smart_report.go 26 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016
  1. package smart_report
  2. import (
  3. "encoding/json"
  4. "eta/eta_api/controllers"
  5. "eta/eta_api/models"
  6. "eta/eta_api/models/smart_report"
  7. "eta/eta_api/models/system"
  8. "eta/eta_api/services"
  9. smartReportService "eta/eta_api/services/smart_report"
  10. "eta/eta_api/utils"
  11. "fmt"
  12. "github.com/rdlucklib/rdluck_tools/paging"
  13. "html"
  14. "strings"
  15. "time"
  16. )
  17. // SmartReportController 智能研报
  18. type SmartReportController struct {
  19. controllers.BaseAuthController
  20. }
  21. // Add
  22. // @Title 新增
  23. // @Description 新增
  24. // @Param request body smart_report.SmartReportAddReq true "type json string"
  25. // @Success 200 {object} smart_report.SmartReportItem
  26. // @router /add [post]
  27. func (this *SmartReportController) Add() {
  28. br := new(models.BaseResponse).Init()
  29. defer func() {
  30. if br.ErrMsg == "" {
  31. br.IsSendEmail = false
  32. }
  33. this.Data["json"] = br
  34. this.ServeJSON()
  35. }()
  36. sysUser := this.SysUser
  37. if sysUser == nil {
  38. br.Msg = "请登录"
  39. br.ErrMsg = "请登录,SysUser Is Empty"
  40. br.Ret = 408
  41. return
  42. }
  43. var req smart_report.SmartReportAddReq
  44. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  45. if err != nil {
  46. br.Msg = "参数解析异常!"
  47. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  48. return
  49. }
  50. if req.AddType != 1 && req.AddType != 2 {
  51. br.Msg = "请选择新增方式"
  52. return
  53. }
  54. if req.ClassifyIdFirst <= 0 || req.ClassifyIdSecond <= 0 {
  55. br.Msg = "请选择分类"
  56. return
  57. }
  58. req.Title = strings.TrimSpace(req.Title)
  59. if req.Title == "" {
  60. br.Msg = "请输入标题"
  61. return
  62. }
  63. reportOB := new(smart_report.SmartReport)
  64. stageMax, e := reportOB.GetMaxStageByClassifyId(req.ClassifyIdSecond)
  65. if e != nil {
  66. br.Msg = "操作失败"
  67. br.ErrMsg = "获取期数失败, Err: " + e.Error()
  68. return
  69. }
  70. stageMax += 1
  71. item := new(smart_report.SmartReport)
  72. item.AddType = req.AddType
  73. item.ClassifyIdFirst = req.ClassifyIdFirst
  74. item.ClassifyNameFirst = req.ClassifyNameFirst
  75. item.ClassifyIdSecond = req.ClassifyIdSecond
  76. item.ClassifyNameSecond = req.ClassifyNameSecond
  77. item.Title = req.Title
  78. item.Abstract = req.Abstract
  79. item.Author = req.Author
  80. item.Frequency = req.Frequency
  81. item.Stage = stageMax
  82. item.AdminId = sysUser.AdminId
  83. item.AdminRealName = sysUser.RealName
  84. item.CreateTime = time.Now().Local()
  85. item.ModifyTime = time.Now().Local()
  86. if e = item.Create(); e != nil {
  87. br.Msg = "操作失败"
  88. br.ErrMsg = "新增研报失败, Err: " + e.Error()
  89. return
  90. }
  91. uniqueCode := utils.MD5(fmt.Sprint("smart_", item.SmartReportId))
  92. item.ReportCode = uniqueCode
  93. if e = item.Update([]string{"ReportCode"}); e != nil {
  94. br.Msg = "操作失败"
  95. br.ErrMsg = "更新研报编码失败, Err: " + e.Error()
  96. return
  97. }
  98. resp := smart_report.FormatSmartReport2Item(item)
  99. br.Ret = 200
  100. br.Success = true
  101. br.Msg = "操作成功"
  102. br.Data = resp
  103. }
  104. // Edit
  105. // @Title 编辑
  106. // @Description 编辑
  107. // @Param request body smart_report.SmartReportEditReq true "type json string"
  108. // @Success 200 {object} smart_report.SmartReportItem
  109. // @router /edit [post]
  110. func (this *SmartReportController) Edit() {
  111. br := new(models.BaseResponse).Init()
  112. defer func() {
  113. if br.ErrMsg == "" {
  114. br.IsSendEmail = false
  115. }
  116. this.Data["json"] = br
  117. this.ServeJSON()
  118. }()
  119. sysUser := this.SysUser
  120. if sysUser == nil {
  121. br.Msg = "请登录"
  122. br.ErrMsg = "请登录,SysUser Is Empty"
  123. br.Ret = 408
  124. return
  125. }
  126. var req smart_report.SmartReportEditReq
  127. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  128. if err != nil {
  129. br.Msg = "参数解析异常!"
  130. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  131. return
  132. }
  133. if req.SmartReportId <= 0 {
  134. br.Msg = "参数有误"
  135. br.ErrMsg = "报告ID为空"
  136. return
  137. }
  138. if req.ClassifyIdFirst <= 0 || req.ClassifyIdSecond <= 0 {
  139. br.Msg = "请选择分类"
  140. return
  141. }
  142. req.Title = strings.TrimSpace(req.Title)
  143. if req.Title == "" {
  144. br.Msg = "请输入标题"
  145. return
  146. }
  147. var subContent string
  148. if req.Content != "" {
  149. req.Content = html.EscapeString(req.Content)
  150. // 前两个章节
  151. sub, e := services.GetReportContentSub(req.Content)
  152. if e != nil {
  153. br.Msg = "操作失败"
  154. br.ErrMsg = "读取报告前两个章节内容失败, Err: " + e.Error()
  155. return
  156. }
  157. subContent = html.EscapeString(sub)
  158. }
  159. req.ContentStruct = html.EscapeString(req.ContentStruct)
  160. ob := new(smart_report.SmartReport)
  161. item, e := ob.GetItemById(req.SmartReportId)
  162. if e != nil {
  163. if e.Error() == utils.ErrNoRow() {
  164. br.Msg = "报告不存在, 请刷新页面"
  165. return
  166. }
  167. br.Msg = "操作失败"
  168. br.ErrMsg = "获取研报失败, Err: " + e.Error()
  169. return
  170. }
  171. item.ClassifyIdFirst = req.ClassifyIdFirst
  172. item.ClassifyNameFirst = req.ClassifyNameFirst
  173. item.ClassifyIdSecond = req.ClassifyIdSecond
  174. item.ClassifyNameSecond = req.ClassifyNameSecond
  175. item.Title = req.Title
  176. item.Abstract = req.Abstract
  177. item.Author = req.Author
  178. item.Frequency = req.Frequency
  179. item.Content = req.Content
  180. item.ContentSub = subContent
  181. item.ContentStruct = req.ContentStruct
  182. item.ModifyTime = time.Now().Local()
  183. cols := []string{"ClassifyIdFirst", "ClassifyNameFirst", "ClassifyIdSecond", "ClassifyNameSecond", "Title", "Abstract", "Author",
  184. "Frequency", "Content", "ContentSub", "ContentStruct", "ModifyTime"}
  185. if e := item.Update(cols); e != nil {
  186. br.Msg = "操作失败"
  187. br.ErrMsg = "更新报告失败, Err: " + e.Error()
  188. return
  189. }
  190. resp := smart_report.FormatSmartReport2Item(item)
  191. br.Ret = 200
  192. br.Success = true
  193. br.Msg = "操作成功"
  194. br.Data = resp
  195. }
  196. // Remove
  197. // @Title 删除
  198. // @Description 删除
  199. // @Param request body smart_report.SmartReportRemoveReq true "type json string"
  200. // @Success 200 string "操作成功"
  201. // @router /remove [post]
  202. func (this *SmartReportController) Remove() {
  203. br := new(models.BaseResponse).Init()
  204. defer func() {
  205. if br.ErrMsg == "" {
  206. br.IsSendEmail = false
  207. }
  208. this.Data["json"] = br
  209. this.ServeJSON()
  210. }()
  211. sysUser := this.SysUser
  212. if sysUser == nil {
  213. br.Msg = "请登录"
  214. br.ErrMsg = "请登录,SysUser Is Empty"
  215. br.Ret = 408
  216. return
  217. }
  218. var req smart_report.SmartReportRemoveReq
  219. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  220. if err != nil {
  221. br.Msg = "参数解析异常!"
  222. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  223. return
  224. }
  225. if req.SmartReportId <= 0 {
  226. br.Msg = "参数有误"
  227. br.ErrMsg = "报告ID为空"
  228. return
  229. }
  230. ob := new(smart_report.SmartReport)
  231. item, e := ob.GetItemById(req.SmartReportId)
  232. if e != nil {
  233. if e.Error() == utils.ErrNoRow() {
  234. br.Ret = 200
  235. br.Success = true
  236. br.Msg = "操作成功"
  237. return
  238. }
  239. br.Msg = "操作失败"
  240. br.ErrMsg = "获取研报失败, Err: " + e.Error()
  241. return
  242. }
  243. if e = item.Del(); e != nil {
  244. br.Msg = "操作失败"
  245. br.ErrMsg = "删除报告失败, Err: " + e.Error()
  246. return
  247. }
  248. // ES更新报告为未发布
  249. go func() {
  250. _ = smartReportService.SmartReportElasticUpsert(item.SmartReportId, 1)
  251. }()
  252. br.Ret = 200
  253. br.Success = true
  254. br.Msg = "操作成功"
  255. }
  256. // Detail
  257. // @Title 详情
  258. // @Description 详情
  259. // @Param SmartReportId query int true "智能研报ID"
  260. // @Success 200 {object} smart_report.SmartReportItem
  261. // @router /detail [get]
  262. func (this *SmartReportController) Detail() {
  263. br := new(models.BaseResponse).Init()
  264. defer func() {
  265. if br.ErrMsg == "" {
  266. br.IsSendEmail = false
  267. }
  268. this.Data["json"] = br
  269. this.ServeJSON()
  270. }()
  271. sysUser := this.SysUser
  272. if sysUser == nil {
  273. br.Msg = "请登录"
  274. br.ErrMsg = "请登录,SysUser Is Empty"
  275. br.Ret = 408
  276. return
  277. }
  278. reportId, _ := this.GetInt("SmartReportId")
  279. if reportId <= 0 {
  280. br.Msg = "参数有误"
  281. br.ErrMsg = "报告ID有误"
  282. return
  283. }
  284. ob := new(smart_report.SmartReport)
  285. item, e := ob.GetItemById(reportId)
  286. if e != nil {
  287. if e.Error() == utils.ErrNoRow() {
  288. br.Msg = "报告不存在, 请刷新页面"
  289. return
  290. }
  291. br.Msg = "操作失败"
  292. br.ErrMsg = "获取研报失败, Err: " + e.Error()
  293. return
  294. }
  295. resp := smart_report.FormatSmartReport2Item(item)
  296. br.Ret = 200
  297. br.Success = true
  298. br.Msg = "获取成功"
  299. br.Data = resp
  300. }
  301. // Publish
  302. // @Title 发布/取消发布
  303. // @Description 发布/取消发布
  304. // @Param request body smart_report.SmartReportPublishReq true "type json string"
  305. // @Success 200 string "操作成功"
  306. // @router /edit [post]
  307. func (this *SmartReportController) Publish() {
  308. br := new(models.BaseResponse).Init()
  309. defer func() {
  310. if br.ErrMsg == "" {
  311. br.IsSendEmail = false
  312. }
  313. this.Data["json"] = br
  314. this.ServeJSON()
  315. }()
  316. sysUser := this.SysUser
  317. if sysUser == nil {
  318. br.Msg = "请登录"
  319. br.ErrMsg = "请登录,SysUser Is Empty"
  320. br.Ret = 408
  321. return
  322. }
  323. var req smart_report.SmartReportPublishReq
  324. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  325. if err != nil {
  326. br.Msg = "参数解析异常!"
  327. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  328. return
  329. }
  330. if req.SmartReportId <= 0 {
  331. br.Msg = "参数有误"
  332. br.ErrMsg = "报告ID为空"
  333. return
  334. }
  335. if req.PublishState != 1 && req.PublishState != 2 {
  336. br.Msg = "参数有误"
  337. return
  338. }
  339. ob := new(smart_report.SmartReport)
  340. item, e := ob.GetItemById(req.SmartReportId)
  341. if e != nil {
  342. if e.Error() == utils.ErrNoRow() {
  343. br.Msg = "报告不存在, 请刷新页面"
  344. return
  345. }
  346. br.Msg = "操作失败"
  347. br.ErrMsg = "获取研报失败, Err: " + e.Error()
  348. return
  349. }
  350. cols := []string{"State", "ModifyTime"}
  351. item.State = req.PublishState
  352. item.ModifyTime = time.Now().Local()
  353. // 取消发布时同时清除掉Img和PDF的文件地址
  354. if req.PublishState == 1 {
  355. cols = append(cols, "DetailImgUrl", "DetailPdfUrl")
  356. item.DetailImgUrl = ""
  357. item.DetailPdfUrl = ""
  358. }
  359. if e = item.Update(cols); e != nil {
  360. br.Msg = "操作失败"
  361. br.ErrMsg = "更新研报失败, Err: " + e.Error()
  362. return
  363. }
  364. // 生成音频
  365. if req.PublishState == smart_report.SmartReportStatePublished && item.VideoUrl == "" {
  366. go smartReportService.SmartReportBuildVideoAndUpdate(item)
  367. }
  368. // ES更新报告
  369. go func() {
  370. _ = smartReportService.SmartReportElasticUpsert(item.SmartReportId, req.PublishState)
  371. }()
  372. br.Ret = 200
  373. br.Success = true
  374. br.Msg = "操作成功"
  375. }
  376. // PrePublish
  377. // @Title 设置定时发布
  378. // @Description 设置定时发布
  379. // @Param request body smart_report.SmartReportPrePublishReq true "type json string"
  380. // @Success 200 string "操作成功"
  381. // @router /pre_publish [post]
  382. func (this *SmartReportController) PrePublish() {
  383. br := new(models.BaseResponse).Init()
  384. defer func() {
  385. if br.ErrMsg == "" {
  386. br.IsSendEmail = false
  387. }
  388. this.Data["json"] = br
  389. this.ServeJSON()
  390. }()
  391. sysUser := this.SysUser
  392. if sysUser == nil {
  393. br.Msg = "请登录"
  394. br.ErrMsg = "请登录,SysUser Is Empty"
  395. br.Ret = 408
  396. return
  397. }
  398. var req smart_report.SmartReportPrePublishReq
  399. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  400. if err != nil {
  401. br.Msg = "参数解析异常!"
  402. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  403. return
  404. }
  405. reportId := req.SmartReportId
  406. if reportId == 0 {
  407. br.Msg = "参数错误"
  408. br.ErrMsg = "参数错误,报告id不可为空"
  409. return
  410. }
  411. if req.PrePublishTime == "" {
  412. br.Msg = "发布时间不能为空"
  413. return
  414. }
  415. //if req.PreMsgSend != 0 && req.PreMsgSend != 1 {
  416. // br.Msg = "参数错误"
  417. // br.ErrMsg = "是否发送模版消息标识错误"
  418. // return
  419. //}
  420. preTime, e := time.ParseInLocation(utils.FormatDateTime, req.PrePublishTime, time.Local)
  421. if e != nil {
  422. br.Msg = "发布时间格式错误"
  423. br.ErrMsg = "发布时间格式错误,Err:" + e.Error()
  424. return
  425. }
  426. if preTime.Before(time.Now()) {
  427. br.Msg = "发布时间不允许选择过去时间"
  428. return
  429. }
  430. if preTime.Before(time.Now().Add(2 * time.Minute)) {
  431. br.Msg = "发布时间距离当前时间太近了"
  432. return
  433. }
  434. reportOB := new(smart_report.SmartReport)
  435. item, e := reportOB.GetItemById(reportId)
  436. if e != nil {
  437. if e.Error() == utils.ErrNoRow() {
  438. br.Msg = "报告不存在, 请刷新页面"
  439. return
  440. }
  441. br.Msg = "获取报告失败"
  442. br.ErrMsg = "获取报告失败, Err:" + e.Error()
  443. return
  444. }
  445. if item.Content == "" {
  446. br.Msg = "报告内容为空, 不可发布"
  447. return
  448. }
  449. if item.State == 2 {
  450. br.Msg = "报告已发布, 不可设置定时发布"
  451. return
  452. }
  453. item.PrePublishTime = preTime
  454. item.PreMsgSend = req.PreMsgSend
  455. cols := []string{"PrePublishTime", "PreMsgSend"}
  456. if e = item.Update(cols); e != nil {
  457. br.Msg = "操作失败"
  458. br.ErrMsg = "更新报告预发布失败, Err: " + e.Error()
  459. return
  460. }
  461. br.Ret = 200
  462. br.Success = true
  463. br.Msg = "操作成功"
  464. }
  465. // SendMsg
  466. // @Title 消息推送
  467. // @Description 消息推送
  468. // @Param request body models.SendTemplateMsgReq true "type json string"
  469. // @Success 200 Ret=200 推送成功
  470. // @router /send_msg [post]
  471. func (this *SmartReportController) SendMsg() {
  472. br := new(models.BaseResponse).Init()
  473. defer func() {
  474. if br.ErrMsg == "" {
  475. br.IsSendEmail = false
  476. }
  477. this.Data["json"] = br
  478. this.ServeJSON()
  479. }()
  480. sysUser := this.SysUser
  481. if sysUser == nil {
  482. br.Msg = "请登录"
  483. br.ErrMsg = "请登录,SysUser Is Empty"
  484. br.Ret = 408
  485. return
  486. }
  487. var req smart_report.SmartReportSendMsgReq
  488. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  489. if err != nil {
  490. br.Msg = "参数解析异常!"
  491. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  492. return
  493. }
  494. if req.SmartReportId <= 0 {
  495. br.Msg = "参数有误"
  496. br.ErrMsg = fmt.Sprintf("参数有误, SmartReportId: %d", req.SmartReportId)
  497. return
  498. }
  499. // 避免重复推送
  500. {
  501. redisKey := fmt.Sprint(utils.CACHE_SMART_REPORT_SEND_MSG, req.SmartReportId)
  502. ok := utils.Rc.SetNX(redisKey, 1, time.Second*300)
  503. if !ok {
  504. br.Msg = "报告已推送, 请勿重复推送"
  505. return
  506. }
  507. defer func() {
  508. _ = utils.Rc.Delete(redisKey)
  509. }()
  510. }
  511. reportOB := new(smart_report.SmartReport)
  512. item, e := reportOB.GetItemById(req.SmartReportId)
  513. if e != nil {
  514. if e.Error() == utils.ErrNoRow() {
  515. br.Msg = "报告不存在, 请刷新页面"
  516. return
  517. }
  518. br.Msg = "操作失败"
  519. br.ErrMsg = "获取报告失败, Err: " + e.Error()
  520. return
  521. }
  522. if item.MsgIsSend == 1 {
  523. br.Msg = "消息已推送,请勿重复操作"
  524. return
  525. }
  526. item.MsgIsSend = 1
  527. item.ModifyTime = time.Now().Local()
  528. if e = item.Update([]string{"MsgIsSend", "ModifyTime"}); e != nil {
  529. br.Msg = "操作失败"
  530. br.ErrMsg = "更新报告推送状态失败, Err: " + e.Error()
  531. return
  532. }
  533. br.Ret = 200
  534. br.Success = true
  535. br.Msg = "操作成功"
  536. br.IsAddLog = true
  537. }
  538. // SaveContent
  539. // @Title 保存草稿
  540. // @Description 保存草稿
  541. // @Param request body smart_report.SmartReportSaveContentReq true "type json string"
  542. // @Success 200 {object} smart_report.SmartReportSaveContentResp
  543. // @router /save_content [post]
  544. func (this *SmartReportController) SaveContent() {
  545. br := new(models.BaseResponse).Init()
  546. defer func() {
  547. if br.ErrMsg == "" {
  548. br.IsSendEmail = false
  549. }
  550. this.Data["json"] = br
  551. this.ServeJSON()
  552. }()
  553. sysUser := this.SysUser
  554. if sysUser == nil {
  555. br.Msg = "请登录"
  556. br.ErrMsg = "请登录,SysUser Is Empty"
  557. br.Ret = 408
  558. return
  559. }
  560. var req smart_report.SmartReportSaveContentReq
  561. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  562. if err != nil {
  563. br.Msg = "参数解析异常!"
  564. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  565. return
  566. }
  567. resp := new(smart_report.SmartReportSaveContentResp)
  568. if req.SmartReportId <= 0 {
  569. br.Ret = 200
  570. br.Success = true
  571. br.Msg = "操作成功"
  572. br.Data = resp
  573. return
  574. }
  575. reportOB := new(smart_report.SmartReport)
  576. item, _ := reportOB.GetItemById(req.SmartReportId)
  577. if item == nil {
  578. br.Ret = 200
  579. br.Success = true
  580. br.Msg = "操作成功"
  581. br.Data = resp
  582. return
  583. }
  584. if item.State == smart_report.SmartReportStatePublished {
  585. br.Msg = "报告已发布, 不允许编辑"
  586. return
  587. }
  588. // 更新编辑状态
  589. adminIdName := make(map[int]string)
  590. admins, e := system.GetSysAdminList(``, make([]interface{}, 0), []string{}, "")
  591. if e != nil {
  592. br.Msg = "获取失败"
  593. br.ErrMsg = "获取系统用户列表失败, Err: " + e.Error()
  594. return
  595. }
  596. for _, ad := range admins {
  597. adminIdName[ad.AdminId] = ad.RealName
  598. }
  599. editing, e := smartReportService.UpdateSmartReportEditing(req.SmartReportId, 1, sysUser.AdminId, sysUser.RealName, adminIdName)
  600. if e != nil {
  601. br.Msg = e.Error()
  602. return
  603. }
  604. if editing.Status == 1 {
  605. br.Msg = editing.Msg
  606. return
  607. }
  608. // 内容有改动
  609. if req.NoChange != 1 && req.Content != "" && req.ContentStruct != "" {
  610. req.Content = html.EscapeString(req.Content)
  611. req.ContentStruct = html.EscapeString(req.ContentStruct)
  612. sub, e := services.GetReportContentSub(req.Content)
  613. if e != nil {
  614. br.Msg = "操作失败"
  615. br.ErrMsg = "读取报告前两个章节内容失败, Err: " + e.Error()
  616. return
  617. }
  618. subContent := html.EscapeString(sub)
  619. item.Content = req.Content
  620. item.ContentSub = subContent
  621. item.ContentStruct = req.ContentStruct
  622. item.ModifyTime = time.Now().Local()
  623. cols := []string{"Content", "ContentSub", "ContentStruct", "ModifyTime"}
  624. if e = item.Update(cols); e != nil {
  625. br.Msg = "操作失败"
  626. br.ErrMsg = "更新报告内容失败"
  627. return
  628. }
  629. go func() {
  630. saveLog := new(smart_report.SmartReportSaveLog)
  631. saveLog.SmartReportId = item.SmartReportId
  632. saveLog.Content = item.Content
  633. saveLog.ContentSub = item.ContentSub
  634. saveLog.ContentStruct = item.ContentStruct
  635. saveLog.AdminId = sysUser.AdminId
  636. saveLog.AdminName = sysUser.AdminName
  637. saveLog.CreateTime = time.Now().Local()
  638. _ = saveLog.Create()
  639. }()
  640. }
  641. resp.SmartReportId = item.SmartReportId
  642. br.Ret = 200
  643. br.Success = true
  644. br.Msg = "保存成功"
  645. br.Data = resp
  646. }
  647. // MarkEditStatus
  648. // @Title 标记报告编辑状态
  649. // @Description 标记报告编辑状态接口
  650. // @Param request body request.MarkEditEnReport true "type json string"
  651. // @Success 200 标记成功 ;202 标记成功
  652. // @router /mark [post]
  653. func (this *SmartReportController) MarkEditStatus() {
  654. br := new(models.BaseResponse).Init()
  655. defer func() {
  656. if br.ErrMsg == "" {
  657. br.IsSendEmail = false
  658. }
  659. this.Data["json"] = br
  660. this.ServeJSON()
  661. }()
  662. sysUser := this.SysUser
  663. if sysUser == nil {
  664. br.Msg = "请登录"
  665. br.ErrMsg = "请登录,SysUser Is Empty"
  666. br.Ret = 408
  667. return
  668. }
  669. var req models.MarkEditReport
  670. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  671. if err != nil {
  672. br.Msg = "参数解析异常!"
  673. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  674. return
  675. }
  676. if req.ReportId <= 0 {
  677. br.Msg = "缺少报告Id"
  678. return
  679. }
  680. if req.Status <= 0 {
  681. br.Msg = "标记状态异常"
  682. return
  683. }
  684. // 获取系统用户列表-用于匹配编辑中的用户
  685. adminIdName := make(map[int]string)
  686. admins, e := system.GetSysAdminList(``, make([]interface{}, 0), []string{}, "")
  687. if e != nil {
  688. br.Msg = "获取失败"
  689. br.ErrMsg = "获取系统用户列表失败, Err: " + e.Error()
  690. return
  691. }
  692. for _, ad := range admins {
  693. adminIdName[ad.AdminId] = ad.RealName
  694. }
  695. data, e := smartReportService.UpdateSmartReportEditing(req.ReportId, req.Status, sysUser.AdminId, sysUser.RealName, adminIdName)
  696. if e != nil {
  697. br.Msg = e.Error()
  698. return
  699. }
  700. br.Ret = 200
  701. br.Success = true
  702. br.Msg = "标记成功"
  703. br.Data = data
  704. }
  705. // List
  706. // @Title 报告列表
  707. // @Description 报告列表
  708. // @Param PageSize query int true "每页数据条数"
  709. // @Param CurrentIndex query int true "当前页页码"
  710. // @Param TimeType query string false "筛选的时间类别: publish_time-发布时间, modify_time-更新时间"
  711. // @Param StartDate query string false "开始时间"
  712. // @Param EndDate query string false "结束时间"
  713. // @Param Frequency query string false "频度"
  714. // @Param ClassifyIdFirst query int false "一级分类ID"
  715. // @Param ClassifyIdSecond query int false "二级分类ID"
  716. // @Param State query int false "发布状态: 1-待发布; 2-已发布"
  717. // @Param Keyword query string false "搜索关键词"
  718. // @Success 200 {object} smart_report.SmartReportListResp
  719. // @router /list [get]
  720. func (this *SmartReportController) List() {
  721. br := new(models.BaseResponse).Init()
  722. defer func() {
  723. if br.ErrMsg == "" {
  724. br.IsSendEmail = false
  725. }
  726. this.Data["json"] = br
  727. this.ServeJSON()
  728. }()
  729. sysUser := this.SysUser
  730. if sysUser == nil {
  731. br.Msg = "请登录"
  732. br.ErrMsg = "请登录,SysUser Is Empty"
  733. br.Ret = 408
  734. return
  735. }
  736. type SmartReportListReq struct {
  737. PageSize int `form:"PageSize"`
  738. CurrentIndex int `form:"CurrentIndex"`
  739. TimeType string `form:"TimeType"`
  740. StartDate string `form:"StartDate"`
  741. EndDate string `form:"EndDate"`
  742. Frequency string `form:"Frequency"`
  743. ClassifyIdFirst int `form:"ClassifyIdFirst"`
  744. ClassifyIdSecond int `form:"ClassifyIdSecond"`
  745. State int `form:"State"`
  746. Keyword string `form:"Keyword"`
  747. }
  748. params := new(SmartReportListReq)
  749. if e := this.ParseForm(&params); e != nil {
  750. br.Msg = "获取失败"
  751. br.ErrMsg = "入参解析失败, Err: " + e.Error()
  752. return
  753. }
  754. if params.TimeType == "" {
  755. params.TimeType = "publish_time"
  756. }
  757. if params.TimeType != "publish_time" && params.TimeType != "modify_time" {
  758. br.Msg = "请选择正确的时间类型"
  759. return
  760. }
  761. var condition string
  762. var pars []interface{}
  763. // 筛选项
  764. {
  765. keyword := strings.TrimSpace(params.Keyword)
  766. if keyword != "" {
  767. kw := fmt.Sprint("%", keyword, "%")
  768. condition += fmt.Sprintf(` AND (title LIKE ? OR admin_real_name LIKE ?)`)
  769. pars = append(pars, kw, kw)
  770. }
  771. if params.StartDate != "" && params.EndDate != "" {
  772. condition += fmt.Sprintf(` AND %s >= ? AND %s <= ?`, params.TimeType, params.TimeType)
  773. pars = append(pars, params.StartDate, params.EndDate)
  774. }
  775. if params.Frequency != "" {
  776. condition += ` AND frequency = ?`
  777. pars = append(pars, params.Frequency)
  778. }
  779. if params.ClassifyIdFirst > 0 {
  780. condition += ` AND classify_id_first = ?`
  781. pars = append(pars, params.ClassifyIdFirst)
  782. }
  783. if params.ClassifyIdSecond > 0 {
  784. condition += ` AND classify_id_second = ?`
  785. pars = append(pars, params.ClassifyIdSecond)
  786. }
  787. if params.State > 0 {
  788. condition += ` AND state = ?`
  789. pars = append(pars, params.State)
  790. }
  791. }
  792. resp := new(smart_report.SmartReportListResp)
  793. reportOB := new(smart_report.SmartReport)
  794. total, e := reportOB.GetCountByCondition(condition, pars)
  795. if e != nil {
  796. br.Msg = "获取失败"
  797. br.ErrMsg = "获取报告总数失败, Err:" + e.Error()
  798. return
  799. }
  800. if total <= 0 {
  801. page := paging.GetPaging(params.CurrentIndex, params.PageSize, total)
  802. resp.Paging = page
  803. br.Ret = 200
  804. br.Success = true
  805. br.Msg = "获取成功"
  806. br.Data = resp
  807. return
  808. }
  809. // 分页列表
  810. var startSize int
  811. if params.PageSize <= 0 {
  812. params.PageSize = utils.PageSize20
  813. }
  814. if params.CurrentIndex <= 0 {
  815. params.CurrentIndex = 1
  816. }
  817. startSize = utils.StartIndex(params.CurrentIndex, params.PageSize)
  818. // 列表查询过滤掉富文本内容
  819. fields := []string{
  820. "SmartReportId", "ReportCode", "ClassifyIdFirst", "ClassifyNameFirst", "ClassifyIdSecond", "ClassifyNameSecond", "AddType",
  821. "Title", "Author", "Frequency", "Stage", "VideoUrl", "VideoName", "VideoPlaySeconds", "VideoSize", "AdminId", "AdminRealName", "State",
  822. "PublishTime", "PrePublishTime", "PreMsgSend", "MsgIsSend", "MsgSendTime", "CreateTime", "ModifyTime",
  823. }
  824. list, e := reportOB.GetPageItemsByCondition(condition, pars, fields, "", startSize, params.PageSize)
  825. if e != nil {
  826. br.Msg = "获取失败"
  827. br.ErrMsg = "获取报告分页列表失败, Err:" + e.Error()
  828. return
  829. }
  830. // 获取系统用户列表-用于匹配编辑中的用户
  831. adminIdName := make(map[int]string)
  832. admins, e := system.GetSysAdminList(``, make([]interface{}, 0), []string{}, "")
  833. if e != nil {
  834. br.Msg = "获取失败"
  835. br.ErrMsg = "获取系统用户列表失败, Err: " + e.Error()
  836. return
  837. }
  838. for _, ad := range admins {
  839. adminIdName[ad.AdminId] = ad.RealName
  840. }
  841. for _, v := range list {
  842. item := smart_report.FormatSmartReport2Item(v)
  843. mark, e := smartReportService.UpdateSmartReportEditing(v.SmartReportId, 2, sysUser.AdminId, sysUser.RealName, adminIdName)
  844. if e != nil {
  845. br.Msg = "获取失败"
  846. br.ErrMsg = "查询编辑中标记失败, Err:" + e.Error()
  847. return
  848. }
  849. if mark.Status == 0 {
  850. item.CanEdit = true
  851. } else {
  852. item.Editor = mark.Editor
  853. }
  854. resp.List = append(resp.List, item)
  855. }
  856. page := paging.GetPaging(params.CurrentIndex, params.PageSize, total)
  857. resp.Paging = page
  858. br.Ret = 200
  859. br.Success = true
  860. br.Msg = "获取成功"
  861. br.Data = resp
  862. }
  863. // DetailImg
  864. // @Title 生成长图
  865. // @Description 生成长图
  866. // @Param SmartReportId query int true "智能研报ID"
  867. // @Success 200 {object} smart_report.SmartReportSaveContentResp
  868. // @router /detail_img [get]
  869. func (this *SmartReportController) DetailImg() {
  870. br := new(models.BaseResponse).Init()
  871. defer func() {
  872. if br.ErrMsg == "" {
  873. br.IsSendEmail = false
  874. }
  875. this.Data["json"] = br
  876. this.ServeJSON()
  877. }()
  878. sysUser := this.SysUser
  879. if sysUser == nil {
  880. br.Msg = "请登录"
  881. br.ErrMsg = "请登录,SysUser Is Empty"
  882. br.Ret = 408
  883. return
  884. }
  885. reportId, _ := this.GetInt("SmartReportId", 0)
  886. if reportId <= 0 {
  887. br.Msg = "参数有误"
  888. br.ErrMsg = fmt.Sprintf("参数有误, SmartReportId: %d", reportId)
  889. return
  890. }
  891. reportOB := new(smart_report.SmartReport)
  892. item, e := reportOB.GetItemById(reportId)
  893. if e != nil {
  894. if e.Error() == utils.ErrNoRow() {
  895. br.Msg = "报告不存在, 请刷新页面"
  896. return
  897. }
  898. br.Msg = "操作失败"
  899. br.ErrMsg = "获取报告失败, Err: " + e.Error()
  900. return
  901. }
  902. if item.DetailImgUrl != "" {
  903. br.Data = item.DetailImgUrl
  904. br.Ret = 200
  905. br.Success = true
  906. br.Msg = "获取成功"
  907. return
  908. }
  909. // TODO:生成一个长图或者PDF需要个2min左右, 加个锁避免重复请求生成服务
  910. // TODO:未生成, 则调用eta_report的详情转换接口去生成一次
  911. go func() {
  912. }()
  913. br.Msg = "图片正在生成中, 请稍后下载"
  914. return
  915. }
  916. // LastPublishedReport
  917. // @Title 上期已发布的报告
  918. // @Description 上期已发布的报告
  919. // @Param ClassifyIdFirst query int false "一级分类ID"
  920. // @Param ClassifyIdSecond query int false "二级分类ID"
  921. // @Success 200 {object} smart_report.SmartReportItem
  922. // @router /last_published_report [get]
  923. func (this *SmartReportController) LastPublishedReport() {
  924. br := new(models.BaseResponse).Init()
  925. defer func() {
  926. if br.ErrMsg == "" {
  927. br.IsSendEmail = false
  928. }
  929. this.Data["json"] = br
  930. this.ServeJSON()
  931. }()
  932. sysUser := this.SysUser
  933. if sysUser == nil {
  934. br.Msg = "请登录"
  935. br.ErrMsg = "请登录,SysUser Is Empty"
  936. br.Ret = 408
  937. return
  938. }
  939. firstId, _ := this.GetInt("ClassifyIdFirst")
  940. secondId, _ := this.GetInt("ClassifyIdSecond")
  941. ob := new(smart_report.SmartReport)
  942. cond := ` AND classify_id_first = ? AND classify_id_second = ? AND state = 2`
  943. pars := make([]interface{}, 0)
  944. pars = append(pars, firstId, secondId)
  945. item, e := ob.GetItemByCondition(cond, pars)
  946. if e != nil && e.Error() != utils.ErrNoRow() {
  947. br.Msg = "获取失败"
  948. br.ErrMsg = "获取研报失败, Err: " + e.Error()
  949. return
  950. }
  951. resp := smart_report.FormatSmartReport2Item(item)
  952. br.Ret = 200
  953. br.Success = true
  954. br.Msg = "获取成功"
  955. br.Data = resp
  956. }