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). 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, "成功") } // 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) }