Browse Source

fix:新增章节的音频上传接口

Roc 9 months ago
parent
commit
d1dfec4b47

+ 223 - 0
controllers/report_chapter.go

@@ -7,7 +7,12 @@ import (
 	"eta/eta_api/models/smart_report"
 	"eta/eta_api/models/smart_report"
 	"eta/eta_api/services"
 	"eta/eta_api/services"
 	"eta/eta_api/utils"
 	"eta/eta_api/utils"
+	"fmt"
+	"github.com/kgiannakakis/mp3duration/src/mp3duration"
 	"html"
 	"html"
+	"io/ioutil"
+	"os"
+	"path"
 	"strconv"
 	"strconv"
 	"time"
 	"time"
 )
 )
@@ -534,6 +539,13 @@ func (this *ReportController) GetReportChapterList() {
 		return
 		return
 	}
 	}
 
 
+	reportInfo, err := models.GetReportByReportId(reportId)
+	if err != nil {
+		br.Msg = "获取报告信息失败"
+		br.ErrMsg = "获取报告信息失败, Err: " + err.Error()
+		return
+	}
+
 	// 获取章节列表
 	// 获取章节列表
 	chapterList, err := models.GetChapterListByReportId(reportId)
 	chapterList, err := models.GetChapterListByReportId(reportId)
 	if err != nil {
 	if err != nil {
@@ -687,6 +699,9 @@ func (this *ReportController) GetReportChapterList() {
 					tmpChapterItem.Editor = markStatus.Editor
 					tmpChapterItem.Editor = markStatus.Editor
 				}
 				}
 
 
+				// 报告章节的操作权限
+				tmpChapterItem.IsAuth = services.CheckChapterAuthByAdminIdList(sysUser.AdminId, reportInfo.AdminId, tmpChapterIdGrandList)
+
 				resp = append(resp, tmpChapterItem)
 				resp = append(resp, tmpChapterItem)
 			}
 			}
 		}
 		}
@@ -1018,3 +1033,211 @@ func (this *ReportController) GetSunCode() {
 	br.Success = true
 	br.Success = true
 	br.Msg = "操作成功"
 	br.Msg = "操作成功"
 }
 }
