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(&params); 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(&params); 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(&params); 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