report.go 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "eta_gn/eta_api/models"
  5. "eta_gn/eta_api/services"
  6. "eta_gn/eta_api/services/alarm_msg"
  7. "eta_gn/eta_api/services/data"
  8. "eta_gn/eta_api/utils"
  9. "fmt"
  10. "github.com/beego/beego/v2/server/web"
  11. "github.com/h2non/filetype"
  12. "github.com/tealeg/xlsx"
  13. "html"
  14. "io"
  15. "os"
  16. "path"
  17. "path/filepath"
  18. "strconv"
  19. "strings"
  20. "time"
  21. )
  22. // ReportController 报告
  23. type ReportController struct {
  24. BaseAuthController
  25. }
  26. // ReportCommonController 报告
  27. type ReportCommonController struct {
  28. BaseCommonController
  29. }
  30. // ReportUploadCommonController 报告上传
  31. type ReportUploadCommonController struct {
  32. web.Controller
  33. }
  34. // Delete
  35. // @Title 删除报告接口
  36. // @Description 删除报告
  37. // @Param request body models.DeleteReq true "type json string"
  38. // @Success 200 Ret=200 删除成功
  39. // @router /delete [post]
  40. func (this *ReportController) Delete() {
  41. br := new(models.BaseResponse).Init()
  42. defer func() {
  43. this.Data["json"] = br
  44. this.ServeJSON()
  45. }()
  46. var req models.DeleteReq
  47. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  48. if err != nil {
  49. br.Msg = "参数解析异常!"
  50. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  51. return
  52. }
  53. if req.ReportIds <= 0 {
  54. br.Msg = "参数错误"
  55. br.ErrMsg = "参数错误,报告id不可为空"
  56. return
  57. }
  58. if err := services.DeleteReportAndChapter(req.ReportIds); err != nil {
  59. br.Msg = "删除失败"
  60. br.ErrMsg = "删除报告失败, Err: " + err.Error()
  61. return
  62. }
  63. br.Ret = 200
  64. br.Success = true
  65. br.Msg = "删除成功"
  66. }
  67. // Upload
  68. // @Title 图片上传
  69. // @Description 图片上传接口
  70. // @Param file query file true "文件"
  71. // @Success 200 新增成功
  72. // @router /upload [post]
  73. func (this *ReportController) Upload() {
  74. br := new(models.BaseResponse).Init()
  75. defer func() {
  76. this.Data["json"] = br
  77. this.ServeJSON()
  78. }()
  79. f, h, err := this.GetFile("file")
  80. if err != nil {
  81. br.Msg = "获取资源信息失败"
  82. br.ErrMsg = "获取资源信息失败,Err:" + err.Error()
  83. return
  84. }
  85. fileData, e := io.ReadAll(f)
  86. if e != nil {
  87. br.Msg = "上传失败"
  88. br.ErrMsg = "读取文件失败, Err: " + e.Error()
  89. return
  90. }
  91. pass := filetype.IsImage(fileData)
  92. if !pass {
  93. br.Msg = "文件格式有误"
  94. br.ErrMsg = "文件格式有误"
  95. return
  96. }
  97. ext := path.Ext(h.Filename)
  98. dateDir := time.Now().Format("20060102")
  99. uploadDir := utils.STATIC_DIR + "hongze/" + dateDir
  100. err = os.MkdirAll(uploadDir, utils.DIR_MOD)
  101. if err != nil {
  102. br.Msg = "存储目录创建失败"
  103. br.ErrMsg = "存储目录创建失败,Err:" + err.Error()
  104. return
  105. }
  106. randStr := utils.GetRandStringNoSpecialChar(28)
  107. fileName := randStr + ext
  108. fpath := uploadDir + "/" + fileName
  109. defer f.Close() //关闭上传文件
  110. err = this.SaveToFile("file", fpath)
  111. if err != nil {
  112. br.Msg = "文件上传失败"
  113. br.ErrMsg = "文件上传失败,Err:" + err.Error()
  114. return
  115. }
  116. resourceUrl := ``
  117. //上传到阿里云 和 minio
  118. //if utils.ObjectStorageClient == "minio" {
  119. // resourceUrl, err = services.UploadImgToMinIo(fileName, fpath)
  120. // if err != nil {
  121. // br.Msg = "文件上传失败"
  122. // br.ErrMsg = "文件上传失败,Err:" + err.Error()
  123. // return
  124. // }
  125. //} else {
  126. // resourceUrl, err = services.UploadAliyunV2(fileName, fpath)
  127. // if err != nil {
  128. // br.Msg = "文件上传失败"
  129. // br.ErrMsg = "文件上传失败,Err:" + err.Error()
  130. // return
  131. // }
  132. //}
  133. ossClient := services.NewOssClient()
  134. if ossClient == nil {
  135. br.Msg = "上传失败"
  136. br.ErrMsg = "初始化OSS服务失败"
  137. return
  138. }
  139. resourceUrl, err = ossClient.UploadFile(fileName, fpath, "")
  140. if err != nil {
  141. br.Msg = "文件上传失败"
  142. br.ErrMsg = "文件上传失败,Err:" + err.Error()
  143. return
  144. }
  145. defer func() {
  146. os.Remove(fpath)
  147. }()
  148. item := new(models.Resource)
  149. item.ResourceUrl = resourceUrl
  150. item.ResourceType = 1
  151. item.CreateTime = time.Now()
  152. newId, err := models.AddResource(item)
  153. if err != nil {
  154. br.Msg = "资源上传失败"
  155. br.ErrMsg = "资源上传失败,Err:" + err.Error()
  156. return
  157. }
  158. resp := new(models.ResourceResp)
  159. resp.Id = newId
  160. resp.ResourceUrl = resourceUrl
  161. br.Msg = "上传成功"
  162. br.Ret = 200
  163. br.Success = true
  164. br.Data = resp
  165. return
  166. }
  167. // ClassifyIdDetail
  168. // @Title 根据分类获取最近一次报告详情接口
  169. // @Description 根据分类获取最近一次报告详情
  170. // @Param request body models.ClassifyIdDetailReq true "type json string"
  171. // @Success 200 {object} models.Report
  172. // @router /classifyIdDetail [get]
  173. func (this *ReportController) ClassifyIdDetail() {
  174. br := new(models.BaseResponse).Init()
  175. defer func() {
  176. this.Data["json"] = br
  177. this.ServeJSON()
  178. }()
  179. //classify_id_first=34&classify_id_second=36
  180. /*var req models.ClassifyIdDetailReq
  181. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  182. if err != nil {
  183. br.Msg = "参数解析异常!"
  184. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  185. return
  186. }*/
  187. classifyIdFirst, _ := this.GetInt("classify_id_first")
  188. if classifyIdFirst <= 0 {
  189. classifyIdFirst, _ = this.GetInt("ClassifyIdFirst")
  190. }
  191. classifyIdSecond, _ := this.GetInt("classify_id_second")
  192. if classifyIdSecond <= 0 {
  193. classifyIdSecond, _ = this.GetInt("ClassifyIdSecond")
  194. }
  195. item, err := models.GetReportDetailByClassifyId(classifyIdFirst, classifyIdSecond)
  196. if err != nil && !utils.IsErrNoRow(err) {
  197. br.Msg = "获取失败!"
  198. br.ErrMsg = "获取失败,Err:" + err.Error()
  199. return
  200. }
  201. if item != nil {
  202. item.Content = html.UnescapeString(item.Content)
  203. item.ContentSub = html.UnescapeString(item.ContentSub)
  204. }
  205. br.Ret = 200
  206. br.Success = true
  207. br.Msg = "获取成功"
  208. br.Data = item
  209. }
  210. // SendTemplateMsg
  211. // @Title 模板消息推送接口
  212. // @Description 模板消息推送
  213. // @Param request body models.SendTemplateMsgReq true "type json string"
  214. // @Success 200 Ret=200 推送成功
  215. // @router /sendTemplateMsg [post]
  216. func (this *ReportController) SendTemplateMsg() {
  217. br := new(models.BaseResponse).Init()
  218. defer func() {
  219. this.Data["json"] = br
  220. this.ServeJSON()
  221. }()
  222. if utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeSandbox && utils.BusinessCode != utils.BusinessCodeDebug {
  223. br.Ret = 200
  224. br.Success = true
  225. br.Msg = "操作成功"
  226. return
  227. }
  228. var req models.SendTemplateMsgReq
  229. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  230. if err != nil {
  231. br.Msg = "参数解析异常!"
  232. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  233. return
  234. }
  235. if req.ReportId <= 0 {
  236. br.Msg = "参数错误"
  237. br.ErrMsg = "参数错误"
  238. return
  239. }
  240. report, _ := models.GetReportById(req.ReportId)
  241. if report.MsgIsSend == 1 {
  242. br.Msg = "消息已推送,请勿重复操作"
  243. br.ErrMsg = "模板消息已推送,请勿重复操作"
  244. return
  245. }
  246. videoNameDate := `(` + time.Now().Format("0102") + `)`
  247. err = models.UpdateReportPublishTime(req.ReportId, videoNameDate)
  248. if err != nil {
  249. br.Msg = "修改报告发布时间失败"
  250. br.ErrMsg = "修改发布时间失败,Err:" + err.Error()
  251. return
  252. }
  253. err = models.UpdateReportChapterPublishTime(req.ReportId, videoNameDate)
  254. if err != nil {
  255. br.Msg = "修改章节发布时间失败"
  256. br.ErrMsg = "修改发布时间失败,Err:" + err.Error()
  257. return
  258. }
  259. services.SendMiniProgramReportWxMsg(req.ReportId)
  260. err = models.ModifyReportMsgIsSend(req.ReportId)
  261. if err != nil {
  262. br.Msg = "发送失败"
  263. br.ErrMsg = "发送失败,Err:" + err.Error()
  264. return
  265. }
  266. br.Ret = 200
  267. br.Success = true
  268. br.Msg = "发送成功"
  269. br.IsAddLog = true
  270. }
  271. // Author
  272. // @Title 获取报告作者接口
  273. // @Description 获取报告作者
  274. // @Param AuthorType query int true "来源类型,1:中文,2:英文"
  275. // @Param StartDate query string true "开始时间"
  276. // @Success 200 {object} models.ReportAuthorResp
  277. // @router /author [get]
  278. func (this *ReportController) Author() {
  279. br := new(models.BaseResponse).Init()
  280. defer func() {
  281. this.Data["json"] = br
  282. this.ServeJSON()
  283. }()
  284. keyword := this.GetString("Keyword")
  285. var condition string
  286. var pars []interface{}
  287. condition += ` AND author_type = 1 AND enable = 1`
  288. if keyword != `` {
  289. condition += ` AND report_author like ? `
  290. pars = append(pars, utils.GetLikeKeyword(keyword))
  291. }
  292. _, items, err := models.GetReportAuthorList(condition, pars, 0, 10000)
  293. if err != nil {
  294. br.Msg = "获取失败!"
  295. br.ErrMsg = "获取失败,Err:" + err.Error()
  296. return
  297. }
  298. resp := models.ReportAuthorResp{
  299. List: items,
  300. }
  301. br.Ret = 200
  302. br.Success = true
  303. br.Msg = "获取成功"
  304. br.Data = resp
  305. }
  306. // UploadImg
  307. // @Title 图片上传
  308. // @Description 图片上传接口
  309. // @Param File query file true "文件"
  310. // @Success 200 上传成功
  311. // @router /uploadImg [post]
  312. func (this *ReportUploadCommonController) UploadImg() {
  313. var err error
  314. defer func() {
  315. if err != nil {
  316. fmt.Println("文件上传失败:", err.Error())
  317. go alarm_msg.SendAlarmMsg("URI:"+this.Ctx.Input.URI()+" 文件上传失败:"+err.Error(), 3)
  318. //go utils.SendEmail(utils.APPNAME+"失败提醒", "URI:"+this.Ctx.Input.URI()+" 文件上传失败:"+err.Error(), utils.EmailSendToUsers)
  319. }
  320. }()
  321. f, h, err := this.GetFile("file")
  322. if err != nil {
  323. return
  324. }
  325. defer f.Close() //关闭上传文件
  326. // 不依赖于文件扩展名检查文件格式
  327. fileData, e := io.ReadAll(f)
  328. if e != nil {
  329. err = fmt.Errorf("读取文件失败, Err: %s", e.Error())
  330. return
  331. }
  332. pass := filetype.IsImage(fileData)
  333. if !pass {
  334. kind, _ := filetype.Match(fileData)
  335. if kind.Extension != "pdf" {
  336. err = fmt.Errorf("文件格式有误")
  337. return
  338. }
  339. fmt.Printf("File type: %s. MIME: %s\n", kind.Extension, kind.MIME.Value)
  340. }
  341. ext := path.Ext(h.Filename)
  342. dateDir := time.Now().Format("20060102")
  343. uploadDir := utils.STATIC_DIR + "hongze/" + dateDir
  344. err = os.MkdirAll(uploadDir, utils.DIR_MOD)
  345. if err != nil {
  346. return
  347. }
  348. randStr := utils.GetRandStringNoSpecialChar(28)
  349. fileName := randStr + ext
  350. fpath := uploadDir + "/" + fileName
  351. err = this.SaveToFile("file", fpath)
  352. if err != nil {
  353. return
  354. }
  355. defer func() {
  356. os.Remove(fpath)
  357. }()
  358. // 上传至对象存储
  359. resourceUrl := ``
  360. ossClient := services.NewOssClient()
  361. if ossClient == nil {
  362. err = fmt.Errorf("初始化OSS服务失败")
  363. return
  364. }
  365. resourceUrl, err = ossClient.UploadFile(fileName, fpath, "")
  366. if err != nil {
  367. err = fmt.Errorf("文件上传失败, Err: %s", err.Error())
  368. return
  369. }
  370. item := new(models.Resource)
  371. item.ResourceUrl = resourceUrl
  372. item.ResourceType = 1
  373. item.CreateTime = time.Now()
  374. newId, err := models.AddResource(item)
  375. if err != nil {
  376. return
  377. }
  378. resp := new(models.ResourceResp)
  379. resp.Id = newId
  380. resp.ResourceUrl = resourceUrl
  381. this.Data["json"] = map[string]string{"link": resourceUrl}
  382. this.ServeJSON()
  383. }
  384. // Export
  385. // @Title 研报浏览数据导出
  386. // @Description 研报浏览数据导出接口
  387. // @Param ReportIds query string true "报告id,多个报告用英文,隔开"
  388. // @Success 200 {object} company.CompanyListResp
  389. // @router /report_view_record/export [get]
  390. func (this *ReportController) Export() {
  391. br := new(models.BaseResponse).Init()
  392. defer func() {
  393. this.Data["json"] = br
  394. this.ServeJSON()
  395. }()
  396. sysUser := this.SysUser
  397. if sysUser == nil {
  398. br.Msg = "请登录"
  399. br.ErrMsg = "请登录,SysUser Is Empty"
  400. br.Ret = 408
  401. return
  402. }
  403. reportIds := this.GetString("ReportIds")
  404. if reportIds == "" {
  405. br.Msg = "请选择需要下载的报告"
  406. br.ErrMsg = "请选择需要下载的报告"
  407. return
  408. }
  409. //生成excel文件
  410. dir, err := os.Executable()
  411. exPath := filepath.Dir(dir)
  412. downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
  413. xlsxFile := xlsx.NewFile()
  414. if err != nil {
  415. br.Msg = "生成文件失败"
  416. br.ErrMsg = "生成文件失败"
  417. return
  418. }
  419. //只有权益研究员,以及超管可以下载
  420. if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_RESEARCHR && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN {
  421. br.Msg = "没有下载权限"
  422. br.ErrMsg = "没有下载权限"
  423. return
  424. }
  425. //普通样式
  426. style := xlsx.NewStyle()
  427. alignment := xlsx.Alignment{
  428. Horizontal: "center",
  429. Vertical: "center",
  430. WrapText: true,
  431. }
  432. //设置默认字体和文字大小
  433. xlsx.SetDefaultFont(12, "宋体")
  434. style.Alignment = alignment
  435. style.ApplyAlignment = true
  436. //标题样式
  437. titleStyle := xlsx.NewStyle()
  438. titleFont := xlsx.NewFont(20, "宋体")
  439. titleFont.Bold = true
  440. titleStyle.Font = *titleFont
  441. titleStyle.Alignment = alignment
  442. //titleStyle.ApplyAlignment = true
  443. //表头
  444. headerStyle := xlsx.NewStyle()
  445. headerFont := xlsx.NewFont(12, "宋体")
  446. headerFont.Bold = true
  447. headerStyle.Font = *headerFont
  448. headerStyle.Alignment = alignment
  449. headerStyle.ApplyAlignment = true
  450. defer func() {
  451. os.Remove(downLoadnFilePath)
  452. }()
  453. //记录已经命名了的表单名称
  454. sheetNameMap := make(map[string]int)
  455. reportSlice := strings.Split(reportIds, ",")
  456. for _, reportIdStr := range reportSlice {
  457. reportId, convErr := strconv.Atoi(reportIdStr)
  458. if convErr != nil {
  459. br.Msg = "报告传参异常"
  460. br.ErrMsg = "报告传参异常"
  461. return
  462. }
  463. report, reportErr := models.GetReportById(reportId)
  464. if reportErr != nil {
  465. br.Msg = "查询报告异常"
  466. br.ErrMsg = "查询报告异常:" + reportErr.Error()
  467. return
  468. }
  469. //查询浏览记录
  470. _, viewList, err := models.GetViewListByReportId(reportId)
  471. //fmt.Println(total)
  472. //fmt.Println(viewList)
  473. //fmt.Println(err)
  474. if err != nil {
  475. br.Msg = "查询报告浏览记录异常"
  476. br.ErrMsg = "查询报告浏览记录异常:" + err.Error()
  477. return
  478. }
  479. //导入报表
  480. //报表名称
  481. createTime, _ := time.Parse(utils.FormatDateTime, report.CreateTime)
  482. timeStr := createTime.Format("0102")
  483. reportName := report.Title + "(" + timeStr + ")"
  484. //表单名称
  485. sheetName := reportName
  486. //判断当前sheet表单map中是否已经存在该表单名称,如果存在,那么需要添加后缀,并给sheet表单map中赋值次数加1处理;不存在,那么还是使用当前名称,并给sheet表单map中赋值次数为1
  487. if n, ok := sheetNameMap[sheetName]; ok == true {
  488. n++
  489. sheetName = sheetName + "_" + strconv.Itoa(n)
  490. sheetNameMap[sheetName] = n
  491. } else {
  492. sheetNameMap[sheetName] = 1
  493. }
  494. sheel, err := xlsxFile.AddSheet(sheetName)
  495. if err != nil {
  496. br.Msg = "新增Sheet失败"
  497. br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
  498. return
  499. }
  500. //设置列宽
  501. sheel.SetColWidth(0, 0, 28)
  502. sheel.SetColWidth(1, 1, 18)
  503. sheel.SetColWidth(2, 2, 18)
  504. sheel.SetColWidth(3, 3, 18)
  505. sheel.SetColWidth(4, 4, 40)
  506. //标题行
  507. titleRow := sheel.AddRow()
  508. titleRow.SetHeight(40)
  509. //标题列
  510. titleCell := titleRow.AddCell()
  511. titleCell.HMerge = 4 //向右合并列数,不包括自身列
  512. //报表标题名称
  513. titleCell.SetValue(reportName)
  514. titleCell.SetStyle(titleStyle)
  515. //表头
  516. headerRow := sheel.AddRow()
  517. headerRow.SetHeight(18)
  518. timeHeaderCell := headerRow.AddCell()
  519. timeHeaderCell.SetValue("浏览时间")
  520. timeHeaderCell.SetStyle(headerStyle)
  521. nameHeaderCell := headerRow.AddCell()
  522. nameHeaderCell.SetValue("用户名称")
  523. nameHeaderCell.SetStyle(headerStyle)
  524. mobileHeaderCell := headerRow.AddCell()
  525. mobileHeaderCell.SetValue("手机号")
  526. mobileHeaderCell.SetStyle(headerStyle)
  527. emailHeaderCell := headerRow.AddCell()
  528. emailHeaderCell.SetValue("邮箱")
  529. emailHeaderCell.SetStyle(headerStyle)
  530. companyHeaderCell := headerRow.AddCell()
  531. companyHeaderCell.SetValue("所属企业客户名称")
  532. companyHeaderCell.SetStyle(headerStyle)
  533. for _, v := range viewList {
  534. dataRow := sheel.AddRow()
  535. dataRow.SetHeight(18)
  536. timeCell := dataRow.AddCell()
  537. timeCell.SetString(v.CreateTime.Format(utils.FormatDateTime))
  538. timeCell.SetStyle(style)
  539. nameCell := dataRow.AddCell()
  540. nameCell.SetString(v.RealName)
  541. nameCell.SetStyle(style)
  542. mobileCell := dataRow.AddCell()
  543. mobileCell.SetString(v.Mobile)
  544. mobileCell.SetStyle(style)
  545. emailCell := dataRow.AddCell()
  546. emailCell.SetString(v.Email)
  547. emailCell.SetStyle(style)
  548. companyCell := dataRow.AddCell()
  549. companyCell.SetString(v.CompanyName)
  550. companyCell.SetStyle(style)
  551. }
  552. }
  553. err = xlsxFile.Save(downLoadnFilePath)
  554. if err != nil {
  555. br.Msg = "保存文件失败"
  556. br.ErrMsg = "保存文件失败"
  557. return
  558. }
  559. randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
  560. downloadFileName := "研报浏览记录" + randStr + ".xlsx"
  561. this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
  562. br.Ret = 200
  563. br.Success = true
  564. br.Msg = "导出成功"
  565. }
  566. // ThsSendTemplateMsg
  567. // @Title 客群消息推送接口
  568. // @Description 客群消息推送接口
  569. // @Param request body models.SendTemplateMsgReq true "type json string"
  570. // @Success 200 Ret=200 推送成功
  571. // @router /ths/sendTemplateMsg [post]
  572. func (this *ReportController) ThsSendTemplateMsg() {
  573. br := new(models.BaseResponse).Init()
  574. defer func() {
  575. this.Data["json"] = br
  576. this.ServeJSON()
  577. }()
  578. var req models.ThsSendTemplateMsgReq
  579. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  580. if err != nil {
  581. br.Msg = "参数解析异常!"
  582. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  583. return
  584. }
  585. for _, v := range req.ReportId {
  586. if v <= 0 {
  587. br.Msg = "参数错误"
  588. br.ErrMsg = "参数错误"
  589. return
  590. }
  591. //加锁,避免重复点击造成的多次推送
  592. {
  593. redisKey := fmt.Sprint("report:send:ths:", v)
  594. ok := utils.Rc.SetNX(redisKey, 1, time.Second*300)
  595. if !ok {
  596. br.Msg = "报告已推送客群,请勿重复推送"
  597. return
  598. }
  599. defer func() {
  600. utils.Rc.Delete(redisKey)
  601. }()
  602. }
  603. report, err := models.GetReportById(v)
  604. if err != nil {
  605. if utils.IsErrNoRow(err) {
  606. br.Msg = "报告已经被删除,请刷新页面"
  607. br.ErrMsg = "报告已经被删除,请刷新页面,req:" + string(this.Ctx.Input.RequestBody)
  608. return
  609. }
  610. br.Msg = "获取报告信息失败"
  611. br.ErrMsg = "获取报告信息失败,req:" + string(this.Ctx.Input.RequestBody)
  612. return
  613. }
  614. if report.ThsMsgIsSend == 1 {
  615. br.Msg = "消息已推送,请勿重复操作"
  616. br.ErrMsg = "模板消息已推送,请勿重复操作1"
  617. return
  618. }
  619. err = models.ModifyReportThsMsgIsSend(report)
  620. if err != nil {
  621. br.Msg = "发送失败"
  622. br.ErrMsg = "发送失败,Err:" + err.Error()
  623. return
  624. }
  625. }
  626. br.Ret = 200
  627. br.Success = true
  628. br.Msg = "发送成功"
  629. }
  630. // GetDayWeekReportChapterTypeList
  631. // @Title 获取晨报周报章节类型列表
  632. // @Description 获取晨报周报章节类型列表
  633. // @Param StopType query string true "停更类型 stop; disable;"
  634. // @Success 200 {object} models.ReportListResp
  635. // @router /getDayWeekReportChapterTypeList [get]
  636. func (this *ReportController) GetDayWeekReportChapterTypeList() {
  637. br := new(models.BaseResponse).Init()
  638. defer func() {
  639. this.Data["json"] = br
  640. this.ServeJSON()
  641. }()
  642. sysUser := this.SysUser
  643. if sysUser == nil {
  644. br.Msg = "请登录"
  645. br.ErrMsg = "请登录,SysUser Is Empty"
  646. br.Ret = 408
  647. return
  648. }
  649. if utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeSandbox && utils.BusinessCode != utils.BusinessCodeDebug {
  650. br.Ret = 200
  651. br.Success = true
  652. br.Msg = "操作成功"
  653. return
  654. }
  655. var condition string
  656. var pars []interface{}
  657. // 停更类型
  658. stopType := this.GetString("StopType")
  659. switch stopType {
  660. case "", "stop":
  661. condition += ` AND enabled = ? `
  662. pars = append(pars, 1)
  663. case "disable":
  664. default:
  665. br.Msg = "停更类型异常"
  666. br.IsSendEmail = false
  667. return
  668. }
  669. dayList := make([]*models.ReportChapterType, 0)
  670. weekList := make([]*models.ReportChapterType, 0)
  671. // 晨报
  672. {
  673. tmpCondition := condition
  674. tmpPars := pars
  675. // 报告类型
  676. tmpCondition += ` AND research_type = ? `
  677. tmpPars = append(tmpPars, "day")
  678. list, err := models.GetAllReportChapterTypeList(tmpCondition, tmpPars)
  679. if err != nil {
  680. br.Msg = "获取报告章节类型列表失败"
  681. br.ErrMsg = "获取报告章节类型列表失败, Err: " + err.Error()
  682. return
  683. }
  684. nowTime := time.Now()
  685. for _, v := range list {
  686. if v.IsSet == 1 {
  687. endTime, _ := time.Parse(utils.FormatDate, v.PauseEndTime)
  688. if nowTime.After(endTime.AddDate(0, 0, 1)) { //设置过期了已经
  689. v.IsSet = 0
  690. v.PauseStartTime = ``
  691. v.PauseEndTime = ``
  692. }
  693. }
  694. dayList = append(dayList, v)
  695. }
  696. }
  697. // 周报
  698. {
  699. tmpCondition := condition
  700. tmpPars := pars
  701. // 报告类型
  702. tmpCondition += ` AND research_type = ? `
  703. tmpPars = append(tmpPars, "week")
  704. list, err := models.GetAllReportChapterTypeList(tmpCondition, tmpPars)
  705. if err != nil {
  706. br.Msg = "获取报告章节类型列表失败"
  707. br.ErrMsg = "获取报告章节类型列表失败, Err: " + err.Error()
  708. return
  709. }
  710. nowTime := time.Now()
  711. for _, v := range list {
  712. if v.IsSet == 1 {
  713. endTime, _ := time.Parse(utils.FormatDate, v.PauseEndTime)
  714. if nowTime.After(endTime.AddDate(0, 0, 1)) { //设置过期了已经
  715. v.IsSet = 0
  716. v.PauseStartTime = ``
  717. v.PauseEndTime = ``
  718. }
  719. }
  720. weekList = append(weekList, v)
  721. }
  722. }
  723. resp := models.UpdateReportChapterTypeResp{
  724. Day: dayList,
  725. Week: weekList,
  726. }
  727. br.Ret = 200
  728. br.Success = true
  729. br.Msg = "获取成功"
  730. br.Data = resp
  731. }
  732. // GetDayWeekReportPauseTime
  733. // @Title 获取晨报周报的更新暂停时间
  734. // @Description 获取晨报周报的更新暂停时间
  735. // @Success 200 {object} models.ReportListResp
  736. // @router /getDayWeekReportPauseTime [get]
  737. func (this *ReportController) GetDayWeekReportPauseTime() {
  738. br := new(models.BaseResponse).Init()
  739. defer func() {
  740. this.Data["json"] = br
  741. this.ServeJSON()
  742. }()
  743. sysUser := this.SysUser
  744. if sysUser == nil {
  745. br.Msg = "请登录"
  746. br.ErrMsg = "请登录,SysUser Is Empty"
  747. br.Ret = 408
  748. return
  749. }
  750. if utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeSandbox && utils.BusinessCode != utils.BusinessCodeDebug {
  751. br.Ret = 200
  752. br.Success = true
  753. br.Msg = "操作成功"
  754. return
  755. }
  756. list, err := models.GetDayWeekReportPauseTimeList()
  757. if err != nil {
  758. br.Msg = "获取晨报周报的更新暂停时间失败"
  759. br.ErrMsg = "获取晨报周报的更新暂停时间失败, Err: " + err.Error()
  760. return
  761. }
  762. br.Ret = 200
  763. br.Success = true
  764. br.Msg = "获取成功"
  765. br.Data = list
  766. }
  767. // SetDayWeekReportUpdateRule
  768. // @Title 设置晨报周报的更新规则
  769. // @Description 设置晨报周报的更新规则
  770. // @Param request body models.SetDayWeekReportUpdateRuleReq true "type json string"
  771. // @Success 200 string "操作成功"
  772. // @router /setDayWeekReportUpdateRule [post]
  773. func (this *ReportController) SetDayWeekReportUpdateRule() {
  774. br := new(models.BaseResponse).Init()
  775. defer func() {
  776. this.Data["json"] = br
  777. this.ServeJSON()
  778. }()
  779. sysUser := this.SysUser
  780. if sysUser == nil {
  781. br.Msg = "请登录"
  782. br.ErrMsg = "请登录,SysUser Is Empty"
  783. br.Ret = 408
  784. return
  785. }
  786. if utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeSandbox && utils.BusinessCode != utils.BusinessCodeDebug {
  787. br.Ret = 200
  788. br.Success = true
  789. br.Msg = "操作成功"
  790. return
  791. }
  792. var req models.SetDayWeekReportUpdateRuleReq
  793. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  794. if err != nil {
  795. br.Msg = "参数解析异常!"
  796. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  797. return
  798. }
  799. researchType := req.ResearchType
  800. if researchType == "" {
  801. br.Msg = "报告类型不能为空"
  802. return
  803. }
  804. // 设置章节类型的暂停时间
  805. if err := models.SetDayWeekReportUpdateRule(researchType, req.List); err != nil {
  806. br.Msg = "设置暂停时间失败"
  807. br.ErrMsg = "设置暂停时间失败, Err: " + err.Error()
  808. return
  809. }
  810. // 同步到crm数据库
  811. go func() {
  812. var syncReq services.ChapterTypeSyncReq
  813. _, _ = services.ReportChapterTypeSync(&syncReq)
  814. }()
  815. br.Ret = 200
  816. br.Success = true
  817. br.Msg = "操作成功"
  818. }
  819. // SetDayWeekReportEnableRule
  820. // @Title 设置晨报周报的永久暂停更新规则
  821. // @Description 设置晨报周报的永久暂停更新规则
  822. // @Param request body models.SetDayWeekReportEnableUpdateRuleReq true "type json string"
  823. // @Success 200 string "操作成功"
  824. // @router /setDayWeekReportEnableUpdateRule [post]
  825. func (this *ReportController) SetDayWeekReportEnableRule() {
  826. br := new(models.BaseResponse).Init()
  827. defer func() {
  828. this.Data["json"] = br
  829. this.ServeJSON()
  830. }()
  831. sysUser := this.SysUser
  832. if sysUser == nil {
  833. br.Msg = "请登录"
  834. br.ErrMsg = "请登录,SysUser Is Empty"
  835. br.Ret = 408
  836. return
  837. }
  838. if utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeSandbox && utils.BusinessCode != utils.BusinessCodeDebug {
  839. br.Ret = 200
  840. br.Success = true
  841. br.Msg = "操作成功"
  842. return
  843. }
  844. var req models.SetDayWeekReportEnableUpdateRuleReq
  845. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  846. if err != nil {
  847. br.Msg = "参数解析异常!"
  848. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  849. return
  850. }
  851. dayReportChapterTypeIdList := strings.Split(req.DayReportChapterTypeId, ",")
  852. weekReportChapterTypeIdList := strings.Split(req.WeekReportChapterTypeId, ",")
  853. //if len(reportChapterTypeIdList) <= 0 {
  854. // br.Msg = "报告类型选择异常"
  855. // br.IsSendEmail = false
  856. // return
  857. //}
  858. // 设置章节类型的禁用状态
  859. if err := models.SetDayWeekReportEnableUpdateRule(dayReportChapterTypeIdList, weekReportChapterTypeIdList); err != nil {
  860. br.Msg = "设置永久停更失败"
  861. br.ErrMsg = "设置永久停更失败, Err: " + err.Error()
  862. return
  863. }
  864. go func() {
  865. var syncReq services.ChapterTypeSyncReq
  866. _, _ = services.ReportChapterTypeSync(&syncReq)
  867. }()
  868. br.Ret = 200
  869. br.Success = true
  870. br.Msg = "操作成功"
  871. }
  872. // AddDayWeekReport
  873. // @Title 新增晨报周报
  874. // @Description 新增晨报周报
  875. // @Param request body models.SaveDayWeekReportReq true "type json string"
  876. // @Success 200 Ret=200 保存成功
  877. // @router /addDayWeekReport [post]
  878. //func (this *ReportController) AddDayWeekReport() {
  879. // br := new(models.BaseResponse).Init()
  880. // defer func() {
  881. // this.Data["json"] = br
  882. // this.ServeJSON()
  883. // }()
  884. // sysUser := this.SysUser
  885. // if sysUser == nil {
  886. // br.Msg = "请登录"
  887. // br.ErrMsg = "请登录,SysUser Is Empty"
  888. // br.Ret = 408
  889. // return
  890. // }
  891. // if utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeSandbox && utils.BusinessCode != utils.BusinessCodeDebug {
  892. // br.Ret = 200
  893. // br.Success = true
  894. // br.Msg = "操作成功"
  895. // return
  896. // }
  897. //
  898. // var req models.SaveDayWeekReportReq
  899. // err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  900. // if err != nil {
  901. // br.Msg = "参数解析异常!"
  902. // br.ErrMsg = "参数解析失败,Err:" + err.Error()
  903. // return
  904. // }
  905. //
  906. // reportType := req.ReportType
  907. // if reportType == "" {
  908. // br.Msg = "请选择报告类型"
  909. // return
  910. // }
  911. // if reportType != utils.REPORT_TYPE_DAY && reportType != utils.REPORT_TYPE_WEEK {
  912. // br.Msg = "报告类型有误"
  913. // return
  914. // }
  915. // if req.Title == "" {
  916. // br.Msg = "请输入报告标题"
  917. // return
  918. // }
  919. // if req.CreateTime == "" {
  920. // br.Msg = "请选择发布时间"
  921. // return
  922. // }
  923. //
  924. // // 报告
  925. // var frequency, classifyName string
  926. // var classifyId int
  927. // if reportType == utils.REPORT_TYPE_DAY {
  928. // frequency = "日度"
  929. // classify, err := models.GetClassifyByKeyword("晨报")
  930. // if err == nil {
  931. // classifyId = classify.Id
  932. // classifyName = "晨报"
  933. // }
  934. // } else if reportType == utils.REPORT_TYPE_WEEK {
  935. // frequency = "周度"
  936. // classify, err := models.GetClassifyByKeyword("周报")
  937. // if err == nil {
  938. // classifyId = classify.Id
  939. // classifyName = "周报"
  940. // }
  941. // } else {
  942. // br.Msg = "报告类型有误"
  943. // return
  944. // }
  945. //
  946. // // 获取晨周报期数
  947. // yearStart := time.Date(time.Now().Local().Year(), 1, 1, 0, 0, 0, 0, time.Local)
  948. // maxStage, err := models.GetDayWeekReportStage(classifyId, yearStart)
  949. // if err != nil {
  950. // br.Msg = "获取报告期数失败"
  951. // br.ErrMsg = "获取报告期数失败,Err:" + err.Error()
  952. // return
  953. // }
  954. // stage := maxStage + 1
  955. //
  956. // item := new(models.Report)
  957. // item.AddType = 1
  958. // item.ClassifyIdFirst = classifyId
  959. // item.ClassifyNameFirst = classifyName
  960. // item.Title = req.Title
  961. // item.Author = req.Author
  962. // item.Frequency = frequency
  963. // item.State = 1
  964. // item.Stage = stage
  965. // item.CreateTime = req.CreateTime
  966. // item.ModifyTime = time.Now()
  967. // item.HasChapter = 1
  968. // item.ChapterType = reportType
  969. //
  970. // // 章节类型列表
  971. // typeList, err := models.GetReportChapterTypeListByResearchType(reportType)
  972. // if err != nil {
  973. // br.Msg = "获取报告章节类型列表失败"
  974. // br.ErrMsg = "获取报告章节类型列表失败,Err:" + err.Error()
  975. // return
  976. // }
  977. // var chapterList []*models.ReportChapter
  978. // // 晨报自动继承上一期内容
  979. // skip := false
  980. // if reportType == utils.REPORT_TYPE_DAY {
  981. // lastDayReport, err := models.GetLastPublishDayWeekReport(utils.REPORT_TYPE_DAY)
  982. // if err != nil && !utils.IsErrNoRow(err) {
  983. // br.Msg = "获取上一期晨报失败"
  984. // br.ErrMsg = "获取上一期晨报失败,Err:" + err.Error()
  985. // return
  986. // }
  987. // if lastDayReport != nil {
  988. // // 继承上一篇章节内容
  989. // lastReportChapters, err := models.GetPublishedChapterListByReportId(lastDayReport.Id)
  990. // if err != nil {
  991. // br.Msg = "获取上一期晨报章节失败"
  992. // br.ErrMsg = "获取上一期晨报章节失败,Err:" + err.Error()
  993. // return
  994. // }
  995. // chapterMap := make(map[int]*models.ReportChapter)
  996. // for i := 0; i < len(lastReportChapters); i++ {
  997. // chapterMap[lastReportChapters[i].TypeId] = lastReportChapters[i]
  998. // }
  999. // for _, typeItem := range typeList {
  1000. // v := chapterMap[typeItem.ReportChapterTypeId]
  1001. // chapterItem := new(models.ReportChapter)
  1002. // if v != nil {
  1003. // chapterItem.AddType = 2
  1004. // chapterItem.Title = v.Title
  1005. // chapterItem.ReportType = reportType
  1006. // chapterItem.ClassifyIdFirst = classifyId
  1007. // chapterItem.ClassifyNameFirst = classifyName
  1008. // chapterItem.TypeId = typeItem.ReportChapterTypeId
  1009. // chapterItem.TypeName = typeItem.ReportChapterTypeName
  1010. // chapterItem.Content = v.Content
  1011. // chapterItem.ContentSub = v.ContentSub
  1012. // chapterItem.Stage = stage
  1013. // chapterItem.PublishState = 1
  1014. // chapterItem.Sort = typeItem.Sort
  1015. // chapterItem.CreateTime = req.CreateTime
  1016. // chapterItem.ModifyTime = time.Now()
  1017. // } else {
  1018. // chapterItem.AddType = 1
  1019. // chapterItem.ReportType = reportType
  1020. // chapterItem.ClassifyIdFirst = classifyId
  1021. // chapterItem.ClassifyNameFirst = classifyName
  1022. // chapterItem.TypeId = typeItem.ReportChapterTypeId
  1023. // chapterItem.TypeName = typeItem.ReportChapterTypeName
  1024. // chapterItem.Stage = stage
  1025. // chapterItem.PublishState = 1
  1026. // chapterItem.Sort = typeItem.Sort
  1027. // chapterItem.CreateTime = req.CreateTime
  1028. // chapterItem.ModifyTime = time.Now()
  1029. // }
  1030. // chapterList = append(chapterList, chapterItem)
  1031. // }
  1032. // skip = true
  1033. // }
  1034. // }
  1035. // if !skip {
  1036. // // 空白章节
  1037. // for _, typeItem := range typeList {
  1038. // chapterItem := new(models.ReportChapter)
  1039. // chapterItem.AddType = 1
  1040. // chapterItem.ReportType = reportType
  1041. // chapterItem.ClassifyIdFirst = classifyId
  1042. // chapterItem.ClassifyNameFirst = classifyName
  1043. // chapterItem.TypeId = typeItem.ReportChapterTypeId
  1044. // chapterItem.TypeName = typeItem.ReportChapterTypeName
  1045. // chapterItem.Stage = stage
  1046. // chapterItem.PublishState = 1
  1047. // chapterItem.Sort = typeItem.Sort
  1048. // chapterItem.CreateTime = req.CreateTime
  1049. // chapterItem.ModifyTime = time.Now()
  1050. // chapterList = append(chapterList, chapterItem)
  1051. // }
  1052. // }
  1053. //
  1054. // // 新增报告及章节
  1055. // var reportId int64
  1056. // if reportId, err = models.AddReportAndChapter(item, chapterList); err != nil {
  1057. // br.Msg = "保存失败"
  1058. // br.ErrMsg = "新增报告及章节失败, Err: " + err.Error()
  1059. // return
  1060. // }
  1061. // reportCode := utils.MD5(strconv.Itoa(int(reportId)))
  1062. // // 修改唯一编码
  1063. // {
  1064. // go models.ModifyReportCode(reportId, reportCode)
  1065. // }
  1066. //
  1067. // // 备份关键数据
  1068. // go services.SaveReportLogs(item, chapterList, sysUser.AdminId, sysUser.RealName)
  1069. //
  1070. // resp := new(models.AddResp)
  1071. // resp.ReportId = reportId
  1072. // resp.ReportCode = reportCode
  1073. // br.Ret = 200
  1074. // br.Success = true
  1075. // br.Msg = "保存成功"
  1076. // br.Data = resp
  1077. //}
  1078. // EditDayWeekReport
  1079. // @Title 编辑晨周报
  1080. // @Description 编辑晨周报
  1081. // @Param request body models.SaveDayWeekReportReq true "type json string"
  1082. // @Success 200 Ret=200 保存成功
  1083. // @router /editDayWeekReport [post]
  1084. func (this *ReportController) EditDayWeekReport() {
  1085. br := new(models.BaseResponse).Init()
  1086. defer func() {
  1087. this.Data["json"] = br
  1088. this.ServeJSON()
  1089. }()
  1090. sysUser := this.SysUser
  1091. if sysUser == nil {
  1092. br.Msg = "请登录"
  1093. br.ErrMsg = "请登录,SysUser Is Empty"
  1094. br.Ret = 408
  1095. return
  1096. }
  1097. if utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeSandbox && utils.BusinessCode != utils.BusinessCodeDebug {
  1098. br.Ret = 200
  1099. br.Success = true
  1100. br.Msg = "操作成功"
  1101. return
  1102. }
  1103. var req models.SaveDayWeekReportReq
  1104. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  1105. if err != nil {
  1106. br.Msg = "参数解析异常!"
  1107. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  1108. return
  1109. }
  1110. if req.ReportId == 0 {
  1111. br.Msg = "报告ID有误"
  1112. return
  1113. }
  1114. if req.ReportType == "" {
  1115. br.Msg = "请选择报告类型"
  1116. return
  1117. }
  1118. if req.ReportType != utils.REPORT_TYPE_DAY && req.ReportType != utils.REPORT_TYPE_WEEK {
  1119. br.Msg = "报告类型有误"
  1120. return
  1121. }
  1122. if req.Title == "" {
  1123. br.Msg = "请输入报告标题"
  1124. return
  1125. }
  1126. if req.CreateTime == "" {
  1127. br.Msg = "请选择发布时间"
  1128. return
  1129. }
  1130. reportInfo, err := models.GetReportByReportId(req.ReportId)
  1131. if err != nil {
  1132. br.Msg = "获取报告信息失败"
  1133. br.ErrMsg = "获取报告信息失败, Err: " + err.Error()
  1134. return
  1135. }
  1136. if req.ReportType != reportInfo.ChapterType {
  1137. br.Msg = "暂不允许修改晨周报类型"
  1138. return
  1139. }
  1140. reportInfo.Title = req.Title
  1141. if req.CreateTime != "" {
  1142. createTime, tmpErr := time.ParseInLocation(utils.FormatDateTime, req.CreateTime, time.Local)
  1143. if tmpErr != nil {
  1144. err = tmpErr
  1145. br.Msg = "日期解析异常"
  1146. br.ErrMsg = "日期解析异常,err:" + tmpErr.Error()
  1147. return
  1148. }
  1149. reportInfo.CreateTime = createTime
  1150. }
  1151. reportInfo.Author = req.Author
  1152. err = models.EditReport(reportInfo, int64(req.ReportId))
  1153. br.Ret = 200
  1154. br.Success = true
  1155. br.Msg = "保存成功"
  1156. }
  1157. // GetLastDayWeekReportChapter
  1158. // @Title 获取上一篇已发表的晨周报章节内容
  1159. // @Description 获取上一篇已发表的晨周报章节内容
  1160. // @Param TypeId query int true "品种ID"
  1161. // @Param ReportType query string true "报告类型 day-晨报; week-周报; "
  1162. // @Success 200 {object} company.CompanyListResp
  1163. // @router /getLastDayWeekReportChapter [get]
  1164. func (this *ReportController) GetLastDayWeekReportChapter() {
  1165. br := new(models.BaseResponse).Init()
  1166. defer func() {
  1167. this.Data["json"] = br
  1168. this.ServeJSON()
  1169. }()
  1170. sysUser := this.SysUser
  1171. if sysUser == nil {
  1172. br.Msg = "请登录"
  1173. br.ErrMsg = "请登录,SysUser Is Empty"
  1174. br.Ret = 408
  1175. return
  1176. }
  1177. if utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeSandbox && utils.BusinessCode != utils.BusinessCodeDebug {
  1178. br.Ret = 200
  1179. br.Success = true
  1180. br.Msg = "操作成功"
  1181. return
  1182. }
  1183. typeId, _ := this.GetInt("TypeId")
  1184. reportType := this.GetString("ReportType")
  1185. item, err := models.GetLastPublishedReportChapter(typeId, reportType)
  1186. if err != nil && !utils.IsErrNoRow(err) {
  1187. br.Msg = "获取失败"
  1188. br.ErrMsg = "获取上一篇晨周报失败, Err: " + err.Error()
  1189. return
  1190. }
  1191. if item != nil {
  1192. item.Content = html.UnescapeString(item.Content)
  1193. item.ContentSub = html.UnescapeString(item.ContentSub)
  1194. }
  1195. br.Ret = 200
  1196. br.Success = true
  1197. br.Msg = "获取成功"
  1198. br.Data = item
  1199. }
  1200. // GetChapterTrendTag
  1201. // @Title 获取章节趋势标签列表
  1202. // @Description 获取章节趋势标签列表
  1203. // @Success 200 Ret=200 获取成功
  1204. // @router /getChapterTrendTag [get]
  1205. func (this *ReportController) GetChapterTrendTag() {
  1206. br := new(models.BaseResponse).Init()
  1207. defer func() {
  1208. this.Data["json"] = br
  1209. this.ServeJSON()
  1210. }()
  1211. sysUser := this.SysUser
  1212. if sysUser == nil {
  1213. br.Msg = "请登录"
  1214. br.ErrMsg = "请登录,SysUser Is Empty"
  1215. br.Ret = 408
  1216. return
  1217. }
  1218. list, err := models.GetKeyWordListByFrom("trend")
  1219. if err != nil {
  1220. br.Msg = "获取章节趋势标签列表失败"
  1221. br.ErrMsg = "获取章节趋势标签列表失败, Err: " + err.Error()
  1222. return
  1223. }
  1224. br.Ret = 200
  1225. br.Success = true
  1226. br.Msg = "获取成功"
  1227. br.Data = list
  1228. }
  1229. // GetDayReportTickerList
  1230. // @Title 获取晨报数据指标列表
  1231. // @Description 获取晨报数据指标列表
  1232. // @Param ReportChapterId query int true "章节ID"
  1233. // @Success 200 Ret=200 保存成功
  1234. // @router /getDayReportTickerList [get]
  1235. func (this *ReportController) GetDayReportTickerList() {
  1236. br := new(models.BaseResponse).Init()
  1237. defer func() {
  1238. this.Data["json"] = br
  1239. this.ServeJSON()
  1240. }()
  1241. sysUser := this.SysUser
  1242. if sysUser == nil {
  1243. br.Msg = "请登录"
  1244. br.ErrMsg = "请登录,SysUser Is Empty"
  1245. br.Ret = 408
  1246. return
  1247. }
  1248. if utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeSandbox && utils.BusinessCode != utils.BusinessCodeDebug {
  1249. br.Ret = 200
  1250. br.Success = true
  1251. br.Msg = "操作成功"
  1252. return
  1253. }
  1254. reportChapterId, _ := this.GetInt("ReportChapterId")
  1255. if reportChapterId <= 0 {
  1256. br.Msg = "章节ID有误"
  1257. return
  1258. }
  1259. chapterInfo, err := models.GetReportChapterInfoById(reportChapterId)
  1260. if err != nil {
  1261. br.Msg = "获取章节信息失败"
  1262. br.ErrMsg = "获取章节信息失败, Err: " + err.Error()
  1263. return
  1264. }
  1265. // 获取ticker列表
  1266. tickerList, err := models.GetDailyBaseColumnList("", chapterInfo.TypeId)
  1267. if err != nil {
  1268. br.Msg = "获取指标列表失败"
  1269. br.ErrMsg = "获取指标列表失败, Err: " + err.Error()
  1270. return
  1271. }
  1272. // 获取章节ticker
  1273. reportTicker, err := models.GetTickerListByReportChapterId(reportChapterId)
  1274. if err != nil {
  1275. br.Msg = "获取章节Ticker失败"
  1276. br.ErrMsg = "获取章节Ticker失败, Err: " + err.Error()
  1277. return
  1278. }
  1279. selectMap := make(map[string]int, 0)
  1280. for i := 0; i < len(reportTicker); i++ {
  1281. selectMap[reportTicker[i].Ticker] = 1
  1282. }
  1283. // 选中状态
  1284. for _, item := range tickerList {
  1285. if _, in := selectMap[item.BaseColumnTicker]; in {
  1286. item.Selected = 1
  1287. }
  1288. }
  1289. br.Ret = 200
  1290. br.Success = true
  1291. br.Msg = "获取成功"
  1292. br.Data = tickerList
  1293. }
  1294. // GetDayWeekReportVideoList
  1295. // @Title 获取晨周报音视频列表
  1296. // @Description 获取晨周报音视频列表
  1297. // @Param ReportId query int true "报告ID"
  1298. // @Success 200 Ret=200 保存成功
  1299. // @router /getDayWeekReportVideoList [get]
  1300. func (this *ReportController) GetDayWeekReportVideoList() {
  1301. br := new(models.BaseResponse).Init()
  1302. defer func() {
  1303. this.Data["json"] = br
  1304. this.ServeJSON()
  1305. }()
  1306. sysUser := this.SysUser
  1307. if sysUser == nil {
  1308. br.Msg = "请登录"
  1309. br.ErrMsg = "请登录,SysUser Is Empty"
  1310. br.Ret = 408
  1311. return
  1312. }
  1313. reportId, _ := this.GetInt("ReportId")
  1314. if reportId <= 0 {
  1315. br.Msg = "参数有误"
  1316. return
  1317. }
  1318. list, err := models.GetReportChapterVideoList(reportId)
  1319. if err != nil {
  1320. br.Msg = "获取失败"
  1321. br.ErrMsg = "获取报告音频列表失败, Err: " + err.Error()
  1322. return
  1323. }
  1324. br.Ret = 200
  1325. br.Success = true
  1326. br.Msg = "获取成功"
  1327. br.Data = list
  1328. }
  1329. // IsLastDayWeekReportChapter
  1330. // @Title 是否为晨周报本期最后一个发布的报告
  1331. // @Description 是否为晨周报本期最后一个发布的报告
  1332. // @Param ReportChapterId query int true "报告章节ID"
  1333. // @Success 200 Ret=200 获取成功
  1334. // @router /isLastDayWeekReportChapter [get]
  1335. func (this *ReportController) IsLastDayWeekReportChapter() {
  1336. br := new(models.BaseResponse).Init()
  1337. defer func() {
  1338. this.Data["json"] = br
  1339. this.ServeJSON()
  1340. }()
  1341. sysUser := this.SysUser
  1342. if sysUser == nil {
  1343. br.Msg = "请登录"
  1344. br.ErrMsg = "请登录,SysUser Is Empty"
  1345. br.Ret = 408
  1346. return
  1347. }
  1348. if utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeSandbox && utils.BusinessCode != utils.BusinessCodeDebug {
  1349. br.Ret = 200
  1350. br.Success = true
  1351. br.Msg = "操作成功"
  1352. return
  1353. }
  1354. reportChapterId, _ := this.GetInt("ReportChapterId")
  1355. if reportChapterId <= 0 {
  1356. br.Msg = "参数有误"
  1357. return
  1358. }
  1359. chapterInfo, err := models.GetReportChapterInfoById(reportChapterId)
  1360. if err != nil {
  1361. br.Msg = "章节信息有误"
  1362. br.ErrMsg = "章节信息有误, Err: " + err.Error()
  1363. return
  1364. }
  1365. // 获取已发布章节数及本期报告应发布数
  1366. publishedNum, err := models.CountPublishedChapterNum(chapterInfo.ReportId)
  1367. if err != nil {
  1368. br.Msg = "获取已发布章节数失败"
  1369. br.ErrMsg = "获取已发布章节数失败, Err: " + err.Error()
  1370. return
  1371. }
  1372. enableTypeList, err := models.GetEnableReportChapterTypeList(chapterInfo.ReportType)
  1373. if err != nil {
  1374. br.Msg = "获取章节类型列表失败"
  1375. br.ErrMsg = "获取章节类型列表失败, Err: " + err.Error()
  1376. return
  1377. }
  1378. var isLast bool
  1379. enableNum := len(enableTypeList)
  1380. publishedNum += 1
  1381. if publishedNum == enableNum {
  1382. isLast = true
  1383. }
  1384. br.Ret = 200
  1385. br.Success = true
  1386. br.Msg = "获取成功"
  1387. br.Data = isLast
  1388. }
  1389. // PublishDayWeekReport
  1390. // @Title 发布晨周报
  1391. // @Description 发布晨周报
  1392. // @Param request body models.PublishDayWeekReportReq true "type json string"
  1393. // @Success 200 Ret=200 操作成功
  1394. // @router /publishDayWeekReport [post]
  1395. func (this *ReportController) PublishDayWeekReport() {
  1396. br := new(models.BaseResponse).Init()
  1397. defer func() {
  1398. this.Data["json"] = br
  1399. this.ServeJSON()
  1400. }()
  1401. sysUser := this.SysUser
  1402. if sysUser == nil {
  1403. br.Msg = "请登录"
  1404. br.ErrMsg = "请登录,SysUser Is Empty"
  1405. br.Ret = 408
  1406. return
  1407. }
  1408. if utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeSandbox && utils.BusinessCode != utils.BusinessCodeDebug {
  1409. br.Ret = 200
  1410. br.Success = true
  1411. br.Msg = "操作成功"
  1412. return
  1413. }
  1414. var req models.PublishDayWeekReportReq
  1415. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  1416. if err != nil {
  1417. br.Msg = "参数解析异常!"
  1418. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  1419. return
  1420. }
  1421. reportId := req.ReportId
  1422. if reportId <= 0 {
  1423. br.Msg = "参数有误"
  1424. return
  1425. }
  1426. reportInfo, err := models.GetReportByReportId(reportId)
  1427. if err != nil {
  1428. br.Msg = "报告信息有误"
  1429. br.ErrMsg = "报告信息有误, Err: " + err.Error()
  1430. return
  1431. }
  1432. if reportInfo.State == 2 {
  1433. br.Msg = "该报告已发布"
  1434. return
  1435. }
  1436. // 图表刷新状态
  1437. refreshResult := data.CheckBatchChartRefreshResult("report", reportId, 0)
  1438. if !refreshResult {
  1439. br.Msg = "图表刷新未完成,请稍后操作"
  1440. br.ErrMsg = "图表刷新未完成,请稍后操作"
  1441. br.IsSendEmail = false
  1442. return
  1443. }
  1444. tips, err, errMsg := services.PublishChapterReport(reportInfo, "", sysUser)
  1445. if err != nil {
  1446. br.Msg = errMsg
  1447. br.ErrMsg = "发布晨/周报失败, Err: " + err.Error()
  1448. return
  1449. }
  1450. // 部分章节未发布的提示信息
  1451. if tips != "" {
  1452. br.Data = tips
  1453. }
  1454. br.Ret = 200
  1455. br.Success = true
  1456. br.Msg = "操作成功"
  1457. }
  1458. // GetStopDayWeekReportChapterTypeList
  1459. // @Title 获取暂停更新的晨报周报章节类型列表
  1460. // @Description 获取暂停更新的晨报周报章节类型列表
  1461. // @Success 200 {object} models.ReportListResp
  1462. // @router /getStopDayWeekReportChapterTypeList [get]
  1463. func (this *ReportController) GetStopDayWeekReportChapterTypeList() {
  1464. br := new(models.BaseResponse).Init()
  1465. defer func() {
  1466. this.Data["json"] = br
  1467. this.ServeJSON()
  1468. }()
  1469. sysUser := this.SysUser
  1470. if sysUser == nil {
  1471. br.Msg = "请登录"
  1472. br.ErrMsg = "请登录,SysUser Is Empty"
  1473. br.Ret = 408
  1474. return
  1475. }
  1476. if utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeSandbox && utils.BusinessCode != utils.BusinessCodeDebug {
  1477. br.Ret = 200
  1478. br.Success = true
  1479. br.Msg = "获取成功"
  1480. return
  1481. }
  1482. stopDay := make([]*models.ReportChapterType, 0)
  1483. stopWeek := make([]*models.ReportChapterType, 0)
  1484. disableDay := make([]*models.ReportChapterType, 0)
  1485. disableWeek := make([]*models.ReportChapterType, 0)
  1486. stopList, err := models.GetStopUpdateReportChapterTypeListByResearchType()
  1487. if err != nil {
  1488. br.Msg = "获取暂停更新报告章节类型列表失败"
  1489. br.ErrMsg = "获取暂停更新报告章节类型列表失败, Err: " + err.Error()
  1490. return
  1491. }
  1492. for _, v := range stopList {
  1493. if v.ResearchType == "day" {
  1494. stopDay = append(stopDay, v)
  1495. } else {
  1496. stopWeek = append(stopWeek, v)
  1497. }
  1498. }
  1499. disableList, err := models.GetDisableUpdateReportChapterTypeListByResearchType()
  1500. if err != nil {
  1501. br.Msg = "获取停止更新报告章节类型列表失败"
  1502. br.ErrMsg = "获取停止更新报告章节类型列表失败, Err: " + err.Error()
  1503. return
  1504. }
  1505. for _, v := range disableList {
  1506. if v.ResearchType == "day" {
  1507. disableDay = append(disableDay, v)
  1508. } else {
  1509. disableWeek = append(disableWeek, v)
  1510. }
  1511. }
  1512. resp := models.StopUpdateReportChapterTypeResp{
  1513. StopDay: stopDay,
  1514. StopWeek: stopWeek,
  1515. DisableDay: disableDay,
  1516. DisableWeek: disableWeek,
  1517. }
  1518. br.Ret = 200
  1519. br.Success = true
  1520. br.Msg = "获取成功"
  1521. br.Data = resp
  1522. }
  1523. // MarkEditStatus
  1524. // @Title 标记报告编辑状态
  1525. // @Description 标记报告编辑状态接口
  1526. // @Param request body request.MarkEditEnReport true "type json string"
  1527. // @Success 200 标记成功 ;202 标记成功
  1528. // @router /mark [post]
  1529. func (this *ReportController) MarkEditStatus() {
  1530. br := new(models.BaseResponse).Init()
  1531. defer func() {
  1532. this.Data["json"] = br
  1533. this.ServeJSON()
  1534. }()
  1535. sysUser := this.SysUser
  1536. if sysUser == nil {
  1537. br.Msg = "请登录"
  1538. br.ErrMsg = "请登录,SysUser Is Empty"
  1539. br.Ret = 408
  1540. return
  1541. }
  1542. var req models.MarkEditReport
  1543. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  1544. if err != nil {
  1545. br.Msg = "参数解析异常!"
  1546. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  1547. return
  1548. }
  1549. if req.ReportId <= 0 {
  1550. br.Msg = "缺少报告Id"
  1551. return
  1552. }
  1553. if req.Status < 0 {
  1554. br.Msg = "标记状态异常"
  1555. return
  1556. }
  1557. //更新标记key
  1558. data, err := services.UpdateReportEditMark(req.ReportId, req.ReportChapterId, sysUser.AdminId, req.Status, sysUser.RealName, this.Lang)
  1559. if err != nil {
  1560. br.Msg = err.Error()
  1561. return
  1562. }
  1563. msg := "标记成功"
  1564. br.Ret = 200
  1565. br.Success = true
  1566. br.Msg = msg
  1567. br.Data = data
  1568. }
  1569. // SendMsg
  1570. // @Title 模板消息/客群消息推送接口
  1571. // @Description 模板消息/客群消息推送接口
  1572. // @Param request body models.SendTemplateMsgReq true "type json string"
  1573. // @Success 200 {object} models.SendTemplateMsgResp
  1574. // @router /sendMsg [post]
  1575. func (this *ReportController) SendMsg() {
  1576. br := new(models.BaseResponse).Init()
  1577. defer func() {
  1578. this.Data["json"] = br
  1579. this.ServeJSON()
  1580. }()
  1581. var req models.SendTemplateMsgReq
  1582. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  1583. if err != nil {
  1584. br.Msg = "参数解析异常!"
  1585. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  1586. return
  1587. }
  1588. if req.ReportId <= 0 {
  1589. br.Msg = "参数错误"
  1590. br.ErrMsg = "参数错误"
  1591. return
  1592. }
  1593. // 加锁,避免重复点击造成的多次推送
  1594. {
  1595. redisKey := fmt.Sprint("report:send:ths:", req.ReportId)
  1596. ok := utils.Rc.SetNX(redisKey, 1, time.Second*300)
  1597. if !ok {
  1598. br.Msg = "报告已推送, 请勿重复推送"
  1599. return
  1600. }
  1601. defer func() {
  1602. _ = utils.Rc.Delete(redisKey)
  1603. }()
  1604. }
  1605. reportInfo, e := models.GetReportByReportId(req.ReportId)
  1606. if e != nil {
  1607. br.Msg = "报告不存在或已被删除, 请刷新页面"
  1608. br.ErrMsg = "获取报告失败, Err: " + e.Error()
  1609. return
  1610. }
  1611. if reportInfo.MsgIsSend == 1 && reportInfo.ThsMsgIsSend == 1 {
  1612. br.Msg = "消息已推送,请勿重复操作"
  1613. br.ErrMsg = "消息已推送,请勿重复操作"
  1614. return
  1615. }
  1616. // 更新报告发布时间
  1617. videoNameDate := `(` + time.Now().Format("0102") + `)`
  1618. if err = models.UpdateReportPublishTime(req.ReportId, videoNameDate); err != nil {
  1619. br.Msg = "修改报告发布时间失败"
  1620. br.ErrMsg = "修改发布时间失败,Err:" + err.Error()
  1621. return
  1622. }
  1623. if err = models.UpdateReportChapterPublishTime(req.ReportId, videoNameDate); err != nil {
  1624. br.Msg = "修改章节发布时间失败"
  1625. br.ErrMsg = "修改发布时间失败,Err:" + err.Error()
  1626. return
  1627. }
  1628. // 可能存在历史数据两个只推了一个所以此处加个判断
  1629. // 推送模板消息
  1630. if reportInfo.MsgIsSend == 0 {
  1631. go services.SendMiniProgramReportWxMsg(reportInfo.Id)
  1632. }
  1633. // 更新推送消息状态
  1634. reportInfo.MsgIsSend = 1
  1635. reportInfo.ThsMsgIsSend = 1
  1636. reportInfo.MsgSendTime = time.Now()
  1637. reportInfo.ModifyTime = time.Now()
  1638. err = reportInfo.UpdateReport([]string{"MsgIsSend", "ThsMsgIsSend", "MsgSendTime", "ModifyTime"})
  1639. if err != nil {
  1640. br.Msg = "推送失败"
  1641. br.ErrMsg = "更新报告消息状态失败, Err:" + err.Error()
  1642. return
  1643. }
  1644. br.Ret = 200
  1645. br.Success = true
  1646. br.Msg = "推送成功"
  1647. br.IsAddLog = true
  1648. br.Data = models.SendTemplateMsgResp{
  1649. ReportId: reportInfo.Id,
  1650. MsgSendTime: reportInfo.MsgSendTime.Format(utils.FormatDateTime),
  1651. }
  1652. }
  1653. // CheckDayWeekReportChapterVideo
  1654. // @Title 获取暂停更新的晨报周报章节类型列表
  1655. // @Description 获取暂停更新的晨报周报章节类型列表
  1656. // @Param ReportId query string true "报告ID"
  1657. // @Success 200 {object} models.ReportListResp
  1658. // @router /CheckDayWeekReportChapterVideo [get]
  1659. func (this *ReportController) CheckDayWeekReportChapterVideo() {
  1660. br := new(models.BaseResponse).Init()
  1661. defer func() {
  1662. this.Data["json"] = br
  1663. this.ServeJSON()
  1664. }()
  1665. sysUser := this.SysUser
  1666. if sysUser == nil {
  1667. br.Msg = "请登录"
  1668. br.ErrMsg = "请登录,SysUser Is Empty"
  1669. br.Ret = 408
  1670. return
  1671. }
  1672. reqReportId := this.GetString("ReportId")
  1673. reportId, _ := strconv.Atoi(reqReportId)
  1674. if reportId <= 0 {
  1675. br.Msg = "报告ID有误"
  1676. return
  1677. }
  1678. // 获取章节列表
  1679. chapterList, err := models.GetChapterListByReportId(reportId)
  1680. if err != nil {
  1681. br.Msg = "获取章节列表失败"
  1682. br.ErrMsg = "获取章节列表失败, Err: " + err.Error()
  1683. return
  1684. }
  1685. typeNameArr := make([]string, 0)
  1686. for _, v := range chapterList {
  1687. if v.VideoUrl == "" || (v.VideoUrl != "" && v.VideoKind == 2) {
  1688. typeNameArr = append(typeNameArr, v.TypeName)
  1689. }
  1690. }
  1691. br.Ret = 200
  1692. br.Success = true
  1693. br.Msg = "保存成功"
  1694. br.Data = typeNameArr
  1695. }