report.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  1. package services
  2. import (
  3. "errors"
  4. "eta_gn/eta_task/models"
  5. "eta_gn/eta_task/models/report"
  6. "eta_gn/eta_task/services/alarm_msg"
  7. "eta_gn/eta_task/utils"
  8. "fmt"
  9. "golang.org/x/net/context"
  10. "html"
  11. "strconv"
  12. "strings"
  13. "time"
  14. )
  15. func UpdateReportEs(reportId int, publishState int) (err error) {
  16. if reportId <= 0 {
  17. return
  18. }
  19. reportInfo, err := models.GetReportByReportId(reportId)
  20. if err != nil {
  21. return
  22. }
  23. categories := ""
  24. if reportInfo.HasChapter == 1 {
  25. chapterList, tmpErr := models.GetPublishedChapterListByReportId(reportInfo.Id)
  26. if tmpErr != nil {
  27. return
  28. }
  29. if len(chapterList) > 0 {
  30. for _, chapterInfo := range chapterList {
  31. err = updateReportChapterEsByChapter(chapterInfo)
  32. if err != nil {
  33. return
  34. }
  35. }
  36. }
  37. } else {
  38. permissionList, tmpErr := models.GetChartPermissionNameFromMappingByKeyword("rddp", reportInfo.ClassifyIdSecond)
  39. if tmpErr != nil {
  40. return
  41. }
  42. categoryArr := make([]string, 0)
  43. for i := 0; i < len(permissionList); i++ {
  44. categoryArr = append(categoryArr, permissionList[i].PermissionName)
  45. }
  46. aliasArr, _ := addCategoryAliasToArr(categoryArr)
  47. categories = strings.Join(aliasArr, ",")
  48. }
  49. minClassifyId, minClassifyName, err := getMinClassify(reportInfo)
  50. if err != nil {
  51. return
  52. }
  53. esReport := &models.ElasticReportDetail{
  54. ReportId: reportInfo.Id,
  55. ReportChapterId: 0,
  56. Title: reportInfo.Title,
  57. Abstract: reportInfo.Abstract,
  58. BodyContent: utils.TrimHtml(html.UnescapeString(reportInfo.Content)),
  59. PublishTime: reportInfo.PublishTime.Format(utils.FormatDateTime),
  60. PublishState: publishState,
  61. Author: reportInfo.Author,
  62. ClassifyIdFirst: reportInfo.ClassifyIdFirst,
  63. ClassifyNameFirst: reportInfo.ClassifyNameFirst,
  64. ClassifyIdSecond: reportInfo.ClassifyIdSecond,
  65. ClassifyNameSecond: reportInfo.ClassifyNameSecond,
  66. ClassifyId: minClassifyId,
  67. ClassifyName: minClassifyName,
  68. Categories: categories,
  69. StageStr: strconv.Itoa(reportInfo.Stage),
  70. }
  71. docId := fmt.Sprintf("%d-%d", reportInfo.Id, 0)
  72. if err = EsAddOrEditReport(utils.EsReportIndexName, docId, esReport); err != nil {
  73. return
  74. }
  75. return
  76. }
  77. func addCategoryAliasToArr(categoryArr []string) (aliasArr []string, err error) {
  78. aliasArr = categoryArr
  79. if len(categoryArr) > 0 {
  80. for i := 0; i < len(categoryArr); i++ {
  81. if strings.Contains(categoryArr[i], "沥青") {
  82. aliasArr = append(aliasArr, "BU")
  83. }
  84. if strings.Contains(categoryArr[i], "MEG") {
  85. aliasArr = append(aliasArr, "EG", "乙二醇")
  86. }
  87. if strings.Contains(categoryArr[i], "聚酯") {
  88. aliasArr = append(aliasArr, "长丝", "短纤", "瓶片")
  89. }
  90. if strings.Contains(categoryArr[i], "纯苯+苯乙烯") {
  91. aliasArr = append(aliasArr, "EB")
  92. }
  93. if strings.Contains(categoryArr[i], "聚乙烯") {
  94. aliasArr = append(aliasArr, "PP", "PE")
  95. }
  96. if strings.Contains(categoryArr[i], "玻璃纯碱") {
  97. aliasArr = append(aliasArr, "玻璃", "纯碱", "FG", "SA")
  98. }
  99. if strings.Contains(categoryArr[i], "甲醇") {
  100. aliasArr = append(aliasArr, "甲醇", "MA")
  101. }
  102. if strings.Contains(categoryArr[i], "橡胶") {
  103. aliasArr = append(aliasArr, "橡胶", "RU")
  104. }
  105. }
  106. }
  107. return
  108. }
  109. func updateReportChapterEsByChapter(chapterInfo *models.ReportChapter) (err error) {
  110. obj := report.ReportChapterPermissionMapping{}
  111. permissionList, tmpErr := obj.GetPermissionItemListById(chapterInfo.ReportChapterId)
  112. if tmpErr != nil {
  113. return
  114. }
  115. categoryArr := make([]string, 0)
  116. if len(permissionList) > 0 {
  117. for ii := 0; ii < len(permissionList); ii++ {
  118. categoryArr = append(categoryArr, permissionList[ii].ChartPermissionName)
  119. }
  120. }
  121. aliasArr, _ := addCategoryAliasToArr(categoryArr)
  122. categories := strings.Join(aliasArr, ",")
  123. esChapter := &models.ElasticReportDetail{
  124. ReportId: chapterInfo.ReportId,
  125. ReportChapterId: chapterInfo.ReportChapterId,
  126. Title: chapterInfo.Title,
  127. Abstract: chapterInfo.Abstract,
  128. BodyContent: utils.TrimHtml(html.UnescapeString(chapterInfo.Content)),
  129. PublishTime: chapterInfo.PublishTime.Format(utils.FormatDateTime),
  130. PublishState: chapterInfo.PublishState,
  131. Author: chapterInfo.Author,
  132. ClassifyIdFirst: chapterInfo.ClassifyIdFirst,
  133. ClassifyNameFirst: chapterInfo.ClassifyNameFirst,
  134. ClassifyIdSecond: 0,
  135. ClassifyNameSecond: "",
  136. ClassifyId: chapterInfo.ClassifyIdFirst,
  137. ClassifyName: chapterInfo.ClassifyNameFirst,
  138. Categories: categories,
  139. StageStr: strconv.Itoa(chapterInfo.Stage),
  140. }
  141. chapterDocId := fmt.Sprintf("%d-%d", chapterInfo.ReportId, chapterInfo.ReportChapterId)
  142. if err = EsAddOrEditReport(utils.EsReportIndexName, chapterDocId, esChapter); err != nil {
  143. return
  144. }
  145. return
  146. }
  147. func PublishReport(cont context.Context) (err error) {
  148. errMsgList := make([]string, 0)
  149. defer func() {
  150. if err != nil {
  151. go alarm_msg.SendAlarmMsg("PublishReport-定时发布研报失败, ErrMsg:\n"+err.Error(), 3)
  152. }
  153. }()
  154. now := time.Now().Format(utils.FormatDateTimeMinute)
  155. startTime := now + ":00"
  156. endTime := now + ":59"
  157. afterDate := time.Now().AddDate(0, -1, 0).Format(utils.FormatDate) //限制一下,只查询最近一个月的
  158. list, err := models.GetPrePublishedReports(startTime, endTime, afterDate)
  159. if err != nil {
  160. return
  161. }
  162. listLen := len(list)
  163. if listLen == 0 {
  164. return
  165. }
  166. for i := 0; i < listLen; i++ {
  167. item := list[i]
  168. var publishTime time.Time
  169. if item.MsgIsSend == 1 && !item.PublishTime.IsZero() { //如果报告曾经发布过,并且已经发送过模版消息,则章节的发布时间为报告的发布时间
  170. publishTime = item.PublishTime
  171. } else {
  172. publishTime = time.Now()
  173. }
  174. var tmpErr error
  175. if item.HasChapter == 1 { // 章节类型的报告
  176. item.State = 2
  177. item.PublishTime = publishTime
  178. item.ModifyTime = time.Now().Local()
  179. updateCols := make([]string, 0)
  180. updateCols = append(updateCols, "PublishTime", "State", "ModifyTime")
  181. tmpErr = models.PublishReportAndChapter(item, true, updateCols)
  182. } else {
  183. tmpErr = models.PublishReportById(item.Id, publishTime)
  184. }
  185. if tmpErr != nil {
  186. errMsgList = append(errMsgList, fmt.Sprint("报告发布失败,ID:", item.Id, ",ErrMsg:", tmpErr.Error()))
  187. } else {
  188. go handleByPublishReport(item)
  189. }
  190. }
  191. return
  192. }
  193. func handleByPublishReport(item *models.Report) {
  194. recordItem := &models.ReportStateRecord{
  195. ReportId: item.Id,
  196. ReportType: 1,
  197. State: 2,
  198. AdminId: item.AdminId,
  199. AdminName: item.AdminName,
  200. CreateTime: time.Now(),
  201. }
  202. _, _ = models.AddReportStateRecord(recordItem)
  203. if item.HasChapter == 1 {
  204. _ = UpdateChaptersVideoByReportId(item.Id)
  205. } else {
  206. if item.VideoUrl == "" {
  207. _ = CreateVideo(item)
  208. }
  209. }
  210. err := UpdateReportEs(item.Id, 2)
  211. if err != nil {
  212. utils.FileLog.Error("UpdateReportEs, 更新报告Es失败, ReportId:%s, Err:%s", item.Id, err.Error())
  213. }
  214. if utils.SendWxTemplateEnable == "1" {
  215. if item.MsgIsSend == 0 && item.PreMsgSend == 1 {
  216. _ = ReportSendTemplateMsg(item.Id)
  217. }
  218. }
  219. return
  220. }
  221. func ReportSendTemplateMsg(reportId int) (err error) {
  222. defer func() {
  223. if err != nil {
  224. msg := fmt.Sprintf("ReportSendTemplateMsg, 发送报告模版消息失败, ReportId:%s, Err:%s", reportId, err.Error())
  225. utils.FileLog.Error(msg)
  226. go alarm_msg.SendAlarmMsg(msg, 3)
  227. }
  228. }()
  229. reportInfo, err := models.GetReportByReportId(reportId)
  230. if err != nil {
  231. err = errors.New("查询报告失败 Err:" + err.Error())
  232. return
  233. }
  234. if reportInfo.MsgIsSend == 1 {
  235. err = errors.New("模板消息已推送,请勿重复操作")
  236. return
  237. }
  238. videoNameDate := `(` + time.Now().Format("0102") + `)`
  239. err = models.UpdateReportPublishTime(reportId, videoNameDate)
  240. if err != nil {
  241. err = errors.New("修改发布时间失败,Err:" + err.Error())
  242. return
  243. }
  244. if reportInfo.HasChapter > 0 {
  245. err = models.UpdateReportChapterPublishTime(reportId, videoNameDate)
  246. if err != nil {
  247. err = errors.New("修改发布时间失败,Err:" + err.Error())
  248. return
  249. }
  250. }
  251. err = sendMiniProgramReportWxMsg(reportInfo)
  252. if err != nil {
  253. err = errors.New("发送失败,Err:" + err.Error())
  254. return
  255. }
  256. err = models.ModifyReportMsgIsSend(reportId)
  257. if err != nil {
  258. err = errors.New("发送失败,Err:" + err.Error())
  259. return
  260. }
  261. return
  262. }
  263. func sendMiniProgramReportWxMsg(report *models.Report) (err error) {
  264. reportId := report.Id
  265. var msg string
  266. reportIdStr := strconv.Itoa(reportId)
  267. defer func() {
  268. if err != nil {
  269. fmt.Println("msg:", msg)
  270. utils.FileLog.Error(fmt.Sprintf("SendMiniProgramReportWxMsg, 发送报告模版消息失败, ReportId:%s, Err:%s", reportIdStr, err.Error()))
  271. go alarm_msg.SendAlarmMsg("SendMiniProgramReportWxMsg发送报告模版消息失败;"+"ReportId:"+reportIdStr+",Err:"+err.Error()+";msg:"+msg, 3)
  272. }
  273. }()
  274. utils.FileLog.Info("%s", "services SendMsg")
  275. if report == nil {
  276. utils.FileLog.Info("报告信息不存在")
  277. return
  278. }
  279. var openIdArr []string
  280. minClassifyId, _, err := getMinClassify(report)
  281. if err != nil {
  282. msg = "获取报告的最小分类失败 err:" + err.Error()
  283. return err
  284. }
  285. _, err = models.GetClassifyById(minClassifyId)
  286. if err != nil {
  287. msg = "获取报告分类失败 err:" + err.Error()
  288. return err
  289. }
  290. openIdArr, err = models.GetOpenIdArrByClassifyId(minClassifyId)
  291. if err != nil {
  292. msg = "GetOpenIdArrByClassifyNameSecond err:" + err.Error()
  293. return err
  294. }
  295. title := fmt.Sprintf("弘则%s", report.ClassifyNameFirst)
  296. if CheckTwoWeekOrMonthReport(report.ClassifyIdFirst, report.ClassifyNameFirst) {
  297. title = fmt.Sprintf("弘则%s", report.ClassifyNameSecond)
  298. }
  299. first := fmt.Sprintf("Hi,最新一期%s已上线,欢迎查看", report.ClassifyNameFirst)
  300. keyword1 := title
  301. keyword2 := report.Title
  302. keyword3 := report.PublishTime.Format(utils.FormatDateTime)
  303. keyword4 := report.Abstract
  304. var wxAppPath string
  305. if report.ChapterType == utils.REPORT_TYPE_WEEK {
  306. wxAppPath = fmt.Sprintf("pages-report/chapterList?reportId=%s", reportIdStr)
  307. } else {
  308. wxAppPath = fmt.Sprintf("pages-report/reportDetail?reportId=%s", reportIdStr)
  309. }
  310. sendInfo := new(SendWxTemplate)
  311. sendInfo.First = first
  312. sendInfo.Keyword1 = keyword1
  313. sendInfo.Keyword2 = keyword2
  314. sendInfo.Keyword3 = keyword3
  315. sendInfo.Keyword4 = keyword4
  316. sendInfo.TemplateId = utils.TemplateIdByProduct
  317. sendInfo.RedirectUrl = wxAppPath
  318. sendInfo.Resource = wxAppPath
  319. sendInfo.SendType = utils.TEMPLATE_MSG_REPORT
  320. sendInfo.OpenIdArr = openIdArr
  321. sendInfo.RedirectTarget = 1
  322. err = SendTemplateMsgV2(sendInfo)
  323. return
  324. }
  325. func CheckTwoWeekOrMonthReport(classifyId int, classifyName string) (ok bool) {
  326. if utils.RunMode == "debug" {
  327. miniStrArr := []string{
  328. "双周报", "月报",
  329. }
  330. if utils.InArrayByStr(miniStrArr, classifyName) {
  331. ok = true
  332. }
  333. } else {
  334. IdArr := []int{
  335. 96, 112,
  336. }
  337. if utils.InArrayByInt(IdArr, classifyId) {
  338. ok = true
  339. }
  340. }
  341. return
  342. }
  343. func ClearReportSaveLog(cont context.Context) (err error) {
  344. defer func() {
  345. if err != nil {
  346. tips := fmt.Sprintf("报告日志记录, SaveReportLogs error: %s", err.Error())
  347. fmt.Println(tips)
  348. go alarm_msg.SendAlarmMsg(tips, 2)
  349. }
  350. }()
  351. twoWeek := time.Now().Local().AddDate(0, 0, -14).Format(utils.FormatDateTime)
  352. e := models.ClearReportSaveLog(twoWeek)
  353. if e != nil {
  354. err = fmt.Errorf("ClearReportSaveLog: %s", e.Error())
  355. }
  356. return
  357. }
  358. func UpdateChaptersVideoByReportId(reportId int) (err error) {
  359. defer func() {
  360. if err != nil {
  361. utils.FileLog.Error("UpdateChaptersVideo, reportId:%v, Err:%s", reportId, err.Error())
  362. go alarm_msg.SendAlarmMsg(fmt.Sprintf("更新章节音频失败, 报告ID: %v; Err: "+err.Error(), reportId), 3)
  363. }
  364. }()
  365. chapterList, err := models.GetChapterListByReportId(reportId)
  366. if err != nil {
  367. return
  368. }
  369. nowTime := time.Now()
  370. updateCols := make([]string, 0)
  371. updateCols = append(updateCols, "VideoUrl", "VideoName", "VideoSize", "VideoPlaySeconds")
  372. for i := 0; i < len(chapterList); i++ {
  373. item := chapterList[i]
  374. if item.VideoUrl != "" && item.VideoName != "" && item.VideoSize != "" && item.VideoPlaySeconds != "" {
  375. continue
  376. }
  377. videoUrl, videoName, videoSize, videoPlaySeconds, e := CreateReportVideo(item.Title, html.UnescapeString(item.Content), nowTime.Format(utils.FormatDateTime))
  378. if e != nil {
  379. err = e
  380. return
  381. }
  382. item.VideoUrl = videoUrl
  383. item.VideoName = videoName
  384. item.VideoSize = videoSize
  385. item.VideoPlaySeconds = fmt.Sprintf("%.2f", videoPlaySeconds)
  386. if e = item.UpdateChapter(updateCols); e != nil {
  387. err = e
  388. }
  389. }
  390. return
  391. }
  392. func getMinClassify(reportInfo *models.Report) (minClassifyId int, minClassifyName string, err error) {
  393. defer func() {
  394. if err != nil {
  395. utils.FileLog.Error("获取最小分类ID失败,报告ID:%d,Err:%s", reportInfo.Id, err.Error())
  396. }
  397. }()
  398. minClassifyId = reportInfo.ClassifyIdThird
  399. minClassifyName = reportInfo.ClassifyNameThird
  400. if minClassifyId <= 0 {
  401. minClassifyId = reportInfo.ClassifyIdSecond
  402. minClassifyName = reportInfo.ClassifyNameSecond
  403. }
  404. if minClassifyId <= 0 {
  405. minClassifyId = reportInfo.ClassifyIdFirst
  406. minClassifyName = reportInfo.ClassifyNameFirst
  407. }
  408. if minClassifyId <= 0 {
  409. err = errors.New("分类异常")
  410. }
  411. return
  412. }