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