report.go 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824
  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. reportInfo.CreateTime = req.CreateTime
  1142. reportInfo.Author = req.Author
  1143. err = models.EditReport(reportInfo, int64(req.ReportId))
  1144. br.Ret = 200
  1145. br.Success = true
  1146. br.Msg = "保存成功"
  1147. }
  1148. // GetLastDayWeekReportChapter
  1149. // @Title 获取上一篇已发表的晨周报章节内容
  1150. // @Description 获取上一篇已发表的晨周报章节内容
  1151. // @Param TypeId query int true "品种ID"
  1152. // @Param ReportType query string true "报告类型 day-晨报; week-周报; "
  1153. // @Success 200 {object} company.CompanyListResp
  1154. // @router /getLastDayWeekReportChapter [get]
  1155. func (this *ReportController) GetLastDayWeekReportChapter() {
  1156. br := new(models.BaseResponse).Init()
  1157. defer func() {
  1158. this.Data["json"] = br
  1159. this.ServeJSON()
  1160. }()
  1161. sysUser := this.SysUser
  1162. if sysUser == nil {
  1163. br.Msg = "请登录"
  1164. br.ErrMsg = "请登录,SysUser Is Empty"
  1165. br.Ret = 408
  1166. return
  1167. }
  1168. if utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeSandbox && utils.BusinessCode != utils.BusinessCodeDebug {
  1169. br.Ret = 200
  1170. br.Success = true
  1171. br.Msg = "操作成功"
  1172. return
  1173. }
  1174. typeId, _ := this.GetInt("TypeId")
  1175. reportType := this.GetString("ReportType")
  1176. item, err := models.GetLastPublishedReportChapter(typeId, reportType)
  1177. if err != nil && !utils.IsErrNoRow(err) {
  1178. br.Msg = "获取失败"
  1179. br.ErrMsg = "获取上一篇晨周报失败, Err: " + err.Error()
  1180. return
  1181. }
  1182. if item != nil {
  1183. item.Content = html.UnescapeString(item.Content)
  1184. item.ContentSub = html.UnescapeString(item.ContentSub)
  1185. }
  1186. br.Ret = 200
  1187. br.Success = true
  1188. br.Msg = "获取成功"
  1189. br.Data = item
  1190. }
  1191. // GetChapterTrendTag
  1192. // @Title 获取章节趋势标签列表
  1193. // @Description 获取章节趋势标签列表
  1194. // @Success 200 Ret=200 获取成功
  1195. // @router /getChapterTrendTag [get]
  1196. func (this *ReportController) GetChapterTrendTag() {
  1197. br := new(models.BaseResponse).Init()
  1198. defer func() {
  1199. this.Data["json"] = br
  1200. this.ServeJSON()
  1201. }()
  1202. sysUser := this.SysUser
  1203. if sysUser == nil {
  1204. br.Msg = "请登录"
  1205. br.ErrMsg = "请登录,SysUser Is Empty"
  1206. br.Ret = 408
  1207. return
  1208. }
  1209. list, err := models.GetKeyWordListByFrom("trend")
  1210. if err != nil {
  1211. br.Msg = "获取章节趋势标签列表失败"
  1212. br.ErrMsg = "获取章节趋势标签列表失败, Err: " + err.Error()
  1213. return
  1214. }
  1215. br.Ret = 200
  1216. br.Success = true
  1217. br.Msg = "获取成功"
  1218. br.Data = list
  1219. }
  1220. // GetDayReportTickerList
  1221. // @Title 获取晨报数据指标列表
  1222. // @Description 获取晨报数据指标列表
  1223. // @Param ReportChapterId query int true "章节ID"
  1224. // @Success 200 Ret=200 保存成功
  1225. // @router /getDayReportTickerList [get]
  1226. func (this *ReportController) GetDayReportTickerList() {
  1227. br := new(models.BaseResponse).Init()
  1228. defer func() {
  1229. this.Data["json"] = br
  1230. this.ServeJSON()
  1231. }()
  1232. sysUser := this.SysUser
  1233. if sysUser == nil {
  1234. br.Msg = "请登录"
  1235. br.ErrMsg = "请登录,SysUser Is Empty"
  1236. br.Ret = 408
  1237. return
  1238. }
  1239. if utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeSandbox && utils.BusinessCode != utils.BusinessCodeDebug {
  1240. br.Ret = 200
  1241. br.Success = true
  1242. br.Msg = "操作成功"
  1243. return
  1244. }
  1245. reportChapterId, _ := this.GetInt("ReportChapterId")
  1246. if reportChapterId <= 0 {
  1247. br.Msg = "章节ID有误"
  1248. return
  1249. }
  1250. chapterInfo, err := models.GetReportChapterInfoById(reportChapterId)
  1251. if err != nil {
  1252. br.Msg = "获取章节信息失败"
  1253. br.ErrMsg = "获取章节信息失败, Err: " + err.Error()
  1254. return
  1255. }
  1256. // 获取ticker列表
  1257. tickerList, err := models.GetDailyBaseColumnList("", chapterInfo.TypeId)
  1258. if err != nil {
  1259. br.Msg = "获取指标列表失败"
  1260. br.ErrMsg = "获取指标列表失败, Err: " + err.Error()
  1261. return
  1262. }
  1263. // 获取章节ticker
  1264. reportTicker, err := models.GetTickerListByReportChapterId(reportChapterId)
  1265. if err != nil {
  1266. br.Msg = "获取章节Ticker失败"
  1267. br.ErrMsg = "获取章节Ticker失败, Err: " + err.Error()
  1268. return
  1269. }
  1270. selectMap := make(map[string]int, 0)
  1271. for i := 0; i < len(reportTicker); i++ {
  1272. selectMap[reportTicker[i].Ticker] = 1
  1273. }
  1274. // 选中状态
  1275. for _, item := range tickerList {
  1276. if _, in := selectMap[item.BaseColumnTicker]; in {
  1277. item.Selected = 1
  1278. }
  1279. }
  1280. br.Ret = 200
  1281. br.Success = true
  1282. br.Msg = "获取成功"
  1283. br.Data = tickerList
  1284. }
  1285. // GetDayWeekReportVideoList
  1286. // @Title 获取晨周报音视频列表
  1287. // @Description 获取晨周报音视频列表
  1288. // @Param ReportId query int true "报告ID"
  1289. // @Success 200 Ret=200 保存成功
  1290. // @router /getDayWeekReportVideoList [get]
  1291. func (this *ReportController) GetDayWeekReportVideoList() {
  1292. br := new(models.BaseResponse).Init()
  1293. defer func() {
  1294. this.Data["json"] = br
  1295. this.ServeJSON()
  1296. }()
  1297. sysUser := this.SysUser
  1298. if sysUser == nil {
  1299. br.Msg = "请登录"
  1300. br.ErrMsg = "请登录,SysUser Is Empty"
  1301. br.Ret = 408
  1302. return
  1303. }
  1304. reportId, _ := this.GetInt("ReportId")
  1305. if reportId <= 0 {
  1306. br.Msg = "参数有误"
  1307. return
  1308. }
  1309. list, err := models.GetReportChapterVideoList(reportId)
  1310. if err != nil {
  1311. br.Msg = "获取失败"
  1312. br.ErrMsg = "获取报告音频列表失败, Err: " + err.Error()
  1313. return
  1314. }
  1315. br.Ret = 200
  1316. br.Success = true
  1317. br.Msg = "获取成功"
  1318. br.Data = list
  1319. }
  1320. // IsLastDayWeekReportChapter
  1321. // @Title 是否为晨周报本期最后一个发布的报告
  1322. // @Description 是否为晨周报本期最后一个发布的报告
  1323. // @Param ReportChapterId query int true "报告章节ID"
  1324. // @Success 200 Ret=200 获取成功
  1325. // @router /isLastDayWeekReportChapter [get]
  1326. func (this *ReportController) IsLastDayWeekReportChapter() {
  1327. br := new(models.BaseResponse).Init()
  1328. defer func() {
  1329. this.Data["json"] = br
  1330. this.ServeJSON()
  1331. }()
  1332. sysUser := this.SysUser
  1333. if sysUser == nil {
  1334. br.Msg = "请登录"
  1335. br.ErrMsg = "请登录,SysUser Is Empty"
  1336. br.Ret = 408
  1337. return
  1338. }
  1339. if utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeSandbox && utils.BusinessCode != utils.BusinessCodeDebug {
  1340. br.Ret = 200
  1341. br.Success = true
  1342. br.Msg = "操作成功"
  1343. return
  1344. }
  1345. reportChapterId, _ := this.GetInt("ReportChapterId")
  1346. if reportChapterId <= 0 {
  1347. br.Msg = "参数有误"
  1348. return
  1349. }
  1350. chapterInfo, err := models.GetReportChapterInfoById(reportChapterId)
  1351. if err != nil {
  1352. br.Msg = "章节信息有误"
  1353. br.ErrMsg = "章节信息有误, Err: " + err.Error()
  1354. return
  1355. }
  1356. // 获取已发布章节数及本期报告应发布数
  1357. publishedNum, err := models.CountPublishedChapterNum(chapterInfo.ReportId)
  1358. if err != nil {
  1359. br.Msg = "获取已发布章节数失败"
  1360. br.ErrMsg = "获取已发布章节数失败, Err: " + err.Error()
  1361. return
  1362. }
  1363. enableTypeList, err := models.GetEnableReportChapterTypeList(chapterInfo.ReportType)
  1364. if err != nil {
  1365. br.Msg = "获取章节类型列表失败"
  1366. br.ErrMsg = "获取章节类型列表失败, Err: " + err.Error()
  1367. return
  1368. }
  1369. var isLast bool
  1370. enableNum := len(enableTypeList)
  1371. publishedNum += 1
  1372. if publishedNum == enableNum {
  1373. isLast = true
  1374. }
  1375. br.Ret = 200
  1376. br.Success = true
  1377. br.Msg = "获取成功"
  1378. br.Data = isLast
  1379. }
  1380. // PublishDayWeekReport
  1381. // @Title 发布晨周报
  1382. // @Description 发布晨周报
  1383. // @Param request body models.PublishDayWeekReportReq true "type json string"
  1384. // @Success 200 Ret=200 操作成功
  1385. // @router /publishDayWeekReport [post]
  1386. func (this *ReportController) PublishDayWeekReport() {
  1387. br := new(models.BaseResponse).Init()
  1388. defer func() {
  1389. this.Data["json"] = br
  1390. this.ServeJSON()
  1391. }()
  1392. sysUser := this.SysUser
  1393. if sysUser == nil {
  1394. br.Msg = "请登录"
  1395. br.ErrMsg = "请登录,SysUser Is Empty"
  1396. br.Ret = 408
  1397. return
  1398. }
  1399. if utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeSandbox && utils.BusinessCode != utils.BusinessCodeDebug {
  1400. br.Ret = 200
  1401. br.Success = true
  1402. br.Msg = "操作成功"
  1403. return
  1404. }
  1405. var req models.PublishDayWeekReportReq
  1406. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  1407. if err != nil {
  1408. br.Msg = "参数解析异常!"
  1409. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  1410. return
  1411. }
  1412. reportId := req.ReportId
  1413. if reportId <= 0 {
  1414. br.Msg = "参数有误"
  1415. return
  1416. }
  1417. reportInfo, err := models.GetReportByReportId(reportId)
  1418. if err != nil {
  1419. br.Msg = "报告信息有误"
  1420. br.ErrMsg = "报告信息有误, Err: " + err.Error()
  1421. return
  1422. }
  1423. if reportInfo.State == 2 {
  1424. br.Msg = "该报告已发布"
  1425. return
  1426. }
  1427. // 图表刷新状态
  1428. refreshResult := data.CheckBatchChartRefreshResult("report", reportId, 0)
  1429. if !refreshResult {
  1430. br.Msg = "图表刷新未完成,请稍后操作"
  1431. br.ErrMsg = "图表刷新未完成,请稍后操作"
  1432. br.IsSendEmail = false
  1433. return
  1434. }
  1435. tips, err, errMsg := services.PublishChapterReport(reportInfo, "", sysUser)
  1436. if err != nil {
  1437. br.Msg = errMsg
  1438. br.ErrMsg = "发布晨/周报失败, Err: " + err.Error()
  1439. return
  1440. }
  1441. // 部分章节未发布的提示信息
  1442. if tips != "" {
  1443. br.Data = tips
  1444. }
  1445. br.Ret = 200
  1446. br.Success = true
  1447. br.Msg = "操作成功"
  1448. }
  1449. // GetStopDayWeekReportChapterTypeList
  1450. // @Title 获取暂停更新的晨报周报章节类型列表
  1451. // @Description 获取暂停更新的晨报周报章节类型列表
  1452. // @Success 200 {object} models.ReportListResp
  1453. // @router /getStopDayWeekReportChapterTypeList [get]
  1454. func (this *ReportController) GetStopDayWeekReportChapterTypeList() {
  1455. br := new(models.BaseResponse).Init()
  1456. defer func() {
  1457. this.Data["json"] = br
  1458. this.ServeJSON()
  1459. }()
  1460. sysUser := this.SysUser
  1461. if sysUser == nil {
  1462. br.Msg = "请登录"
  1463. br.ErrMsg = "请登录,SysUser Is Empty"
  1464. br.Ret = 408
  1465. return
  1466. }
  1467. if utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeSandbox && utils.BusinessCode != utils.BusinessCodeDebug {
  1468. br.Ret = 200
  1469. br.Success = true
  1470. br.Msg = "获取成功"
  1471. return
  1472. }
  1473. stopDay := make([]*models.ReportChapterType, 0)
  1474. stopWeek := make([]*models.ReportChapterType, 0)
  1475. disableDay := make([]*models.ReportChapterType, 0)
  1476. disableWeek := make([]*models.ReportChapterType, 0)
  1477. stopList, err := models.GetStopUpdateReportChapterTypeListByResearchType()
  1478. if err != nil {
  1479. br.Msg = "获取暂停更新报告章节类型列表失败"
  1480. br.ErrMsg = "获取暂停更新报告章节类型列表失败, Err: " + err.Error()
  1481. return
  1482. }
  1483. for _, v := range stopList {
  1484. if v.ResearchType == "day" {
  1485. stopDay = append(stopDay, v)
  1486. } else {
  1487. stopWeek = append(stopWeek, v)
  1488. }
  1489. }
  1490. disableList, err := models.GetDisableUpdateReportChapterTypeListByResearchType()
  1491. if err != nil {
  1492. br.Msg = "获取停止更新报告章节类型列表失败"
  1493. br.ErrMsg = "获取停止更新报告章节类型列表失败, Err: " + err.Error()
  1494. return
  1495. }
  1496. for _, v := range disableList {
  1497. if v.ResearchType == "day" {
  1498. disableDay = append(disableDay, v)
  1499. } else {
  1500. disableWeek = append(disableWeek, v)
  1501. }
  1502. }
  1503. resp := models.StopUpdateReportChapterTypeResp{
  1504. StopDay: stopDay,
  1505. StopWeek: stopWeek,
  1506. DisableDay: disableDay,
  1507. DisableWeek: disableWeek,
  1508. }
  1509. br.Ret = 200
  1510. br.Success = true
  1511. br.Msg = "获取成功"
  1512. br.Data = resp
  1513. }
  1514. // MarkEditStatus
  1515. // @Title 标记报告编辑状态
  1516. // @Description 标记报告编辑状态接口
  1517. // @Param request body request.MarkEditEnReport true "type json string"
  1518. // @Success 200 标记成功 ;202 标记成功
  1519. // @router /mark [post]
  1520. func (this *ReportController) MarkEditStatus() {
  1521. br := new(models.BaseResponse).Init()
  1522. defer func() {
  1523. this.Data["json"] = br
  1524. this.ServeJSON()
  1525. }()
  1526. sysUser := this.SysUser
  1527. if sysUser == nil {
  1528. br.Msg = "请登录"
  1529. br.ErrMsg = "请登录,SysUser Is Empty"
  1530. br.Ret = 408
  1531. return
  1532. }
  1533. var req models.MarkEditReport
  1534. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  1535. if err != nil {
  1536. br.Msg = "参数解析异常!"
  1537. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  1538. return
  1539. }
  1540. if req.ReportId <= 0 {
  1541. br.Msg = "缺少报告Id"
  1542. return
  1543. }
  1544. if req.Status < 0 {
  1545. br.Msg = "标记状态异常"
  1546. return
  1547. }
  1548. //更新标记key
  1549. data, err := services.UpdateReportEditMark(req.ReportId, req.ReportChapterId, sysUser.AdminId, req.Status, sysUser.RealName, this.Lang)
  1550. if err != nil {
  1551. br.Msg = err.Error()
  1552. return
  1553. }
  1554. msg := "标记成功"
  1555. br.Ret = 200
  1556. br.Success = true
  1557. br.Msg = msg
  1558. br.Data = data
  1559. }
  1560. // SendMsg
  1561. // @Title 模板消息/客群消息推送接口
  1562. // @Description 模板消息/客群消息推送接口
  1563. // @Param request body models.SendTemplateMsgReq true "type json string"
  1564. // @Success 200 {object} models.SendTemplateMsgResp
  1565. // @router /sendMsg [post]
  1566. func (this *ReportController) SendMsg() {
  1567. br := new(models.BaseResponse).Init()
  1568. defer func() {
  1569. this.Data["json"] = br
  1570. this.ServeJSON()
  1571. }()
  1572. var req models.SendTemplateMsgReq
  1573. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  1574. if err != nil {
  1575. br.Msg = "参数解析异常!"
  1576. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  1577. return
  1578. }
  1579. if req.ReportId <= 0 {
  1580. br.Msg = "参数错误"
  1581. br.ErrMsg = "参数错误"
  1582. return
  1583. }
  1584. // 加锁,避免重复点击造成的多次推送
  1585. {
  1586. redisKey := fmt.Sprint("report:send:ths:", req.ReportId)
  1587. ok := utils.Rc.SetNX(redisKey, 1, time.Second*300)
  1588. if !ok {
  1589. br.Msg = "报告已推送, 请勿重复推送"
  1590. return
  1591. }
  1592. defer func() {
  1593. _ = utils.Rc.Delete(redisKey)
  1594. }()
  1595. }
  1596. reportInfo, e := models.GetReportByReportId(req.ReportId)
  1597. if e != nil {
  1598. br.Msg = "报告不存在或已被删除, 请刷新页面"
  1599. br.ErrMsg = "获取报告失败, Err: " + e.Error()
  1600. return
  1601. }
  1602. if reportInfo.MsgIsSend == 1 && reportInfo.ThsMsgIsSend == 1 {
  1603. br.Msg = "消息已推送,请勿重复操作"
  1604. br.ErrMsg = "消息已推送,请勿重复操作"
  1605. return
  1606. }
  1607. // 更新报告发布时间
  1608. videoNameDate := `(` + time.Now().Format("0102") + `)`
  1609. if err = models.UpdateReportPublishTime(req.ReportId, videoNameDate); err != nil {
  1610. br.Msg = "修改报告发布时间失败"
  1611. br.ErrMsg = "修改发布时间失败,Err:" + err.Error()
  1612. return
  1613. }
  1614. if err = models.UpdateReportChapterPublishTime(req.ReportId, videoNameDate); err != nil {
  1615. br.Msg = "修改章节发布时间失败"
  1616. br.ErrMsg = "修改发布时间失败,Err:" + err.Error()
  1617. return
  1618. }
  1619. // 可能存在历史数据两个只推了一个所以此处加个判断
  1620. // 推送模板消息
  1621. if reportInfo.MsgIsSend == 0 {
  1622. go services.SendMiniProgramReportWxMsg(reportInfo.Id)
  1623. }
  1624. // 更新推送消息状态
  1625. reportInfo.MsgIsSend = 1
  1626. reportInfo.ThsMsgIsSend = 1
  1627. reportInfo.MsgSendTime = time.Now()
  1628. reportInfo.ModifyTime = time.Now()
  1629. err = reportInfo.UpdateReport([]string{"MsgIsSend", "ThsMsgIsSend", "MsgSendTime", "ModifyTime"})
  1630. if err != nil {
  1631. br.Msg = "推送失败"
  1632. br.ErrMsg = "更新报告消息状态失败, Err:" + err.Error()
  1633. return
  1634. }
  1635. br.Ret = 200
  1636. br.Success = true
  1637. br.Msg = "推送成功"
  1638. br.IsAddLog = true
  1639. br.Data = models.SendTemplateMsgResp{
  1640. ReportId: reportInfo.Id,
  1641. MsgSendTime: reportInfo.MsgSendTime.Format(utils.FormatDateTime),
  1642. }
  1643. }
  1644. // CheckDayWeekReportChapterVideo
  1645. // @Title 获取暂停更新的晨报周报章节类型列表
  1646. // @Description 获取暂停更新的晨报周报章节类型列表
  1647. // @Param ReportId query string true "报告ID"
  1648. // @Success 200 {object} models.ReportListResp
  1649. // @router /CheckDayWeekReportChapterVideo [get]
  1650. func (this *ReportController) CheckDayWeekReportChapterVideo() {
  1651. br := new(models.BaseResponse).Init()
  1652. defer func() {
  1653. this.Data["json"] = br
  1654. this.ServeJSON()
  1655. }()
  1656. sysUser := this.SysUser
  1657. if sysUser == nil {
  1658. br.Msg = "请登录"
  1659. br.ErrMsg = "请登录,SysUser Is Empty"
  1660. br.Ret = 408
  1661. return
  1662. }
  1663. reqReportId := this.GetString("ReportId")
  1664. reportId, _ := strconv.Atoi(reqReportId)
  1665. if reportId <= 0 {
  1666. br.Msg = "报告ID有误"
  1667. return
  1668. }
  1669. // 获取章节列表
  1670. chapterList, err := models.GetChapterListByReportId(reportId)
  1671. if err != nil {
  1672. br.Msg = "获取章节列表失败"
  1673. br.ErrMsg = "获取章节列表失败, Err: " + err.Error()
  1674. return
  1675. }
  1676. typeNameArr := make([]string, 0)
  1677. for _, v := range chapterList {
  1678. if v.VideoUrl == "" || (v.VideoUrl != "" && v.VideoKind == 2) {
  1679. typeNameArr = append(typeNameArr, v.TypeName)
  1680. }
  1681. }
  1682. br.Ret = 200
  1683. br.Success = true
  1684. br.Msg = "保存成功"
  1685. br.Data = typeNameArr
  1686. }