123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427 |
- package report
- import (
- "errors"
- "fmt"
- report_chapter_type_cache "hongze/hongze_yb/cache/report_chapter_type"
- "hongze/hongze_yb/global"
- "hongze/hongze_yb/models/response"
- "hongze/hongze_yb/models/tables/chart_permission_chapter_mapping"
- "hongze/hongze_yb/models/tables/company_product"
- "hongze/hongze_yb/models/tables/rddp/report"
- "hongze/hongze_yb/models/tables/rddp/report_chapter"
- "hongze/hongze_yb/models/tables/report_chapter_type"
- "hongze/hongze_yb/services/company"
- "hongze/hongze_yb/services/user"
- "hongze/hongze_yb/task"
- "hongze/hongze_yb/utils"
- "html"
- "sort"
- "strings"
- "time"
- )
- // GetReportTypeIdsByPermissionIds 获取所有和权限绑定的报告章节ID
- func GetReportTypeIdsByPermissionIds(permissionIds []int) (ids []int, err error) {
- ids, err = chart_permission_chapter_mapping.GetReportIdsByPermisssionIds(permissionIds, "week")
- return
- }
- // GetLatestWeek 获取有权限的最新的周报
- func GetLatestWeek(permissionIds []int, typeIds []int) (reportInfo *report.Report, err error) {
- newTypeIds, err := GetWeekTypeIdsByPermissionIds(permissionIds, typeIds)
- chapters, err := report_chapter.GetLatestChaptersByTypeIdsAndClass(newTypeIds,"week")
- if err != nil {
- return
- }
- var reportIds []int
- for _, v := range chapters {
- reportIds = append(reportIds, v.ReportId)
- }
- reportInfo, err = report.GetLatestByReportIds(reportIds)
- return
- }
- // GetWeekTypeIdsByPermissionIds 获取有权限的章节类型ID
- func GetWeekTypeIdsByPermissionIds(permissionIds []int, typeIds []int) (newTypeIds []int, err error) {
- ids, err := GetReportTypeIdsByPermissionIds(permissionIds)
- if err != nil {
- return
- }
- if len(typeIds) == 0 {
- typeIds, err = report_chapter_type_cache.GetEffectTypeID()
- if err != nil {
- return
- }
- }
- for _, v1 := range typeIds {
- for _, v2 := range ids {
- if v1 == v2 {
- newTypeIds = append(newTypeIds, v2)
- }
- }
- }
- return
- }
- // GetChapterListByReport 根据报告获取章节列表
- func GetChapterListByReport(classifyNameFirst string, reportId int, validWeekTypeIds []int, reportCreateTime time.Time) (reportTypeList response.ReportChapterList, err error) {
- var errMsg string
- defer func() {
- if err != nil {
- global.LOG.Critical(fmt.Sprintf("GetChapterListByReport: err:%s, errMsg:%s", err.Error(), errMsg))
- }
- }()
- //查询有效的章节
- typeList, tErr := report_chapter_type.GetEffectTypes()
- if tErr != nil {
- errMsg = tErr.Error()
- err = errors.New("章节类型查询出错")
- return
- }
- if len(typeList) == 0 {
- err = errors.New("无有效的章节")
- return
- }
- typeMap := make(map[uint64]*report_chapter_type.ReportChapterType)
- var typeIds []int
- newTypeMap := make(map[int]bool)
- for _, v := range typeList {
- typeMap[v.ReportChapterTypeId] = v
- typeIds = append(typeIds, int(v.ReportChapterTypeId))
- }
- if classifyNameFirst == "周报" {
- for _, v := range validWeekTypeIds {
- newTypeMap[v] = true
- }
- }
- //获取所有当前研报的章节
- chapterList, tErr := report_chapter.GetListByReportId(reportId, classifyNameFirst)
- if tErr != nil && tErr != utils.ErrNoRow{
- errMsg = err.Error()
- err = errors.New("章节查询出错")
- return
- }
- if len(chapterList) == 0 {
- err = errors.New("无有效章节")
- return
- }
- for _, item := range chapterList {
- if typeItem, ok := typeMap[uint64(item.TypeId)]; ok {
- // 如果是周报只展示有权限的章节
- if classifyNameFirst == "周报" {
- if _, ok1 := newTypeMap[item.TypeId]; !ok1 {
- continue
- }
- }
- temp := new(response.ReportChapterListItem)
- if reportCreateTime.Before(typeItem.PauseStartTime) || reportCreateTime.After(typeItem.PauseEndTime) {
- temp.ReportChapterId = item.ReportChapterId
- temp.TypeId = item.TypeId
- temp.TypeName = item.TypeName
- temp.Title = item.Title
- temp.Trend = item.Trend
- temp.ReportId = item.ReportId
- temp.Sort = typeItem.Sort
- temp.PublishTime = item.PublishTime
- temp.ReportChapterTypeKey = typeItem.ReportChapterTypeKey
- temp.ReportChapterTypeName = typeItem.ReportChapterTypeName
- temp.ReportChapterTypeThumb = typeItem.YbIconUrl
- reportTypeList = append(reportTypeList, temp)
- }
- }
- }
- if len(reportTypeList) > 0 {
- sort.Sort(reportTypeList)
- }
- return
- }
- // GetChapterDetail 获取章节详情
- func GetChapterDetail(user user.UserInfo, reportChapterId int) (reportChapterDetail *response.ReportChapterDetail, err error) {
- var errMsg string
- defer func() {
- if err != nil {
- global.LOG.Critical(fmt.Sprintf("GetChapterDetail: userId=%d, err:%s, errMsg:%s", user.UserID, err.Error(), errMsg))
- }
- }()
- var authOk bool
- var productAuthOk bool
- var chapterAuthOk bool
- var permissionCheckInfo response.PermissionCheckInfo
- // 判断用户状态是否是正常和永续
- companyProduct, err := company_product.GetByCompany2ProductId(user.CompanyID, 1)
- if err == utils.ErrNoRow {
- err = nil
- }
- if err != nil {
- errMsg = err.Error()
- err = errors.New("查询用户购买产品出错")
- return
- }
- if companyProduct != nil {
- // 无FICC权限的客户不可见
- if companyProduct.CompanyProductID > 0 {
- // 已购或者试用用户可见
- if strings.Contains("永续,正式", companyProduct.Status) || (companyProduct.Status == "试用" && companyProduct.IsSuspend != 1) {
- productAuthOk = true
- }
- }
- }
- typeIds, err := report_chapter_type_cache.GetEffectTypeID()
- if err != nil {
- errMsg = err.Error()
- err = errors.New("章节类型查询出错")
- return
- }
- if len(typeIds) == 0 {
- err = errors.New("无有效的章节类型")
- return
- }
- reportChapter, err := report_chapter.GetContentById(reportChapterId, typeIds)
- if err != nil {
- errMsg = err.Error()
- err = errors.New("章节查询出错")
- return
- }
- if reportChapter.ReportChapterId == 0 {
- err = errors.New("章节不存在")
- return
- }
- reportInfo, tErr := report.GetByReportId(reportChapter.ReportId)
- if tErr != nil {
- errMsg = err.Error()
- err = errors.New("报告查询出错")
- return
- }
- if reportInfo.Id == 0 {
- err = errors.New("报告不存在")
- return
- }
- if reportInfo.ClassifyNameFirst == "周报" && reportChapter.IsEdit != 1 {
- err = errors.New("章节未编辑")
- return
- }
- //判断权限 TODO 查询章节相关的报告的charPermissionId
- var newTypeIds []int
- if reportInfo.ClassifyNameFirst == "晨报"{
- authOk, permissionCheckInfo, err = CheckDayReportPermission(user, productAuthOk)
- if err != nil && err != utils.ErrNoRow {
- errMsg = err.Error()
- err = errors.New("权限查询出错")
- return
- }
- }else if reportInfo.ClassifyNameFirst == "周报"{
- authOk, permissionCheckInfo, newTypeIds, err = CheckWeekReportPermission(user, productAuthOk)
- if err != nil && err != utils.ErrNoRow {
- errMsg = err.Error()
- err = errors.New("权限查询出错")
- return
- }
- for _, v := range newTypeIds {
- if v == reportChapter.TypeId {
- chapterAuthOk = true
- }
- }
- authOk = chapterAuthOk
- }
- var chapterMenu []*response.ReportChapterMenu
- reportChapterItem := new(response.ReportChapterItem)
- reportChapterItem.ReportChapterId = reportChapter.ReportChapterId
- reportChapterItem.ReportId = reportChapter.ReportId
- reportChapterItem.Abstract = reportChapter.Abstract
- reportChapterItem.TypeId = reportChapter.TypeId
- reportChapterItem.Title = reportChapter.Title
- reportChapterItem.ReportId = reportChapter.ReportId
- reportChapterItem.PublishTime = reportChapter.PublishTime
- reportChapterItem.VideoPlaySeconds = reportChapter.VideoPlaySeconds
- reportChapterItem.VideoName = reportChapter.VideoName
- if reportChapter.VideoUrl != "" && reportChapter.VideoName == "" {
- reportChapterItem.VideoName = reportChapter.Title
- }
- reportChapterItem.VideoSize = reportChapter.VideoSize
- reportChapterItem.TypeName = reportChapter.TypeName
- reportChapterItem.Author = reportChapter.Author
- reportChapterItem.Stage = reportChapter.Stage
- reportChapterItem.ClassifyNameFirst = reportChapter.ClassifyNameFirst
- reportChapterItem.ClassifyIdFirst = reportChapter.ClassifyIdFirst
- if authOk {
- reportChapterItem.Content = html.UnescapeString(reportChapter.Content)
- reportChapterItem.VideoUrl = reportChapter.VideoUrl
- //底部菜单切换
- if reportInfo.ClassifyNameFirst == "周报" {
- chapterMenu, err = GetMenuChapter(reportInfo.Id, newTypeIds, reportInfo.ClassifyNameFirst, reportInfo.CreateTime)
- }else{
- chapterMenu, err = GetMenuChapter(reportInfo.Id, typeIds, reportInfo.ClassifyNameFirst, reportInfo.CreateTime)
- }
- task.Task(AddViewRecord, user, reportInfo.Id, reportInfo.ClassifyNameFirst, reportChapterId)
- }else{
- reportChapterItem.ContentSub = html.UnescapeString(reportChapter.ContentSub)
- }
- task.Task(AddUserAccessRecord, user, reportInfo.Id, reportInfo.ClassifyNameFirst, reportChapterId, authOk)
- reportChapterDetail = new(response.ReportChapterDetail)
- reportChapterDetail.ReportChapterItem = reportChapterItem
- reportChapterDetail.PermissionCheck = &permissionCheckInfo
- reportChapterDetail.ReportChapterMenuList = chapterMenu
- reportChapterDetail.AuthOk = authOk
- return
- }
- func GetMenuChapter(reportId int, typeIds []int, classifyNameFirst string, reportCreateTime time.Time) (reportTypeList response.ReportChapterMenuList, err error) {
- //查询有效的章节
- typeList, tErr := report_chapter_type.GetEffectTypes()
- if tErr != nil {
- return
- }
- if len(typeList) == 0 {
- err = errors.New("无有效的章节")
- return
- }
- typeMap := make(map[uint64]*report_chapter_type.ReportChapterType)
- for _, v := range typeList {
- typeMap[v.ReportChapterTypeId] = v
- }
- //获取所有当前研报的章节
- chapterList, tErr := report_chapter.GetListByReportIdTypeIds(reportId, typeIds, classifyNameFirst)
- if tErr != nil && tErr != utils.ErrNoRow{
- return
- }
- if len(chapterList) > 0 {
- for _, item := range chapterList {
- if typeItem, ok := typeMap[uint64(item.TypeId)]; ok {
- if reportCreateTime.Before(typeItem.PauseStartTime) || reportCreateTime.After(typeItem.PauseEndTime) {
- temp := new(response.ReportChapterMenu)
- temp.ReportChapterId = item.ReportChapterId
- temp.ReportId = item.ReportId
- temp.ReportChapterTypeName = typeItem.ReportChapterTypeName
- temp.ReportChapterTypeThumb = typeItem.YbBottomIcon
- temp.Sort = typeItem.Sort
- reportTypeList = append(reportTypeList, temp)
- }
- }
- }
- }
- if len(reportTypeList) > 0{
- sort.Sort(reportTypeList)
- }
- return
- }
- // CheckWeekReportPermission 验证周报的权限
- func CheckWeekReportPermission(userInfo user.UserInfo, productAuthOk bool) (authOk bool, permissionCheckInfo response.PermissionCheckInfo, validTypeIds []int, err error) {
- var permissionIds []int
- var validPermissionIds []int //最后允许显示的章节
- if productAuthOk {
- permissionIds, err = chart_permission_chapter_mapping.GetPermissionIdsByWeek()
- if err != nil && err != utils.ErrNoRow {
- return
- }
- }
- authOk, permissionCheckInfo, validPermissionIds, err = company.GetCheckPermission(userInfo.CompanyID, int(userInfo.UserID), permissionIds)
- if err != nil {
- return
- }
- //返回可用的章节列表
- if len(validPermissionIds) > 0 {
- validTypeIds, err = chart_permission_chapter_mapping.GetReportIdsByPermisssionIds(validPermissionIds, "week")
- }
- return
- }
- // CheckDayReportPermission 验证晨报的权限
- func CheckDayReportPermission(userInfo user.UserInfo, productAuthOk bool) (authOk bool, permissionCheckInfo response.PermissionCheckInfo, err error) {
- if productAuthOk {
- authOk = true
- return
- }
- authOk, permissionCheckInfo,_, err = company.GetCheckPermission(userInfo.CompanyID, int(userInfo.UserID), []int{})
- return
- }
- // GetReportChapterVideoList 根据报告获取章节的音频列表
- func GetReportChapterVideoList(permissionIds []int, classifyName string, list []*report.Report) (videoMap map[int][]*response.VideoListItem, weekAuthMap map[int]bool, errMsg string, err error) {
- videoMap = make(map[int][]*response.VideoListItem)
- weekAuthMap = make(map[int]bool)
- var reportIds []int
- reportMap := make(map[int]*report.Report)
- for _, reportInfo := range list {
- reportMap[reportInfo.Id] = reportInfo
- reportIds = append(reportIds, reportInfo.Id)
- }
- // 查询有效的章节
- //查询有效的章节
- typeList, tErr := report_chapter_type.GetEffectTypes()
- if tErr != nil {
- errMsg = tErr.Error()
- err = errors.New("章节类型查询出错")
- return
- }
- if len(typeList) == 0 {
- err = errors.New("无有效的章节")
- return
- }
- typeMap := make(map[int]*report_chapter_type.ReportChapterType)
- var typeIds []int
- for _, v := range typeList {
- typeMap[int(v.ReportChapterTypeId)] = v
- typeIds = append(typeIds, int(v.ReportChapterTypeId))
- }
- var chapters []*report_chapter.ReportChapter
- if classifyName == "周报" {
- // 查询用户有权限的章节ID
- newTypeIds, tErr := GetWeekTypeIdsByPermissionIds(permissionIds, typeIds)
- if tErr != nil {
- errMsg = tErr.Error()
- err = errors.New("查询章节类型权限出错")
- return
- }
- // 查询章节列表
- chapters, err = report_chapter.GetByTypeIdsAndReportIds(newTypeIds, reportIds, classifyName)
- }else{
- // 查询章节列表
- chapters, err = report_chapter.GetByTypeIdsAndReportIds(typeIds, reportIds, classifyName)
- }
- if err != nil {
- errMsg = err.Error()
- err = errors.New("查询章节出错")
- return
- }
- for _, v := range chapters {
- if classifyName == "周报" {
- weekAuthMap[v.ReportId] = true
- }
- if temp, ok := typeMap[v.TypeId]; ok && v.VideoUrl != "" {
- if reportDetail, ok1 := reportMap[v.ReportId]; ok1 {
- reportDate := reportDetail.CreateTime
- if reportDate.Before(temp.PauseStartTime) || reportDate.After(temp.PauseEndTime) {
- videoItem := new(response.VideoListItem)
- videoItem.VideoPlaySeconds = v.VideoPlaySeconds
- videoItem.VideoName = v.VideoName
- if v.VideoName == "" {
- videoItem.VideoName = v.Title
- }
- videoItem.VideoUrl = v.VideoUrl
- videoItem.Sort = v.Sort
- videoMap[v.ReportId] = append(videoMap[v.ReportId], videoItem)
- }
- }
- }
- }
- return
- }
|