Browse Source

中英文PPT新增编辑人编辑中

hsun 1 year ago
parent
commit
d16cef3313
7 changed files with 319 additions and 22 deletions
  1. 103 10
      controllers/ppt_english.go
  2. 105 7
      controllers/ppt_v2.go
  3. 16 3
      models/ppt_english/ppt_english.go
  4. 15 2
      models/ppt_v2.go
  5. 18 0
      routers/commentsRouter.go
  6. 60 0
      services/ppt.go
  7. 2 0
      utils/constants.go

+ 103 - 10
controllers/ppt_english.go

@@ -359,9 +359,19 @@ func (this *PptEnglishController) DeletePpt() {
 func (this *PptEnglishController) DetailPpt() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
 	pptId, _ := this.GetInt("PptId")
 
 	pptInfo, err := ppt_english.GetPptEnglishById(pptId)
@@ -371,10 +381,21 @@ func (this *PptEnglishController) DetailPpt() {
 		return
 	}
 
+	// 查询编辑中
+	editor, e := services.UpdatePptEditing(pptId, 0, sysUser.AdminId, sysUser.RealName, true)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "更新编辑状态失败, err: " + e.Error()
+		return
+	}
+	resp := new(ppt_english.EnglishPPTDetailResp)
+	resp.PptEnglish = pptInfo
+	resp.Editor = editor
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
-	br.Data = pptInfo
+	br.Data = resp
 }
 
 // DownloadPptx
@@ -574,9 +595,19 @@ func (this *PptEnglishController) PptUpload() {
 func (this *PptEnglishController) SaveLog() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
 	var req ppt_english.AddPptEnglishReq
 	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
 	if err != nil {
@@ -603,17 +634,26 @@ func (this *PptEnglishController) SaveLog() {
 	}
 
 	//变更ppt内容
-	_, err = ppt_english.GetPptEnglishById(int(req.PptId))
-	if err != nil {
-		br.Msg = "信息获取失败"
-		br.ErrMsg = "信息获取失败,Err:" + err.Error()
-		if err.Error() == utils.ErrNoRow() {
-			br.Msg = "PPT已删除"
-			br.ErrMsg = "PPT已删除"
-			br.IsSendEmail = false
+	pptItem, e := ppt_english.GetPptEnglishById(int(req.PptId))
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "PPT已被删除, 请刷新页面"
+			return
 		}
+		br.Msg = "信息获取失败"
+		br.ErrMsg = "信息获取失败,Err:" + e.Error()
 		return
 	}
+
+	// 标记编辑状态
+	if pptItem.PptId > 0 {
+		_, e = services.UpdatePptEditing(pptItem.PptId, 1, sysUser.AdminId, sysUser.RealName, true)
+		if e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "更新编辑状态失败, err: " + e.Error()
+			return
+		}
+	}
 	//pptInfo.TemplateType = req.FirstPage.TemplateType
 	//pptInfo.BackgroundImg = req.FirstPage.ImgUrl
 	//pptInfo.Title = req.FirstPage.Title
@@ -638,7 +678,9 @@ func (this *PptEnglishController) SaveLog() {
 	}
 	_, err = ppt_english.AddPptEnglishSaveLog(logInfo)
 	if err != nil {
-
+		br.Msg = "保存失败"
+		br.ErrMsg = "保存PPT日志失败, Err: " + err.Error()
+		return
 	}
 	br.Ret = 200
 	br.Success = true
@@ -935,3 +977,54 @@ func (this *PptEnglishController) TitleCheck() {
 	br.Success = true
 	br.Msg = "校验成功"
 }
+
+// Editing
+// @Title 标记编辑状态
+// @Description 标记编辑状态
+// @Param	request	body models.PPTEditingReq true "type json string"
+// @Success 200 Ret=200 操作成功
+// @router /editing [post]
+func (this *PptEnglishController) Editing() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req models.PPTEditingReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.PptId <= 0 {
+		br.Msg = "参数有误"
+		return
+	}
+	if req.Status <= 0 {
+		br.Msg = "标记状态异常"
+		return
+	}
+
+	editor, e := services.UpdatePptEditing(req.PptId, req.Status, sysUser.AdminId, sysUser.RealName, true)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "更新编辑状态失败, err: " + e.Error()
+		return
+	}
+
+	br.Data = editor
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 105 - 7
controllers/ppt_v2.go

