report_chapter.go 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. package report
  2. import (
  3. "errors"
  4. "fmt"
  5. report_chapter_type_cache "hongze/hongze_yb/cache/report_chapter_type"
  6. "hongze/hongze_yb/global"
  7. "hongze/hongze_yb/models/response"
  8. "hongze/hongze_yb/models/tables/chart_permission_chapter_mapping"
  9. "hongze/hongze_yb/models/tables/rddp/report"
  10. "hongze/hongze_yb/models/tables/rddp/report_chapter"
  11. "hongze/hongze_yb/models/tables/report_chapter_type"
  12. "hongze/hongze_yb/services/company"
  13. "hongze/hongze_yb/services/user"
  14. "hongze/hongze_yb/task"
  15. "hongze/hongze_yb/utils"
  16. "html"
  17. "sort"
  18. )
  19. // GetReportTypeIdsByPermissionIds 获取所有和权限绑定的报告章节ID
  20. func GetReportTypeIdsByPermissionIds(permissionIds []int) (ids []int, err error) {
  21. ids, err = chart_permission_chapter_mapping.GetReportIdsByPermisssionIds(permissionIds, "week")
  22. return
  23. }
  24. // GetLatestWeek 获取有权限的最新的周报
  25. func GetLatestWeek(permissionIds []int, typeIds []int) (reportInfo *report.Report, err error) {
  26. newTypeIds, err := GetWeekTypeIdsByPermissionIds(permissionIds, typeIds)
  27. chapter, err := report_chapter.GetLatestChapterByTypeIdsAndClass(newTypeIds,"week")
  28. if err != nil {
  29. return
  30. }
  31. if chapter.ReportId == 0 {
  32. return
  33. }
  34. reportInfo, err = report.GetByReportId(chapter.ReportId)
  35. return
  36. }
  37. // GetWeekTypeIdsByPermissionIds 获取有权限的章节类型ID
  38. func GetWeekTypeIdsByPermissionIds(permissionIds []int, typeIds []int) (newTypeIds []int, err error) {
  39. ids, err := GetReportTypeIdsByPermissionIds(permissionIds)
  40. if err != nil {
  41. return
  42. }
  43. if len(typeIds) == 0 {
  44. typeIds, err = report_chapter_type_cache.GetEffectTypeID()
  45. if err != nil {
  46. return
  47. }
  48. }
  49. for _, v1 := range typeIds {
  50. for _, v2 := range ids {
  51. if v1 == v2 {
  52. newTypeIds = append(newTypeIds, v2)
  53. }
  54. }
  55. }
  56. return
  57. }
  58. // GetChapterListByReport 根据报告获取章节列表
  59. func GetChapterListByReport(classifyNameFirst string, reportId int, validWeekTypeIds []int) (reportTypeList response.ReportChapterList, err error) {
  60. var errMsg string
  61. defer func() {
  62. if err != nil {
  63. global.LOG.Critical(fmt.Sprintf("GetChapterListByReport: err:%s, errMsg:%s", err.Error(), errMsg))
  64. }
  65. }()
  66. //查询有效的章节
  67. typeList, tErr := report_chapter_type.GetEffectTypes()
  68. if tErr != nil {
  69. errMsg = tErr.Error()
  70. err = errors.New("章节类型查询出错")
  71. return
  72. }
  73. if len(typeList) == 0 {
  74. err = errors.New("无有效的章节")
  75. return
  76. }
  77. typeMap := make(map[uint64]*report_chapter_type.ReportChapterType)
  78. var typeIds []int
  79. newTypeMap := make(map[int]bool)
  80. for _, v := range typeList {
  81. typeMap[v.ReportChapterTypeId] = v
  82. typeIds = append(typeIds, int(v.ReportChapterTypeId))
  83. }
  84. if classifyNameFirst == "周报" {
  85. for _, v := range validWeekTypeIds {
  86. newTypeMap[v] = true
  87. }
  88. }
  89. //获取所有当前研报的章节
  90. chapterList, tErr := report_chapter.GetListByReportId(reportId, classifyNameFirst)
  91. if tErr != nil && tErr != utils.ErrNoRow{
  92. errMsg = err.Error()
  93. err = errors.New("章节查询出错")
  94. return
  95. }
  96. if len(chapterList) == 0 {
  97. err = errors.New("无有效章节")
  98. return
  99. }
  100. for _, item := range chapterList {
  101. if typeItem, ok := typeMap[uint64(item.TypeId)]; ok {
  102. // 如果是周报只展示有权限的章节
  103. if classifyNameFirst == "周报" {
  104. if _, ok1 := newTypeMap[item.TypeId]; !ok1 {
  105. continue
  106. }
  107. }
  108. temp := new(response.ReportChapterListItem)
  109. temp.ReportChapterId = item.ReportChapterId
  110. temp.TypeId = item.TypeId
  111. temp.TypeName = item.TypeName
  112. temp.Title = item.Title
  113. temp.ReportId = item.ReportId
  114. temp.Sort = typeItem.Sort
  115. temp.PublishTime = item.PublishTime
  116. temp.ReportChapterTypeKey = typeItem.ReportChapterTypeKey
  117. temp.ReportChapterTypeName = typeItem.ReportChapterTypeName
  118. temp.ReportChapterTypeThumb = typeItem.YbIconUrl
  119. reportTypeList = append(reportTypeList, temp)
  120. }
  121. }
  122. if len(reportTypeList) > 0 {
  123. sort.Sort(reportTypeList)
  124. }
  125. return
  126. }
  127. // GetChapterDetail 获取章节详情
  128. func GetChapterDetail(user user.UserInfo, reportChapterId int) (reportChapterDetail *response.ReportChapterDetail, err error) {
  129. var errMsg string
  130. defer func() {
  131. if err != nil {
  132. global.LOG.Critical(fmt.Sprintf("GetChapterDetail: userId=%d, err:%s, errMsg:%s", user.UserID, err.Error(), errMsg))
  133. }
  134. }()
  135. typeIds, err := report_chapter_type_cache.GetEffectTypeID()
  136. if err != nil {
  137. errMsg = err.Error()
  138. err = errors.New("章节类型查询出错")
  139. return
  140. }
  141. if len(typeIds) == 0 {
  142. err = errors.New("无有效的章节类型")
  143. return
  144. }
  145. reportChapter, err := report_chapter.GetContentById(reportChapterId, typeIds)
  146. if err != nil {
  147. errMsg = err.Error()
  148. err = errors.New("章节查询出错")
  149. return
  150. }
  151. if reportChapter.ReportChapterId == 0 {
  152. err = errors.New("章节不存在")
  153. return
  154. }
  155. var authOk bool
  156. var chapterAuthOk bool
  157. var permissionCheckInfo response.PermissionCheckInfo
  158. reportInfo, tErr := report.GetByReportId(reportChapter.ReportId)
  159. if tErr != nil {
  160. errMsg = err.Error()
  161. err = errors.New("报告查询出错")
  162. return
  163. }
  164. if reportInfo.Id == 0 {
  165. err = errors.New("报告不存在")
  166. return
  167. }
  168. if reportInfo.ClassifyNameFirst == "周报" && reportChapter.IsEdit != 1 {
  169. err = errors.New("章节未编辑")
  170. return
  171. }
  172. //判断权限 TODO 查询章节相关的报告的charPermissionId
  173. var newTypeIds []int
  174. if reportInfo.ClassifyNameFirst == "晨报"{
  175. authOk, permissionCheckInfo, err = CheckDayReportPermission(user)
  176. if err != nil && err != utils.ErrNoRow {
  177. errMsg = err.Error()
  178. err = errors.New("权限查询出错")
  179. return
  180. }
  181. }else if reportInfo.ClassifyNameFirst == "周报"{
  182. authOk, permissionCheckInfo, newTypeIds, err = CheckWeekReportPermission(user)
  183. if err != nil && err != utils.ErrNoRow {
  184. errMsg = err.Error()
  185. err = errors.New("权限查询出错")
  186. return
  187. }
  188. for _, v := range newTypeIds {
  189. if v == reportChapter.TypeId {
  190. chapterAuthOk = true
  191. }
  192. }
  193. authOk = chapterAuthOk
  194. }
  195. var chapterMenu []*response.ReportChapterMenu
  196. reportChapterItem := new(response.ReportChapterItem)
  197. reportChapterItem.ReportChapterId = reportChapter.ReportChapterId
  198. reportChapterItem.ReportId = reportChapter.ReportId
  199. reportChapterItem.TypeId = reportChapter.TypeId
  200. reportChapterItem.Title = reportChapter.Title
  201. reportChapterItem.ReportId = reportChapter.ReportId
  202. reportChapterItem.PublishTime = reportChapter.PublishTime
  203. reportChapterItem.VideoPlaySeconds = reportChapter.VideoPlaySeconds
  204. reportChapterItem.VideoName = reportChapter.VideoName
  205. reportChapterItem.VideoSize = reportChapter.VideoSize
  206. reportChapterItem.TypeName = reportChapter.TypeName
  207. reportChapterItem.Author = reportChapter.Author
  208. reportChapterItem.Stage = reportChapter.Stage
  209. reportChapterItem.ClassifyNameFirst = reportChapter.ClassifyNameFirst
  210. reportChapterItem.ClassifyIdFirst = reportChapter.ClassifyIdFirst
  211. if authOk {
  212. reportChapterItem.Content = html.UnescapeString(reportChapter.Content)
  213. reportChapterItem.VideoUrl = reportChapter.VideoUrl
  214. //底部菜单切换
  215. if reportInfo.ClassifyNameFirst == "周报" {
  216. chapterMenu, err = GetMenuChapter(reportInfo.Id, newTypeIds, reportInfo.ClassifyNameFirst)
  217. }else{
  218. chapterMenu, err = GetMenuChapter(reportInfo.Id, typeIds, reportInfo.ClassifyNameFirst)
  219. }
  220. task.Task(AddViewRecord, user, reportInfo.Id, reportInfo.ClassifyNameFirst, reportChapterId)
  221. }else{
  222. reportChapterItem.ContentSub = html.UnescapeString(reportChapter.ContentSub)
  223. }
  224. reportChapterDetail = new(response.ReportChapterDetail)
  225. reportChapterDetail.ReportChapterItem = reportChapterItem
  226. reportChapterDetail.PermissionCheck = &permissionCheckInfo
  227. reportChapterDetail.ReportChapterMenuList = chapterMenu
  228. reportChapterDetail.AuthOk = authOk
  229. return
  230. }
  231. func GetMenuChapter(reportId int, typeIds []int, classifyNameFirst string) (reportTypeList response.ReportChapterMenuList, err error) {
  232. //查询有效的章节
  233. typeList, tErr := report_chapter_type.GetEffectTypes()
  234. if tErr != nil {
  235. return
  236. }
  237. if len(typeList) == 0 {
  238. err = errors.New("无有效的章节")
  239. return
  240. }
  241. typeMap := make(map[uint64]*report_chapter_type.ReportChapterType)
  242. for _, v := range typeList {
  243. typeMap[v.ReportChapterTypeId] = v
  244. }
  245. //获取所有当前研报的章节
  246. chapterList, tErr := report_chapter.GetListByReportIdTypeIds(reportId, typeIds, classifyNameFirst)
  247. if tErr != nil && tErr != utils.ErrNoRow{
  248. return
  249. }
  250. if len(chapterList) > 0 {
  251. for _, item := range chapterList {
  252. if typeItem, ok := typeMap[uint64(item.TypeId)]; ok {
  253. temp := new(response.ReportChapterMenu)
  254. temp.ReportChapterId = item.ReportChapterId
  255. temp.ReportId = item.ReportId
  256. temp.ReportChapterTypeName = typeItem.ReportChapterTypeName
  257. temp.ReportChapterTypeThumb = typeItem.YbIconUrl
  258. temp.Sort = typeItem.Sort
  259. reportTypeList = append(reportTypeList, temp)
  260. }
  261. }
  262. }
  263. if len(reportTypeList) > 0{
  264. sort.Sort(reportTypeList)
  265. }
  266. return
  267. }
  268. // CheckWeekReportPermission 验证周报的权限
  269. func CheckWeekReportPermission(userInfo user.UserInfo) (authOk bool, permissionCheckInfo response.PermissionCheckInfo, validTypeIds []int, err error) {
  270. var permissionIds []int
  271. permissionIds, err = chart_permission_chapter_mapping.GetPermissionIdsByWeek()
  272. if err != nil && err != utils.ErrNoRow {
  273. return
  274. }
  275. var validPermissionIds []int //最后允许显示的章节
  276. authOk, permissionCheckInfo, validPermissionIds, err = company.GetCheckPermission(userInfo.CompanyID, int(userInfo.UserID), permissionIds)
  277. if err != nil {
  278. return
  279. }
  280. //返回可用的章节列表
  281. validTypeIds, err = chart_permission_chapter_mapping.GetReportIdsByPermisssionIds(validPermissionIds, "week")
  282. return
  283. }
  284. // CheckDayReportPermission 验证晨报的权限
  285. func CheckDayReportPermission(userInfo user.UserInfo) (authOk bool, permissionCheckInfo response.PermissionCheckInfo, err error) {
  286. permissions, err := company.GetValidPermissionByCompany2ProductId(userInfo.CompanyID, 1)
  287. if err != nil && err != utils.ErrNoRow {
  288. return
  289. }
  290. if len(permissions) > 0 {
  291. authOk = true
  292. return
  293. }
  294. authOk, permissionCheckInfo,_, err = company.GetCheckPermission(userInfo.CompanyID, int(userInfo.UserID), []int{})
  295. return
  296. }