From 649b262b570d1c463e927a99eb1ede611da31344 Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期一, 13 五月 2024 11:04:05 +0800 Subject: [PATCH] 批量处理接口,删除接口,批量删除接口 --- request/audio.go | 4 models/audio_text.go | 14 + service/process.go | 56 ++++++ service/audio.go | 39 ++++ models/audio.go | 12 + docs/swagger.yaml | 66 +++++++ controllers/audio.go | 130 +++++++++----- docs/docs.go | 104 +++++++++++ docs/swagger.json | 104 +++++++++++ router/router.go | 11 10 files changed, 487 insertions(+), 53 deletions(-) diff --git a/controllers/audio.go b/controllers/audio.go index afd995d..9ea4502 100644 --- a/controllers/audio.go +++ b/controllers/audio.go @@ -5,7 +5,6 @@ "github.com/gin-gonic/gin" "gorm.io/gorm" "path" - "speechAnalysis/conf" "speechAnalysis/constvar" "speechAnalysis/extend/code" "speechAnalysis/extend/util" @@ -144,54 +143,93 @@ return } - audio, err := models.NewAudioSearch().SetID(params.ID).First() - + err := service.Process(params.ID) if err != nil { - util.ResponseFormat(c, code.RequestParamError, "鏌ユ壘闊抽澶辫触") + util.ResponseFormat(c, code.InternalError, err.Error()) return } - - if audio.AudioStatus != constvar.AudioStatusUploadOk && audio.AudioStatus != constvar.AudioStatusFailed { - util.ResponseFormat(c, code.RequestParamError, "鐘舵�佷笉姝g‘") - return - } - - err = models.NewAudioSearch().SetID(params.ID).UpdateByMap(map[string]interface{}{"audio_status": constvar.AudioStatusProcessing}) - if err != nil { - util.ResponseFormat(c, code.RequestParamError, "澶勭悊澶辫触") - return - } - - go func() { - resp, err := service.AnalysisAudio(audio.FilePath, conf.AanlysisConf.Url) - if err != nil { - logx.Errorf("err when AnalysisAudio:%v", err) - _ = models.NewAudioSearch().SetID(params.ID).UpdateByMap(map[string]interface{}{"audio_status": constvar.AudioStatusFailed}) - return - } - if resp.Code != 0 { - logx.Errorf("AnalysisAudio error return:%v", resp) - _ = models.NewAudioSearch().SetID(params.ID).UpdateByMap(map[string]interface{}{"audio_status": constvar.AudioStatusFailed}) - return - } - logx.Infof("AnalysisAudio result: %v", resp) - err = models.WithTransaction(func(db *gorm.DB) error { - err = models.NewAudioSearch().SetID(params.ID).UpdateByMap(map[string]interface{}{"audio_status": constvar.AudioStatusFinish}) - if err != nil { - return err - } - err = models.NewAudioTextSearch().Save(&models.AudioText{ - AudioID: audio.ID, - AudioText: resp.Result, - Score: resp.Score, - }) - return err - }) - if err != nil { - logx.Infof("AnalysisAudio success but update record failed: %v", err) - 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 [post] +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 [post] +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, "鎴愬姛") +} diff --git a/docs/docs.go b/docs/docs.go index 54c68e1..d16d13e 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -16,6 +16,96 @@ "host": "{{.Host}}", "basePath": "{{.BasePath}}", "paths": { + "/api-sa/v1/audio/batchDelete": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "闊抽" + ], + "summary": "鎵归噺鍒犻櫎闊抽", + "parameters": [ + { + "description": "闊抽淇℃伅", + "name": "object", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.BatchProcessAudio" + } + } + ], + "responses": { + "200": { + "description": "鎴愬姛", + "schema": { + "$ref": "#/definitions/util.Response" + } + } + } + } + }, + "/api-sa/v1/audio/batchProcess": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "闊抽" + ], + "summary": "鎵归噺澶勭悊闊抽", + "parameters": [ + { + "description": "闊抽淇℃伅", + "name": "object", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.BatchProcessAudio" + } + } + ], + "responses": { + "200": { + "description": "鎴愬姛", + "schema": { + "$ref": "#/definitions/util.Response" + } + } + } + } + }, + "/api-sa/v1/audio/delete": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "闊抽" + ], + "summary": "鍒犻櫎闊抽", + "parameters": [ + { + "description": "闊抽淇℃伅", + "name": "object", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.ProcessAudio" + } + } + ], + "responses": { + "200": { + "description": "鎴愬姛", + "schema": { + "$ref": "#/definitions/util.Response" + } + } + } + } + }, "/api-sa/v1/audio/list": { "get": { "produces": [ @@ -265,6 +355,20 @@ } } }, + "request.BatchProcessAudio": { + "type": "object", + "required": [ + "ids" + ], + "properties": { + "ids": { + "type": "array", + "items": { + "type": "integer" + } + } + } + }, "request.ProcessAudio": { "type": "object", "required": [ diff --git a/docs/swagger.json b/docs/swagger.json index 3dca8ac..42ab712 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -4,6 +4,96 @@ "contact": {} }, "paths": { + "/api-sa/v1/audio/batchDelete": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "闊抽" + ], + "summary": "鎵归噺鍒犻櫎闊抽", + "parameters": [ + { + "description": "闊抽淇℃伅", + "name": "object", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.BatchProcessAudio" + } + } + ], + "responses": { + "200": { + "description": "鎴愬姛", + "schema": { + "$ref": "#/definitions/util.Response" + } + } + } + } + }, + "/api-sa/v1/audio/batchProcess": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "闊抽" + ], + "summary": "鎵归噺澶勭悊闊抽", + "parameters": [ + { + "description": "闊抽淇℃伅", + "name": "object", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.BatchProcessAudio" + } + } + ], + "responses": { + "200": { + "description": "鎴愬姛", + "schema": { + "$ref": "#/definitions/util.Response" + } + } + } + } + }, + "/api-sa/v1/audio/delete": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "闊抽" + ], + "summary": "鍒犻櫎闊抽", + "parameters": [ + { + "description": "闊抽淇℃伅", + "name": "object", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.ProcessAudio" + } + } + ], + "responses": { + "200": { + "description": "鎴愬姛", + "schema": { + "$ref": "#/definitions/util.Response" + } + } + } + } + }, "/api-sa/v1/audio/list": { "get": { "produces": [ @@ -253,6 +343,20 @@ } } }, + "request.BatchProcessAudio": { + "type": "object", + "required": [ + "ids" + ], + "properties": { + "ids": { + "type": "array", + "items": { + "type": "integer" + } + } + } + }, "request.ProcessAudio": { "type": "object", "required": [ diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 8a88041..34715bd 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -77,6 +77,15 @@ updatedAt: type: string type: object + request.BatchProcessAudio: + properties: + ids: + items: + type: integer + type: array + required: + - ids + type: object request.ProcessAudio: properties: id: @@ -109,6 +118,63 @@ info: contact: {} paths: + /api-sa/v1/audio/batchDelete: + post: + parameters: + - description: 闊抽淇℃伅 + in: body + name: object + required: true + schema: + $ref: '#/definitions/request.BatchProcessAudio' + produces: + - application/json + responses: + "200": + description: 鎴愬姛 + schema: + $ref: '#/definitions/util.Response' + summary: 鎵归噺鍒犻櫎闊抽 + tags: + - 闊抽 + /api-sa/v1/audio/batchProcess: + post: + parameters: + - description: 闊抽淇℃伅 + in: body + name: object + required: true + schema: + $ref: '#/definitions/request.BatchProcessAudio' + produces: + - application/json + responses: + "200": + description: 鎴愬姛 + schema: + $ref: '#/definitions/util.Response' + summary: 鎵归噺澶勭悊闊抽 + tags: + - 闊抽 + /api-sa/v1/audio/delete: + post: + parameters: + - description: 闊抽淇℃伅 + in: body + name: object + required: true + schema: + $ref: '#/definitions/request.ProcessAudio' + produces: + - application/json + responses: + "200": + description: 鎴愬姛 + schema: + $ref: '#/definitions/util.Response' + summary: 鍒犻櫎闊抽 + tags: + - 闊抽 /api-sa/v1/audio/list: get: parameters: diff --git a/models/audio.go b/models/audio.go index 5688134..313f379 100644 --- a/models/audio.go +++ b/models/audio.go @@ -32,6 +32,7 @@ PageSize int Orm *gorm.DB Keyword string + IDs []uint } ) @@ -68,6 +69,11 @@ func (slf *AudioSearch) SetID(id uint) *AudioSearch { slf.ID = id + return slf +} + +func (slf *AudioSearch) SetIDs(ids []uint) *AudioSearch { + slf.IDs = ids return slf } @@ -134,6 +140,10 @@ db = db.Where("station_number like ?", slf.StationNumber) } + if len(slf.IDs) > 0 { + db = db.Where("id in ?", slf.IDs) + } + return db } @@ -196,7 +206,7 @@ func (slf *AudioSearch) Delete() error { var db = slf.build() - if err := db.Unscoped().Delete(&Audio{}).Error; err != nil { + if err := db.Delete(&Audio{}).Error; err != nil { return err } diff --git a/models/audio_text.go b/models/audio_text.go index e4ad793..e5e1f36 100644 --- a/models/audio_text.go +++ b/models/audio_text.go @@ -21,6 +21,7 @@ PageNum int PageSize int Orm *gorm.DB + AudioIDs []uint } ) @@ -51,6 +52,11 @@ return slf } +func (slf *AudioTextSearch) SetAudioIDs(ids []uint) *AudioTextSearch { + slf.AudioIDs = ids + return slf +} + func (slf *AudioTextSearch) build() *gorm.DB { var db = slf.Orm.Table(slf.TableName()) @@ -60,6 +66,10 @@ if slf.Order != "" { db = db.Order(slf.Order) + } + + if len(slf.AudioIDs) > 0 { + db = db.Where("audio_id in ?", slf.AudioIDs) } return db @@ -90,7 +100,7 @@ func (slf *AudioTextSearch) Save(record *AudioText) error { var db = slf.build() - if err := db.Omit("CreatedAt").Save(record).Error; err != nil { + if err := db.Save(record).Error; err != nil { return fmt.Errorf("save err: %v, record: %+v", err, record) } @@ -124,7 +134,7 @@ func (slf *AudioTextSearch) Delete() error { var db = slf.build() - if err := db.Unscoped().Delete(&AudioText{}).Error; err != nil { + if err := db.Delete(&AudioText{}).Error; err != nil { return err } diff --git a/request/audio.go b/request/audio.go index afd75d5..41cc415 100644 --- a/request/audio.go +++ b/request/audio.go @@ -12,3 +12,7 @@ type ProcessAudio struct { ID uint `json:"id" binding:"required"` } + +type BatchProcessAudio struct { + IDs []uint `json:"ids" binding:"required"` +} diff --git a/router/router.go b/router/router.go index 811d663..6ab95fb 100644 --- a/router/router.go +++ b/router/router.go @@ -21,13 +21,16 @@ urlPrefix := "/api-sa/v1" - // 缁勭粐绠$悊 + // 闊抽绠$悊 AudioCtl := new(controllers.AudioCtl) organizeAPI := r.Group(urlPrefix + "/audio") { - organizeAPI.POST("upload", AudioCtl.Upload) // 涓婁紶闊抽 - organizeAPI.GET("list", AudioCtl.List) // 闊抽妫�绱� - organizeAPI.POST("process", AudioCtl.Process) // 闊抽澶勭悊 + organizeAPI.POST("upload", AudioCtl.Upload) // 涓婁紶闊抽 + organizeAPI.GET("list", AudioCtl.List) // 闊抽妫�绱� + organizeAPI.POST("process", AudioCtl.Process) // 闊抽澶勭悊 + organizeAPI.POST("batchProcess", AudioCtl.BatchProcess) // 闊抽鎵归噺澶勭悊 + organizeAPI.POST("delete", AudioCtl.Delete) // 闊抽鍒犻櫎 + organizeAPI.POST("batchDelete", AudioCtl.BatchDelete) // 闊抽鎵归噺鍒犻櫎 } return r diff --git a/service/audio.go b/service/audio.go new file mode 100644 index 0000000..fa30810 --- /dev/null +++ b/service/audio.go @@ -0,0 +1,39 @@ +package service + +import ( + "errors" + "gorm.io/gorm" + "speechAnalysis/models" + "speechAnalysis/pkg/logx" +) + +func DeleteAudio(audioId uint) (err error) { + err = models.WithTransaction(func(db *gorm.DB) error { + if err := models.NewAudioSearch().SetID(audioId).Delete(); err != nil { + return err + } + return models.NewAudioTextSearch().SetAudioID(audioId).Delete() + }) + if err != nil { + logx.Errorf("delete audio err: %v", err) + return errors.New("DB閿欒") + } + return nil +} + +func BatchDeleteAudio(audioIds []uint) (err error) { + if len(audioIds) == 0 { + return nil + } + err = models.WithTransaction(func(db *gorm.DB) error { + if err := models.NewAudioSearch().SetIDs(audioIds).Delete(); err != nil { + return err + } + return models.NewAudioTextSearch().SetAudioIDs(audioIds).Delete() + }) + if err != nil { + logx.Errorf("delete audio err: %v", err) + return errors.New("DB閿欒") + } + return nil +} diff --git a/service/process.go b/service/process.go index c9413c0..50bf7eb 100644 --- a/service/process.go +++ b/service/process.go @@ -3,10 +3,16 @@ import ( "bytes" "encoding/json" + "errors" + "gorm.io/gorm" "io" "mime/multipart" "net/http" "os" + "speechAnalysis/conf" + "speechAnalysis/constvar" + "speechAnalysis/models" + "speechAnalysis/pkg/logx" ) // Response 缁撴瀯浣撶敤浜庡瓨鍌ㄥ搷搴斾綋鐨勫唴瀹� @@ -74,3 +80,53 @@ return } + +func Process(audioId uint) (err error) { + audio, err := models.NewAudioSearch().SetID(audioId).First() + + if err != nil { + return errors.New("鏌ユ壘闊抽澶辫触") + } + + if audio.AudioStatus != constvar.AudioStatusUploadOk && audio.AudioStatus != constvar.AudioStatusFailed { + return errors.New("鐘舵�佷笉姝g‘") + } + + err = models.NewAudioSearch().SetID(audioId).UpdateByMap(map[string]interface{}{"audio_status": constvar.AudioStatusProcessing}) + if err != nil { + return errors.New("DB閿欒") + } + + go func() { + resp, err := AnalysisAudio(audio.FilePath, conf.AanlysisConf.Url) + if err != nil { + logx.Errorf("err when AnalysisAudio:%v", err) + _ = models.NewAudioSearch().SetID(audioId).UpdateByMap(map[string]interface{}{"audio_status": constvar.AudioStatusFailed}) + return + } + if resp.Code != 0 { + logx.Errorf("AnalysisAudio error return:%v", resp) + _ = models.NewAudioSearch().SetID(audioId).UpdateByMap(map[string]interface{}{"audio_status": constvar.AudioStatusFailed}) + return + } + logx.Infof("AnalysisAudio result: %v", resp) + err = models.WithTransaction(func(db *gorm.DB) error { + err = models.NewAudioSearch().SetID(audioId).UpdateByMap(map[string]interface{}{"audio_status": constvar.AudioStatusFinish}) + if err != nil { + return err + } + err = models.NewAudioTextSearch().Save(&models.AudioText{ + AudioID: audio.ID, + AudioText: resp.Result, + Score: resp.Score, + }) + return err + }) + if err != nil { + logx.Infof("AnalysisAudio success but update record failed: %v", err) + return + } + }() + + return nil +} -- Gitblit v1.8.0