+
+// VoiceUpload
+// @Title 音频上传
+// @Description 音频上传接口
+// @Param   file   query   file  true       "文件"
+// @Param   ReportId   query   int  true       "报告ID"
+// @Param   ReportChapterId   query   int  true       "报告章节ID"
+// @Success Ret=200 上传成功
+// @router /chapter/voice/upload [post]
+func (this *ReportController) VoiceUpload() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	f, h, err := this.GetFile("file")
+	if err != nil {
+		br.Msg = "获取资源信息失败"
+		br.ErrMsg = "获取资源信息失败,Err:" + err.Error()
+		return
+	}
+
+	// 报告章节id
+	reportChapterId, err := this.GetInt("ReportChapterId", 0)
+	if err != nil {
+		br.Msg = "报告章节ID异常"
+		br.ErrMsg = "报告章节ID异常,Err:" + err.Error()
+		return
+	}
+
+	// 报告章节信息
+	reportChapterInfo, err := models.GetReportChapterInfoById(reportChapterId)
+	if err != nil {
+		br.Msg = "获取报告章节信息失败"
+		br.ErrMsg = "获取报告章节信息失败,Err:" + err.Error()
+		return
+	}
+
+	// 报告信息
+	reportInfo, err := models.GetReportByReportId(reportChapterInfo.ReportId)
+	if err != nil {
+		br.Msg = "获取报告信息失败"
+		br.ErrMsg = "获取报告信息失败,Err:" + err.Error()
+		return
+	}
+
+	// 如果不是自己创建的报告,那么要去校验是否属于授权用户
+	if this.SysUser.AdminId == reportInfo.AdminId {
+		isAuth, err := services.CheckChapterAuthByReportChapterInfo(this.SysUser.AdminId, reportChapterInfo)
+		if err != nil {
+			br.Msg = "获取报告权限失败"
+			br.ErrMsg = "获取报告权限失败,Err:" + err.Error()
+			return
+		}
+		if !isAuth {
+			br.Msg = "无操作权限"
+			br.ErrMsg = "无操作权限"
+			return
+		}
+	}
+
+	ext := path.Ext(h.Filename)
+	dateDir := time.Now().Format("20060102")
+	uploadDir := utils.STATIC_DIR + "hongze/" + dateDir
+	err = os.MkdirAll(uploadDir, utils.DIR_MOD)
+	if err != nil {
+		br.Msg = "存储目录创建失败"
+		br.ErrMsg = "存储目录创建失败,Err:" + err.Error()
+		return
+	}
+	randStr := utils.GetRandStringNoSpecialChar(28)
+	fileName := randStr + ext
+	fpath := uploadDir + "/" + fileName
+	defer f.Close() //关闭上传文件
+	err = this.SaveToFile("file", fpath)
+	if err != nil {
+		br.Msg = "文件上传失败"
+		br.ErrMsg = "文件上传失败,Err:" + err.Error()
+		return
+	}
+
+	resourceUrl := ``
+	//上传到阿里云 和 minio
+	//if utils.ObjectStorageClient == "minio" {
+	//	resourceUrl, err = services.UploadAudioToMinIo(fileName, fpath)
+	//	if err != nil {
+	//		br.Msg = "文件上传失败"
+	//		br.ErrMsg = "文件上传失败,Err:" + err.Error()
+	//		return
+	//	}
+	//} else {
+	//	resourceUrl, err = services.UploadAudioAliyun(fileName, fpath)
+	//	if err != nil {
+	//		br.Msg = "文件上传失败"
+	//		br.ErrMsg = "文件上传失败,Err:" + err.Error()
+	//		return
+	//	}
+	//}
+	ossClient := services.NewOssClient()
+	if ossClient == nil {
+		br.Msg = "上传失败"
+		br.ErrMsg = "初始化OSS服务失败"
+		return
+	}
+	resourceUrl, err = ossClient.UploadFile(fileName, fpath, "")
+	if err != nil {
+		br.Msg = "文件上传失败"
+		br.ErrMsg = "文件上传失败,Err:" + err.Error()
+		return
+	}
+
+	defer func() {
+		os.Remove(fpath)
+	}()
+	item := new(models.Resource)
+	item.ResourceUrl = resourceUrl
+	item.ResourceType = 2
+	item.CreateTime = time.Now()
+	newId, err := models.AddResource(item)
+	if err != nil {
+		br.Msg = "资源上传失败"
+		br.ErrMsg = "资源上传失败,Err:" + err.Error()
+		return
+	}
+
+	var playSeconds float64
+	playSeconds, err = mp3duration.Calculate(fpath)
+	if playSeconds <= 0 {
+		playSeconds, err = utils.GetVideoPlaySeconds(fpath)
+		if err != nil {
+			br.Msg = "获取音频时间失败"
+			br.ErrMsg = "获取音频时间失败,Err:" + err.Error()
+			return
+		}
+	}
+
+	fileBody, err := ioutil.ReadFile(fpath)
+	videoSize := len(fileBody)
+	sizeFloat := (float64(videoSize) / float64(1024)) / float64(1024)
+	sizeStr := utils.SubFloatToFloatStr(sizeFloat, 2)
+
+	if reportChapterId > 0 {
+		reportChapterCreateTime, err := time.Parse(utils.FormatDateTime, reportChapterInfo.CreateTime)
+		if err != nil {
+			br.Msg = "上传失败"
+			br.ErrMsg = "上传失败,Err:" + err.Error()
+			return
+		}
+		createTimeStr := reportChapterCreateTime.Format("0102")
+		videoName := reportChapterInfo.Title + "(" + createTimeStr + ")"
+
+		reportChapterInfo.VideoUrl = resourceUrl
+		reportChapterInfo.VideoName = videoName
+		reportChapterInfo.VideoPlaySeconds = fmt.Sprint(playSeconds)
+		reportChapterInfo.VideoSize = sizeStr
+		reportChapterInfo.LastModifyAdminId = this.SysUser.AdminId
+		reportChapterInfo.LastModifyAdminName = this.SysUser.RealName
+		reportChapterInfo.ModifyTime = time.Now()
+		err = reportChapterInfo.UpdateChapter([]string{"VideoUrl", "VideoName", "VideoPlaySeconds", "VideoSize", "LastModifyAdminId", "LastModifyAdminName", "ModifyTime"})
+		if err != nil {
+			br.Msg = "上传失败"
+			br.ErrMsg = "修改报告章节的音频信息失败,Err:" + err.Error()
+			return
+		}
+
+		reportInfo.LastModifyAdminId = this.SysUser.AdminId
+		reportInfo.LastModifyAdminName = this.SysUser.RealName
+		reportInfo.ModifyTime = time.Now()
+		err = reportInfo.UpdateReport([]string{"LastModifyAdminId", "LastModifyAdminName", "ModifyTime"})
+		if err != nil {
+			br.Msg = "上传失败"
+			br.ErrMsg = "修改报告最后更新人信息失败,Err:" + err.Error()
+			return
+		}
+	} else {
+		reportCreateTime, err := time.Parse(utils.FormatDateTime, reportInfo.CreateTime)
+		if err != nil {
+			br.Msg = "上传失败"
+			br.ErrMsg = "上传失败,Err:" + err.Error()
+			return
+		}
+		createTimeStr := reportCreateTime.Format("0102")
+		videoName := reportInfo.Title + "(" + createTimeStr + ")"
+
+		reportInfo.VideoUrl = resourceUrl
+		reportInfo.VideoName = videoName
+		reportInfo.VideoPlaySeconds = fmt.Sprint(playSeconds)
+		reportInfo.VideoSize = sizeStr
+		reportInfo.LastModifyAdminId = this.SysUser.AdminId
+		reportInfo.LastModifyAdminName = this.SysUser.RealName
+		reportInfo.ModifyTime = time.Now()
+		err = reportInfo.UpdateReport([]string{"VideoUrl", "VideoName", "VideoPlaySeconds", "VideoSize", "LastModifyAdminId", "LastModifyAdminName", "ModifyTime"})
+		if err != nil {
+			br.Msg = "上传失败"
+			br.ErrMsg = "修改报告的音频信息失败,Err:" + err.Error()
+			return
+		}
+	}
+
+	resp := new(models.ResourceResp)
+	resp.Id = newId
+	resp.ResourceUrl = resourceUrl
+	br.Msg = "上传成功"
+	br.Ret = 200
+	br.Success = true
+	br.Data = resp
+	return
+}

