package controllers
|
|
import (
|
"errors"
|
"github.com/gin-gonic/gin"
|
"gorm.io/gorm"
|
"path"
|
"speechAnalysis/constvar"
|
"speechAnalysis/extend/code"
|
"speechAnalysis/extend/util"
|
"speechAnalysis/models"
|
"speechAnalysis/pkg/logx"
|
"speechAnalysis/request"
|
"speechAnalysis/response"
|
"speechAnalysis/service"
|
"speechAnalysis/utils/upload"
|
"strings"
|
"time"
|
)
|
|
type AudioCtl struct{}
|
|
// Upload
|
// @Tags 音频
|
// @Summary 上传音频
|
// @Produce application/json
|
// @Param file formData file true "音频文件"
|
// @Success 200 {object} util.Response "成功"
|
// @Router /api-sa/v1/audio/upload [post]
|
func (slf AudioCtl) Upload(c *gin.Context) {
|
_, header, err := c.Request.FormFile("file")
|
if err != nil {
|
util.ResponseFormat(c, code.RequestParamError, err.Error())
|
return
|
}
|
|
filename := path.Base(header.Filename)
|
|
arr := strings.Split(filename, "_")
|
if len(arr) != 6 {
|
util.ResponseFormat(c, code.RequestParamError, "文件名称错误")
|
return
|
}
|
|
_, err = models.NewAudioSearch().SetName(filename).First()
|
if err != gorm.ErrRecordNotFound {
|
util.ResponseFormat(c, code.RequestParamError, "重复上传")
|
return
|
}
|
|
oss := upload.NewOss()
|
filePath, filename, uploadErr := oss.UploadFile(header)
|
if uploadErr != nil {
|
logx.Errorf("upload audio err: %v", err)
|
util.ResponseFormat(c, code.RequestParamError, "上传失败")
|
return
|
}
|
|
timeStr := arr[4] + strings.Split(arr[5], ".")[0]
|
|
t, err := time.ParseInLocation("20060102150405", timeStr, time.Local)
|
|
if err != nil {
|
util.ResponseFormat(c, code.RequestParamError, "时间格式不对")
|
return
|
}
|
|
audio := &models.Audio{
|
Name: filename,
|
Size: header.Size,
|
FilePath: filePath,
|
AudioStatus: constvar.AudioStatusUploadOk,
|
LocomotiveNumber: arr[0],
|
TrainNumber: arr[1],
|
DriverNumber: arr[2],
|
Station: arr[3],
|
OccurrenceAt: t,
|
IsFollowed: 0,
|
}
|
|
if err = models.NewAudioSearch().Create(audio); err != nil {
|
util.ResponseFormat(c, code.SaveFail, "上传失败")
|
return
|
}
|
go func() {
|
|
var trainInfoNames = []string{arr[0], arr[1], arr[3]}
|
|
var (
|
info *models.TrainInfo
|
err error
|
parent models.TrainInfo
|
)
|
for i := 0; i < 3; i++ {
|
name := trainInfoNames[i]
|
class := constvar.Class(i + 1)
|
info, err = models.NewTrainInfoSearch().SetName(name).SetClass(class).First()
|
if err == gorm.ErrRecordNotFound {
|
info = &models.TrainInfo{
|
Name: name,
|
Class: class,
|
ParentID: parent.ID,
|
}
|
_ = models.NewTrainInfoSearch().Create(info)
|
}
|
parent = *info
|
}
|
|
}()
|
|
util.ResponseFormat(c, code.Success, "添加成功")
|
}
|
|
func (slf AudioCtl) ParamsCheck(filename string) (err error) {
|
arr := strings.Split(filename, "_")
|
if len(arr) != 6 {
|
return errors.New("文件格式错误")
|
}
|
return nil
|
}
|
|
// TrainInfoList
|
// @Tags 音频
|
// @Summary 获取火车信息
|
// @Produce application/json
|
// @Param object query request.GetTrainInfoList true "参数"
|
// @Success 200 {object} util.ResponseList{data=[]models.TrainInfo} "成功"
|
// @Router /api-sa/v1/audio/trainInfoList [get]
|
func (slf AudioCtl) TrainInfoList(c *gin.Context) {
|
var params request.GetTrainInfoList
|
if err := c.ShouldBindQuery(¶ms); err != nil {
|
util.ResponseFormat(c, code.RequestParamError, err.Error())
|
return
|
}
|
|
if !params.PageInfo.Check() {
|
util.ResponseFormat(c, code.RequestParamError, "分页参数错误")
|
return
|
}
|
|
list, total, err := models.NewTrainInfoSearch().
|
SetPage(params.Page, params.PageSize).
|
SetClass(params.Class).
|
SetParentId(params.ParentID).
|
Find()
|
|
if err != nil {
|
util.ResponseFormat(c, code.RequestParamError, "查找失败")
|
return
|
}
|
|
util.ResponseFormatList(c, code.Success, list, total)
|
}
|
|
// List
|
// @Tags 音频
|
// @Summary 音频分析检索
|
// @Produce application/json
|
// @Param object query request.GetAudioList true "参数"
|
// @Success 200 {object} util.ResponseList{data=[]models.Audio} "成功"
|
// @Router /api-sa/v1/audio/list [get]
|
func (slf AudioCtl) List(c *gin.Context) {
|
var params request.GetAudioList
|
if err := c.ShouldBindQuery(¶ms); err != nil {
|
util.ResponseFormat(c, code.RequestParamError, err.Error())
|
return
|
}
|
|
if !params.PageInfo.Check() {
|
util.ResponseFormat(c, code.RequestParamError, "分页参数错误")
|
return
|
}
|
|
list, total, err := models.NewAudioSearch().
|
SetPage(params.Page, params.PageSize).
|
SetKeyword(params.Keyword).
|
SetLocomotiveNumber(params.LocomotiveNumber).
|
SetTrainNumber(params.TrainNumber).
|
SetDriverNumber(params.DriverNumber).
|
SetStation(params.StationNumber).
|
SetBeginTime(params.BeginTime).
|
SetEndTime(params.EndTime).
|
SetIsFollowed(params.IsFollowed).
|
Find()
|
|
if err != nil {
|
util.ResponseFormat(c, code.RequestParamError, "查找失败")
|
return
|
}
|
|
util.ResponseFormatList(c, code.Success, list, total)
|
}
|
|
// Process
|
// @Tags 音频
|
// @Summary 处理音频
|
// @Produce application/json
|
// @Param object body request.ProcessAudio true "参数"
|
// @Success 200 {object} util.Response "成功"
|
// @Router /api-sa/v1/audio/process [post]
|
func (slf AudioCtl) Process(c *gin.Context) {
|
var params request.ProcessAudio
|
if err := c.ShouldBind(¶ms); err != nil {
|
util.ResponseFormat(c, code.RequestParamError, err.Error())
|
return
|
}
|
|
err := service.Process(params.ID)
|
if err != nil {
|
util.ResponseFormat(c, code.InternalError, err.Error())
|
return
|
}
|
|
util.ResponseFormat(c, code.UpdateSuccess, "成功")
|
}
|
|
// AudioInfo
|
// @Tags 音频
|
// @Summary 音频详情,含解析结果
|
// @Produce application/json
|
// @Param object query request.ProcessAudio true "参数"
|
// @Success 200 {object} util.Response{data=models.Audio} "成功"
|
// @Router /api-sa/v1/audio/info [get]
|
func (slf AudioCtl) AudioInfo(c *gin.Context) {
|
var params request.ProcessAudio
|
if err := c.ShouldBindQuery(¶ms); err != nil {
|
util.ResponseFormat(c, code.RequestParamError, err.Error())
|
return
|
}
|
|
audio, err := models.NewAudioSearch().SetID(params.ID).First()
|
if err != nil {
|
util.ResponseFormat(c, code.InternalError, "请求失败")
|
return
|
}
|
audioText, err := models.NewAudioTextSearch().SetAudioID(audio.ID).First()
|
if err == nil {
|
audio.AudioText = audioText.AudioText
|
}
|
|
util.ResponseFormat(c, code.UpdateSuccess, audio)
|
}
|
|
// AudioDownload
|
// @Tags 音频
|
// @Summary 音频下载
|
// @Produce application/json
|
// @Param object query request.ProcessAudio true "参数"
|
// @Success 200 {object} util.Response{data=models.Audio} "成功"
|
// @Router /api-sa/v1/audio/download [get]
|
func (slf AudioCtl) AudioDownload(c *gin.Context) {
|
var params request.ProcessAudio
|
if err := c.ShouldBindQuery(¶ms); err != nil {
|
util.ResponseFormat(c, code.RequestParamError, err.Error())
|
return
|
}
|
|
audio, err := models.NewAudioSearch().SetID(params.ID).First()
|
if err != nil {
|
util.ResponseFormat(c, code.InternalError, "查询失败")
|
return
|
}
|
|
if audio.FilePath == "" {
|
util.ResponseFormat(c, code.InternalError, "查询失败")
|
return
|
}
|
|
c.Header("Content-Description", "File Transfer")
|
c.Header("Content-Disposition", "attachment; filename="+audio.Name)
|
c.Header("Content-Type", "application/octet-stream")
|
c.File(audio.FilePath)
|
}
|
|
// BatchProcess
|
// @Tags 音频
|
// @Summary 批量处理音频
|
// @Produce application/json
|
// @Param object body request.BatchProcessAudio true "参数"
|
// @Success 200 {object} util.Response "成功"
|
// @Router /api-sa/v1/audio/batchProcess [post]
|
func (slf AudioCtl) BatchProcess(c *gin.Context) {
|
var params request.BatchProcessAudio
|
if err := c.ShouldBind(¶ms); err != nil {
|
util.ResponseFormat(c, code.RequestParamError, err.Error())
|
return
|
}
|
|
var failedNumber int
|
for _, audioID := range params.IDs {
|
err := service.Process(audioID)
|
if err != nil {
|
logx.Errorf("%v,编号: %v", err.Error(), audioID)
|
failedNumber++
|
continue
|
}
|
}
|
|
if failedNumber == 0 {
|
util.ResponseFormat(c, code.UpdateSuccess, "成功")
|
return
|
} else if failedNumber < len(params.IDs) {
|
util.ResponseFormat(c, code.RequestParamError, "部分处理失败")
|
return
|
} else {
|
util.ResponseFormat(c, code.RequestParamError, "全部处理失败")
|
return
|
}
|
}
|
|
// Delete
|
// @Tags 音频
|
// @Summary 删除音频
|
// @Produce application/json
|
// @Param object body request.ProcessAudio true "参数"
|
// @Success 200 {object} util.Response "成功"
|
// @Router /api-sa/v1/audio/delete [delete]
|
func (slf AudioCtl) Delete(c *gin.Context) {
|
var params request.ProcessAudio
|
if err := c.ShouldBind(¶ms); err != nil {
|
util.ResponseFormat(c, code.RequestParamError, err.Error())
|
return
|
}
|
|
err := service.DeleteAudio(params.ID)
|
if err != nil {
|
util.ResponseFormat(c, code.InternalError, err.Error())
|
return
|
}
|
|
util.ResponseFormat(c, code.DeleteSuccess, "成功")
|
}
|
|
// BatchDelete
|
// @Tags 音频
|
// @Summary 批量删除音频
|
// @Produce application/json
|
// @Param object body request.BatchProcessAudio true "参数"
|
// @Success 200 {object} util.Response "成功"
|
// @Router /api-sa/v1/audio/batchDelete [delete]
|
func (slf AudioCtl) BatchDelete(c *gin.Context) {
|
var params request.BatchProcessAudio
|
if err := c.ShouldBind(¶ms); err != nil {
|
util.ResponseFormat(c, code.RequestParamError, err.Error())
|
return
|
}
|
|
err := service.BatchDeleteAudio(params.IDs)
|
if err != nil {
|
util.ResponseFormat(c, code.InternalError, err.Error())
|
return
|
}
|
|
util.ResponseFormat(c, code.DeleteSuccess, "成功")
|
}
|
|
// Follow
|
// @Tags 音频
|
// @Summary 关注/取消关注
|
// @Produce application/json
|
// @Param object body request.FollowReq true "参数"
|
// @Success 200 {object} util.Response{data=response.FollowResp} "成功"
|
// @Router /api-sa/v1/audio/follow [post]
|
func (slf AudioCtl) Follow(c *gin.Context) {
|
var params request.ProcessAudio
|
if err := c.ShouldBind(¶ms); err != nil {
|
util.ResponseFormat(c, code.RequestParamError, err.Error())
|
return
|
}
|
|
followStatus, err := service.Follow(params.ID)
|
if err != nil {
|
util.ResponseFormat(c, code.InternalError, err.Error())
|
return
|
}
|
resp := response.FollowResp{FollowStatus: followStatus}
|
|
util.ResponseFormat(c, code.UpdateSuccess, resp)
|
}
|