ppt.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633
  1. package services
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta/eta_api/models"
  6. "eta/eta_api/models/data_manage/excel"
  7. "eta/eta_api/models/ppt_english"
  8. "eta/eta_api/models/system"
  9. "eta/eta_api/services/alarm_msg"
  10. "eta/eta_api/services/ppt2img"
  11. "eta/eta_api/utils"
  12. "fmt"
  13. "html"
  14. "sort"
  15. "time"
  16. )
  17. const (
  18. ElementsTypeText = "text"
  19. ElementsTypeImage = "image"
  20. ElementsTypeChart = "chart"
  21. ElementsTypeSheet = "sheet"
  22. )
  23. type PPTContent struct {
  24. //Id int `json:"id" description:"此处因目录改版类型有int也有string且并没有使用到该字段所以注释掉"`
  25. Key int `json:"key"`
  26. ModelId int `json:"modelId"`
  27. Title string `json:"title"`
  28. Elements []PPTContentElements `json:"elements"`
  29. }
  30. type PPTContentElements struct {
  31. Type string `json:"type"`
  32. Position int `json:"position"`
  33. Content string `json:"content"`
  34. RichContent string `json:"richContent"`
  35. ChartId string `json:"chartId"`
  36. SheetId string `json:"sheetId"`
  37. SheetHeight string `json:"sheetHeight"`
  38. Src string `json:"src"`
  39. Uid string `json:"uid"`
  40. }
  41. // SavePPTReport 保存PPT报告
  42. func SavePPTReport(pptId, classifyId int, title string, adminInfo *system.Admin) (reportId int, reportCode, errMsg string, err error) {
  43. defer func() {
  44. if err != nil {
  45. utils.FileLog.Info("%s", err.Error())
  46. go alarm_msg.SendAlarmMsg("PPT转报告失败, SavePPTReport Msg: "+errMsg+", Err: "+err.Error(), 3)
  47. }
  48. }()
  49. if pptId == 0 {
  50. errMsg = "参数有误"
  51. err = errors.New("参数有误")
  52. return
  53. }
  54. item, e := models.GetPptV2ById(pptId)
  55. if e != nil {
  56. errMsg = "获取PPT失败"
  57. err = errors.New("获取PPT失败, Err: " + e.Error())
  58. return
  59. }
  60. // PPT内容转HTML
  61. htm, e := pptContent2Html(item.Content, false)
  62. if e != nil {
  63. errMsg = "转换失败"
  64. err = e
  65. return
  66. }
  67. // 2023-02-21 PPT可多次转为报告, 不做关联
  68. if classifyId == 0 {
  69. errMsg = "请选择报告类型"
  70. err = errors.New("请选择报告类型")
  71. return
  72. }
  73. if title == "" {
  74. errMsg = "标题不能为空"
  75. err = errors.New("标题不能为空")
  76. return
  77. }
  78. // 获取分类及父级分类
  79. classifyList, e := models.GetAllClassify()
  80. if e != nil {
  81. errMsg = "转换失败"
  82. err = errors.New("获取分类列表失败, Err: " + e.Error())
  83. return
  84. }
  85. classifyMap := make(map[int]*models.Classify, 0)
  86. for _, v := range classifyList {
  87. classifyMap[v.Id] = v
  88. }
  89. classifyIdFirst := 0
  90. classifyIdSecond := 0
  91. classifyIdThird := 0
  92. classifyNameFirst := ""
  93. classifyNameSecond := ""
  94. classifyNameThird := ""
  95. // 最小单元分类,第二级别的分类 ,最大的分类
  96. var baseClassify, twoClassify, threeClassify *models.Classify
  97. var hasTwo, hasThird bool
  98. baseClassify, ok := classifyMap[classifyId]
  99. if !ok {
  100. errMsg = "分类异常"
  101. err = errors.New("获取分类失败 ")
  102. return
  103. }
  104. twoClassify, hasTwo = classifyMap[baseClassify.ParentId]
  105. if hasTwo {
  106. threeClassify, hasThird = classifyMap[twoClassify.ParentId]
  107. }
  108. if hasThird { // 如果确实是有三级分类
  109. classifyIdFirst = threeClassify.Id
  110. classifyNameFirst = threeClassify.ClassifyName
  111. classifyIdSecond = twoClassify.Id
  112. classifyNameSecond = twoClassify.ClassifyName
  113. classifyIdThird = baseClassify.Id
  114. classifyNameThird = baseClassify.ClassifyName
  115. } else if hasTwo {
  116. classifyIdFirst = twoClassify.Id
  117. classifyNameFirst = twoClassify.ClassifyName
  118. classifyIdSecond = baseClassify.Id
  119. classifyNameSecond = baseClassify.ClassifyName
  120. } else {
  121. classifyIdFirst = baseClassify.Id
  122. classifyNameFirst = baseClassify.ClassifyName
  123. }
  124. // 新增报告
  125. nowTime := time.Now().Local()
  126. reportReq := &models.AddReq{
  127. AddType: 1,
  128. ClassifyIdFirst: classifyIdFirst,
  129. ClassifyNameFirst: classifyNameFirst,
  130. ClassifyIdSecond: classifyIdSecond,
  131. ClassifyNameSecond: classifyNameSecond,
  132. ClassifyIdThird: classifyIdThird,
  133. ClassifyNameThird: classifyNameThird,
  134. Title: title,
  135. Abstract: "",
  136. Author: "",
  137. Frequency: utils.ReportFrequencyDefault,
  138. State: 1,
  139. Content: htm,
  140. CreateTime: nowTime.Format(utils.FormatDateTime),
  141. ReportVersion: 2,
  142. CollaborateType: 1, // 协作方式,1:个人,2:多人协作。默认:1
  143. ReportLayout: 1, // 报告布局,1:常规布局,2:智能布局。默认:1
  144. IsPublicPublish: 1, // 是否公开发布,1:是,2:否
  145. }
  146. // 如果PPT是公开的,则报告也公开发布
  147. if item.IsShare == 1 {
  148. reportReq.IsPublicPublish = 1
  149. }
  150. newReportInfo, _, e := CreateNewReport(*reportReq, adminInfo)
  151. if e != nil {
  152. errMsg = "转换失败"
  153. err = errors.New("新增报告失败, Err: " + e.Error())
  154. return
  155. }
  156. reportId = newReportInfo.Id
  157. reportCode = newReportInfo.ReportCode
  158. // ppt转报告后,将ppt的表格关系做处理
  159. handlerPptToReportTableReferenced(pptId, newReportInfo.Id)
  160. // 更新报告中的ppt图片
  161. go saveReportPptImg(pptId, reportId, item.PptxUrl)
  162. return
  163. }
  164. // PPT2内容转HTML
  165. func pptContent2Html(content string, isEnglish bool) (htm string, err error) {
  166. contents := make([]PPTContent, 0)
  167. if e := json.Unmarshal([]byte(content), &contents); e != nil {
  168. err = errors.New("PPT内容转换失败")
  169. return
  170. }
  171. pageLen := len(contents)
  172. htmlContent := ``
  173. // iframe图表/表格域名
  174. // 获取基础配置, 若未配置则直接返回
  175. // 获取配置好的短信模版
  176. smsCond := ` AND conf_key = ? `
  177. smsPars := make([]interface{}, 0)
  178. smsPars = append(smsPars, "ChartViewUrl")
  179. conf := new(models.BusinessConf)
  180. conf, e := conf.GetItemByCondition(smsCond, smsPars)
  181. if e != nil {
  182. if e.Error() == utils.ErrNoRow() {
  183. err = fmt.Errorf("请先配置公共图库的地址")
  184. return
  185. }
  186. err = fmt.Errorf("获取聚合短信配置信息失败, Err: %s", e.Error())
  187. return
  188. }
  189. if conf.ConfVal == "" {
  190. err = fmt.Errorf("请先配置公共图库的地址")
  191. return
  192. }
  193. chartRoot := conf.ConfVal
  194. if pageLen > 0 {
  195. htmlPrefix := `<p style="text-align: left; margin-top: 10px; font-size: 16px;">`
  196. htmlSuffix := `</p>`
  197. htmlBr := `<br>`
  198. for i := 0; i < pageLen; i++ {
  199. // 每页标题加粗居中
  200. title := contents[i].Title
  201. if title != "" {
  202. htmlContent += `<p style="font-size: 16px; text-align: left;"><strong>`
  203. htmlContent += title
  204. htmlContent += `</strong></p>`
  205. }
  206. ele := contents[i].Elements
  207. // 每页元素按照Position升序排序
  208. sort.Slice(ele, func(k, j int) bool {
  209. return ele[k].Position < ele[j].Position
  210. })
  211. for _, v := range ele {
  212. // 根据不同的Type拼接不同的内容
  213. htmlContent += htmlPrefix
  214. switch v.Type {
  215. case ElementsTypeText:
  216. htmlContent += v.RichContent
  217. case ElementsTypeImage:
  218. htmlContent += fmt.Sprint(`<img src="`, v.Src, `" class="fr-fic fr-dib fr-draggable">`)
  219. case ElementsTypeChart:
  220. if isEnglish {
  221. // 英文研报图表src多加一个fromPage=en, 表格暂时没有区分
  222. htmlContent += fmt.Sprintf(`<iframe src="%s/chartshow?code=%s&fromPage=en&uid=%s" width="100%%" height="350" style="border-width:0px; min-height:350px;" class="iframe%s"></iframe>`, chartRoot, v.ChartId, v.Uid, v.Uid)
  223. break
  224. }
  225. htmlContent += fmt.Sprintf(`<iframe src="%s/chartshow?code=%s&uid=%s" width="100%%" height="350" style="border-width:0px; min-height:350px;" class="iframe%s"></iframe>`, chartRoot, v.ChartId, v.Uid, v.Uid)
  226. case ElementsTypeSheet:
  227. htmlContent += fmt.Sprintf(`<iframe src="%s/sheetshow?code=%s&uid=%s" class="iframe%s" width="100%%" height="%s" style="border-width:0px;"></iframe>`, chartRoot, v.SheetId, v.Uid, v.Uid, v.SheetHeight)
  228. }
  229. htmlContent += htmlSuffix
  230. }
  231. // 每页中间插入一个换行符, 最后一页不插入
  232. currentPage := i + 1
  233. if currentPage != pageLen {
  234. htmlContent += htmlPrefix + htmlBr + htmlSuffix
  235. }
  236. }
  237. }
  238. htm = htmlContent
  239. return
  240. }
  241. // ResetPPTReport 重置PPT关联的报告(如删除关联的报告后)
  242. func ResetPPTReport(reportId int, isEnglish bool) (err error) {
  243. defer func() {
  244. if err != nil {
  245. utils.FileLog.Info("%s", err.Error())
  246. go alarm_msg.SendAlarmMsg("重置PPT关联报告失败, ResetPPTReport Err: "+err.Error(), 3)
  247. }
  248. }()
  249. // 英文报告
  250. if isEnglish {
  251. en, e := ppt_english.GetPptEnglishByReportId(reportId)
  252. if e != nil && e.Error() != utils.ErrNoRow() {
  253. err = errors.New("获取英文PPT失败, Err: " + e.Error())
  254. return
  255. }
  256. if en != nil {
  257. updateCols := []string{"ReportId", "ReportCode"}
  258. en.ReportId = 0
  259. en.ReportCode = ""
  260. if e = en.Update(updateCols); e != nil {
  261. err = errors.New("更新英文PPT关联报告失败, Err: " + e.Error())
  262. return
  263. }
  264. }
  265. return
  266. }
  267. // 中文报告
  268. item, e := models.GetPptV2ByReportId(reportId)
  269. if e != nil && e.Error() != utils.ErrNoRow() {
  270. err = errors.New("获取PPT失败, Err: " + e.Error())
  271. return
  272. }
  273. if item != nil {
  274. updateCols := []string{"ReportId", "ReportCode"}
  275. item.ReportId = 0
  276. item.ReportCode = ""
  277. if e = item.Update(updateCols); e != nil {
  278. err = errors.New("更新PPT关联报告失败, Err: " + e.Error())
  279. return
  280. }
  281. }
  282. return
  283. }
  284. // saveReportPptImg ppt转报告后,需要再次将ppt转图片
  285. func saveReportPptImg(pptId, reportId int, pptUrl string) {
  286. var err error
  287. defer func() {
  288. if err != nil {
  289. utils.FileLog.Info(fmt.Sprintf("将ppt转图片失败, saveReportPptImg Err:%s", err.Error()))
  290. go alarm_msg.SendAlarmMsg("将ppt转图片失败, saveReportPptImg Err: "+err.Error(), 3)
  291. }
  292. }()
  293. // 更新报告内容
  294. report, e := models.GetReportByReportId(reportId)
  295. if e != nil && e.Error() != utils.ErrNoRow() {
  296. err = errors.New("获取报告失败, Err: " + e.Error())
  297. return
  298. }
  299. if report == nil {
  300. return
  301. }
  302. // 获取ppt转图片的结果
  303. list, err := ppt2img.Ppt2Img(pptUrl)
  304. if err != nil {
  305. return
  306. }
  307. reportPptImgList := make([]*models.ReportPptImg, 0)
  308. for _, v := range list {
  309. reportPptImg := &models.ReportPptImg{
  310. //ReportPptImgId: 0,
  311. PptId: pptId,
  312. ReportId: reportId,
  313. ReportChapterId: 0,
  314. ImgUrl: v,
  315. CreateTime: time.Now(),
  316. }
  317. reportPptImgList = append(reportPptImgList, reportPptImg)
  318. }
  319. //批量添加Ppt转报告的图片记录
  320. err = models.AddAndEditMultiReportPptImg(pptId, reportPptImgList)
  321. return
  322. }
  323. // SaveEnglishPPTReport 保存英文PPT报告
  324. func SaveEnglishPPTReport(pptId, classifyIdFirst, classifyIdSecond int, title, abstract string, adminInfo *system.Admin) (reportId int, reportCode, errMsg string, err error) {
  325. defer func() {
  326. if err != nil {
  327. utils.FileLog.Info("%s", err.Error())
  328. go alarm_msg.SendAlarmMsg("PPT转报告失败, SavePPTReport Msg: "+errMsg+", Err: "+err.Error(), 3)
  329. }
  330. }()
  331. if pptId == 0 {
  332. errMsg = "参数有误"
  333. err = errors.New("参数有误")
  334. return
  335. }
  336. item, e := ppt_english.GetPptEnglishById(pptId)
  337. if e != nil {
  338. errMsg = "获取PPT失败"
  339. err = errors.New("获取PPT失败, Err: " + e.Error())
  340. return
  341. }
  342. // PPT内容转HTML
  343. htm, e := pptContent2Html(item.Content, true)
  344. if e != nil {
  345. errMsg = "转换失败"
  346. err = e
  347. return
  348. }
  349. // 2023-02-21 PPT可多次转为报告, 不做关联
  350. if title == "" {
  351. errMsg = "标题不能为空"
  352. err = errors.New("标题不能为空")
  353. return
  354. }
  355. if classifyIdFirst <= 0 {
  356. errMsg = "请选择报告分类"
  357. err = errors.New("报告分类不能为空")
  358. return
  359. }
  360. // 分类
  361. classifyList, e := models.GetAllEnglishClassify()
  362. if e != nil {
  363. errMsg = "转换失败"
  364. err = errors.New("获取分类列表失败, Err: " + e.Error())
  365. return
  366. }
  367. classifyMap := make(map[int]string, 0)
  368. for _, v := range classifyList {
  369. classifyMap[v.Id] = v.ClassifyName
  370. }
  371. classifyNameFirst := classifyMap[classifyIdFirst]
  372. classifyNameSecond := classifyMap[classifyIdSecond]
  373. // 新增报告
  374. nowTime := time.Now().Local()
  375. reportReq := &models.AddEnglishReportReq{
  376. AddType: 1,
  377. ClassifyIdFirst: classifyIdFirst,
  378. ClassifyNameFirst: classifyNameFirst,
  379. ClassifyIdSecond: classifyIdSecond,
  380. ClassifyNameSecond: classifyNameSecond,
  381. Title: title,
  382. Abstract: abstract,
  383. Author: "Horizon Insights FICC Team",
  384. Frequency: utils.ReportFrequencyDefault,
  385. State: 1,
  386. Content: htm,
  387. CreateTime: nowTime.Format(utils.FormatDateTime),
  388. }
  389. newReportId, newCode, e := CreateNewEnglishReport(*reportReq, adminInfo)
  390. if e != nil {
  391. errMsg = "转换失败"
  392. err = errors.New("新增报告失败, Err: " + e.Error())
  393. return
  394. }
  395. reportId = int(newReportId)
  396. reportCode = newCode
  397. // 英文ppt转英文报告后,将英文报告的表格关系做处理
  398. handlerPptToEnReportTableReferenced(pptId, reportId)
  399. return
  400. }
  401. // UpdatePptEditing 更新PPT编辑状态
  402. func UpdatePptEditing(pptId, status, userId int, userName string, isEn bool) (ret ppt_english.PPTEditingCache, err error) {
  403. if pptId <= 0 {
  404. return
  405. }
  406. cacheKey := ""
  407. if isEn {
  408. cacheKey = fmt.Sprint(utils.CACHE_EN_PPT_EDITING, pptId)
  409. } else {
  410. cacheKey = fmt.Sprint(utils.CACHE_PPT_EDITING, pptId)
  411. }
  412. // 完成编辑
  413. if status == 2 {
  414. _ = utils.Rc.Delete(cacheKey)
  415. return
  416. }
  417. // 读取缓存中的结果
  418. var editor ppt_english.PPTEditingCache
  419. strCache, _ := utils.Rc.RedisString(cacheKey)
  420. fmt.Println(strCache)
  421. if strCache != "" {
  422. e := json.Unmarshal([]byte(strCache), &editor)
  423. if e != nil {
  424. err = fmt.Errorf("解析缓存内容失败: %s", e.Error())
  425. return
  426. }
  427. }
  428. // 标记编辑中
  429. if status == 1 {
  430. // 无人编辑, 写入缓存
  431. if !editor.IsEditing {
  432. ret.IsEditing = true
  433. ret.AdminId = userId
  434. ret.Editor = userName
  435. ret.Tips = fmt.Sprintf("当前%s正在编辑PPT", userName)
  436. b, _ := json.Marshal(ret)
  437. utils.Rc.SetNX(cacheKey, string(b), utils.ReportPptEditingWait*time.Second)
  438. return
  439. }
  440. // 有人编辑
  441. if editor.IsEditing {
  442. // 编辑用户与当前用户不一致, 返回编辑用户, 一致则更新缓存
  443. if userId == editor.AdminId {
  444. b, _ := json.Marshal(editor)
  445. utils.Rc.Do("SETEX", cacheKey, int64(utils.ReportPptEditingWait), string(b))
  446. }
  447. ret = editor
  448. return
  449. }
  450. } else {
  451. // 默认查询
  452. ret = editor
  453. }
  454. return
  455. }
  456. // handlerPptToReportTableReferenced
  457. // @Description: ppt转报告后,需要同时继承原来ppt中表格的拖动数据逻辑
  458. // @author: Roc
  459. // @datetime 2025-01-09 16:51:11
  460. // @param pptId int
  461. // @param reportId int
  462. func handlerPptToReportTableReferenced(pptId, reportId int) {
  463. var err error
  464. defer func() {
  465. if err != nil {
  466. utils.FileLog.Error("ppt转报告后,报告与动态表格关联处理失败,PPT的ID:%d,新报告ID:%d,Err:%s", pptId, reportId, err.Error())
  467. }
  468. }()
  469. reportInfo, err := models.GetReportByReportId(reportId)
  470. if err != nil {
  471. return
  472. }
  473. newFromScene := utils.TableReferencedByReport
  474. addList, err := excel.CopyReferencedExcelConfigByReferencedIdAndFromScene(pptId, utils.TableReferencedByPPT, reportInfo.Id, newFromScene, reportInfo.AdminId, reportInfo.AdminRealName)
  475. if err != nil {
  476. return
  477. }
  478. if len(addList) > 0 {
  479. // 修改内容
  480. content := HandleReportContentTableAndScene(reportInfo.Id, newFromScene, html.UnescapeString(reportInfo.Content))
  481. reportInfo.Content = html.EscapeString(content)
  482. reportInfo.ContentStruct = HandleReportContentStructTableAndScene(reportInfo.Id, newFromScene, reportInfo.ContentStruct)
  483. err = reportInfo.Update([]string{"Content", "ContentStruct"})
  484. if err != nil {
  485. return
  486. }
  487. if reportInfo.HasChapter == 1 {
  488. chapterList, tmpErr := models.GetChapterListByReportId(reportInfo.Id)
  489. if tmpErr != nil {
  490. err = tmpErr
  491. return
  492. }
  493. for _, v := range chapterList {
  494. chapterContent := HandleReportContentTableAndScene(reportInfo.Id, newFromScene, html.UnescapeString(v.Content))
  495. v.Content = html.EscapeString(chapterContent)
  496. v.ContentStruct = HandleReportContentStructTableAndScene(reportInfo.Id, newFromScene, v.ContentStruct)
  497. err = v.Update([]string{"Content", "ContentStruct"})
  498. if err != nil {
  499. return
  500. }
  501. }
  502. }
  503. }
  504. }
  505. // HandlerPptToEnPptTableReferenced
  506. // @Description: ppt转英文ppt后,需要同时继承原来ppt中表格的拖动数据逻辑
  507. // @author: Roc
  508. // @datetime 2025-01-09 16:51:03
  509. // @param pptId int
  510. // @param enPptId int
  511. // @param sysUserId int
  512. // @param sysUserName string
  513. func HandlerPptToEnPptTableReferenced(pptId, enPptId, sysUserId int, sysUserName string) {
  514. var err error
  515. defer func() {
  516. if err != nil {
  517. utils.FileLog.Error("ppt转英文PPT后,英文PPT与动态表格关联处理失败,PPT的ID:%d,英文ppt的ID:%d,Err:%s", pptId, enPptId, err.Error())
  518. }
  519. }()
  520. _, err = excel.CopyReferencedExcelConfigByReferencedIdAndFromScene(pptId, utils.TableReferencedByPPT, enPptId, utils.TableReferencedByEnPPT, sysUserId, sysUserName)
  521. if err != nil {
  522. return
  523. }
  524. }
  525. // HandlerMergePptTableReferenced
  526. // @Description: 多ppt合并生成新的ppt,需要同时继承原来所有ppt中表格的拖动数据逻辑
  527. // @author: Roc
  528. // @datetime 2025-01-09 16:51:03
  529. // @param pptId int
  530. // @param enPptId int
  531. // @param sysUserId int
  532. // @param sysUserName string
  533. // @param fromScene int
  534. func HandlerMergePptTableReferenced(oldPptIdList []int, pptId, sysUserId int, sysUserName string, fromScene int) {
  535. var err error
  536. defer func() {
  537. if err != nil {
  538. utils.FileLog.Error("ppt转英文PPT后,英文PPT与动态表格关联处理失败,待合并的PPT的ID:%v,英文ppt的ID:%d,Err:%s", oldPptIdList, pptId, err.Error())
  539. }
  540. }()
  541. _, err = excel.CopyReferencedExcelConfigByReferencedIdListAndFromScene(oldPptIdList, fromScene, pptId, fromScene, sysUserId, sysUserName)
  542. if err != nil {
  543. return
  544. }
  545. }
  546. // handlerPptToEnReportTableReferenced
  547. // @Description: 英文ppt转报告后,需要同时继承原来英文ppt中表格的拖动数据逻辑
  548. // @author: Roc
  549. // @datetime 2025-01-09 17:04:49
  550. // @param enPptId int
  551. // @param enReportId int
  552. func handlerPptToEnReportTableReferenced(enPptId, enReportId int) {
  553. var err error
  554. defer func() {
  555. if err != nil {
  556. utils.FileLog.Error("ppt转英文报告后,英文报告与动态表格关联处理失败,PPT的ID:%d,英文报告ID:%d,Err:%s", enPptId, enReportId, err.Error())
  557. }
  558. }()
  559. reportInfo, err := models.GetEnglishReportItemById(enReportId)
  560. if err != nil {
  561. return
  562. }
  563. newFromScene := utils.TableReferencedByEnReport
  564. addList, err := excel.CopyReferencedExcelConfigByReferencedIdAndFromScene(enPptId, utils.TableReferencedByEnPPT, enReportId, newFromScene, reportInfo.AdminId, reportInfo.AdminRealName)
  565. if err != nil {
  566. return
  567. }
  568. if len(addList) > 0 {
  569. // 修改内容
  570. content := HandleReportContentTableAndScene(reportInfo.Id, newFromScene, html.UnescapeString(reportInfo.Content))
  571. reportInfo.Content = html.EscapeString(content)
  572. err = reportInfo.Update([]string{"Content"})
  573. if err != nil {
  574. return
  575. }
  576. }
  577. }