From abc05dcd6f9ab2ec826c1109afc135e4722d5c28 Mon Sep 17 00:00:00 2001 From: liuxiaolong <736321739@qq.com> Date: 星期四, 01 八月 2019 18:26:31 +0800 Subject: [PATCH] fix 4 to 1 --- controllers/fileController.go | 403 +++++++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 303 insertions(+), 100 deletions(-) diff --git a/controllers/fileController.go b/controllers/fileController.go index 8bb9a36..b3b4406 100644 --- a/controllers/fileController.go +++ b/controllers/fileController.go @@ -1,16 +1,14 @@ package controllers import ( - "basic.com/pubsub/protomsg.git" + "basic.com/dbapi.git" "basic.com/fileServer/WeedFSClient.git" - "basic.com/valib/deliver.git" + "basic.com/pubsub/protomsg.git" "bytes" "encoding/base64" - "encoding/json" "errors" "fmt" "github.com/gin-gonic/gin" - "github.com/gogo/protobuf/proto" "github.com/satori/go.uuid" "image" "image/jpeg" @@ -19,6 +17,7 @@ "mime/multipart" "net/http" "path" + "sort" "strconv" "strings" "time" @@ -152,6 +151,7 @@ type CompareResult struct { Id string `json:"id"` + CompareScore float32 `json:"compareScore"` CameraId string `json:"cameraId"` CameraAddr string `json:"cameraAddr"` PicDate string `json:"picDate"` @@ -162,9 +162,11 @@ 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"` @@ -180,126 +182,326 @@ TableName string `json:"tableName"` } -var captureTable = "capturetable" // 鎶撴媿搴� -type SearchCondition struct { - PicUrl string `json:"picUrl"` - Databases []string `json:"databases"` - Threshold string `json:"threshold"` +type CompareSortResult []CompareResult + +func (s CompareSortResult) Len() int{ + return len(s) } +func (s CompareSortResult) Swap(i,j int){ + s[i],s[j] = s[j],s[i] +} +func (s CompareSortResult) Less(i,j int) bool{ + return s[i].CompareScore > s[j].CompareScore +} + +//濉厖鍚戝墠绔繑鍥炵殑鏁版嵁 +func FillDataToCompareResult(compResult *protomsg.SdkCompareResult) CompareSortResult { + //resultList :=make([]CompareResult,0) + var resultList = CompareSortResult{} + + 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 == service.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, + BwType: strconv.Itoa(int(p.BwType)), + TableName: p.TableName, + }) + } + 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) + } + } + sort.Sort(resultList) + return resultList +} + +func parseMonitorLevel(level string) string { + if level == "1" { + return "涓�绾�" + } + if level == "2" { + return "浜岀骇" + } + if level == "3" { + return "涓夌骇" + } + return level +} + // @Summary 浠ュ浘鎼滃浘 // @Description 浠ュ浘鎼滃浘 // @Accept json // @Produce json // @Tags 浠ュ浘鎼滃浘 -// @Param condition body controllers.SearchCondition true "鎼滅储鍙傛暟" +// @Param condition body models.EsSearch true "鎼滅储鍙傛暟" // @Success 200 {string} json "{"code":200, msg:"", data:"", success:true}" // @Failure 500 {string} json "{"code":500, msg:"", data:"", success:false}" // @Router /data/api-v/dbperson/searchByPhoto [POST] func (controller FileController) SearchByPhoto(c *gin.Context) { - var condition SearchCondition - err := c.BindJSON(&condition) - if err !=nil || condition.PicUrl == "" { + var searchBody models.EsSearch + err := c.BindJSON(&searchBody) + if err !=nil || searchBody.PicUrl == "" || len(searchBody.DataBases) == 0 { util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎") return } - compThreshold, err := strconv.ParseFloat(condition.Threshold,32) - if condition.PicUrl == "" || err != nil { - util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎") + if searchBody.CompareNum !="" { + //浜屾鎼滅储锛屼笉闇�瑕佸啀姣斿浜� + co := service.GetCompResultByNum(searchBody.CompareNum) + if co != nil { + //浜屾鎼滅储鍜屾帓搴� + twiceM := GetCompareDataTwice(co,&searchBody) + util.ResponseFormat(c,code.Success,twiceM) + } else { + m :=make(map[string]interface{},0) + m["compareNum"] = searchBody.CompareNum + m["total"] = 0 + m["totalList"] = []CompareResult{} + util.ResponseFormat(c,code.CompareResultGone,m) + } + } + var sysSetApi dbapi.SysSetApi + analyServerId := "" + flag, sysconf := sysSetApi.GetServerInfo() + if flag { + analyServerId = sysconf.ServerId + } else { + util.ResponseFormat(c, code.ComError, "analyServerId涓虹┖锛岄厤缃湁璇�") return } - if face,ok := faceExtractedMap[condition.PicUrl];!ok{ - util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎") + if face,ok := faceExtractedMap[searchBody.PicUrl];!ok{ + util.ResponseFormat(c, code.RequestParamError, "璇烽噸鏂颁笂浼犲浘鐗�") return } else { arg := protomsg.CompareArgs{ - TableIds:[]string{ captureTable }, - FaceFeature:face.FaceBytes, - CompareThreshold:float32(compThreshold), + FaceFeature: face.FaceBytes, + CompareThreshold: searchBody.Threshold, } - if condition.Databases !=nil { - arg.TableIds = append(arg.TableIds, condition.Databases...) - } - b, err := proto.Marshal(&arg) - if err !=nil{ - util.ResponseFormat(c, code.ComError, "璇锋眰marshal澶辫触") - return - } - compServerList := config.CompServerInfo.Url - logger.Debug("compServerList:", compServerList) - resultList :=make([]CompareResult,0) - for _,str :=range compServerList{ - reqUrl := "tcp://"+str - reqClient := deliver.NewClient(deliver.ReqRep, reqUrl) - err = reqClient.Send(b) - if err !=nil{ - logger.Debug("reqClient.Send err:",err) - continue - } - resultB, err := reqClient.Recv() - if err !=nil{ - logger.Debug("reqClient.Recv err:",err) - continue - } - rList :=make([]protomsg.Esinfo,0) - err = json.Unmarshal(resultB, &rList) - if err !=nil{ - logger.Debug("recv result Unmarshal err:", err) - continue - } - logger.Debug("rList:", rList) - 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 - personIds = append(personIds,v.Id) - } else { - dbPersonM[v.Id] = &v - captureIds = append(captureIds,v.Id) + if searchBody.DataBases !=nil { + for idx,tableId :=range searchBody.DataBases { + if tableId == "esData" { + searchBody.DataBases = append(searchBody.DataBases[:idx], searchBody.DataBases[idx+1:]...) + searchBody.DataBases = append(searchBody.DataBases,service.CaptureTable) + break } } - logger.Debug("personIds:", personIds) - logger.Debug("captureIds:",captureIds) - esServerIp := config.EsInfo.Masterip - esServerPort := config.EsInfo.Httpport - index := config.EsInfo.EsIndex.Dbtablepersons.IndexName - dbpersons, e := esApi.Dbpersoninfosbyid(personIds, index, esServerIp, esServerPort) - if e !=nil { - logger.Debug("Dbpersoninfosbyid.err:",e) - } - logger.Debug("dbpersons:", dbpersons) - if e ==nil && dbpersons !=nil { - for _,p :=range dbpersons { - var dbP = DbPersonVo { - PersonId: p.Id, - IdCard: p.IdCard, - CompareScore: 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) - } - } - logger.Debug("resultList:",resultList) + arg.TableIds = searchBody.DataBases } - util.ResponseFormat(c,code.Success,resultList) + arg.Source = true // 鏍囪瘑鏉ユ簮鏄痺eb + 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 = analyServerId + + logger.Debug("arg.TableIds:", arg.TableIds, ",alarmLevel:",arg.AlarmLevel,",treeNodes:",arg.TreeNodes,",searchTime:",arg.SearchTime, + ",inputValue:",arg.InputValue,",tasks:",arg.Tasks,",compThreshold:",arg.CompareThreshold) + timeStart := time.Now() + + compareService := service.NewFaceCompareService(arg) + compareOnce := compareService.Compare() + totalData := compareOnce.CompareData + + logger.Debug("comp 姣斿缁撴潫锛岀敤鏃讹細",time.Since(timeStart)) + m := make(map[string]interface{},3) + if totalData != nil && totalData.Len() > 0{ + //鎸夊垎鍊兼帓搴� + var scorePre []float32 + for _,f1 :=range *totalData { + scorePre = append(scorePre, f1.CompareScore) + } + //logger.Debug("comp 鎺掑簭鍓嶅垎鍊兼暟缁勶細",scorePre) + sort.Sort(totalData) + var scoreAf []float32 + for _,f2 :=range *totalData { + scoreAf = append(scoreAf, f2.CompareScore) + } + //logger.Debug("comp 鎺掑簭鍚庡垎鍊兼暟缁勶細",scoreAf) + total := totalData.Len() + + m["compareNum"] = compareOnce.CompareNum + m["total"] = total + var sCompResult protomsg.SdkCompareResult + if total <= searchBody.Size { + sCompResult.CompareResult = *totalData + } else { + sCompResult.CompareResult = (*totalData)[0:searchBody.Size] + } + resultList := FillDataToCompareResult(&sCompResult) + m["totalList"] = resultList + logger.Debug("comp 姣斿鍔犳帓搴忚繑鍥炵敤鏃�:", time.Since(timeStart)) + + } else { + m["total"] = 0 + m["compareNum"] = searchBody.CompareNum + m["totalList"] = []CompareResult{} + } + 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) + // } + //} + + //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) + + 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] + // } + //} else { + // m["totalList"] = []CompareResult{} + //} + return m +} + +func isInArr(id string,arr []string) bool { + for _,v :=range arr { + if v == id { + return true + } + } + return false +} + // @Description 浜哄憳鐓х墖涓婁紶骞惰幏鍙栫壒寰佸�� // @Router /data/api-v/dbperson/fileUploadTest [POST] @@ -388,6 +590,7 @@ dbperson.PersonPicUrl = field // 鍥剧墖璺粡 dbperson.TableId = tableId // dbperson.PersonName = fileNameOnly // 鍥剧墖鍚� + dbperson.Enable = 1 //榛樿鏈夋晥 // 婕旂ずbase64缂栫爜 dbperson.FaceFeature = faceBase64 // 鐗瑰緛鍊糱ase64 鐮� @@ -468,7 +671,7 @@ //addResult["detail"] = details //fields := fdfsclient.UploadFileByBuffer100(bytess, extNames) // fastdfs 涓婁紶 if len(successList)>0 { - util.ResponseFormat(c, code.Success, addResult) + util.ResponseFormat(c, code.DbPersonUploadSuccess, addResult) } else { util.ResponseFormat(c, code.ServiceInsideError, err.Error()) } -- Gitblit v1.8.0