@@ -360,9 +360,19 @@ func (this *PptV2Controller) DeletePpt() {
 func (this *PptV2Controller) DetailPpt() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
 	pptId, _ := this.GetInt("PptId")
 
 	pptInfo, err := models.GetPptV2ById(pptId)
@@ -372,10 +382,21 @@ func (this *PptV2Controller) DetailPpt() {
 		return
 	}
 
+	// 编辑中
+	editor, e := services.UpdatePptEditing(pptId, 0, sysUser.AdminId, sysUser.RealName, false)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "更新编辑状态失败, err: " + e.Error()
+		return
+	}
+	resp := new(models.PPTDetailResp)
+	resp.PptV2 = pptInfo
+	resp.Editor = editor
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
-	br.Data = pptInfo
+	br.Data = resp
 }
 
 // DownloadPptx
@@ -575,9 +596,19 @@ func (this *PptV2Controller) PptUpload() {
 func (this *PptV2Controller) SaveLog() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
 	var req models.AddPptV2Req
 	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
 	if err != nil {
@@ -604,12 +635,26 @@ func (this *PptV2Controller) SaveLog() {
 	}
 
 	//变更ppt内容
-	_, err = models.GetPptV2ById(int(req.PptId))
-	if err != nil {
+	pptItem, e := models.GetPptV2ById(int(req.PptId))
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "PPT已被删除, 请刷新页面"
+			return
+		}
 		br.Msg = "信息获取失败"
-		br.ErrMsg = "信息获取失败,Err:" + err.Error()
+		br.ErrMsg = "信息获取失败,Err:" + e.Error()
 		return
 	}
+
+	// 标记编辑状态
+	if pptItem.PptId > 0 {
+		_, e = services.UpdatePptEditing(pptItem.PptId, 1, sysUser.AdminId, sysUser.RealName, false)
+		if e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "更新编辑状态失败, err: " + e.Error()
+			return
+		}
+	}
 	//pptInfo.TemplateType = req.FirstPage.TemplateType
 	//pptInfo.BackgroundImg = req.FirstPage.ImgUrl
 	//pptInfo.Title = req.FirstPage.Title
@@ -632,9 +677,11 @@ func (this *PptV2Controller) SaveLog() {
 		AdminRealName: this.SysUser.RealName,
 		CreateTime:    time.Now(),
 	}
-	_, err = models.AddPptV2SaveLog(logInfo)
-	if err != nil {
-
+	_, e = models.AddPptV2SaveLog(logInfo)
+	if e != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "保存PPT日志失败, Err: " + e.Error()
+		return
 	}
 	br.Ret = 200
 	br.Success = true
@@ -1129,3 +1176,54 @@ func (this *PptV2Controller) TitleCheck() {
 	br.Success = true
 	br.Msg = "校验成功"
 }
+
+// Editing
+// @Title 标记编辑状态
+// @Description 标记编辑状态
+// @Param	request	body models.PPTEditingReq true "type json string"
+// @Success 200 Ret=200 操作成功
+// @router /editing [post]
+func (this *PptV2Controller) Editing() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req models.PPTEditingReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.PptId <= 0 {
+		br.Msg = "参数有误"
+		return
+	}
+	if req.Status <= 0 {
+		br.Msg = "标记状态异常"
+		return
+	}
+
+	editor, e := services.UpdatePptEditing(req.PptId, req.Status, sysUser.AdminId, sysUser.RealName, false)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "更新编辑状态失败, err: " + e.Error()
+		return
+	}
+
+	br.Data = editor
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 16 - 3
models/ppt_english/ppt_english.go

@@ -344,10 +344,23 @@ type EnglishPPT2ReportReq struct {
 	Abstract         string `description:"摘要"`
 }
 
-
-func GetPptEnglishByTitleAndId(title string,adminId int) (item *PptEnglish, err error) {
+func GetPptEnglishByTitleAndId(title string, adminId int) (item *PptEnglish, err error) {
 	o := orm.NewOrmUsingDB("rddp")
 	sql := `SELECT * FROM ppt_english WHERE 1=1 AND title=? AND admin_id=? `
 	err = o.Raw(sql, title, adminId).QueryRow(&item)
 	return
-}
+}
+
+// PPTEditingCache PPT编辑缓存信息
+type PPTEditingCache struct {
+	IsEditing bool   `description:"是否有人编辑"`
+	AdminId   int    `description:"编辑者ID"`
+	Editor    string `description:"编辑者姓名"`
+	Tips      string `description:"提示信息"`
+}
+
+// EnglishPPTDetailResp 英文PPT详情响应体
+type EnglishPPTDetailResp struct {
+	*PptEnglish
+	Editor PPTEditingCache `description:"编辑人信息"`
+}

+ 15 - 2
models/ppt_v2.go

