road_video.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724
  1. package yb
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/rdlucklib/rdluck_tools/paging"
  6. "hongze/hz_crm_api/controllers"
  7. "hongze/hz_crm_api/models"
  8. ybModels "hongze/hz_crm_api/models/yb"
  9. "hongze/hz_crm_api/models/yb/request"
  10. "hongze/hz_crm_api/services"
  11. "hongze/hz_crm_api/services/yb"
  12. "hongze/hz_crm_api/utils"
  13. "sort"
  14. "strings"
  15. "time"
  16. )
  17. // RoadVideoController 研报视频社区
  18. type RoadVideoController struct {
  19. controllers.BaseAuthController
  20. }
  21. // List
  22. // @Title 视频列表
  23. // @Description 视频列表
  24. // @Param Keywords query string false "关键词"
  25. // @Param SortParam query string false "排序字段参数,用来排序的字段, 枚举值:'ClickNum':点击量"
  26. // @Param SortType query string true "如何排序,是正序还是倒序,枚举值:`asc 正序`,`desc 倒叙`"
  27. // @Success 200 {object} response.CommunityQuestionListResp
  28. // @router /road/video/list [get]
  29. func (r *RoadVideoController) List() {
  30. br := new(models.BaseResponse).Init()
  31. br.IsSendEmail = false
  32. defer func() {
  33. r.Data["json"] = br
  34. r.ServeJSON()
  35. }()
  36. sysUser := r.SysUser
  37. if sysUser == nil {
  38. br.Msg = "请登录"
  39. br.ErrMsg = "请登录,SysUser Is Empty"
  40. br.Ret = 408
  41. return
  42. }
  43. condition := ""
  44. pars := make([]interface{}, 0)
  45. keywords := r.GetString("Keywords", "")
  46. if keywords != "" {
  47. keywords = "%" + keywords + "%"
  48. condition += ` AND v.title LIKE ? `
  49. pars = append(pars, keywords)
  50. }
  51. var startSize int
  52. pageSize, _ := r.GetInt("PageSize")
  53. currentIndex, _ := r.GetInt("CurrentIndex")
  54. if pageSize <= 0 {
  55. pageSize = utils.PageSize20
  56. }
  57. if currentIndex <= 0 {
  58. currentIndex = 1
  59. }
  60. startSize = paging.StartIndex(currentIndex, pageSize)
  61. // 排序相关
  62. sortParam := r.GetString("SortParam")
  63. sortType := r.GetString("SortType")
  64. orderStr := ""
  65. if sortType != "" && strings.ToLower(sortType) != "desc" && strings.ToLower(sortType) != "asc" {
  66. br.Msg = "请输入正确的排序类型"
  67. return
  68. }
  69. if sortParam == "ClickNum" {
  70. orderStr = " ORDER BY l.click_num"
  71. if sortType != "" {
  72. orderStr += " " + sortType
  73. } else {
  74. orderStr += " DESC"
  75. }
  76. orderStr += ", v.modify_time DESC"
  77. }
  78. total, resp, err, errMsg := yb.GetRoadVideoList(condition, pars, orderStr, startSize, pageSize)
  79. if err != nil {
  80. br.Msg = errMsg
  81. br.ErrMsg = err.Error()
  82. return
  83. }
  84. page := paging.GetPaging(currentIndex, pageSize, total)
  85. resp.Paging = page
  86. br.Ret = 200
  87. br.Success = true
  88. br.Msg = "获取成功"
  89. br.Data = resp
  90. }
  91. // Save
  92. // @Title 保存视频
  93. // @Description 保存视频
  94. // @Param request body request.RoadVideoSaveReq true "type json string"
  95. // @Success 200 string "操作成功"
  96. // @router /road/video/save [post]
  97. func (r *RoadVideoController) Save() {
  98. br := new(models.BaseResponse).Init()
  99. br.IsSendEmail = false
  100. defer func() {
  101. r.Data["json"] = br
  102. r.ServeJSON()
  103. }()
  104. sysUser := r.SysUser
  105. if sysUser == nil {
  106. br.Msg = "请登录"
  107. br.ErrMsg = "请登录,SysUser Is Empty"
  108. br.Ret = 408
  109. return
  110. }
  111. var req request.RoadVideoSaveReq
  112. if err := json.Unmarshal(r.Ctx.Input.RequestBody, &req); err != nil {
  113. br.Msg = "参数解析异常!"
  114. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  115. return
  116. }
  117. if req.Title == "" {
  118. br.Msg = "请输入标题"
  119. return
  120. }
  121. if req.ChartPermissionIds == "" {
  122. br.Msg = "请选择品种"
  123. return
  124. }
  125. if req.CoverImgUrl == "" {
  126. br.Msg = "请上传封面图"
  127. return
  128. }
  129. if req.VideoUrl == "" {
  130. br.Msg = "请上传视频"
  131. return
  132. }
  133. data, errMsg, err := yb.SaveRoadVideo(sysUser, req.VideoId, req.ReportId, req.ChartPermissionIds, req.Title, req.CoverImgUrl, req.VideoUrl, req.VideoSeconds)
  134. if err != nil {
  135. br.Msg = errMsg
  136. br.ErrMsg = "Yb-SaveVideo ErrMsg:" + err.Error()
  137. return
  138. }
  139. br.Ret = 200
  140. br.Success = true
  141. br.Msg = "操作成功"
  142. br.Data = data
  143. }
  144. // Delete
  145. // @Title 删除视频
  146. // @Description 删除视频
  147. // @Param request body request.RoadVideoOptionReq true "type json string"
  148. // @Success 200 string "操作成功"
  149. // @router /road/video/delete [post]
  150. func (r *RoadVideoController) Delete() {
  151. br := new(models.BaseResponse).Init()
  152. br.IsSendEmail = false
  153. defer func() {
  154. r.Data["json"] = br
  155. r.ServeJSON()
  156. }()
  157. sysUser := r.SysUser
  158. if sysUser == nil {
  159. br.Msg = "请登录"
  160. br.ErrMsg = "请登录,SysUser Is Empty"
  161. br.Ret = 408
  162. return
  163. }
  164. var req request.RoadVideoOptionReq
  165. if err := json.Unmarshal(r.Ctx.Input.RequestBody, &req); err != nil {
  166. br.Msg = "参数解析异常!"
  167. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  168. return
  169. }
  170. if req.VideoId <= 0 {
  171. br.Msg = "参数有误"
  172. return
  173. }
  174. errMsg, err := yb.SoftDeleteRoadVideo(req.VideoId)
  175. if err != nil {
  176. br.Msg = errMsg
  177. br.ErrMsg = "Yb-DeleteVideo ErrMsg:" + err.Error()
  178. return
  179. }
  180. br.Ret = 200
  181. br.Success = true
  182. br.Msg = "操作成功"
  183. }
  184. // Publish
  185. // @Title 发布/取消视频
  186. // @Description 发布/取消视频
  187. // @Param request body request.RoadVideoPublishReq true "type json string"
  188. // @Success 200 string "操作成功"
  189. // @router /road/video/publish [post]
  190. func (r *RoadVideoController) Publish() {
  191. br := new(models.BaseResponse).Init()
  192. br.IsSendEmail = false
  193. defer func() {
  194. r.Data["json"] = br
  195. r.ServeJSON()
  196. }()
  197. sysUser := r.SysUser
  198. if sysUser == nil {
  199. br.Msg = "请登录"
  200. br.ErrMsg = "请登录,SysUser Is Empty"
  201. br.Ret = 408
  202. return
  203. }
  204. var req request.RoadVideoPublishReq
  205. if err := json.Unmarshal(r.Ctx.Input.RequestBody, &req); err != nil {
  206. br.Msg = "参数解析异常!"
  207. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  208. return
  209. }
  210. if req.VideoId <= 0 {
  211. br.Msg = "参数有误"
  212. return
  213. }
  214. errMsg, err := yb.PublishRoadVideo(req.VideoId, req.PublishState)
  215. if err != nil {
  216. br.Msg = errMsg
  217. br.ErrMsg = "Yb-PublishVideo ErrMsg:" + err.Error()
  218. return
  219. }
  220. br.Ret = 200
  221. br.Success = true
  222. br.Msg = "操作成功"
  223. }
  224. // SendThs
  225. // @Title 推送客群消息
  226. // @Description 推送客群消息
  227. // @Param request body request.RoadVideoOptionReq true "type json string"
  228. // @Success 200 string "操作成功"
  229. // @router /road/video/send_ths [post]
  230. func (r *RoadVideoController) SendThs() {
  231. br := new(models.BaseResponse).Init()
  232. br.IsSendEmail = false
  233. defer func() {
  234. r.Data["json"] = br
  235. r.ServeJSON()
  236. }()
  237. sysUser := r.SysUser
  238. if sysUser == nil {
  239. br.Msg = "请登录"
  240. br.ErrMsg = "请登录,SysUser Is Empty"
  241. br.Ret = 408
  242. return
  243. }
  244. var req request.RoadVideoOptionReq
  245. if err := json.Unmarshal(r.Ctx.Input.RequestBody, &req); err != nil {
  246. br.Msg = "参数解析异常!"
  247. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  248. return
  249. }
  250. if req.VideoId <= 0 {
  251. br.Msg = "参数有误"
  252. return
  253. }
  254. errMsg, err := yb.SendRoadVideoThsMsg(req.VideoId)
  255. if err != nil {
  256. br.Msg = errMsg
  257. br.ErrMsg = "Yb-SendVideoThsMsg ErrMsg:" + err.Error()
  258. return
  259. }
  260. br.Ret = 200
  261. br.Success = true
  262. br.Msg = "操作成功"
  263. }
  264. // VideoPlayLogList
  265. // @Title 获取视频点击量列表
  266. // @Description 获取视频点击量列表
  267. // @Param VideoId query int false "视频ID"
  268. // @Param SortType query int false "播放时长排序:默认倒序; 1-倒序(多一个数方便前端回显); 2-正序"
  269. // @Success 200 {object} response.QuestionClickLogListResp
  270. // @router /road/video/click/logs [get]
  271. func (r *RoadVideoController) VideoPlayLogList() {
  272. br := new(models.BaseResponse).Init()
  273. defer func() {
  274. r.Data["json"] = br
  275. r.ServeJSON()
  276. }()
  277. sysUser := r.SysUser
  278. if sysUser == nil {
  279. br.Msg = "请登录"
  280. br.ErrMsg = "请登录,SysUser Is Empty"
  281. br.Ret = 408
  282. return
  283. }
  284. videoId, _ := r.GetInt("VideoId")
  285. if videoId <= 0 {
  286. br.Msg = "请输入正确的视频ID"
  287. return
  288. }
  289. // 播放时长排序:1-DESC; 2-ASC;
  290. sortType, _ := r.GetInt("SortType")
  291. var startSize int
  292. pageSize, _ := r.GetInt("PageSize")
  293. currentIndex, _ := r.GetInt("CurrentIndex")
  294. if pageSize <= 0 {
  295. pageSize = utils.PageSize20
  296. }
  297. if currentIndex <= 0 {
  298. currentIndex = 1
  299. }
  300. startSize = paging.StartIndex(currentIndex, pageSize)
  301. total, resp, err := yb.GetVideoPlayLogList(videoId, 2, startSize, pageSize, sortType)
  302. if err != nil {
  303. br.Msg = "获取点击量详情列表失败"
  304. br.ErrMsg = "VideoPlayLogList ErrMsg:" + err.Error()
  305. return
  306. }
  307. page := paging.GetPaging(currentIndex, pageSize, int(total))
  308. resp.Paging = page
  309. br.Ret = 200
  310. br.Success = true
  311. br.Msg = "获取成功"
  312. br.Data = resp
  313. }
  314. // SendTemplateMsg
  315. // @Title 推送模板消息
  316. // @Description 推送模板消息
  317. // @Param request body request.RoadVideoOptionReq true "type json string"
  318. // @Success 200 string "操作成功"
  319. // @router /road/video/send_template_msg [post]
  320. func (r *RoadVideoController) SendTemplateMsg() {
  321. br := new(models.BaseResponse).Init()
  322. br.IsSendEmail = false
  323. defer func() {
  324. r.Data["json"] = br
  325. r.ServeJSON()
  326. }()
  327. sysUser := r.SysUser
  328. if sysUser == nil {
  329. br.Msg = "请登录"
  330. br.ErrMsg = "请登录,SysUser Is Empty"
  331. br.Ret = 408
  332. return
  333. }
  334. var req request.RoadVideoOptionReq
  335. if err := json.Unmarshal(r.Ctx.Input.RequestBody, &req); err != nil {
  336. br.Msg = "参数解析异常!"
  337. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  338. return
  339. }
  340. if req.VideoId <= 0 {
  341. br.Msg = "参数有误"
  342. return
  343. }
  344. errMsg, err := yb.SendRoadVideoTemplateMsg(req.VideoId)
  345. if err != nil {
  346. br.Msg = errMsg
  347. br.ErrMsg = "Yb-SendRoadVideoTemplateMsg ErrMsg:" + err.Error()
  348. return
  349. }
  350. br.Ret = 200
  351. br.Success = true
  352. br.Msg = "操作成功"
  353. }
  354. // GetPermission
  355. // @Title 查询品种权限
  356. // @Description 查询品种权限
  357. // @Param request body request.RoadVideoOptionReq true "type json string"
  358. // @Success 200 string "操作成功"
  359. // @router /road/permission [get]
  360. func (r *RoadVideoController) GetPermission() {
  361. br := new(models.BaseResponse).Init()
  362. defer func() {
  363. r.Data["json"] = br
  364. r.ServeJSON()
  365. }()
  366. sysUser := r.SysUser
  367. if sysUser == nil {
  368. br.Msg = "请登录"
  369. br.ErrMsg = "请登录,SysUser Is Empty"
  370. br.Ret = 408
  371. return
  372. }
  373. ret, err := yb.GetFiccPermission()
  374. if err != nil {
  375. br.Msg = "查询权限出错"
  376. br.ErrMsg = "Yb-SendVideoThsMsg ErrMsg:" + err.Error()
  377. return
  378. }
  379. br.Ret = 200
  380. br.Success = true
  381. br.Msg = "操作成功"
  382. br.Data = ret
  383. }
  384. // TwoWeekClassifyList
  385. // @Title 路演视频-关联报告类型列表
  386. // @Description 路演视频-关联报告类型列表
  387. // @Success 200 {object} models.SimpleClassifyList
  388. // @router /road/video/two_week_classify_list [get]
  389. func (r *RoadVideoController) TwoWeekClassifyList() {
  390. br := new(models.BaseResponse).Init()
  391. defer func() {
  392. r.Data["json"] = br
  393. r.ServeJSON()
  394. }()
  395. sysUser := r.SysUser
  396. if sysUser == nil {
  397. br.Msg = "请登录"
  398. br.ErrMsg = "请登录,SysUser Is Empty"
  399. br.Ret = 408
  400. return
  401. }
  402. // 2023-04-19 取classify表relate_video=1的二级分类, 但是需要分层级, 所以对应的一级分类也要组合起来
  403. list, e := models.GetAllClassify()
  404. if e != nil {
  405. br.Msg = "获取失败"
  406. br.ErrMsg = "获取路演视频可选报告分类失败, Err: " + e.Error()
  407. return
  408. }
  409. resp := make([]*models.SimpleClassifyList, 0)
  410. parentMap := make(map[int]*models.SimpleClassifyList)
  411. classifyMap := make(map[int]*models.Classify)
  412. for _, c := range list {
  413. classifyMap[c.Id] = c
  414. if c.ParentId > 0 && c.RelateVideo == 1 {
  415. if parentMap[c.ParentId] == nil {
  416. parentMap[c.ParentId] = new(models.SimpleClassifyList)
  417. }
  418. }
  419. }
  420. for k, v := range parentMap {
  421. p := classifyMap[k]
  422. if p == nil {
  423. continue
  424. }
  425. v.Id = p.Id
  426. v.ClassifyName = p.ClassifyName
  427. v.Sort = p.Sort
  428. v.Child = make([]*models.SimpleClassifyList, 0)
  429. for _, c := range list {
  430. if c.ParentId == v.Id && c.RelateVideo == 1 {
  431. v.Child = append(v.Child, &models.SimpleClassifyList{
  432. Id: c.Id,
  433. ClassifyName: c.ClassifyName,
  434. ParentId: c.ParentId,
  435. Sort: c.Sort,
  436. })
  437. }
  438. }
  439. sort.Slice(v.Child, func(i, j int) bool {
  440. return v.Child[j].Sort > v.Child[i].Sort
  441. })
  442. resp = append(resp, v)
  443. }
  444. sort.Slice(resp, func(i, j int) bool {
  445. return resp[j].Sort > resp[i].Sort
  446. })
  447. br.Ret = 200
  448. br.Success = true
  449. br.Msg = "操作成功"
  450. br.Data = resp
  451. }
  452. // SimpleReportList
  453. // @Title 路演视频选择报告-列表
  454. // @Description 路演视频选择报告-列表
  455. // @Param ClassifyIdSecond query int false "二级分类ID"
  456. // @Param Keyword query string false "关键词-报告标题"
  457. // @Success 200 string "获取成功"
  458. // @router /road/video/simple_report_list [get]
  459. func (r *RoadVideoController) SimpleReportList() {
  460. br := new(models.BaseResponse).Init()
  461. defer func() {
  462. r.Data["json"] = br
  463. r.ServeJSON()
  464. }()
  465. sysUser := r.SysUser
  466. if sysUser == nil {
  467. br.Msg = "请登录"
  468. br.ErrMsg = "请登录,SysUser Is Empty"
  469. br.Ret = 408
  470. return
  471. }
  472. cond := ` AND state = 2`
  473. pars := make([]interface{}, 0)
  474. classifyIdSecond, _ := r.GetInt("ClassifyIdSecond", 0)
  475. if classifyIdSecond <= 0 {
  476. // 2023-03-03 直接取classify表relate_video=1的二级分类下的报告
  477. classifyCond := ` AND parent_id > 0 AND relate_video = 1`
  478. classifyPars := make([]interface{}, 0)
  479. classifyList, e := models.GetClassifyByCondition(classifyCond, "", classifyPars)
  480. if e != nil {
  481. br.Msg = "获取失败"
  482. br.ErrMsg = "获取路演视频可选报告分类失败, Err: " + e.Error()
  483. return
  484. }
  485. classifyIds := make([]int, 0)
  486. for _, c := range classifyList {
  487. classifyIds = append(classifyIds, c.Id)
  488. }
  489. if len(classifyIds) > 0 {
  490. cond += ` AND classify_id_second IN ( ` + utils.GetOrmInReplace(len(classifyIds)) + ` ) `
  491. pars = append(pars, classifyIds)
  492. } else {
  493. cond += ` AND 1 = 2`
  494. }
  495. }
  496. if classifyIdSecond > 0 {
  497. cond += ` AND classify_id_second = ? `
  498. pars = append(pars, classifyIdSecond)
  499. }
  500. keyword := r.GetString("Keyword", "")
  501. if keyword != "" {
  502. kw := fmt.Sprint("%", keyword, "%")
  503. cond += ` AND title LIKE ?`
  504. pars = append(pars, kw)
  505. }
  506. fieldArr := []string{"id", "classify_id_second", "title", "publish_time"}
  507. orderRule := ` ORDER BY publish_time DESC, id DESC`
  508. reports, e := models.GetReportByCondition(cond, pars, fieldArr, orderRule, true, 0, 5)
  509. if e != nil {
  510. br.Msg = "获取失败"
  511. br.ErrMsg = "获取双周报列表失败, Err: " + e.Error()
  512. return
  513. }
  514. // 查询报告权限
  515. classifyPermissions := make(map[int][]int, 0)
  516. {
  517. classifyIds := make([]int, 0)
  518. for _, v := range reports {
  519. if utils.InArrayByInt(classifyIds, v.ClassifyIdSecond) {
  520. continue
  521. }
  522. classifyIds = append(classifyIds, v.ClassifyIdSecond)
  523. }
  524. if len(classifyIds) > 0 {
  525. cnd := fmt.Sprintf(` AND id IN (%s)`, utils.GetOrmInReplace(len(classifyIds)))
  526. ps := make([]interface{}, 0)
  527. ps = append(ps, classifyIds)
  528. classifies, e := models.GetClassifyByCondition(cnd, "", ps)
  529. if e != nil {
  530. br.Msg = "获取失败"
  531. br.ErrMsg = "获取报告分类失败, Err: " + e.Error()
  532. return
  533. }
  534. classifyNames := make([]string, 0)
  535. classifyNameId := make(map[string]int, 0)
  536. for _, v := range classifies {
  537. classifyNameId[v.ClassifyName] = v.Id
  538. classifyNames = append(classifyNames, v.ClassifyName)
  539. }
  540. if len(classifyNames) > 0 {
  541. classifyNamePermissions, e := models.GetPermissionsByClassifyNames(classifyNames)
  542. if e != nil {
  543. br.Msg = "获取失败"
  544. br.ErrMsg = "获取分类权限失败, Err: " + e.Error()
  545. return
  546. }
  547. namePermissions := make(map[string][]int, 0)
  548. for _, v := range classifyNamePermissions {
  549. if namePermissions[v.KeyWord] == nil {
  550. namePermissions[v.KeyWord] = make([]int, 0)
  551. }
  552. namePermissions[v.KeyWord] = append(namePermissions[v.KeyWord], v.ChartPermissionId)
  553. }
  554. for k, v := range classifyNameId {
  555. classifyPermissions[v] = namePermissions[k]
  556. }
  557. }
  558. }
  559. }
  560. type SimpleReportListResp struct {
  561. ReportId int
  562. Title string
  563. PublishTime string
  564. BindVideo int
  565. BindVideoTitle string
  566. PermissionIds []int
  567. }
  568. respList := make([]*SimpleReportListResp, 0)
  569. if len(reports) > 0 {
  570. reportIds := make([]int, 0)
  571. for i := range reports {
  572. reportIds = append(reportIds, reports[i].Id)
  573. }
  574. // 是否绑定
  575. videos, e := ybModels.GetRoadVideoListByReportIds(reportIds)
  576. if e != nil {
  577. br.Msg = "获取失败"
  578. br.ErrMsg = "获取路演视频列表失败, Err: " + e.Error()
  579. return
  580. }
  581. bindMap := make(map[int]int)
  582. bindTitleMap := make(map[int]string)
  583. for i := range videos {
  584. bindMap[videos[i].ReportId] = videos[i].RoadVideoId
  585. bindTitleMap[videos[i].ReportId] = videos[i].Title
  586. }
  587. for i := range reports {
  588. respList = append(respList, &SimpleReportListResp{
  589. ReportId: reports[i].Id,
  590. Title: reports[i].Title,
  591. PublishTime: reports[i].PublishTime.Format(utils.FormatDateTime),
  592. BindVideo: bindMap[reports[i].Id],
  593. BindVideoTitle: bindTitleMap[reports[i].Id],
  594. PermissionIds: classifyPermissions[reports[i].ClassifyIdSecond],
  595. })
  596. }
  597. }
  598. br.Ret = 200
  599. br.Success = true
  600. br.Msg = "操作成功"
  601. br.Data = respList
  602. }
  603. // SendMsg
  604. // @Title 推送消息(模板/客群)
  605. // @Description 推送消息(模板/客群)
  606. // @Param request body request.RoadVideoOptionReq true "type json string"
  607. // @Success 200 string "操作成功"
  608. // @router /road/video/send_msg [post]
  609. func (r *RoadVideoController) SendMsg() {
  610. br := new(models.BaseResponse).Init()
  611. br.IsSendEmail = false
  612. defer func() {
  613. r.Data["json"] = br
  614. r.ServeJSON()
  615. }()
  616. sysUser := r.SysUser
  617. if sysUser == nil {
  618. br.Msg = "请登录"
  619. br.ErrMsg = "请登录,SysUser Is Empty"
  620. br.Ret = 408
  621. return
  622. }
  623. var req request.RoadVideoOptionReq
  624. if err := json.Unmarshal(r.Ctx.Input.RequestBody, &req); err != nil {
  625. br.Msg = "参数解析异常!"
  626. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  627. return
  628. }
  629. if req.VideoId <= 0 {
  630. br.Msg = "参数有误"
  631. return
  632. }
  633. // 加锁,避免重复点击造成的多次推送
  634. {
  635. redisKey := fmt.Sprint("road_video:send:msg:", req.VideoId)
  636. ok := utils.Rc.SetNX(redisKey, 1, time.Second*300)
  637. if !ok {
  638. br.Msg = "消息已推送, 请勿重复推送"
  639. return
  640. }
  641. defer func() {
  642. _ = utils.Rc.Delete(redisKey)
  643. }()
  644. }
  645. item, e := ybModels.GetRoadVideoById(req.VideoId)
  646. if e != nil {
  647. br.Msg = "视频不存在或已被删除"
  648. br.ErrMsg = "获取路演视频失败, Err: " + e.Error()
  649. return
  650. }
  651. if item.PublishState != 1 {
  652. br.Msg = "视频未发布, 不可推送"
  653. return
  654. }
  655. if item.SendThsState == 1 && item.SendTemplateState == 1 {
  656. br.Msg = "请勿重复推送"
  657. return
  658. }
  659. nowTime := time.Now().Local()
  660. updateCols := make([]string, 0)
  661. // 可能存在历史数据两个只推了一个所以此处加个判断
  662. // 模板消息
  663. if item.SendTemplateState == 0 {
  664. updateCols = append(updateCols, "SendTemplateState", "SendTemplateTime")
  665. item.SendTemplateState = 1
  666. item.SendTemplateTime = nowTime
  667. go func() {
  668. _ = services.SendYbRoadVideoWxMsg(item.RoadVideoId, item.Title, item.PublishTime.Format(utils.FormatDateTime), item.ChartPermissionIds)
  669. }()
  670. }
  671. // 客群消息
  672. if item.SendThsState == 0 {
  673. updateCols = append(updateCols, "SendThsState", "SendThsTime")
  674. item.SendThsState = 1
  675. item.SendThsTime = nowTime
  676. //go func() {
  677. // _ = services.SendYbRoadVideoThs(item.RoadVideoId, item.Title, item.ChartPermissionIds)
  678. //}()
  679. }
  680. // 更新状态
  681. if e := item.Update(updateCols); e != nil {
  682. br.Msg = "推送失败"
  683. br.ErrMsg = "更新路演视频信息失败, Err: " + e.Error()
  684. return
  685. }
  686. br.Ret = 200
  687. br.Success = true
  688. br.Msg = "操作成功"
  689. }