+ 27 - 8
controllers/voice.go

@@ -47,7 +47,7 @@ func (this *VoiceController) Upload() {
 		br.ErrMsg = "获取资源信息失败,Err:" + err.Error()
 		br.ErrMsg = "获取资源信息失败,Err:" + err.Error()
 		return
 		return
 	}
 	}
-	report, err := models.GetReportItemById(reportId)
+	reportInfo, err := models.GetReportByReportId(reportId)
 	if err != nil {
 	if err != nil {
 		br.Msg = "获取报告信息失败"
 		br.Msg = "获取报告信息失败"
 		br.ErrMsg = "获取报告信息失败,Err:" + err.Error()
 		br.ErrMsg = "获取报告信息失败,Err:" + err.Error()
@@ -128,20 +128,39 @@ func (this *VoiceController) Upload() {
 			return
 			return
 		}
 		}
 	}
 	}
-	createTime := report.CreateTime.Format("0102")
-	videoName := report.Title + "(" + createTime + ")"
 
 
 	fileBody, err := ioutil.ReadFile(fpath)
 	fileBody, err := ioutil.ReadFile(fpath)
 	videoSize := len(fileBody)
 	videoSize := len(fileBody)
 	sizeFloat := (float64(videoSize) / float64(1024)) / float64(1024)
 	sizeFloat := (float64(videoSize) / float64(1024)) / float64(1024)
 	sizeStr := utils.SubFloatToFloatStr(sizeFloat, 2)
 	sizeStr := utils.SubFloatToFloatStr(sizeFloat, 2)
 
 
