From 7c811247ecf143e08c576986a884bedadc57dd66 Mon Sep 17 00:00:00 2001 From: liuxiaolong <liuxiaolong@aiotlink.com> Date: 星期五, 05 六月 2020 18:29:41 +0800 Subject: [PATCH] add refresh token to resp --- controllers/fileController.go | 984 +++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 877 insertions(+), 107 deletions(-) diff --git a/controllers/fileController.go b/controllers/fileController.go index 33a2d81..ad9a211 100644 --- a/controllers/fileController.go +++ b/controllers/fileController.go @@ -1,20 +1,37 @@ package controllers import ( + "basic.com/dbapi.git" + "basic.com/fileServer/WeedFSClient.git" + esApi "basic.com/pubsub/esutil.git" + "basic.com/pubsub/protomsg.git" + "basic.com/valib/godraw.git" + "basic.com/valib/logger.git" "bytes" "encoding/base64" + "encoding/json" + "errors" "fmt" "github.com/gin-gonic/gin" - "github.com/satori/go.uuid" "image" + "image/color" "image/jpeg" + "io/ioutil" "log" "mime/multipart" - "net/http" + "path" + "sort" + "strconv" + "strings" + "sync" + "time" + "webserver/cache" "webserver/extend/code" + "webserver/extend/config" "webserver/extend/esutil" "webserver/extend/util" "webserver/models" + "webserver/service" ) type FileController struct { @@ -28,60 +45,744 @@ //var picUrlField = "fid" /**涓婁紶鏂规硶**/ -//var weedfsUri = "http://192.168.1.182:6333/submit" -var weedfsUri = "http://192.168.1.182:9500/submit" +//var weedfsUri = "http://192.168.1.182:9500/submit" -// @Summary 渚濇嵁鍥剧墖娣诲姞搴曞簱浜哄憳 -// @Description 渚濇嵁鍥剧墖娣诲姞搴曞簱杩斿洖鏁版嵁浜哄憳 -// @Accept mpfd +// @Security ApiKeyAuth +// @Summary 鍥剧墖涓婁紶 +// @Description 鍥剧墖涓婁紶 +// @Accept multipart/form-data // @Produce json -// @Tags dbperson 搴曞簱浜哄憳 -// @Param file formData file true "搴曞簱浜哄憳鍥剧墖" -// @Param tableId formData string false "搴曞簱id,鏈塱d 鍒欏姞鍏ュ簳搴擄紝鏃犲垯鍙笂浼犲浘鐗�" -// @Success 200 {string} json "{"code":200, msg:"鐩綍缁撴瀯鏁版嵁", success:true}" -// @Failure 500 {string} json "{"code":500, msg:"杩斿洖閿欒淇℃伅", success:false}" +// @Tags 鍥剧墖涓婁紶 +// @Param file formData file true "鍥剧墖" +// @Param picType formData string true "鍥剧墖绫诲瀷锛�0锛氳溅杈嗙収鐗囷紝1锛氫汉鑴哥収鐗�" +// @Success 200 {string} json "{"code":200, msg:"", success:true}" +// @Failure 500 {string} json "{"code":500, msg:"", success:false}" // @Router /data/api-v/dbperson/fileupload [POST] func (fc FileController) Fileupload(c *gin.Context) { //寰楀埌涓婁紶鐨勬枃浠� file, header, err := c.Request.FormFile("file") //image杩欎釜鏄痷plaodify鍙傛暟瀹氫箟涓殑 'fileObjName':'image' - tableId := c.Request.FormValue("tableId") - if err != nil { - c.String(http.StatusBadRequest, "Bad request") + picType := c.Request.FormValue("picType") //鍥剧墖绫诲瀷 + if err != nil || (picType != "0" && picType != "1") { + util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎") return } //鏂囦欢鐨勫悕绉� filename := header.Filename - fmt.Println(file, err, filename) - if err != nil { - log.Fatal(err) - filename = uuid.NewV4().String() - } - // fastdfs - { - //fileSuffix := path.Ext(filename)[1:] //鑾峰彇鏂囦欢鍚庣紑 - //fmt.Println("鏂囦欢鍚庣紑 =", fileSuffix) - //data, _ := ioutil.ReadAll(file) - // fastdfs 涓婁紶 鏆傚簾寮� - //field := fdfsclient.UploadFileByBuffer(data, fileSuffix) - } - field, result, err := uploadFileReturnAddr(file, filename, tableId) - if err != nil { - if err.Error() == "NotFeatureFindError" { - util.ResponseFormat(c, code.NotFeatureFindError, filename) - } else { - util.ResponseFormat(c, code.ServiceInsideError, err.Error()) + var result = make(map[string]string) + if picType == "1" { + _, _, err, faceFeature, faceUrlPath := uploadFileReturnAddr(file, filename, "", false) + if err != nil { + if err.Error() == "NotFeatureFindError" { + util.ResponseFormat(c, code.NotFeatureFindError, filename) + } else { + util.ResponseFormat(c, code.ServiceInsideError, err.Error()) + } + return } + result["picUrl"] = faceUrlPath + result["faceFeature"] = faceFeature + } else { + localConf, err2 := cache.GetServerInfo() + if err2 !=nil || localConf.WebPicIp == "" { + logger.Debug("localConfig is wrong!!!") + util.ResponseFormat(c,code.ComError,"") + return + } + defer file.Close() + // weedfs 涓婁紶 + fileBytes, err := ioutil.ReadAll(file) + if err !=nil { + util.ResponseFormat(c,code.ComError,"") + return + } + var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit?collection=persistent" + weedFilePath, e := WeedFSClient.UploadFile(weedfsUri, filename, fileBytes) + if e != nil { + logger.Debug("WeedFSClient.UploadFile err:", e) + util.ResponseFormat(c,code.ComError,"UploadFile err") + return + } + result["picUrl"] = weedFilePath + } + + util.ResponseFormat(c, code.Success, result) +} + + +type FaceExtract struct { + Url string `json:"url"` + FaceBytes []byte `json:"faceBytes"` +} +var faceExtractedMap = make(map[string]FaceExtract,0) + +// @Security ApiKeyAuth +// @Summary 浜鸿劯鎻愬彇 +// @Description 浜鸿劯鎻愬彇 +// @Accept multipart/form-data +// @Produce json +// @Tags 浠ュ浘鎼滃浘 +// @Param file formData file 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/faceExtract [POST] +func (controller FileController) FaceExtract(c *gin.Context) { + file, _, err := c.Request.FormFile("file") //image杩欎釜鏄痷plaodify鍙傛暟瀹氫箟涓殑 'fileObjName':'image' + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎") return } - if tableId != "" { // 涓婁紶 - if result["success"].(bool) { - util.ResponseFormat(c, code.Success, result["data"]) + localConf, err2 := cache.GetServerInfo() + if err2 !=nil || localConf.WebPicIp == "" { + logger.Debug("localConfig is wrong!!!") + return + } + var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit?collection=persistent" + logger.Debug("weedfsUri:",weedfsUri) + resultMap :=make(map[string]interface{},0) + //灏嗕笂浼犵殑鍥剧墖浜や汉鑴告娴嬪拰浜鸿劯鎻愬彇锛岃幏寰楃壒寰� + fileBytes, _ := ioutil.ReadAll(file) + faceArr, err, pI := service.GetFaceFeaFromSdk(fileBytes, time.Second*60) + if err ==nil && len(faceArr) >0 { + //1.鎻愬彇姣忎竴寮犱汉鑴稿皬鍥� + urlArr := make([]string,0) + for _,r := range faceArr { + rcFace := r.Pos.RcFace + cutFaceImgData,cutErr := util.SubCutImg(pI, rcFace, 20) + if cutErr != nil { + logger.Debug("util.SubCutImg err:", cutErr) + continue + } + weedFilePath, e := WeedFSClient.UploadFile(weedfsUri, "FaceUrl", cutFaceImgData) + if e == nil{ + faceExtractedMap[weedFilePath] = FaceExtract{ + Url:weedFilePath, + FaceBytes:r.Feats, + } + urlArr = append(urlArr, weedFilePath) + } + } + //2.澶у浘鐢绘,鏍囪瘑浜鸿劯浣嶇疆 + drawedB, _ := drawPolygonOnImg(pI, &faceArr) + + originFilePath, _ := WeedFSClient.UploadFile(weedfsUri, "FaceUrl", *drawedB) + resultMap["uploadImage"] = originFilePath + resultMap["smImage"] = urlArr + util.ResponseFormat(c,code.Success, resultMap) + } else { + util.ResponseFormat(c,code.ComError,"鏈彁鍙栧埌浜鸿劯") + } +} + +func drawPolygonOnImg(i *protomsg.Image,faceArr *[]*protomsg.ResultFaceDetect) (*[]byte,error) { + img,err := godraw.ToImage(i.Data, int(i.Width), int(i.Height)) + if err != nil { + return nil,err + } + red := color.RGBA{255, 0, 0, 0} + for _,faceResult := range *faceArr { + rect := image.Rect(int(faceResult.Pos.RcFace.Left), + int(faceResult.Pos.RcFace.Top), + int(faceResult.Pos.RcFace.Right), + int(faceResult.Pos.RcFace.Bottom)) + err = godraw.DrawRectangle(img, rect, red, 3) + if err != nil { + logger.Debug("godraw.DrawRectangle err:", err) + } + } + + quantity := 100 + jpgData, err := godraw.ImageToJpeg(img, &quantity) + return &jpgData,err +} + +type CompareResult struct { + Id string `json:"id"` + CompareScore float64 `json:"compareScore"` + CameraId string `json:"cameraId"` + CameraName string `json:"cameraName"` + CameraAddr string `json:"cameraAddr"` + PicDate string `json:"picDate"` + Content string `json:"content"` + IsAlarm bool `json:"isAlarm"` + PicMaxUrl []string `json:"picMaxUrl"` + TargetInfo []TargetInfo `json:"targetInfo"` + TaskId string `json:"taskId"` + TaskName string `json:"taskName"` + BaseInfo []DbPersonVo `json:"baseInfo"` + VideoUrl string `json:"videoUrl"` + SdkName string `json:"sdkName"` + AlarmRules []AlarmRuleVo `json:"alarmRules"` +} + +type TargetInfo struct { + TargetId string `json:"targetId"` + TargetType string `json:"targetType"` + TargetScore float64 `json:"targetScore"` + Feature string `json:"feature"` + PicSmUrl string `json:"picSmUrl"` + TargetLocation TargetLocation `json:"targetLocation"` +} + +type TargetLocation struct { + TopLeft protomsg.Location `json:"topLeft"` + BottomRight protomsg.Location `json:"bottomRight"` +} + +type DbPersonVo struct { + TableId string `json:"tableId"` + TableName string `json:"tableName"` + BwType string `json:"bwType"` + CompareScore float64 `json:"compareScore"` + TargetId string `json:"targetId"` + TargetName string `json:"targetName"` + TargetPicUrl string `json:"targetPicUrl"` + MonitorLevel string `json:"monitorLevel"` + Labels string `json:"labels"` + Content string `json:"content"` + Enable int32 `json:"enable"` +} + +type ScoreIndex struct { + CompareScore float64 + Index int +} + +type AlarmRuleVo struct { + GroupId string `json:"groupId"` + AlarmLevel string `json:"alarmLevel"` + RuleText string `json:"ruleText"` + DefenceState bool `json:"defenceState"` + IsLink bool `json:"isLink"` + LinkInfo string `json:"linkInfo"` +} + +//濉厖鍚戝墠绔繑鍥炵殑鏁版嵁 +func FillDataToCompareResult(compResult *protomsg.SdkCompareResult) []CompareResult { + + var resultList = make([]CompareResult, len(compResult.CompareResult)) + dbPersonM := make(map[string]ScoreIndex, 0) + captureM := make(map[string]ScoreIndex, 0) + personIds := make([]string,0) + captureIds := make([]string,0) + for idx,v :=range compResult.CompareResult{ + if v.Tableid == service.CaptureTable { + captureM[v.Id] = ScoreIndex{ + Index: idx, + CompareScore: util.ParseScore64(float64(v.CompareScore)), + } + captureIds = append(captureIds,v.Id) } else { - util.ResponseFormat(c, code.ServiceInsideError, result["data"]) + dbPersonM[v.Id] = ScoreIndex{ + Index: idx, + CompareScore: util.ParseScore64(float64(v.CompareScore)), + } + personIds = append(personIds,v.Id) + } + } + logger.Debug("comp len(personIds):", len(personIds)) + logger.Debug("comp len(captureIds):", len(captureIds)) + + var dbpersons []protomsg.Dbperson + if len(personIds) >0 { + var dbpApi dbapi.DbPersonApi + dbpersons, _ = dbpApi.Dbpersoninfosbyid(personIds) + } + + if len(dbpersons) >0 { + var dtApi dbapi.DbTableApi + for _,p :=range dbpersons { + var dbP = DbPersonVo { + TargetId: p.Id, + CompareScore: dbPersonM[p.Id].CompareScore, + MonitorLevel: p.MonitorLevel, + TargetName: p.PersonName, + TargetPicUrl: p.PersonPicUrl, + Labels: p.PhoneNum+"/"+p.Sex+"/"+p.IdCard, + TableId: p.TableId, + Content: p.Reserved, + Enable: p.Enable, + } + dbTableInfos, _ := dtApi.DbtablesById([]string{ p.TableId }) + if dbTableInfos !=nil{ + dbP.BwType = dbTableInfos[0].BwType + dbP.TableName = dbTableInfos[0].TableName + } + + resultList[dbPersonM[p.Id].Index] = CompareResult{ + BaseInfo:[]DbPersonVo{ dbP }, + } + } + } + if len(captureIds) >0 { + localConf, err2 := cache.GetServerInfo() + if err2 !=nil || localConf.AlarmIp == "" || localConf.ServerId == "" { + logger.Debug("localConfig is wrong!!!") + return nil + } + logger.Debug("captureIds:",strings.Join(captureIds,",")) + aiTargets, _ := esApi.AIOceaninfosbyid(captureIds, config.EsInfo.EsIndex.AiOcean.IndexName, localConf.AlarmIp, strconv.Itoa(int(localConf.AlarmPort))) + logger.Debug("comp aiTargets.len:",len(aiTargets)) + for _,vp :=range aiTargets { + var bi []DbPersonVo + for _,p :=range vp.BaseInfo { + bi = append(bi, DbPersonVo{ + TargetId: p.TargetId, + CompareScore: util.ParseScore64(p.CompareScore), + MonitorLevel: p.MonitorLevel, + TargetName: p.TargetName, + TargetPicUrl: p.TargetPicUrl, + Labels: p.Labels, + TableId: p.TableId, + BwType: p.BwType, + TableName: p.TableName, + }) + } + var alarmRules []AlarmRuleVo + if vp.AlarmRules !=nil && len(vp.AlarmRules) >0 { + for _,ar :=range vp.AlarmRules { + alarmRules = append(alarmRules, AlarmRuleVo{ + GroupId: ar.GroupId, + AlarmLevel: ar.AlarmLevel, + RuleText: ar.RuleText, + DefenceState: ar.DefenceState, + IsLink: ar.IsLink, + LinkInfo: ar.LinkInfo, + }) + } + } + var ti = make([]TargetInfo,0) + if vp.TargetInfo !=nil { + for _,vti :=range vp.TargetInfo { + tl := protomsg.Location{ + X: vti.TargetLocation.TopLeft.X, + Y: vti.TargetLocation.TopLeft.Y, + } + br := protomsg.Location{ + X: vti.TargetLocation.BottomRight.X, + Y: vti.TargetLocation.BottomRight.Y, + } + tInfo := TargetInfo{ + TargetId: vti.TargetId, + TargetType: vti.TargetType, + TargetScore: vti.TargetScore, + Feature: vti.Feature, + PicSmUrl: vti.PicSmUrl, + TargetLocation: TargetLocation{ + TopLeft:tl, + BottomRight:br, + }, + } + ti = append(ti, tInfo) + } + } + vpE := CompareResult{ + Id: vp.Id, + CompareScore: captureM[vp.Id].CompareScore, + CameraId: vp.CameraId, + CameraName: vp.CameraName, + CameraAddr: vp.CameraAddr, + PicDate: vp.PicDate, + PicMaxUrl: vp.PicMaxUrl, + TargetInfo: ti, + IsAlarm: vp.IsAlarm, + TaskName: vp.TaskName, + TaskId: vp.TaskId, + VideoUrl: vp.VideoUrl, + BaseInfo: bi, + SdkName: "浜鸿劯", + AlarmRules: alarmRules, + } + resultList[captureM[vp.Id].Index] = vpE + } + } + return resultList +} + +func parseMonitorLevel(level string) string { + if level == "1" { + return "涓�绾�" + } + if level == "2" { + return "浜岀骇" + } + if level == "3" { + return "涓夌骇" + } + return level +} + +func GetFeaFromOneFaceImg(fileBytes []byte) (faceB []byte,oriImg string,smImgs []string, err error){ + localConf, err2 := cache.GetServerInfo() + if err2 !=nil || localConf.WebPicIp == "" { + logger.Debug("localConfig is wrong!!!") + return nil,"",nil,errors.New("localConf err") + } + var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit?collection=persistent" + logger.Debug("weedfsUri:",weedfsUri) + faceArr, err, pI := service.GetFaceFeaFromSdk(fileBytes, time.Second*60) + if err ==nil && len(faceArr) ==1 { + rcFace := faceArr[0].Pos.RcFace + cutFaceImgData,_ := util.SubCutImg(pI, rcFace, 20) + weedFilePath, e := WeedFSClient.UploadFile(weedfsUri, "FaceUrl", cutFaceImgData) + if e == nil{ + faceExtractedMap[weedFilePath] = FaceExtract{ + Url:weedFilePath, + FaceBytes:faceArr[0].Feats, + } + smImgs = append(smImgs, weedFilePath) + } + //2.澶у浘鐢绘,鏍囪瘑浜鸿劯浣嶇疆 + drawedB, _ := drawPolygonOnImg(pI, &faceArr) + + originFilePath, _ := WeedFSClient.UploadFile(weedfsUri, "FaceUrl", *drawedB) + return faceArr[0].Feats,originFilePath,smImgs,nil + } else { + return nil,"",nil,errors.New("no face") + } +} + +// @Security ApiKeyAuth +// @Summary 浠ュ浘鎼滃浘 +// @Description 浠ュ浘鎼滃浘 +// @Accept json +// @Produce json +// @Tags 浠ュ浘鎼滃浘 +// @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 (fc FileController) SearchByPhoto(c *gin.Context) { + var searchBody models.EsSearch + err := c.BindJSON(&searchBody) + if err !=nil{ + util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎") + return + } + localConf, err2 := cache.GetServerInfo() + if err2 !=nil || localConf.AlarmIp == "" || localConf.ServerId == "" { + logger.Debug("localConfig is wrong!!!") + util.ResponseFormat(c,code.ComError,"localConf wrong") + return + } + var faceB []byte + 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.AiOcean.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, "鏈潯鎶撴�曠壒寰佷笉鏄痓ase64锛岃妫�鏌�") + return + } + faceB = decodeF + } else { + util.ResponseFormat(c, code.ComError, "鏈潯浜鸿劯鎶撴媿鐗瑰緛涓虹┖锛岃妫�鏌�") + return + } + } + + } else {//鍋氫互鍥炬悳鍥� + if searchBody.PicUrl == "" || len(searchBody.DataBases) == 0 { + util.ResponseFormat(c, code.RequestParamError, "浠ュ浘鎼滃浘PicUrl涓嶈兘涓虹┖") + return + } + if face,ok := faceExtractedMap[searchBody.PicUrl];!ok{ + util.ResponseFormat(c, code.RequestParamError, "浜鸿劯鐗瑰緛鏈娴嬶紝璇烽噸鏂颁笂浼犲浘鐗�") + return + } else { + faceB = face.FaceBytes + } + } + + if faceB == nil { + util.ResponseFormat(c, code.RequestParamError, "璇烽噸鏂颁笂浼犲浘鐗�") + return + } + arg := protomsg.CompareArgs{ + FaceFeature: faceB, + CompareThreshold: searchBody.Threshold, + } + + var hasCompEsPerson = false + if searchBody.DataBases !=nil { + for idx,tableId :=range searchBody.DataBases { + if tableId == "esData" { + searchBody.DataBases = append(searchBody.DataBases[:idx], searchBody.DataBases[idx+1:]...) + hasCompEsPerson = true + break + } + } + arg.TableIds = searchBody.DataBases + } else { + arg.TableIds = []string{} + } + alarmLevelTypes := strings.Replace(strings.Trim(fmt.Sprint(getAlarmLevel(searchBody.AlarmLevel)), "[]"), " ", "\",\"", -1) + arg.Source = true // 鏍囪瘑鏉ユ簮鏄痺eb + arg.AlarmLevel = alarmLevelTypes + 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 + + 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) + var totalData service.CompareList + if len(arg.TableIds) >0 {//鏈夋瘮瀵瑰簳搴� + dbPersonTargets := compareService.CompareDbPersons() + if dbPersonTargets !=nil { + totalData = append(totalData,*dbPersonTargets...) + } + } + if hasCompEsPerson {//鏈夋瘮瀵笶s鎶撴媿 + esPersons := compareService.CompareVideoPersons() + if esPersons !=nil { + totalData = append(totalData, *esPersons...) + } + } + + logger.Debug("comp 姣斿缁撴潫锛岀敤鏃讹細",time.Since(timeStart)) + service.SetCompResultByNum(&service.CompareOnce{ + CompareNum: compareService.CompareNum, + CompareData: &totalData, + }) + + m := make(map[string]interface{},3) + if totalData != nil && totalData.Len() > 0{ + sort.Sort(totalData) + total := totalData.Len() + + m["compareNum"] = compareService.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"] = compareService.CompareNum + m["totalList"] = []CompareResult{} + } + util.ResponseFormat(c,code.Success,m) +} + +type PersonId struct { + Id string `json:"id"` +} + +func GetCompareDataTwice(co *service.CompareOnce,searchBody *models.EsSearch) map[string]interface{} { + m := make(map[string]interface{},0) + + 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 {//浜屾妫�绱S姣斿缁撴灉 + arg := protomsg.CompareArgs{ + CompareThreshold: searchBody.Threshold, + } + localConf, err := cache.GetServerInfo() + if err ==nil && localConf.AlarmIp != "" && localConf.ServerId != "" { + alarmLevelTypes := strings.Replace(strings.Trim(fmt.Sprint(getAlarmLevel(searchBody.AlarmLevel)), "[]"), " ", "\",\"", -1) + arg.Source = true // 鏍囪瘑鏉ユ簮鏄痺eb + arg.AlarmLevel = alarmLevelTypes + 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 + + captureIds := esApi.GetAllLocalVideopersonsId(arg, config.EsInfo.EsIndex.AiOcean.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, searchBody) + 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, searchBody) + 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 { + // 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, searchBody *models.EsSearch) *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 && each.CompareScore >= searchBody.Threshold { + 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 { + return true + } + } + return false +} + + +// @Description 浜哄憳鐓х墖涓婁紶骞惰幏鍙栫壒寰佸�� +// @Router /data/api-v/dbperson/fileUploadTest [POST] +func (controller FileController) UploadPersonTest(c *gin.Context) { + file, _, err := c.Request.FormFile("file") //image杩欎釜鏄痷plaodify鍙傛暟瀹氫箟涓殑 'fileObjName':'image' + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎") + return + } + localConf, err2 := cache.GetServerInfo() + if err2 !=nil || localConf.WebPicIp == "" { + logger.Debug("localConfig is wrong!!!") + return + } + var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit?collection=persistent" + + //灏嗕笂浼犵殑鍥剧墖浜や汉鑴告娴嬪拰浜鸿劯鎻愬彇锛岃幏寰楃壒寰� + fileBytes, _ := ioutil.ReadAll(file) + faceArr, err, pI := service.GetFaceFeaFromSdk(fileBytes, time.Second*5) + if err ==nil && len(faceArr) >0 { + var faceBase64= "" + var rcFace *protomsg.Rect + for _,r := range faceArr { + rcFace = r.Pos.RcFace + faceBase64 = base64.StdEncoding.EncodeToString(r.Feats)//鑾峰彇鎻愬彇鍒扮殑绗竴寮犱汉鑴哥壒寰� + break + } + //鏍规嵁浜鸿劯鍧愭爣鎵e嚭浜鸿劯灏忓浘 + cutFaceImgData,_ := util.SubCutImg(pI, rcFace, 20) + weedFilePath, e := WeedFSClient.UploadFile(weedfsUri, "testCutFace", cutFaceImgData) + if e !=nil{ + util.ResponseFormat(c,code.ComError,"鏂囦欢涓婁紶澶辫触") + } else { + util.ResponseFormat(c,code.Success,weedFilePath + ";" + faceBase64) } } else { - util.ResponseFormat(c, code.Success, field) + util.ResponseFormat(c,code.ComError,"鏈彁鍙栧埌浜鸿劯") } } @@ -91,52 +792,82 @@ log.Fatalln(err) }*/ -func uploadFileReturnAddr(file multipart.File, filename string, tableId string) (string, map[string]interface{}, error) { - +func uploadFileReturnAddr(file multipart.File, filename string, tableId string, add2Db bool) (string, map[string]interface{}, error, string, string) { defer file.Close() - field := "" // weedfs 涓婁紶 - { - fileInfo, e := esutil.PostFormData(weedfsUri, filename, "file", file) - if e != nil { - fmt.Println(e.Error()) - return "", nil, e - } else { - field = fileInfo[picUrlField].(string) // 鏂囦欢璺緞 + fileBytes, err := ioutil.ReadAll(file) + if err !=nil { + return "",nil,err,"","" + } + + //灏嗕笂浼犵殑鍥剧墖浜や汉鑴告娴嬪拰浜鸿劯鎻愬彇锛岃幏寰楃壒寰� + var faceBase64="" + faceArr, err, pI := service.GetFaceFeaFromSdk(fileBytes, time.Second*5) + if faceArr ==nil { + return "",nil,errors.New("NotFeatureFindError"),"","" + } + var rcFace *protomsg.Rect + if err ==nil && len(faceArr) >0 { + if len(faceArr) >1 { + return "",nil, errors.New("TooManyFaces"),"","" + } + for _,r := range faceArr { + //鎷垮埌浜鸿劯鐨勫潗鏍� + rcFace = r.Pos.RcFace + + faceBase64 = base64.StdEncoding.EncodeToString(r.Feats)//鑾峰彇鎻愬彇鍒扮殑绗竴寮犱汉鑴哥壒寰� + break } } - if tableId != "" && field != "" { - // 杩斿洖鐗瑰緛鍊� fileInfo["point"] = v.RcFace fileInfo["feature"] = feat - /*features := gorun.GetSimpleFaceDetect(picIp+field) // 鐗瑰緛鍊� // linux - if len(features) == 0 { // linux - return field,nil,errors.New("NotFeatureFindError") // linux - }else if len(features) > 1 { // linux - return field,nil,errors.New("TooManyFeatureFindError") // linux - } // linux - feat := features[0]["feature"].([]byte) // linux - if len(feat) != 2560 { // linux - return field,nil,errors.New("NotFeatureFindError") - } */ // linux - feat := []byte("hello world") // windows 娴嬭瘯鏀惧紑 - dbperson := new(models.Dbtablepersons) - dbperson.FaceFeature = picIp + field // 鍥剧墖璺粡 - dbperson.TableId = tableId // - dbperson.PersonName = filename // 鍥剧墖鍚� - // 婕旂ずbase64缂栫爜 - encodeString := base64.StdEncoding.EncodeToString(feat) - dbperson.FaceFeature = encodeString // 鐗瑰緛鍊糱ase64 鐮� - result := addDbPerson(dbperson) - return field, result, nil - } else { - return field, nil, nil + localConf, err2 := cache.GetServerInfo() + if err2 !=nil || localConf.WebPicIp == "" { + logger.Debug("localConfig is wrong!!!") + return "",nil,err2,"","" } + var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit?collection=persistent" + //鏍规嵁浜鸿劯鍧愭爣鎵e嚭浜鸿劯灏忓浘 + t1 := time.Now() + cutFaceImgData,cutErr := util.SubCutImg(pI, rcFace, 20) + if cutErr != nil { + logger.Debug("util.SubCutImg err:", cutErr) + return "", nil, cutErr,"","" + } + logger.Debug("SubImg鐢ㄦ椂锛�", time.Since(t1)) + t1 = time.Now() + weedFilePath, e := WeedFSClient.UploadFile(weedfsUri, filename, cutFaceImgData) + logger.Debug("涓婁紶鍒皐eedfs鐢ㄦ椂:", time.Since(t1)) + t1 = time.Now() + if e != nil { + logger.Debug("WeedFSClient.UploadFile err:", e) + return "", nil, e,"","" + } + + ext := path.Ext(filename) + fileNameOnly := strings.TrimSuffix(filename, ext) + + var result map[string]interface{} + if add2Db { + dbperson := new(models.Dbtablepersons) + dbperson.PersonPicUrl = weedFilePath // 鍥剧墖璺粡 + dbperson.TableId = tableId // + dbperson.PersonName = fileNameOnly // 鍥剧墖鍚� + dbperson.Enable = 1 //榛樿鏈夋晥 + dbperson.FaceFeature = faceBase64 // 鐗瑰緛鍊糱ase64 鐮� + + result = addDbPerson(dbperson) + } + + logger.Debug("addDbPerson鐢ㄦ椂锛�", time.Since(t1), "result:", result) + return fileNameOnly, result, nil,faceBase64, weedFilePath + } /**涓婁紶鏂规硶**/ +// @Security ApiKeyAuth // @Summary 鎵归噺娣诲姞搴曞簱浜哄憳 // @Description 渚濇嵁鍥剧墖鎵归噺娣诲姞搴曞簱浜哄憳 -// @Accept mpfd +// @Accept multipart/form-data // @Produce json // @Tags dbperson 搴曞簱浜哄憳 // @Param files formData file[] true "澶氫釜搴曞簱浜哄憳鍥剧墖" @@ -155,52 +886,85 @@ return } extNames := make([]string, 0) - isAllFiald := true addResult := make(map[string]interface{}, 0) - details := make([]string, 0) + successList := make([]string,0) + failList := make([]string,0) + noFaceList := make([]string,0) + multiFaceList := make([]string,0) + tAllStart := time.Now() + var wg sync.WaitGroup + var lock sync.Mutex for _, head := range fileHeaders { - //鏂囦欢鐨勫悕绉� - filename := head.Filename - file, err := head.Open() - fmt.Println(file, err, filename) - if err != nil { - log.Fatal(err) - } - //data, _ := ioutil.ReadAll(file) - // weedfs 涓婁紶 - field, _, err1 := uploadFileReturnAddr(file, filename, tableId) - extNames = append(extNames, field) - if isAllFiald && err1 == nil { - isAllFiald = false - } - if err1 != nil { - if field == "" { - details = append(details, filename+"涓婁紶澶辫触,"+err1.Error()) - } else { - details = append(details, filename+"鍔犲叆搴曞簱澶辫触,"+err1.Error()) + wg.Add(1) + go func(head *multipart.FileHeader,tableId string) { + defer wg.Done() + tIStart := time.Now() + filename := head.Filename + fileExt := path.Ext(filename) + fileExt = strings.ToLower(fileExt) + if fileExt !=".jpg" && fileExt != ".jpeg" && fileExt != ".png" { + lock.Lock() + failList = append(failList, filename) + lock.Unlock() + return } - } + file, err := head.Open() + if err != nil { + lock.Lock() + failList = append(failList, filename) + lock.Unlock() + return + } + field, _, err1,_,_ := uploadFileReturnAddr(file, filename, tableId, true) + lock.Lock() + if err1 != nil || field == "" { + if err1 !=nil && err1.Error() == "NotFeatureFindError" { + noFaceList = append(noFaceList, filename) + } else if err1 !=nil && err1.Error() == "TooManyFaces" { + multiFaceList = append(multiFaceList, filename) + } else { + failList = append(failList, filename) + } + } else { + successList = append(successList, filename) + } + lock.Unlock() + logger.Debug(filename,"鍒囧浘鐢ㄦ椂锛�",time.Since(tIStart)) + }(head, tableId) + wg.Wait() } - addResult["isAllFiald"] = isAllFiald + logger.Debug("鍒�",len(fileHeaders),"寮犱汉鑴哥敤鏃讹細", time.Since(tAllStart)) + addResult["successList"] = successList + addResult["failList"] = failList + addResult["noFaceList"] = noFaceList + addResult["multiFaceList"] = multiFaceList addResult["fields"] = extNames - addResult["detail"] = details - //fields := fdfsclient.UploadFileByBuffer100(bytess, extNames) // fastdfs 涓婁紶 - if !isAllFiald { - util.ResponseFormat(c, code.Success, addResult) + + if len(successList)>0 { + util.ResponseFormat(c, code.DbPersonUploadSuccess, addResult) } else { - util.ResponseFormat(c, code.ServiceInsideError, err.Error()) + util.ResponseFormat(c, code.DbPersonUploadFail, addResult) } } +type EsPersonSave struct { + FaceFeature string `json:"faceFeature"` + TableId string `json:"tableId"` + Id string `json:"id"` + PersonPicUrl string `json:"personPicUrl"` + IdCard string `json:"idCard"` +} + +// @Security ApiKeyAuth // @Summary 涓婁紶鍥剧墖 骞跺垏鍥� // @Description 涓婁紶鍥剧墖 骞跺垏鍥� -// @Accept mpfd +// @Accept multipart/form-data // @Produce json // @Tags dbperson 搴曞簱浜哄憳 // @Param file formData file true "搴曞簱浜哄憳鍥剧墖" // @Param tableId formData string false "搴曞簱id,鏈塱d 鍒欏姞鍏ュ簳搴擄紝鏃犲垯鍙笂浼犲浘鐗�" -// @Success 200 {string} json "{"code":200, msg:"鐩綍缁撴瀯鏁版嵁", success:true}" -// @Failure 500 {string} json "{"code":500, msg:"杩斿洖閿欒淇℃伅", success:false}" +// @Success 200 {string} json "{"code":200, msg:"鐩綍缁撴瀯鏁版嵁", success:true, data:""}" +// @Failure 500 {string} json "{"code":500, msg:"杩斿洖閿欒淇℃伅", success:false, data:""}" // @Router /data/api-v/es/ImageUploadReturnPics [POST] func (fc FileController) ImageUploadReturnPics(c *gin.Context) { //寰楀埌涓婁紶鐨勬枃浠� @@ -212,9 +976,9 @@ } //鏂囦欢鐨勫悕绉� filename := header.Filename - fmt.Println(file, err, filename) defer file.Close() field := "" + // weedfs 涓婁紶 uploadData := make([]byte, header.Size) i, err2 := file.ReadAt(uploadData, 0) @@ -223,6 +987,12 @@ util.ResponseFormat(c, code.UploadFileError, err2.Error()) return } + localConf, err2 := cache.GetServerInfo() + if err2 !=nil || localConf.WebPicIp == "" { + logger.Debug("localConfig is wrong!!!") + return + } + var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit?collection=persistent" { uri := weedfsUri fileInfo, e := esutil.PostFormBufferData(uri, filename, "file", uploadData) @@ -237,7 +1007,7 @@ // fileInfo["point"] = v.RcFace // 杩斿洖鐗瑰緛鍊� // fileInfo["feature"] = feat //features := gorun.GetSimpleFaceDetect(picIp + "/" + field) // 鐗瑰緛鍊� 鍙湪linux 涓� - //feat := []byte("hello world") // windows 娴嬭瘯鏀惧紑 + result := make(map[string]interface{}, 0) result["uploadImage"] = picIp + field smUrl := make([]string, 0) -- Gitblit v1.8.0