package controller
|
|
import (
|
"encoding/base64"
|
"fmt"
|
"math/rand"
|
"net/http"
|
"path"
|
"strconv"
|
"time"
|
|
"gat1400Exchange/config"
|
"gat1400Exchange/pkg"
|
"gat1400Exchange/pkg/logger"
|
"gat1400Exchange/repository"
|
"gat1400Exchange/service"
|
"gat1400Exchange/util"
|
"gat1400Exchange/vo"
|
|
"github.com/gin-gonic/gin"
|
)
|
|
type CaptureController struct {
|
Repository repository.CaptureRepository
|
}
|
|
// 构造函数
|
func NewCaptureController() CaptureController {
|
svr := repository.NewCaptureRepository()
|
controller := CaptureController{Repository: svr}
|
|
return controller
|
}
|
|
// 批量提交人脸
|
func (a CaptureController) Faces(c *gin.Context) {
|
var req vo.RequestFaceList
|
if err := c.BindJSON(&req); err != nil {
|
c.AbortWithStatus(http.StatusBadRequest)
|
return
|
}
|
|
if len(req.FaceListObject.FaceObject) == 0 {
|
c.AbortWithStatus(http.StatusBadRequest)
|
return
|
}
|
|
face := req.FaceListObject.FaceObject[0]
|
logger.Debug("Receive new face message, ip:%s, device id:%s faceId:%s, LeftTopX:%d, appearTime:%s", c.RemoteIP(), face.DeviceID, face.FaceID, face.LeftTopX, face.FaceAppearTime)
|
|
if config.ClientConf.UploadType == "url" {
|
for idx, img := range face.SubImageList.SubImageInfoObject {
|
if img.Type != "14" {
|
continue
|
}
|
|
imageBytes, err := base64.StdEncoding.DecodeString(img.Data)
|
if err != nil {
|
logger.Warn("Decode Small Image Base64 String failure, %s", err.Error())
|
c.AbortWithStatus(http.StatusBadRequest)
|
return
|
}
|
|
today := time.Now().Format("2006-01-02")
|
imagePath := path.Join(config.LogConf.Path, "gat1400_face_images", today, img.ImageID+".jpeg")
|
err = util.WriteToFile(imagePath, imageBytes)
|
if err == nil {
|
face.SubImageList.SubImageInfoObject[idx].Data = ""
|
face.SubImageList.SubImageInfoObject[idx].StoragePath = config.ImageConf.ImageUriPrefix + "/" + today + "/" + img.ImageID + ".jpeg"
|
}
|
}
|
}
|
|
// 如果开启了下级, 身份应该是消息代理, 不再转发到服务器
|
if config.ClientConf.Enable && config.ServeConf.Role == "agent" {
|
go a.Repository.VIIDFaceMsgForward(&req)
|
} else if config.ServeConf.Role == "cascade" {
|
go service.AddFaceNotification(&face)
|
}
|
|
if config.ForwardConf.SyncServer != "" {
|
go a.Repository.FaceForward(req.FaceListObject.FaceObject)
|
}
|
|
if config.ForwardConf.RecordServer != "" {
|
go a.Repository.PubRecordMessage(face.DeviceID, face.FaceID)
|
}
|
|
rspMsg := vo.ResponseStatus{
|
RequestURL: c.FullPath(),
|
StatusCode: vo.StatusSuccess,
|
StatusString: vo.StatusString[vo.StatusSuccess],
|
Id: face.FaceID,
|
LocalTime: time.Now().Format("20060102150405"),
|
}
|
|
c.JSON(http.StatusOK, gin.H{"ResponseStatusObject": rspMsg})
|
}
|
|
func (a CaptureController) VideoLabels(c *gin.Context) {
|
var req vo.RequestVideoLabelList
|
if err := c.BindJSON(&req); err != nil {
|
c.AbortWithStatus(http.StatusBadRequest)
|
return
|
}
|
|
if len(req.VideoLabelListObject.VideoLabelObject) == 0 {
|
c.AbortWithStatus(http.StatusBadRequest)
|
return
|
}
|
|
videoLabel := req.VideoLabelListObject.VideoLabelObject[0]
|
logger.Debug("Receive new videoLabel message, Id:%s Ip:%s ", videoLabel.VideoLabelID, c.RemoteIP())
|
|
// 转人员消息
|
var person vo.PersonObject
|
person.PersonID = videoLabel.VideoLabelID[0:41] + "01" + videoLabel.VideoLabelID[43:48]
|
person.InfoKind = "1"
|
person.DeviceID = videoLabel.IVADeviceID
|
person.SourceID = videoLabel.VideoImageID
|
person.LocationMarkTime = videoLabel.BehaviorAnalysisObject.BehaviorBeginTime
|
person.PersonAppearTime = videoLabel.BehaviorAnalysisObject.BehaviorBeginTime
|
person.PersonDisAppearTime = videoLabel.BehaviorAnalysisObject.BehaviorEndTime
|
person.IsDriver = 2
|
person.IsCriminalInvolved = 2
|
|
var hasTargetImage bool
|
var bgImageWith, bgImageHeight int
|
var bgImage *vo.SubImageInfoObject
|
for idx, img := range videoLabel.SubImageList.SubImageInfoObject {
|
videoLabel.SubImageList.SubImageInfoObject[idx].EventSort = 10
|
|
// 判断是否有小图, 如果没有切一张
|
if img.Type == "14" {
|
bgImageWith, bgImageHeight = img.Width, img.Height
|
} else {
|
hasTargetImage = true
|
bgImage = &videoLabel.SubImageList.SubImageInfoObject[idx]
|
}
|
|
person.SubImageList.SubImageInfoObject = append(
|
person.SubImageList.SubImageInfoObject,
|
videoLabel.SubImageList.SubImageInfoObject[idx],
|
)
|
}
|
|
if !hasTargetImage && bgImage != nil {
|
imgData, err := base64.StdEncoding.DecodeString(bgImage.Data)
|
if err != nil {
|
c.AbortWithStatus(http.StatusBadRequest)
|
return
|
}
|
|
var subRect pkg.Rect
|
subRect.Left = bgImageWith / 3
|
subRect.Top = bgImageHeight / 3
|
subRect.Right = subRect.Left * 2
|
subRect.Bottom = subRect.Top * 2
|
|
subImage, err := pkg.SubCutImage(imgData, &subRect, 0)
|
if err != nil {
|
c.AbortWithStatus(http.StatusBadRequest)
|
return
|
}
|
|
imageId := bgImage.ImageID[37:41]
|
imageNumber, err := strconv.Atoi(imageId)
|
if err != nil {
|
imageNumber = rand.Intn(90000) + 10000
|
} else {
|
imageNumber++
|
}
|
var subImageInfo = vo.SubImageInfoObject{
|
ImageID: fmt.Sprintf("%s%d", bgImage.ImageID[0:37], imageNumber),
|
EventSort: 10,
|
DeviceID: bgImage.DeviceID,
|
StoragePath: "",
|
Type: "11",
|
FileFormat: "Jpeg",
|
ShotTime: bgImage.ShotTime,
|
Width: subRect.Right - subRect.Left,
|
Height: subRect.Top - subRect.Bottom,
|
Data: base64.StdEncoding.EncodeToString(subImage),
|
}
|
person.SubImageList.SubImageInfoObject = append(
|
person.SubImageList.SubImageInfoObject,
|
subImageInfo,
|
)
|
}
|
|
// 如果开启了下级, 身份应该是消息代理, 不再转发到服务器
|
if config.ClientConf.Enable && config.ServeConf.Role == "agent" {
|
var personList vo.RequestPersonList
|
personList.PersonListObject.PersonObject = append(personList.PersonListObject.PersonObject, person)
|
go a.Repository.VIIDPersonMsgForward(&personList)
|
} else if config.ServeConf.Role == "cascade" {
|
go service.AddPersonNotification(&person)
|
}
|
|
if config.ForwardConf.SyncServer != "" {
|
go a.Repository.PersonForward([]vo.PersonObject{person})
|
}
|
|
rspMsg := vo.ResponseStatus{
|
RequestURL: c.FullPath(),
|
StatusCode: vo.StatusSuccess,
|
StatusString: vo.StatusString[vo.StatusSuccess],
|
Id: videoLabel.VideoLabelID,
|
LocalTime: time.Now().Format("20060102150405"),
|
}
|
|
c.JSON(http.StatusOK, gin.H{"ResponseStatusObject": rspMsg})
|
}
|
|
func (a CaptureController) Persons(c *gin.Context) {
|
var req vo.RequestPersonList
|
if err := c.BindJSON(&req); err != nil {
|
c.AbortWithStatus(http.StatusBadRequest)
|
return
|
}
|
|
if len(req.PersonListObject.PersonObject) == 0 {
|
c.AbortWithStatus(http.StatusBadRequest)
|
return
|
}
|
|
person := req.PersonListObject.PersonObject[0]
|
logger.Debug("Receive new person message, ip:%s, device Id:%s personId:%s, appearTime:%s", c.RemoteIP(), person.DeviceID, person.PersonID, person.PersonAppearTime)
|
|
// 如果开启了下级, 身份应该是消息代理, 不再转发到服务器
|
if config.ClientConf.Enable && config.ServeConf.Role == "agent" {
|
go a.Repository.VIIDPersonMsgForward(&req)
|
} else if config.ServeConf.Role == "cascade" {
|
go service.AddPersonNotification(&person)
|
}
|
|
if config.ForwardConf.SyncServer != "" {
|
go a.Repository.PersonForward(req.PersonListObject.PersonObject)
|
}
|
|
rspMsg := vo.ResponseStatus{
|
RequestURL: c.FullPath(),
|
StatusCode: vo.StatusSuccess,
|
StatusString: vo.StatusString[vo.StatusSuccess],
|
Id: person.PersonID,
|
LocalTime: time.Now().Format("20060102150405"),
|
}
|
|
c.JSON(http.StatusOK, gin.H{"ResponseStatusObject": rspMsg})
|
}
|