-	err = models.ModifyReportVideo(reportId, resourceUrl, videoName, sizeStr, playSeconds)
-	if err != nil {
-		br.Msg = "上传失败"
-		br.ErrMsg = "上传失败,Err:" + err.Error()
-		return
+	// 修改报告的音频信息
+	{
+		reportCreateTime, err := time.Parse(utils.FormatDateTime, reportInfo.CreateTime)
+		if err != nil {
+			br.Msg = "上传失败"
+			br.ErrMsg = "上传失败,Err:" + err.Error()
+			return
+		}
+
+		createTimeStr := reportCreateTime.Format("0102")
+		videoName := reportInfo.Title + "(" + createTimeStr + ")"
+
+		reportInfo.VideoUrl = resourceUrl
+		reportInfo.VideoName = videoName
+		reportInfo.VideoPlaySeconds = fmt.Sprint(playSeconds)
+		reportInfo.VideoSize = sizeStr
+		reportInfo.LastModifyAdminId = this.SysUser.AdminId
+		reportInfo.LastModifyAdminName = this.SysUser.RealName
+		reportInfo.ModifyTime = time.Now()
+		err = reportInfo.UpdateReport([]string{"VideoUrl", "VideoName", "VideoPlaySeconds", "VideoSize", "LastModifyAdminId", "LastModifyAdminName", "ModifyTime"})
+		if err != nil {
+			br.Msg = "上传失败"
+			br.ErrMsg = "修改报告的音频信息失败,Err:" + err.Error()
+			return
+		}
 	}
 	}
+
 	resp := new(models.ResourceResp)
 	resp := new(models.ResourceResp)
 	resp.Id = newId
 	resp.Id = newId
 	resp.ResourceUrl = resourceUrl
 	resp.ResourceUrl = resourceUrl

+ 2 - 0
models/report.go

@@ -344,6 +344,8 @@ type ReportDetail struct {
 	ThsMsgIsSend       int    `description:"客户群消息是否已发送,0:否,1:是"`
 	ThsMsgIsSend       int    `description:"客户群消息是否已发送,0:否,1:是"`
 	HasChapter         int    `description:"是否有章节 0-否 1-是"`
 	HasChapter         int    `description:"是否有章节 0-否 1-是"`
 	ChapterType        string `description:"章节类型 day-晨报 week-周报"`
 	ChapterType        string `description:"章节类型 day-晨报 week-周报"`
+	AdminId            int    `description:"创建者账号"`
+	AdminRealName      string `description:"创建者姓名"`
 
 
 	// eta1.8.3(研报改版)相关内容
 	// eta1.8.3(研报改版)相关内容
 	ContentStruct       string    `description:"内容组件"`
 	ContentStruct       string    `description:"内容组件"`

+ 1 - 0
models/report_chapter.go

@@ -95,6 +95,7 @@ type ReportChapterResp struct {
 	PermissionIdList []int  `description:"关联的品种id列表"`
 	PermissionIdList []int  `description:"关联的品种id列表"`
 	CanEdit          bool   `description:"是否可编辑"`
 	CanEdit          bool   `description:"是否可编辑"`
 	Editor           string `description:"编辑人"`
 	Editor           string `description:"编辑人"`
+	IsAuth           bool   `description:"是否有权限"`
 }
 }
 
 
 // GetChapterListByReportId 根据ReportId获取章节列表
 // GetChapterListByReportId 根据ReportId获取章节列表

+ 9 - 0
routers/commentsRouter.go

