package services
import (
"encoding/json"
"errors"
"eta/eta_mobile/models"
"eta/eta_mobile/models/ppt_english"
"eta/eta_mobile/services/alarm_msg"
"eta/eta_mobile/utils"
"fmt"
"sort"
"time"
)
const (
ElementsTypeText = "text"
ElementsTypeImage = "image"
ElementsTypeChart = "chart"
ElementsTypeSheet = "sheet"
)
type PPTContent struct {
//Id int `json:"id" description:"此处因目录改版类型有int也有string且并没有使用到该字段所以注释掉"`
Key int `json:"key"`
ModelId int `json:"modelId"`
Title string `json:"title"`
Elements []PPTContentElements `json:"elements"`
}
type PPTContentElements struct {
Type string `json:"type"`
Position int `json:"position"`
Content string `json:"content"`
RichContent string `json:"richContent"`
ChartId string `json:"chartId"`
SheetId string `json:"sheetId"`
SheetHeight string `json:"sheetHeight"`
Src string `json:"src"`
}
// PPT2内容转HTML
func pptContent2Html(content string, isEnglish bool) (htm string, err error) {
contents := make([]PPTContent, 0)
if e := json.Unmarshal([]byte(content), &contents); e != nil {
err = errors.New("PPT内容转换失败")
return
}
pageLen := len(contents)
htmlContent := ``
// iframe图表/表格域名
chartRoot := utils.PublicChartHost
if pageLen > 0 {
htmlPrefix := `
`
htmlSuffix := `
`
htmlBr := `
`
for i := 0; i < pageLen; i++ {
// 每页标题加粗居中
title := contents[i].Title
if title != "" {
htmlContent += ``
htmlContent += title
htmlContent += `
`
}
ele := contents[i].Elements
// 每页元素按照Position升序排序
sort.Slice(ele, func(k, j int) bool {
return ele[k].Position < ele[j].Position
})
for _, v := range ele {
// 根据不同的Type拼接不同的内容
htmlContent += htmlPrefix
switch v.Type {
case ElementsTypeText:
htmlContent += v.RichContent
case ElementsTypeImage:
htmlContent += fmt.Sprint(`
`)
case ElementsTypeChart:
if isEnglish {
// 英文研报图表src多加一个fromPage=en, 表格暂时没有区分
htmlContent += fmt.Sprintf(``, chartRoot, v.ChartId)
break
}
htmlContent += fmt.Sprintf(``, chartRoot, v.ChartId)
case ElementsTypeSheet:
htmlContent += fmt.Sprintf(``, chartRoot, v.SheetId, v.SheetId, v.SheetHeight)
}
htmlContent += htmlSuffix
}
// 每页中间插入一个换行符, 最后一页不插入
currentPage := i + 1
if currentPage != pageLen {
htmlContent += htmlPrefix + htmlBr + htmlSuffix
}
}
}
htm = htmlContent
return
}
// ResetPPTReport 重置PPT关联的报告(如删除关联的报告后)
func ResetPPTReport(reportId int, isEnglish bool) (err error) {
defer func() {
if err != nil {
utils.FileLog.Info("%s", err.Error())
go alarm_msg.SendAlarmMsg("重置PPT关联报告失败, ResetPPTReport Err: "+err.Error(), 3)
}
}()
// 英文报告
if isEnglish {
en, e := ppt_english.GetPptEnglishByReportId(reportId)
if e != nil && e.Error() != utils.ErrNoRow() {
err = errors.New("获取英文PPT失败, Err: " + e.Error())
return
}
if en != nil {
updateCols := []string{"ReportId", "ReportCode"}
en.ReportId = 0
en.ReportCode = ""
if e = en.Update(updateCols); e != nil {
err = errors.New("更新英文PPT关联报告失败, Err: " + e.Error())
return
}
}
return
}
// 中文报告
item, e := models.GetPptV2ByReportId(reportId)
if e != nil && e.Error() != utils.ErrNoRow() {
err = errors.New("获取PPT失败, Err: " + e.Error())
return
}
if item != nil {
updateCols := []string{"ReportId", "ReportCode"}
item.ReportId = 0
item.ReportCode = ""
if e = item.Update(updateCols); e != nil {
err = errors.New("更新PPT关联报告失败, Err: " + e.Error())
return
}
}
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
}