package report import ( "encoding/json" "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/response/purchase" "hongze/hongze_yb/models/tables/chart_permission" "hongze/hongze_yb/models/tables/chart_permission_chapter_mapping" "hongze/hongze_yb/models/tables/chart_permission_search_key_word_mapping" "hongze/hongze_yb/models/tables/company_product" "hongze/hongze_yb/models/tables/daily_base_column" "hongze/hongze_yb/models/tables/rddp/classify" "hongze/hongze_yb/models/tables/rddp/report" "hongze/hongze_yb/models/tables/rddp/report_chapter" "hongze/hongze_yb/models/tables/rddp/report_chapter_ticker" "hongze/hongze_yb/models/tables/rddp/report_ppt_img" "hongze/hongze_yb/models/tables/report_chapter_type" "hongze/hongze_yb/models/tables/report_chapter_type_permission" "hongze/hongze_yb/services" "hongze/hongze_yb/services/company" elasticService "hongze/hongze_yb/services/elastic" "hongze/hongze_yb/services/user" "hongze/hongze_yb/utils" "html" "sort" "strconv" "strings" "time" ) // GetLatestClassReport 已购列表最新报告 func GetLatestClassReport(permissionIds []int, userId uint64) (purchaseList []*purchase.PurchaseListItem, err error) { var errMsg string defer func() { if sysErr := recover(); sysErr != nil { err = errors.New("系统错误") global.LOG.Critical(fmt.Sprintf("GetLatestClassReport: userId=%d, err:%s,sysErr:%s", userId, err.Error(), sysErr)) } if err != nil { global.LOG.Critical(fmt.Sprintf("GetLatestClassReport: userId=%d, err:%s, errMsg:%s", userId, err.Error(), errMsg)) } }() //获取所有分类信息 classifys, err := classify.GetSimpleAll() if err != nil { errMsg = err.Error() err = errors.New("分类查询出错") return } classifyFirstIconMap := make(map[int]string) classifySecondNameMap := make(map[string]int) classifyFirstIdMap := make(map[int]bool) classifySecondIdMap := make(map[int]bool) for _, v := range classifys { if v.ParentId == 0 { classifyFirstIdMap[v.Id] = true classifyFirstIconMap[v.Id] = v.YbIconUrl } else { classifySecondIdMap[v.Id] = true classifySecondNameMap[v.ClassifyName] = v.Id } } //获取最新的晨报 dayReport, err := report.GetLatestDay() if err != nil { errMsg = err.Error() err = errors.New("晨报查询出错") return } //获取最新的有权限的周报 //typeIds, err := report_chapter_type.GetEffectTypeID() typeIds, err := report_chapter_type_cache.GetEffectTypeID() if err != nil { errMsg = err.Error() err = errors.New("晨报查询出错") return } weekReport, err := GetLatestWeek(permissionIds, typeIds) if err != nil { errMsg = err.Error() err = errors.New("周报查询出错") return } // 有权限的二级分类 var reports []*report.Report var classifyIdSeconds []int classifyIdSecondMap := make(map[int]bool) // 获取晨报和周报以外的其他报告 // 获取有权限的二级分类 chartPermissions, err := chart_permission_search_key_word_mapping.GetChartPermissionByFrom("rddp") if err != nil { errMsg = err.Error() err = errors.New("分类权限查询出错") return } if len(chartPermissions) > 0 { for _, v := range chartPermissions { for _, myPerId := range permissionIds { if v.ChartPermissionId == myPerId { if classifyIdSecond, ok := classifySecondNameMap[v.KeyWord]; ok { if _, ok2 := classifyIdSecondMap[classifyIdSecond]; !ok2 { classifyIdSeconds = append(classifyIdSeconds, classifyIdSecond) classifyIdSecondMap[classifyIdSecond] = true } } break } } } } reports, err = report.GetLatestClassReportsByClassifyIdSeconds(classifyIdSeconds) if err != nil { errMsg = err.Error() err = errors.New("二级分类最新报告查询出错") return } if dayReport.Id > 0 { reports = append(reports, dayReport) } if weekReport != nil && weekReport.Id > 0 { reports = append(reports, weekReport) } //获取未读数 unReadItem, tErr := GetUnRead(classifyIdSeconds, userId) if tErr != nil { err = tErr return } if len(reports) > 0 { otherLatestItem := new(purchase.PurchaseListItem) // 处理其他报告() for _, v := range reports { temp := new(purchase.PurchaseListItem) temp.ReportId = v.Id temp.ClassifyIdFirst = v.ClassifyIdFirst temp.ClassifyNameFirst = v.ClassifyNameFirst temp.Stage = v.Stage temp.Title = v.Title temp.ClassifyIdSecond = v.ClassifyIdSecond temp.ClassifyNameSecond = v.ClassifyNameSecond temp.Time = v.PublishTime if temp.ClassifyNameFirst == "大事点评" || temp.ClassifyNameFirst == "会议纪要" || temp.ClassifyNameFirst == "年报合集" { if otherLatestItem.Time.Format(utils.FormatDateTime) > v.PublishTime.Format(utils.FormatDateTime) { continue } temp.Unread = unReadItem["大事点评"] + unReadItem["会议纪要"] + unReadItem["年报合集"] temp.Content = fmt.Sprintf("【第%d期|FICC】%s", temp.Stage, temp.ClassifyNameFirst) temp.ImgUrl = "https://hzstatic.hzinsights.com/static/yb_wx/purchase_icon_other.png" otherLatestItem = temp } } for _, v := range reports { if v.ClassifyNameFirst != "晨报" && v.ClassifyNameFirst != "周报" { // 报告的分类不存在 if !classifyFirstIdMap[v.ClassifyIdFirst] || !classifyIdSecondMap[v.ClassifyIdSecond] { continue } } temp := new(purchase.PurchaseListItem) temp.ReportId = v.Id temp.ClassifyIdFirst = v.ClassifyIdFirst temp.ClassifyNameFirst = v.ClassifyNameFirst temp.Stage = v.Stage temp.Title = v.Title temp.ClassifyIdSecond = v.ClassifyIdSecond temp.ClassifyNameSecond = v.ClassifyNameSecond temp.Time = v.PublishTime temp.Unread = unReadItem[temp.ClassifyNameFirst] if imgUrl, ok := classifyFirstIconMap[temp.ClassifyIdFirst]; ok { temp.ImgUrl = imgUrl } if temp.ClassifyNameFirst == "晨报" || temp.ClassifyNameFirst == "周报" { //晨报或者周报,查询最新的章节信息 temp.Content = fmt.Sprintf("【第%d期|FICC】%s", temp.Stage, temp.Title) } else if temp.ClassifyNameFirst == "大事点评" || temp.ClassifyNameFirst == "会议纪要" || temp.ClassifyNameFirst == "年报合集" { continue } else { if temp.ClassifyNameFirst != temp.ClassifyNameSecond { //包含二级分类 temp.Content = fmt.Sprintf("【第%d期|FICC| %s】%s", temp.Stage, temp.ClassifyNameSecond, temp.ClassifyNameFirst) } else { //无二级分类 temp.Content = fmt.Sprintf("【第%d期|FICC】%s", temp.Stage, temp.ClassifyNameFirst) } } purchaseList = append(purchaseList, temp) } if otherLatestItem.ReportId > 0 { purchaseList = append(purchaseList, otherLatestItem) } } return } // GetPurchaseDetail 已购详情页面 func GetPurchaseDetail(permissionIds []int, userId uint64, classifyIdFirst int, pageIndex, pageSize int) (ret *purchase.DetailResp, err error) { var errMsg string defer func() { if err != nil { global.LOG.Critical(fmt.Sprintf("GetPurchaseDetail: userId=%d, err:%s, errMsg:%s", userId, err.Error(), errMsg)) } }() var reports []*report.Report var weekReportIds []int classifyInfo, err := classify.GetByClassifyId(classifyIdFirst) if err != nil { errMsg = err.Error() err = errors.New("分类查询出错") return } if classifyInfo.Id == 0 { err = errors.New("分类不存在") return } classifyNameFirst := classifyInfo.ClassifyName offset := (pageIndex - 1) * pageSize var total int64 var classifyIdSeconds []int if classifyNameFirst == "晨报" { //分类获取 reports, err = report.GetListByClassifyIdFirst(classifyIdFirst, offset, pageSize) if err != nil { errMsg = err.Error() err = errors.New("晨报查询出错") return } total, err = report.GetListCountByClassifyIdFirst(classifyIdFirst) if err != nil { errMsg = err.Error() err = errors.New("查询报告总数出错") return } } else { if classifyNameFirst == "周报" { newTypeIds, tErr := GetWeekTypeIdsByPermissionIds(permissionIds, []int{}) if tErr != nil { return } weekReportIds, err = report_chapter.GetReportIdsByTypeIdsAndClass(newTypeIds, classifyNameFirst) //分类获取 reports, err = report.GetListByIDsAndClassifyIdFirst(weekReportIds, classifyIdFirst, offset, pageSize) if err != nil { return } total, err = report.GetListCountByIDsAndClassifyIdFirst(weekReportIds, classifyIdFirst) if err != nil { errMsg = err.Error() err = errors.New("查询报告总数出错") return } } else { //获取有权限的二级分类 var classifyNameSeconds []string chartPermissions, tErr := chart_permission_search_key_word_mapping.GetChartPermissionByFrom("rddp") if tErr != nil { errMsg = tErr.Error() err = errors.New("分类权限查询出错") return } if len(chartPermissions) > 0 { for _, v := range chartPermissions { for _, myPerId := range permissionIds { if v.ChartPermissionId == myPerId { if classifyNameFirst == "大事点评" || classifyNameFirst == "会议纪要" || classifyNameFirst == "年报合集" { if v.KeyWord == "大事点评" || v.KeyWord == "会议纪要" || v.KeyWord == "年报合集" { //筛选出用户有权限的二级分类ID classifyNameSeconds = append(classifyNameSeconds, v.KeyWord) } } else { classifyNameSeconds = append(classifyNameSeconds, v.KeyWord) } break } } } } //获取所有二级分类的id if classifyNameFirst == "大事点评" || classifyNameFirst == "会议纪要" || classifyNameFirst == "年报合集" { classifyIdSeconds, tErr = classify.GetOtherSecondIds([]string{"大事点评", "会议纪要", "年报合集"}) } else { classifyIdSeconds, tErr = classify.GetIdsByClassifyNameAndParentId(classifyNameSeconds, classifyIdFirst) } if tErr != nil { errMsg = tErr.Error() err = errors.New("二级分类查询出错") return } if len(classifyIdSeconds) > 0 { //分类获取 reports, err = report.GetListByClassifyIdSeconds(classifyIdSeconds, offset, pageSize) if err != nil { return } total, err = report.GetListCountByClassifyIdSeconds(classifyIdSeconds) if err != nil { errMsg = err.Error() err = errors.New("查询报告总数出错") return } } } } var list []*purchase.Detail ret = new(purchase.DetailResp) if len(reports) > 0 { var viewReportIds []int for _, v := range reports { viewReportIds = append(viewReportIds, v.Id) temp := new(purchase.Detail) temp.ReportId = v.Id temp.ClassifyIdFirst = v.ClassifyIdFirst temp.ClassifyNameFirst = v.ClassifyNameFirst temp.Title = v.Title temp.ClassifyIdSecond = v.ClassifyIdSecond temp.ClassifyNameSecond = v.ClassifyNameSecond temp.Stage = v.Stage temp.ImgUrl = classifyInfo.YbBgUrl if temp.ClassifyNameFirst == "晨报" || temp.ClassifyNameFirst == "周报" { //晨报或者周报,查询最新的章节信息 temp.Content = fmt.Sprintf("【第%d期|FICC】%s", temp.Stage, temp.Title) temp.TopName = temp.Title } else { if temp.ClassifyNameFirst != temp.ClassifyNameSecond { //包含二级分类 temp.Content = fmt.Sprintf("【第%d期|FICC| %s】%s", temp.Stage, temp.ClassifyNameSecond, temp.ClassifyNameFirst) temp.TopName = temp.ClassifyNameSecond } else { temp.Content = fmt.Sprintf("【第%d期|FICC】%s", temp.Stage, temp.ClassifyNameFirst) temp.TopName = temp.ClassifyNameFirst } } temp.Time = v.PublishTime list = append(list, temp) } } ret.List = list ret.Paging = response.GetPaging(pageIndex, pageSize, int(total)) // 执行一个协程任务,新增用户浏览记录 //_, tErr := BatchInsertReportView(weekReportIds, userId, classifyNameFirst, classifyIdSeconds) go BatchInsertReportView(userId, weekReportIds, classifyNameFirst, classifyIdSeconds) /*if tErr != nil { err = tErr return }*/ return } // 获取报告详情 func GetReportDetail(userinfo user.UserInfo, reportId int) (reportDetail response.ReportDetail, err error) { var errMsg string defer func() { if err != nil { global.LOG.Critical(fmt.Sprintf("GetReportDetail: userId=%d, err:%s, errMsg:%s", userinfo.UserID, err.Error(), errMsg)) } }() // 判断用户状态是否是正常和永续 var productAuthOk bool companyProduct, err := company_product.GetByCompany2ProductId(userinfo.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 } } } reportInfo, err := report.GetByReportId(reportId) if err != nil { errMsg = err.Error() err = errors.New("报告查询出错") return } if reportInfo.Id == 0 { err = errors.New("报告不存在") return } if reportInfo.State != 2 { err = errors.New("报告未发布") return } // 判断报告是否属于专栏报告 firstClassify, e := classify.GetByClassifyId(reportInfo.ClassifyIdFirst) if e != nil { err = errors.New("报告一级分类有误") return } //判断权限 var authOk bool var permissionCheckInfo response.PermissionCheckInfo var vaildWeekTypeIds []int if reportInfo.ClassifyNameFirst == "晨报" { authOk, permissionCheckInfo, err = CheckDayReportPermission(userinfo, productAuthOk) } else if reportInfo.ClassifyNameFirst == "周报" { authOk, permissionCheckInfo, vaildWeekTypeIds, err = CheckWeekReportPermission(userinfo, productAuthOk) } else { authOk, permissionCheckInfo, err = CheckReportPermission(userinfo, reportId, productAuthOk) } if err != nil { return } reportItem := new(response.ReportItem) reportItem.ReportId = reportInfo.Id reportItem.Title = reportInfo.Title reportItem.PublishTime = reportInfo.PublishTime reportItem.ClassifyNameFirst = reportInfo.ClassifyNameFirst reportItem.ClassifyNameSecond = reportInfo.ClassifyNameSecond reportItem.Stage = reportInfo.Stage reportItem.Abstract = reportInfo.Abstract reportItem.ContentSub = html.UnescapeString(reportInfo.ContentSub) reportItem.Frequency = reportInfo.Frequency reportItem.VideoName = reportInfo.VideoName if reportInfo.VideoName == "" && reportInfo.VideoUrl != "" { reportItem.VideoName = reportInfo.Title } reportItem.VideoSize = reportInfo.VideoSize reportItem.VideoPlaySeconds = reportInfo.VideoPlaySeconds reportItem.Author = reportInfo.Author // 分享背景图取二级分类配图, 二级没有配图时使用一级配图, 一级也没有使用默认图 reportItem.ShareBgImg = utils.DEFAULT_REPORT_SHARE_BG_IMG secondClassify, e := classify.GetByClassifyId(reportInfo.ClassifyIdSecond) if e != nil { err = errors.New("报告二级分类有误") return } if secondClassify.YbShareBgImg != "" { reportItem.ShareBgImg = secondClassify.YbShareBgImg } else { if firstClassify.YbShareBgImg != "" { reportItem.ShareBgImg = firstClassify.YbShareBgImg } } var reportTypeList []*response.ReportChapterListItem if reportInfo.ClassifyNameFirst == "晨报" || reportInfo.ClassifyNameFirst == "周报" { //(晨报和周报的banner图) if reportInfo.ClassifyNameFirst == "晨报" { reportItem.BannerUrl = utils.ALIYUN_YBIMG_HOST + "report_banner_day.jpg" } else { reportItem.BannerUrl = utils.ALIYUN_YBIMG_HOST + "report_banner_week.jpg" } if authOk { reportTypeList, err = GetChapterListByReport(reportInfo.ClassifyNameFirst, reportInfo.Id, vaildWeekTypeIds, reportInfo.CreateTime) if err != nil { return } } } else { // 音频播放条图片用分类图片 reportItem.VideoImg = utils.HZ_DEFAULT_AVATAR permissionIds, tmpErr := chart_permission_search_key_word_mapping.GetChartPermissionIdsByKeyWord(reportItem.ClassifyNameSecond) if tmpErr != nil { errMsg = tmpErr.Error() err = errors.New("查询报告权限失败") return } if len(permissionIds) > 0 { chartPermission, tmpErr := chart_permission.GetListByIds(permissionIds) if tmpErr != nil { errMsg = tmpErr.Error() err = errors.New("查询品种信息失败") return } lenChart := len(chartPermission) for i := 0; i < lenChart; i++ { if chartPermission[i].YbImgUrl != "" { reportItem.VideoImg = utils.ALIYUN_YBIMG_HOST + chartPermission[i].YbImgUrl break } } } } //如果有权限则展示content var likeNum int64 var likeEnabled int8 if authOk { go AddViewRecord(userinfo, reportInfo.Id, reportInfo.ClassifyNameFirst, 0) reportItem.Content = html.UnescapeString(reportInfo.Content) reportItem.VideoUrl = reportInfo.VideoUrl //查询点赞数 likeNum, likeEnabled, _ = services.GetReportLikeByReportIdOldReportId(userinfo.UserID, reportInfo.Id, 0, 0, 0) } //新增用户访问日志 go AddUserAccessRecord(userinfo, reportInfo.Id, reportInfo.ClassifyNameFirst, 0, authOk) reportDetail.ReportInfo = reportItem reportDetail.ReportChapterList = reportTypeList reportDetail.PermissionCheck = &permissionCheckInfo reportDetail.AuthOk = authOk reportDetail.LikeNum = likeNum reportDetail.LikeEnabled = likeEnabled reportDetail.ReportShowType = int(firstClassify.ShowType) return } // CheckReportPermission 验证用户查看报告的权限 func CheckReportPermission(userInfo user.UserInfo, reportId int, productAuthOk bool) (authOk bool, permissionCheckInfo response.PermissionCheckInfo, err error) { var permissionIds []int if productAuthOk { permissionIds, err = chart_permission_chapter_mapping.GetPermissionIdsByReportId(reportId, "rddp") if err != nil && err != utils.ErrNoRow { return } } authOk, permissionCheckInfo, _, err = company.GetCheckPermission(userInfo.CompanyID, int(userInfo.UserID), permissionIds) return } // GetReportList 获取报告列表 func GetReportList(user user.UserInfo, keyWord string, classifyIdFirst, classifyIdSecond, pageIndex, pageSize int) (ret *response.ReportList, err error) { var errMsg string defer func() { if err != nil { global.LOG.Critical(fmt.Sprintf("GetReportList: userId=%d, err:%s, errMsg:%s", user.UserID, err.Error(), errMsg)) } }() // 判断用户状态是否是正常和永续 var productAuthOk bool 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 } } } var condition string pars := make([]interface{}, 0) classifyParent, err := classify.GetByClassifyId(classifyIdFirst) if err != nil { errMsg = err.Error() err = errors.New("分类查询出错") return } if classifyParent.Id == 0 { err = errors.New("该分类不存在") return } condition = `classify_id_first = ? and state = 2` pars = append(pars, classifyIdFirst) permissionMap := make(map[string][]int) checkPermissionMap := make(map[string]bool) permissionImageMap := make(map[string]string) chartPermissionImageMap := make(map[int]string) var classifyIdSeconds []int //var reportImgUrl string chartPermissionList, err := chart_permission.GetFiccListExceptTacticByProductId() if err != nil { errMsg = err.Error() err = errors.New("分类查询出错") return } if len(chartPermissionList) > 0 { for _, v := range chartPermissionList { chartPermissionImageMap[int(v.ChartPermissionID)] = v.YbImgUrl } } if classifyIdSecond > 0 && keyWord == "" { classifyInfo, tErr := classify.GetByClassifyId(classifyIdSecond) if tErr != nil { errMsg = tErr.Error() err = errors.New("分类查询出错") return } if classifyInfo.Id == 0 { err = errors.New("该二级分类不存在") return } condition += " AND classify_id_second = ?" pars = append(pars, classifyIdSecond) //查询二级分类对应的权限 permissionIds, tErr := chart_permission_search_key_word_mapping.GetChartPermissionIdsByKeyWord(classifyInfo.ClassifyName) if tErr != nil { errMsg = tErr.Error() err = errors.New("分类权限查询出错") return } permissionMap[classifyInfo.ClassifyName] = permissionIds //if len(permissionIds) > 0 { // for _, v := range permissionIds { // reportImgUrl = chartPermissionImageMap[v] // } //} } else { if classifyParent.ClassifyName == "晨报" || classifyParent.ClassifyName == "周报" { //reportImgUrl = chartPermissionImageMap[1] classifyIdSeconds = append(classifyIdSeconds, 0) } chartPermissions, tErr := chart_permission_search_key_word_mapping.GetChartPermissionByFrom("rddp") if tErr != nil { errMsg = tErr.Error() err = errors.New("分类权限查询出错") return } if len(chartPermissions) > 0 { for _, v := range chartPermissions { permissionMap[v.KeyWord] = append(permissionMap[v.KeyWord], v.ChartPermissionId) permissionImageMap[v.KeyWord] = chartPermissionImageMap[v.ChartPermissionId] } } //获取二级分类的所有头像 classifyList, tErr := classify.GetListByPid(classifyIdFirst) if tErr != nil { errMsg = tErr.Error() err = errors.New("二级分类查询出错") return } for _, v := range classifyList { classifyIdSeconds = append(classifyIdSeconds, v.Id) } if len(classifyIdSeconds) == 0 && classifyParent.ClassifyName != "晨报" && classifyParent.ClassifyName != "周报" { ret = new(response.ReportList) ret.Paging = response.GetPaging(pageIndex, pageSize, 0) return } condition += ` AND classify_id_second IN ? ` pars = append(pars, classifyIdSeconds) } // 获取有效的权限id列表 var validPermissionIdList []int if productAuthOk { validPermissionIdList, err = company.GetValidPermissionIdListByCompany2ProductId(user.CompanyID, 1) if err != nil && err != utils.ErrNoRow { errMsg = err.Error() err = errors.New("查询分类出错") return } } if len(validPermissionIdList) > 0 { for classifyName, perIds := range permissionMap { checkLoop: for _, checkId := range perIds { for _, validPerid := range validPermissionIdList { if checkId == validPerid { checkPermissionMap[classifyName] = true break checkLoop } } } } } var total int64 var list []*report.Report if keyWord == "" { offset := (pageIndex - 1) * pageSize list, err = report.GetReportList(condition, pars, offset, pageSize) if err != nil { errMsg = err.Error() err = errors.New("报告查询出错") return } total, err = report.GetReportListCount(condition, pars) if err != nil { errMsg = err.Error() err = errors.New("查询报告总数出错") return } } else { if classifyIdSecond > 0 { classifyIdSeconds = append(classifyIdSeconds, classifyIdSecond) } if classifyParent.ClassifyName == "晨报" || classifyParent.ClassifyName == "周报" { classifyIdSeconds = append(classifyIdSeconds, 0) } searchResp, total1, tErr := elasticService.ReportListSearch(keyWord, classifyIdFirst, classifyIdSeconds, pageIndex, pageSize) if tErr != nil { errMsg = tErr.Error() err = errors.New("查询失败") return } total = int64(total1) if searchResp.Hits != nil && total > 0 { var reportIds []int for _, v := range searchResp.Hits.Hits { temp := new(report.Report) itemJson, tmpErr := v.Source.MarshalJSON() if tmpErr != nil { errMsg = tmpErr.Error() err = errors.New("解析出错") return } reportItem := new(response.EsReportItem) tmpErr = json.Unmarshal(itemJson, &reportItem) if tmpErr != nil { errMsg = tmpErr.Error() err = errors.New("解析json出错") return } temp.Id = reportItem.ReportId reportIds = append(reportIds, reportItem.ReportId) temp.ClassifyIdFirst = reportItem.ClassifyIdFirst temp.ClassifyNameFirst = reportItem.ClassifyNameFirst temp.ClassifyIdSecond = reportItem.ClassifyIdSecond temp.ClassifyNameSecond = reportItem.ClassifyNameSecond if len(v.Highlight["ClassifyNameSecond"]) > 0 { temp.ClassifyNameSecond = v.Highlight["ClassifyNameSecond"][0] } temp.Abstract = reportItem.Abstract stageInt, _ := strconv.Atoi(reportItem.StageStr) temp.Stage = stageInt temp.StageStr = reportItem.StageStr temp.Title = reportItem.Title temp.PublishTime, err = time.ParseInLocation(utils.FormatDateTime, reportItem.PublishTime, time.Local) if len(v.Highlight["Title"]) > 0 { temp.Title = v.Highlight["Title"][0] } if len(v.Highlight["Abstract"]) > 0 { temp.Abstract = v.Highlight["Abstract"][0] } if len(v.Highlight["StageStr"]) > 0 { temp.StageStr = v.Highlight["StageStr"][0] } list = append(list, temp) } reportInfoList, tmpErr := report.GetByReportIds(reportIds) if tmpErr != nil { errMsg = tmpErr.Error() err = errors.New("查询报告出错") return } reportListMap := make(map[int]*report.Report) for _, temp := range reportInfoList { reportListMap[temp.Id] = temp } for k, reportDetail := range list { if v, ok := reportListMap[reportDetail.Id]; ok { list[k].CreateTime = v.CreateTime } } } } var reportList []*response.ReportListItem if len(list) > 0 { // 封面图 classifyList, e := classify.GetClassifyList() if e != nil { err = errors.New("获取报告分类列表失败" + e.Error()) return } listImgMap := make(map[int]string, 0) classifyLen := len(classifyList) for i := 0; i < classifyLen; i++ { listImgMap[classifyList[i].Id] = classifyList[i].YbListImg } var videoReportIds []int videoMap := make(map[int][]*response.VideoListItem) weekAuthMap := make(map[int]bool) if classifyParent.ClassifyName == "晨报" && productAuthOk { //获取晨报的音频列表 videoMap, _, errMsg, err = GetReportChapterVideoList(validPermissionIdList, classifyParent.ClassifyName, list) if err != nil { return } } else if classifyParent.ClassifyName == "周报" { //查询所有权限typeID //如果存在可以查看的章节ID for _, reportInfo := range list { videoReportIds = append(videoReportIds, reportInfo.Id) } // 判断周报权限\查询周报的音频列表 videoMap, weekAuthMap, errMsg, err = GetReportChapterVideoList(validPermissionIdList, classifyParent.ClassifyName, list) if err != nil { return } } // 以下分类图标特殊处理 =_=! //reportImgMap := map[string]string{ // "晨报": "report_list_chen.png", // "周报": "report_list_zhou.png", // "月报": "report_list_yue.png", // "大事点评": "report_list_dashidianping.png", // "会议纪要": "report_list_huiyijiyao.png", // "年报合集": "report_list_nianbaoheji.png", //} for _, reportInfo := range list { reportItem := new(response.ReportListItem) reportItem.ReportId = reportInfo.Id // 样式限制行数 reportItem.Title = "
" + reportInfo.Title + "
" reportItem.PublishTime = reportInfo.PublishTime reportItem.ClassifyNameFirst = reportInfo.ClassifyNameFirst reportItem.ClassifyNameSecond = reportInfo.ClassifyNameSecond reportItem.ClassifyIdFirst = reportInfo.ClassifyIdFirst reportItem.ClassifyIdSecond = reportInfo.ClassifyIdSecond reportItem.Stage = reportInfo.Stage reportItem.Abstract = reportInfo.Abstract if reportInfo.Abstract != "" { reportItem.Abstract = "
" + reportInfo.Abstract + "
" } reportItem.Author = reportInfo.Author stageStr := reportInfo.StageStr if stageStr == "" { stageStr = strconv.Itoa(reportInfo.Stage) } reportItem.TitleInfo = fmt.Sprintf("【第%s期|FICC|%s】", stageStr, reportItem.ClassifyNameSecond) //trimClassifyNameSecond := utils.TrimHtml(reportInfo.ClassifyNameSecond) if reportInfo.ClassifyNameFirst == "晨报" || reportInfo.ClassifyNameFirst == "周报" || classifyIdSecond > 0 { //reportItem.ReportImgUrl = utils.ALIYUN_YBIMG_HOST + reportImgUrl reportItem.TitleInfo = fmt.Sprintf("【第%s期|FICC|%s】", stageStr, reportItem.ClassifyNameFirst) } //else if url, ok := permissionImageMap[trimClassifyNameSecond]; ok { // reportItem.ReportImgUrl = utils.ALIYUN_YBIMG_HOST + url //} //if img, ok := reportImgMap[reportInfo.ClassifyNameFirst]; ok { // reportItem.ReportImgUrl = utils.ALIYUN_YBIMG_HOST + img //} // 封面图-默认取二级分类的图片,二级分类图片没有(如晨周报)则取一级 coverImg := listImgMap[reportInfo.ClassifyIdSecond] if coverImg == "" { coverImg = listImgMap[reportInfo.ClassifyIdFirst] } reportItem.ReportImgUrl = coverImg if classifyParent.ClassifyName == "晨报" && productAuthOk { // 查询当前晨报的所有音频 if vList, ok := videoMap[reportInfo.Id]; ok { for _, vd := range vList { vd.VideoImg = reportItem.ReportImgUrl } reportItem.VideoList = vList } reportItem.AuthOk = productAuthOk } else if classifyParent.ClassifyName == "周报" { if wAuth, ok := weekAuthMap[reportInfo.Id]; ok { reportItem.AuthOk = wAuth if wAuth { // 查询当前晨报的所有音频 if vList, ok2 := videoMap[reportInfo.Id]; ok2 { for _, vd := range vList { vd.VideoImg = reportItem.ReportImgUrl } reportItem.VideoList = vList } } } } else if authOk, ok := checkPermissionMap[reportInfo.ClassifyNameSecond]; ok && authOk { if reportInfo.VideoUrl != "" { videoTemp := new(response.VideoListItem) videoTemp.VideoUrl = reportInfo.VideoUrl videoTemp.VideoName = reportInfo.VideoName if reportInfo.VideoName == "" { videoTemp.VideoName = reportInfo.Title } videoTemp.VideoPlaySeconds = reportInfo.VideoPlaySeconds videoTemp.VideoImg = reportItem.ReportImgUrl reportItem.VideoList = append(reportItem.VideoList, videoTemp) } reportItem.AuthOk = authOk } reportList = append(reportList, reportItem) } } ret = new(response.ReportList) ret.List = reportList ret.Paging = response.GetPaging(pageIndex, pageSize, int(total)) return } // GetCollectReportList 首页展示报告汇总列表 func GetCollectReportList(user user.UserInfo, chartPermissionId, pageIndex, pageSize int) (ret *response.ReportCollectResp, err error) { var errMsg string defer func() { if err != nil { global.LOG.Critical(fmt.Sprintf("GetCollectReportList: userId=%d, err:%s, errMsg:%s", user.UserID, err.Error(), errMsg)) } }() // 查询权限的基本信息 permissionInfo, err := chart_permission.GetByChartPermissionId(chartPermissionId) if err != nil { errMsg = err.Error() err = errors.New("查询权限出错") return } if permissionInfo.ChartPermissionID == 0 { err = errors.New("权限不存在") return } // 除了晨报和周报以外的其他报告 classifyNames, err := chart_permission_search_key_word_mapping.GetKeyWordsByChartPermissionId(chartPermissionId, "rddp") if err != nil { errMsg = err.Error() err = errors.New("查询权限对应的分类出错") return } var classifySecondIds []int if len(classifyNames) > 0 { classifySecondIds, err = classify.GetSecondIdsByClassifyNames(classifyNames) if err != nil { errMsg = err.Error() err = errors.New("查询分类出错") return } } // 查询晨报和周报相对应的章节ID reportChapterTypeIds, err := report_chapter_type_permission.GetTypeIdsByChartPermissionId(chartPermissionId) if err != nil { errMsg = err.Error() err = errors.New("查询权限对应的章节出错") return } var reportList []*response.ReportCollectListItem list := response.ReportCollectListResp{} var total int64 if len(reportChapterTypeIds) > 0 || len(classifySecondIds) > 0 { offset := (pageIndex - 1) * pageSize reportList, err = report.GetReportCollectListByPermission(classifySecondIds, reportChapterTypeIds, offset, pageSize) if err != nil { errMsg = err.Error() err = errors.New("查询报告信息出错") return } listMap := make(map[string]*response.ReportCollectList) for _, v := range reportList { v.ContentSub = GetReportContentSub(v.ContentSub, true) if _, ok := listMap[v.PublishTime.Format("2006-01-02")]; !ok { temp := new(response.ReportCollectList) temp.Date = v.PublishTime.Format("2006-01-02") listMap[v.PublishTime.Format("2006-01-02")] = temp } listMap[v.PublishTime.Format("2006-01-02")].SubList = append(listMap[v.PublishTime.Format("2006-01-02")].SubList, v) } for _, v := range listMap { list = append(list, v) } total, err = report.GetReportCollectCountByPermission(classifySecondIds, reportChapterTypeIds) if err != nil { errMsg = err.Error() err = errors.New("查询报告总数出错") return } if len(list) > 0 { sort.Sort(list) } } ret = new(response.ReportCollectResp) ret.List = list ret.Paging = response.GetPaging(pageIndex, pageSize, int(total)) return } func SearchReport(user user.UserInfo, keyWord string, pageIndex, pageSize int) (ret *response.ReportSearchResp, err error) { var errMsg string defer func() { if err != nil { global.LOG.Critical(fmt.Sprintf("SearchReport: userId=%d, err:%s, errMsg:%s", user.UserID, err.Error(), errMsg)) } }() //查询正常状态的分类 classifys, err := classify.GetSimpleAll() if err != nil { errMsg = err.Error() err = errors.New("分类查询出错") return } var classifyIdFirsts []int classifyIdSeconds := []int{0} for _, v := range classifys { if v.ParentId == 0 { classifyIdFirsts = append(classifyIdFirsts, v.Id) } else { classifyIdSeconds = append(classifyIdSeconds, v.Id) } } keyWord = addAliasToKeyword(keyWord) searchResp, total, err := elasticService.SearchReport(keyWord, classifyIdFirsts, classifyIdSeconds, pageIndex, pageSize) if err != nil { errMsg = err.Error() err = errors.New("查询失败") return } var reportList []*response.ReportCollectListItem if searchResp.Hits != nil { for _, v := range searchResp.Hits.Hits { temp := new(response.ReportCollectListItem) itemJson, tmpErr := v.Source.MarshalJSON() if tmpErr != nil { errMsg = tmpErr.Error() err = errors.New("解析出错") return } reportItem := new(response.EsReportItem) tmpErr = json.Unmarshal(itemJson, &reportItem) if tmpErr != nil { errMsg = tmpErr.Error() err = errors.New("解析json出错") return } temp.ReportId = reportItem.ReportId temp.ReportChapterId = reportItem.ReportChapterId temp.ClassifyIdFirst = reportItem.ClassifyIdFirst temp.ClassifyNameFirst = reportItem.ClassifyNameFirst temp.ClassifyIdSecond = reportItem.ClassifyIdSecond temp.ClassifyNameSecond = reportItem.ClassifyNameSecond temp.Title = reportItem.Title temp.ContentSub = reportItem.BodyContent temp.PublishTime, err = time.ParseInLocation(utils.FormatDateTime, reportItem.PublishTime, time.Local) if len(v.Highlight["Title"]) > 0 { temp.Title = v.Highlight["Title"][0] } if len(v.Highlight["BodyContent"]) > 0 { temp.ContentSub = v.Highlight["BodyContent"][0] } //if len(v.Highlight["Categories"]) > 0 { // if temp.ClassifyNameSecond != "" { // temp.ClassifyNameSecond = ""+temp.ClassifyNameSecond+"" // } // if temp.ClassifyNameFirst != "" { // temp.ClassifyNameFirst = ""+temp.ClassifyNameFirst+"" // } //} temp.ContentSub = GetReportContentSub(temp.ContentSub, false) reportList = append(reportList, temp) } } ret = new(response.ReportSearchResp) ret.List = reportList ret.Paging = response.GetPaging(pageIndex, pageSize, int(total)) return } // GetTickerData 获取指标数据 func GetTickerData(user user.UserInfo, reportChapterId int) (ret *response.TickerData, err error) { var errMsg string defer func() { if err != nil { global.LOG.Critical(fmt.Sprintf("GetTickerData: userId=%d, err:%s, errMsg:%s", user.UserID, err.Error(), errMsg)) } }() //查询章节类型 chapter, err := report_chapter.GetTypeIdById(reportChapterId) if err != nil { errMsg = err.Error() err = errors.New("查询章节失败") return } if chapter.ReportChapterId == 0 { err = errors.New("章节不存在或者未发布") return } tickers, err := report_chapter_ticker.GetTickerByChapterId(reportChapterId) if err != nil { errMsg = err.Error() err = errors.New("查询章节指标失败") return } var list []*response.TickerDataItem if len(tickers) > 0 { var tickerNames []string for _, v := range tickers { tickerNames = append(tickerNames, v.Ticker) } var dataList []*response.TickerDataItem if chapter.TypeId == 17 { dataList, err = daily_base_column.GetDataByBaseColumnTickers17(tickerNames) } else { dataList, err = daily_base_column.GetDataByBaseColumnTickers(tickerNames) } if err != nil { errMsg = err.Error() err = errors.New("查询指标数据失败") return } chapterTypeInfo, tErr := report_chapter_type.GetTickerTitleByTypeId(chapter.TypeId) if tErr != nil { errMsg = tErr.Error() err = errors.New("查询章节类型失败") return } if len(dataList) >= 0 { for _, v := range dataList { temp := new(response.TickerDataItem) temp.BaseColumnName = v.BaseColumnName temp.Ticker = v.Ticker temp.Date = v.Date temp.TickerValue, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", v.TickerValue), 2) temp.LastValue, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", v.LastValue), 2) temp.MmValue, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", v.MmValue), 2) temp.DdValue, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", v.DdValue), 2) temp.WwValue, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", v.WwValue), 2) list = append(list, temp) } } tickerTitle := new(response.TickerTitleData) tickerTitle.TickerTitle = chapterTypeInfo.TickerTitle tickerTitle.ReportChapterTypeId = int(chapterTypeInfo.ReportChapterTypeId) tickerTitle.ReportChapterTypeName = chapterTypeInfo.ReportChapterTypeName tickerTitle.DataTableImage = fmt.Sprintf("http://hongze.oss-cn-shanghai.aliyuncs.com/data_table/%s.png", chapterTypeInfo.ReportChapterTypeKey) ret = new(response.TickerData) ret.List = list ret.TickerTitle = tickerTitle } return } // GetReportContentSub 特殊处理contentSub func GetReportContentSub(content string, scapeFlag bool) (contentSub string) { if scapeFlag { content = html.UnescapeString(content) content = utils.TrimHtml(content) //只展示纯文本 } contentSub = "
" + content + "
" return } // addAliasToKeyword 品种别名 func addAliasToKeyword(keyword string) string { if keyword == "" { return "" } keywordArr := make([]string, 0) keywordArr = append(keywordArr, keyword) if strings.Contains(keyword, "沥青") || strings.Contains(keyword, "BU") { keywordArr = append(keywordArr, "沥青", "BU") } if strings.Contains(keyword, "MEG") || strings.Contains(keyword, "EG") || strings.Contains(keyword, "乙二醇") { keywordArr = append(keywordArr, "MEG", "EG", "乙二醇") } if strings.Contains(keyword, "聚酯") || strings.Contains(keyword, "长丝") || strings.Contains(keyword, "短纤") || strings.Contains(keyword, "瓶片") { keywordArr = append(keywordArr, "聚酯", "长丝", "短纤", "瓶片") } if strings.Contains(keyword, "纯苯") || strings.Contains(keyword, "苯乙烯") || strings.Contains(keyword, "EB") { keywordArr = append(keywordArr, "纯苯", "苯乙烯", "EB") } if strings.Contains(keyword, "甲醇") || strings.Contains(keyword, "MA") { keywordArr = append(keywordArr, "甲醇", "MA") } if strings.Contains(keyword, "橡胶") || strings.Contains(keyword, "RU") { keywordArr = append(keywordArr, "橡胶", "RU") } if strings.Contains(keyword, "聚乙烯") || strings.Contains(keyword, "PP") || strings.Contains(keyword, "PE") { keywordArr = append(keywordArr, "聚乙烯", "PP", "PE") } if strings.Contains(keyword, "玻璃") || strings.Contains(keyword, "纯碱") || strings.Contains(keyword, "FG") || strings.Contains(keyword, "SA") { keywordArr = append(keywordArr, "玻璃", "纯碱", "FG", "SA") } keyword = strings.Join(keywordArr, ",") return keyword } // GetReportPptImgListByReportIdAndReportChapterId 首页展示报告汇总列表 func GetReportPptImgListByReportIdAndReportChapterId(reportId, reportChapterId int) (list []string, err error) { list = make([]string, 0) reportPptImgList, err := report_ppt_img.GetReportPptImgListByReportIdAndReportChapterId(reportId, reportChapterId) for _, v := range reportPptImgList { list = append(list, v.ImgURL) } return }