@@ -7846,6 +7846,15 @@ func init() {
             Filters: nil,
             Filters: nil,
             Params: nil})
             Params: nil})
 
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers:ReportController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:ReportController"],
+        beego.ControllerComments{
+            Method: "VoiceUpload",
+            Router: `/chapter/voice/upload`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers:ReportController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:ReportController"],
     beego.GlobalControllerRouter["eta/eta_api/controllers:ReportController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:ReportController"],
         beego.ControllerComments{
         beego.ControllerComments{
             Method: "ClassifyIdDetail",
             Method: "ClassifyIdDetail",

+ 50 - 1
services/report_chapter.go

@@ -2,6 +2,7 @@ package services
 
 
 import (
 import (
 	"eta/eta_api/models"
 	"eta/eta_api/models"
+	"eta/eta_api/models/report"
 	"eta/eta_api/utils"
 	"eta/eta_api/utils"
 	"fmt"
 	"fmt"
 	"time"
 	"time"
@@ -158,7 +159,7 @@ func moveReportChapter(reportChapter, prevReportChapter, nextReportChapter *mode
 
 
 	//更新
 	//更新
 	if len(updateCol) > 0 {
 	if len(updateCol) > 0 {
-		err = reportChapter.Update(updateCol)
+		err = reportChapter.UpdateChapter(updateCol)
 		if err != nil {
 		if err != nil {
 			errMsg = "移动失败"
 			errMsg = "移动失败"
 			err = fmt.Errorf("修改失败,Err:" + err.Error())
 			err = fmt.Errorf("修改失败,Err:" + err.Error())
@@ -167,3 +168,51 @@ func moveReportChapter(reportChapter, prevReportChapter, nextReportChapter *mode
 	}
 	}
 	return
 	return
 }
 }
+
+// CheckChapterAuthByAdminIdList
+// @Description: 根据管理员id列表,判断当前用户是否有章节权限
+// @author: Roc
+// @datetime 2024-06-13 11:03:10
+// @param adminId int
+// @param createAdminId int
+// @param grantAdminIdList []int
+// @return isAuth bool
+func CheckChapterAuthByAdminIdList(adminId, createAdminId int, grantAdminIdList []int) (isAuth bool) {
+	// 如果是自己创建的报告,那么就有权限
+	if adminId == createAdminId {
+		isAuth = true
+		return
+	}
+	// 如果是授权用户,那么就有权限
+	if utils.IsCheckInList(grantAdminIdList, adminId) {
+		isAuth = true
+		return
+	}
+
+	return
+}
+
+// CheckChapterAuthByReportChapterInfo
+// @Description: 根据报告章节信息,判断当前用户是否有章节权限
+// @author: Roc
+// @datetime 2024-06-13 11:10:46
+// @param adminId int
+// @param reportChapterInfo *models.ReportChapter
+// @return isAuth bool
+// @return err error
+func CheckChapterAuthByReportChapterInfo(adminId int, reportChapterInfo *models.ReportChapter) (isAuth bool, err error) {
+	chapterGrantObj := report.ReportChapterGrant{}
+	chapterGrantList, err := chapterGrantObj.GetGrantListById(reportChapterInfo.ReportChapterId)
+	if err != nil {
+		return
+	}
+
+	for _, v := range chapterGrantList {
+		if v.AdminId == adminId {
+			isAuth = true
+			return
+		}
+	}
+
+	return
+}

+ 9 - 0
services/report_v2.go

@@ -167,6 +167,15 @@ func EditReport(reportInfo *models.Report, req models.EditReq, sysUser *system.A
 
 
 	updateCols := []string{"ClassifyIdFirst", "ClassifyNameFirst", "ClassifyIdSecond", "ClassifyNameSecond", "ClassifyIdThird", "ClassifyNameThird", "Title", "Abstract", "Author", "Frequency", "Stage", "CreateTime", "IsPublicPublish", "LastModifyAdminId", "LastModifyAdminName", "ModifyTime"}
 	updateCols := []string{"ClassifyIdFirst", "ClassifyNameFirst", "ClassifyIdSecond", "ClassifyNameSecond", "ClassifyIdThird", "ClassifyNameThird", "Title", "Abstract", "Author", "Frequency", "Stage", "CreateTime", "IsPublicPublish", "LastModifyAdminId", "LastModifyAdminName", "ModifyTime"}
 
 
+	if req.HeadResourceId > 0 {
+		reportInfo.HeadResourceId = req.HeadResourceId
+		updateCols = append(updateCols, "HeadResourceId")
+	}
+	if req.EndResourceId > 0 {
+		reportInfo.EndResourceId = req.EndResourceId
+		updateCols = append(updateCols, "EndResourceId")
+	}
+
 	// 需要添加的报告授权数据
 	// 需要添加的报告授权数据
 	addReportAdminList := make([]*report.ReportGrant, 0)
 	addReportAdminList := make([]*report.ReportGrant, 0)
 	// 待移除的报告授权数据id
 	// 待移除的报告授权数据id