@@ -1,6 +1,7 @@
 package models
 
 import (
+	"eta/eta_api/models/ppt_english"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"time"
@@ -285,9 +286,21 @@ type BatchEnPPT2CnReq struct {
 	GroupId int    `description:"目录ID"`
 }
 
-func GetPptV2ByTitleAndId(title string,adminId int) (item *PptV2, err error) {
+func GetPptV2ByTitleAndId(title string, adminId int) (item *PptV2, err error) {
 	o := orm.NewOrmUsingDB("rddp")
 	sql := `SELECT * FROM ppt_v2 WHERE 1=1 AND title=? AND admin_id=? `
 	err = o.Raw(sql, title, adminId).QueryRow(&item)
 	return
-}
+}
+
+// PPTEditingReq 标记编辑中请求体
+type PPTEditingReq struct {
+	PptId  int `description:"PPT主键ID"`
+	Status int `description:"标记状态: 1-编辑中; 2-编辑完成"`
+}
+
+// PPTDetailResp PPT详情响应体
+type PPTDetailResp struct {
+	*PptV2
+	Editor ppt_english.PPTEditingCache `description:"编辑人信息"`
+}

+ 18 - 0
routers/commentsRouter.go

@@ -5263,6 +5263,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers:PptEnglishController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:PptEnglishController"],
+        beego.ControllerComments{
+            Method: "Editing",
+            Router: `/editing`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers:PptEnglishController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:PptEnglishController"],
         beego.ControllerComments{
             Method: "Grant",
@@ -5551,6 +5560,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers:PptV2Controller"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:PptV2Controller"],
+        beego.ControllerComments{
+            Method: "Editing",
+            Router: `/editing`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers:PptV2Controller"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:PptV2Controller"],
         beego.ControllerComments{
             Method: "Grant",

+ 60 - 0
services/ppt.go

@@ -382,3 +382,63 @@ func SaveEnglishPPTReport(pptId, classifyIdFirst, classifyIdSecond int, title, a
 	reportCode = newCode
 	return
 }
+
+// UpdatePptEditing 更新PPT编辑状态
+func UpdatePptEditing(pptId, status, userId int, userName string, isEn bool) (ret ppt_english.PPTEditingCache, err error) {
+	if pptId <= 0 {
+		return
+	}
+	cacheKey := ""
+	if isEn {
+		cacheKey = fmt.Sprint(utils.CACHE_EN_PPT_EDITING, pptId)
+	} else {
+		cacheKey = fmt.Sprint(utils.CACHE_PPT_EDITING, pptId)
+	}
+
+	// 完成编辑
+	if status == 2 {
+		_ = utils.Rc.Delete(cacheKey)
+		return
+	}
+
+	// 读取缓存中的结果
+	var editor ppt_english.PPTEditingCache
+	strCache, _ := utils.Rc.RedisString(cacheKey)
+	fmt.Println(strCache)
+	if strCache != "" {
+		e := json.Unmarshal([]byte(strCache), &editor)
+		if e != nil {
+			err = fmt.Errorf("解析缓存内容失败: %s", e.Error())
+			return
+		}
+	}
+
+	// 标记编辑中
+	if status == 1 {
+		// 无人编辑, 写入缓存
+		if !editor.IsEditing {
+			ret.IsEditing = true
+			ret.AdminId = userId
+			ret.Editor = userName
+			ret.Tips = fmt.Sprintf("当前%s正在编辑PPT", userName)
+			b, _ := json.Marshal(ret)
+			utils.Rc.SetNX(cacheKey, string(b), 3*time.Minute)
+			return
+		}
+
+		// 有人编辑
+		if editor.IsEditing {
+			// 编辑用户与当前用户不一致, 返回编辑用户, 一致则更新缓存
+			if userId == editor.AdminId {
+				b, _ := json.Marshal(editor)
+				utils.Rc.Do("SETEX", cacheKey, int64(180), string(b))
+			}
+			ret = editor
+			return
+		}
+	} else {
+		// 默认查询
+		ret = editor
+	}
+	return
+}

+ 2 - 0
utils/constants.go

@@ -222,6 +222,8 @@ const (
 
 	CACHE_SMART_REPORT_EDITING  = "eta:smart_report:editing:" // 智能研报用户编辑中
 	CACHE_SMART_REPORT_SEND_MSG = "eta:smart_report:sending:" // 智能研报用户报告推送
+	CACHE_PPT_EDITING           = "eta:ppt:editing:"          // PPT用户编辑中
+	CACHE_EN_PPT_EDITING        = "eta:en_ppt:editing:"       // 英文PPT用户编辑中
 
 	CACHE_CREATE_REPORT_IMGPDF_QUEUE = "eta_report:report_img_pdf_queue" // 生成报告长图PDF队列
 )