xiexiaoyuan преди 3 години
родител
ревизия
dfe83fb421

+ 22 - 0
controller/report/report.go

@@ -28,4 +28,26 @@ func Detail(c *gin.Context)  {
 	}
 	response.OkData("查询成功", reportDetail, c )
 	return
+}
+
+func ChapterDetail(c *gin.Context)  {
+	reqReportChapterId := c.DefaultQuery("report_chapter_id", "")
+	if reqReportChapterId == ""{
+		response.Fail("请输入章节ID", c)
+		return
+	}
+	reportChapterId, err := strconv.Atoi(reqReportChapterId)
+	if err != nil {
+		response.Fail("章节ID格式有误", c)
+		return
+	}
+	userinfo := userService.GetInfoByClaims(c)
+
+	chapterDetail, err := report.GetChapterDetail(userinfo, reportChapterId)
+	if err != nil {
+		response.Fail(err.Error(), c)
+		return
+	}
+	response.OkData("查询成功", chapterDetail, c )
+	return
 }

+ 28 - 2
models/response/report.go

@@ -9,14 +9,15 @@ type ReportDetail struct {
 	ReportInfo          *ReportItem  `json:"report_info"`
 	ReportTypeList        []*ReportTypeListItem `json:"report_type_list"`
 	PermissionCheck     *company.PermissionCheckInfo    `json:"permission_check"`
+	AuthOk              bool `json:"auth_ok"`
 }
 
 type ReportTypeListItem struct {
-	ReportTypeId    uint64    `json:"report_type_id"`
+	ReportChapterId    int    `json:"report_chapter_id"`
 	ReportId        int    `json:"report_id"`
 	Title           string    `json:"title"`
 	TypeId                  int         `json:"type_id"`
-	Edit                    int8        `json:"edit"`
+	IsEdit                    int8        `json:"is_edit"`
 	Trend                   string      `json:"trend"`
 	ReportChapterTypeKey    string      `json:"report_chapter_type_key"`
 	ReportChapterTypeThumb  string	    `json:"report_chapter_type_thumb"`
@@ -44,4 +45,29 @@ type ReportItem struct {
 	VideoName          string `description:"音频文件名称" json:"video_name"`
 	VideoPlaySeconds   string `description:"音频播放时长" json:"video_play_seconds"`
 	ContentSub         string `description:"内容前两个章节" json:"content_sub"`
+}
+
+type ReportChapterItem struct {
+	ReportChapterId    int    `json:"report_chapter_id"`
+	ReportId        int    `json:"report_id"`
+	Title           string    `json:"title"`
+	TypeId                  int         `json:"type_id"`
+	Edit                    int8        `json:"edit"`
+	Trend                   string      `json:"trend"`
+	ReportChapterTypeName   string       `json:"report_chapter_type_name"`
+	PauseStartTime          time.Time    `json:"pause_start_time"`
+	PauseEndTime            time.Time    `json:"pause_end_time"`
+	PublishTime         time.Time    `json:"publish_time"`
+	Content            string `description:"内容" json:"content"`
+	ContentSub         string `description:"内容前两个章节" json:"content_sub"`
+	VideoUrl            string    `json:"video_url"`                    //音频文件URL
+	VideoName           string    `json:"video_name"`                  //音频文件名称
+	VideoPlaySeconds    string    `json:"video_play_seconds"`      //音频播放时长
+	VideoSize           string    `json:"video_size"`
+}
+
+type ReportChapterDetail struct {
+	ReportChapterItem  * ReportChapterItem
+	PermissionCheck     *company.PermissionCheckInfo    `json:"permission_check"`
+	AuthOk              bool `json:"auth_ok"`
 }

+ 2 - 2
models/tables/chart_permission_chapter_mapping/query.go

@@ -18,11 +18,11 @@ func GetReportIdsByPermisssionIds(permissionIds []int, researchType string) (rep
 }
 
 // GetPermissionIdsByReportId 根据报告ID筛选出对应的权限
-func GetPermissionIdsByReportId(reportId int) (permissionIds []int, err error)  {
+func GetPermissionIdsByReportId(reportId int, researchType string) (permissionIds []int, err error)  {
 	var charPermissionMapping []*ChartPermissionChapterMapping
 	err = global.DEFAULT_MYSQL.Model(ChartPermissionChapterMapping{}).
 		Select("DISTINCT chart_permission_id").
-		Where("report_chapter_type_id = ?", reportId).
+		Where("report_chapter_type_id = ? and research_type = ? ", reportId, researchType).
 		Scan(&charPermissionMapping).Error
 	if err != nil {
 		return

+ 4 - 0
models/tables/rddp/report/query.go

@@ -2,6 +2,7 @@ package report
 
 import (
 	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/utils"
 )
 
 func GetLatestClassReportsByIDs(reportIDs []int) (reportList []*Report, err error) {
@@ -68,6 +69,9 @@ func GetListByClass(classifyNameFirst string,  offset , limit int) (reportList [
 // GetByReportId 根据id获取报告
 func GetByReportId(id int) (item *Report, err error) {
 	err = global.MYSQL["rddp"].Where("id = ? and state = 2", id).First(&item).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
 	return
 }
 

+ 15 - 33
models/tables/rddp/report_chapter/query.go

@@ -2,32 +2,10 @@ package report_chapter
 
 import (
 	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/utils"
 )
 
-func GetLatestChapterByReportId(reportID int, typeIds []int) (reportChapter *ReportChapter, err error) {
-	sql := `SELECT
-	max( publish_time ) as publish_time,
-	classify_id_first,
-	classify_name_first,
-	title,
-	type_id,
-	type_name,
-	report_chapter_id
-FROM
-	report_chapter
-WHERE
-	report_id = ?
-	AND type_id IN (?) 
-	AND publish_state = 2 
-	AND is_edit = 1
-ORDER BY
-	publish_time desc`
-	err = global.MYSQL["rddp"].Raw(sql, reportID, typeIds).First(&reportChapter).Error
-	return
-}
-
-
-func GetLatestChapterByIdsAndClass(typeIds []int, classifyNameFirst string) (reportChapter *ReportChapter, err error) {
+func GetLatestChapterByTypeIdsAndClass(typeIds []int, classifyNameFirst string) (reportChapter *ReportChapter, err error) {
 	sql := `SELECT
 	max( publish_time ) as publish_time,
 	classify_id_first,
@@ -51,23 +29,27 @@ ORDER BY
 
 // GetListByReportId 根据报告ID获取章节列表
 func GetListByReportId(reportId int) (list []*ReportChapter, err error)  {
-	err = global.MYSQL["rddp"].Select("report_chapter_id, type_id, type_name, abstract, title, author, publish_time").
-		Where("report_id = ? and is_edit = 1 AND publish_state = 2 ", reportId).
-		Order("sort, report_chapter_id").
+	err = global.MYSQL["rddp"].Model(ReportChapter{}).
+		Select("report_chapter_id, report_id, type_id, type_name, abstract, title, author, publish_time").
+		Where("report_id = ? AND is_edit = 1 AND publish_state = 2 ", reportId).
+		Order("sort asc, report_chapter_id asc").
 		Scan(&list).Error
 	return
 }
 
-// GetDetailByReportId 根据报告ID获取章节详情
-func GetDetailByReportId(reportId int, typeId int) (info *ReportChapter, err error)  {
-	err = global.MYSQL["rddp"].Select("report_chapter_id, content, trend, type_id, type_name, abstract, title, author, publish_time").
-		Where("report_id = ? and type_id = ? and is_edit = 1 AND publish_state = 2 ", reportId, typeId).
+// GetContentById 根据ID获取章节详情
+func GetContentById(id int, typeIds []int) (info *ReportChapter, err error)  {
+	err = global.MYSQL["rddp"].Select("report_chapter_id, report_id,  content, trend, type_id, type_name, abstract, title, author, publish_time, content, content_sub, video_url, video_name, video_play_seconds, video_size").
+		Where("report_chapter_id = ? and type_id in (?) and is_edit = 1 AND publish_state = 2 ", id, typeIds).
 		First(&info).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
 	return
 }
 
-// GetReportIdsByIdsAndClass 根据章节ID获取报告ID
-func GetReportIdsByIdsAndClass(typeIds []int, classifyNameFirst string) (reportIds []int, err error) {
+// GetReportIdsByTypeIdsAndClass 根据章节ID获取报告ID
+func GetReportIdsByTypeIdsAndClass(typeIds []int, classifyNameFirst string) (reportIds []int, err error) {
 	var list []*ReportChapter
 	err = global.MYSQL["rddp"].Select("DISTINCT report_id").Where("type_id = (?) and publish_state = 2 AND is_edit = 1 AND classify_name_first= ? ", typeIds, classifyNameFirst).Scan(&list).Error
 	if err != nil {

+ 3 - 1
models/tables/rddp/report_chapter/report_chapter.go

@@ -16,12 +16,14 @@ type ReportChapter struct {
 	AddType             int       `gorm:"column:add_type;type:int(10);not null;default:0"  json:"add_type"`                          //是否为继承报告1-空白报告2-继承报告
 	Author              string    `gorm:"column:author;type:varchar(255);not null;default:''"  json:"author"`                          //作者
 	Content             string    `gorm:"column:content;type:longtext;"  json:"content"`                                               //内容
+	ContentSub          string    `gorm:"column:content_sub;type:longtext;"  json:"content_sub"`                                        //内容前两章
 	Stage				int       `gorm:"column:stage;type:int(10);not null;default:0"  json:"stage"`                                 //期数
 	Trend               string    `gorm:"column:trend;type:varchar(255);not null;default:''"  json:"trend"`                             //趋势观点
 	Sort				int       `gorm:"column:sort;type:int(10);not null;default:0"  json:"sort"`                                   //排序:数值越小越靠前
+	IsEdit              int       `gorm:"column:is_edit;type:int(10);not null;default:0"  json:"is_edit"`                                   //是否编辑
 	PublishState        int       `gorm:"column:publish_state;type:int(4);not null;default:0"  json:"publish_state"`                 //发布状态1-待发布2-已发布
 	PublishTime         time.Time `gorm:"column:publish_time;type:datetime"  json:"publish_time"`                                      //发布时间
-	Videourl            string    `gorm:"column:video_url;type:varchar(255);not null;default:''"  json:"video_url"`                    //音频文件URL
+	VideoUrl            string    `gorm:"column:video_url;type:varchar(255);not null;default:''"  json:"video_url"`                    //音频文件URL
 	VideoName           string    `gorm:"column:video_name;type:varchar(255);not null;default:''"  json:"video_name"`                  //音频文件名称
 	VideoPlaySeconds    string    `gorm:"column:video_play_seconds;type:varchar(255);not null;default:''"  json:"video_play_seconds"`      //音频播放时长
 	VideoSize           string    `gorm:"column:video_size;type:varchar(255);not null;default:''"  json:"video_size"`                    //音频文件大小,单位M

+ 8 - 2
models/tables/report_chapter_type/query.go

@@ -1,11 +1,17 @@
 package report_chapter_type
 
-import "hongze/hongze_yb/global"
+import (
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/utils"
+)
 
 func GetEffectTypeID() (chapterIds []int, err error ) {
 	var chapterList []*ReportChapterType
 	err = global.DEFAULT_MYSQL.Model(ReportChapterType{}).Select("report_chapter_type_id ").Where("is_show=1").Scan(&chapterList).Error
 	if err != nil {
+		if err == utils.ErrNoRow {
+			err = nil
+		}
 		return
 	}
 	if len(chapterList) > 0 {
@@ -18,7 +24,7 @@ func GetEffectTypeID() (chapterIds []int, err error ) {
 
 
 func GetEffectTypes() (list []*ReportChapterType, err error ) {
-	err = global.DEFAULT_MYSQL.Model(ReportChapterType{}).Select("report_chapter_type_id ").Where("is_show=1").Scan(&list).Error
+	err = global.DEFAULT_MYSQL.Model(ReportChapterType{}).Where("is_show=1").Scan(&list).Error
 	return
 }
 

+ 1 - 0
routers/report.go

@@ -9,4 +9,5 @@ import (
 func InitReport(r *gin.Engine)  {
 	rGroup := r.Group("report").Use(middleware.Token())
 	rGroup.GET("/detail", report.Detail)
+	rGroup.GET("/chapter/detail", report.ChapterDetail)
 }

+ 0 - 1
services/company/permission.go

@@ -71,7 +71,6 @@ type PermissionCheckInfo struct {
 	Mobile       string       `json:"mobile" description:"手机号"`
 	Type         string       `json:"type" description:"校验失败,没有权限,需要让前端处理的类型,枚举值:apply,contact"`
 	CustomerInfo CustomerInfo `json:"customer_info" description:"客户信息"`
-	AuthOk       int8          `json:"auth_ok" description:"是有有权限: 1:有,0:没有"`
 }
 
 // CustomerInfo 客户信息

+ 32 - 68
services/report/report.go

@@ -1,7 +1,9 @@
 package report
 
 import (
+	"errors"
 	"fmt"
+	"hongze/hongze_yb/global"
 	"hongze/hongze_yb/models/response"
 	"hongze/hongze_yb/models/response/purchase"
 	"hongze/hongze_yb/models/tables/chart_permission_chapter_mapping"
@@ -117,26 +119,11 @@ func GetPurchaseDetail(permissionIds []int, userId uint64, classifyNameFirst str
 		}
 	}else {
 		if classifyNameFirst == "周报" {
-			ids, tErr := GetReportChapterIdsByPermissionIds(permissionIds)
+			newTypeIds, tErr := GetWeekTypeIdsByPermissionIds(permissionIds,[]int{})
 			if tErr != nil {
 				return
 			}
-			typeIds, tErr := report_chapter_type.GetEffectTypeID()
-			if tErr != nil {
-				err = tErr
-				return
-			}
-
-			var newTypeIds []int
-
-			for _, v1 := range typeIds {
-				for _, v2 := range ids {
-					if v1 == v2 {
-						newTypeIds = append(newTypeIds, v2)
-					}
-				}
-			}
-			reportIds, err = report_chapter.GetReportIdsByIdsAndClass(newTypeIds, classifyNameFirst)
+			reportIds, err = report_chapter.GetReportIdsByTypeIdsAndClass(newTypeIds, classifyNameFirst)
 		} else {
 			reportIds, err = GetReportIdsByPermissionIds(permissionIds)
 			if err != nil {
@@ -192,19 +179,36 @@ func GetPurchaseDetail(permissionIds []int, userId uint64, classifyNameFirst str
 
 // 获取报告详情
 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))
+		}
+	}()
 	reportInfo, err := report.GetByReportId(reportId)
 	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("报告查询出错")
 		return
 	}
 	if reportInfo.Id == 0 {
+		err = errors.New("报告不存在")
 		return
 	}
 
 	//判断权限
-	permissionCheckInfo, err := CheckReportPermission(userinfo, reportId)
-	if err != nil {
-		return
+	var authOk bool
+	var permissionCheckInfo company.PermissionCheckInfo
+	if reportInfo.ClassifyNameFirst == "晨报" || reportInfo.ClassifyNameFirst == "周报" {
+		authOk = true
+		permissionCheckInfo = company.PermissionCheckInfo{}
+	}else{
+		authOk, permissionCheckInfo, err = CheckReportPermission(userinfo, reportId)
+		if err != nil {
+			return
+		}
 	}
+
 	reportItem := new(response.ReportItem)
 	reportItem.ReportId = reportInfo.Id
 	reportItem.Title = reportInfo.Title
@@ -221,48 +225,13 @@ func GetReportDetail(userinfo user.UserInfo, reportId int) (reportDetail respons
 
 	var reportTypeList []*response.ReportTypeListItem
 	if reportInfo.ClassifyNameFirst == "晨报" || reportInfo.ClassifyNameFirst == "周报" {
-		//查询有效的章节
-		typeList, tErr := report_chapter_type.GetEffectTypes()
-		if tErr != nil {
-			err = tErr
-			return
-		}
-		typeMap := make(map[uint64]*report_chapter_type.ReportChapterType)
-		for _, v := range typeList {
-			typeMap[v.ReportChapterTypeId] = v
-		}
-		//获取所有当前研报的章节
-		chapterList, tErr := report_chapter.GetListByReportId(reportInfo.Id)
-		if tErr != nil {
-			err = tErr
+		reportTypeList, err = GetChapterListByReport(reportInfo.ClassifyNameFirst, reportInfo.Id, userinfo.CompanyID)
+		if err != nil {
 			return
 		}
-
-		for _, item := range chapterList {
-			// TODO 只展示有权限的章节
-
-			if typeItem, ok := typeMap[uint64(item.TypeId)]; ok {
-				temp := new(response.ReportTypeListItem)
-				temp.TypeId = item.TypeId
-				temp.Title = item.Title
-				temp.ReportId = item.ReportId
-				temp.Sort = item.Sort
-				temp.PublishTime = item.PublishTime
-
-				temp.BannerUrl = typeItem.BannerUrl
-				temp.PauseEndTime = typeItem.PauseEndTime
-				temp.PauseStartTime = typeItem.PauseStartTime
-				temp.EditImgUrl = typeItem.EditImgUrl
-				temp.ReportChapterTypeKey = typeItem.ReportChapterTypeKey
-				temp.ReportChapterTypeName = typeItem.ReportChapterTypeName
-				temp.ReportChapterTypeThumb = typeItem.ReportChapterTypeThumb
-				reportTypeList = append(reportTypeList, temp)
-			}
-		}
-
 	}
 	//如果有权限则展示content
-	if permissionCheckInfo.AuthOk == 1  {
+	if authOk  {
 		AddViewRecord(userinfo, reportInfo.Id)
 		reportItem.Content = reportInfo.Content
 		reportItem.VideoUrl = reportInfo.VideoUrl
@@ -270,21 +239,16 @@ func GetReportDetail(userinfo user.UserInfo, reportId int) (reportDetail respons
 	reportDetail.ReportInfo = reportItem
 	reportDetail.ReportTypeList = reportTypeList
 	reportDetail.PermissionCheck = &permissionCheckInfo
+	reportDetail.AuthOk = authOk
 	return
 }
 
-// CheckReportPermission 验证用户的活动参与权限
-func CheckReportPermission(userInfo user.UserInfo, reportId int) (permissionCheckInfo company.PermissionCheckInfo, err error) {
-	permissionIds, err := chart_permission_chapter_mapping.GetPermissionIdsByReportId(reportId)
+// CheckReportPermission 验证用户查看报告的权限
+func CheckReportPermission(userInfo user.UserInfo, reportId int) (authOk bool, permissionCheckInfo company.PermissionCheckInfo, err error) {
+	permissionIds, err := chart_permission_chapter_mapping.GetPermissionIdsByReportId(reportId, "rddp")
 	if err != nil {
 		return
 	}
-	ok, permissionCheckInfo, err := company.CheckPermissionByPermissionIdList2Ficc(userInfo.CompanyID, int(userInfo.UserID), permissionIds)
-	if err != nil {
-		return
-	}
-	if ok {
-		permissionCheckInfo.AuthOk = 1
-	}
+	authOk, permissionCheckInfo, err = company.CheckPermissionByPermissionIdList2Ficc(userInfo.CompanyID, int(userInfo.UserID), permissionIds)
 	return
 }

+ 208 - 8
services/report/report_chapter.go

@@ -1,25 +1,51 @@
 package report
 
 import (
+	"errors"
+	"fmt"
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/models/response"
 	"hongze/hongze_yb/models/tables/chart_permission_chapter_mapping"
 	"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/utils"
 )
 
-// GetReportChapterIdsByPermissionIds 获取所有和权限绑定的报告章节ID
-func GetReportChapterIdsByPermissionIds(permissionIds []int) (ids []int, err error)   {
+// 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) {
-	ids, err := GetReportChapterIdsByPermissionIds(permissionIds)
+	newTypeIds, err := GetWeekTypeIdsByPermissionIds(permissionIds, typeIds)
+	chapter, err := report_chapter.GetLatestChapterByTypeIdsAndClass(newTypeIds,"week")
 	if err != nil {
 		return
 	}
-	var newTypeIds []int
+	reportInfo, err = report.GetByReportId(chapter.ReportId)
+	if err == utils.ErrNoRow {
+		return nil, nil
+	}
+	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.GetEffectTypeID()
+		if err != nil {
+			return
+		}
+	}
 	for _, v1 := range typeIds {
 		for _, v2 := range ids {
 			if v1 == v2 {
@@ -27,14 +53,188 @@ func GetLatestWeek(permissionIds []int, typeIds []int) (reportInfo *report.Repor
 			}
 		}
 	}
+	return
+}
+
+// GetChapterListByReport 根据报告获取章节列表
+func GetChapterListByReport(classifyNameFirst string, reportId int, companyId int64) (reportTypeList[]*response.ReportTypeListItem, 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 == "周报" {
+		permissionIds, tErr := company.GetValidPermissionIdListByCompany2ProductId(companyId, 1)
+		if tErr != nil {
+			return
+		}
+		newTypeIds, tErr := GetWeekTypeIdsByPermissionIds(permissionIds, typeIds)
+		if tErr != nil {
+			err = tErr
+			return
+		}
+		for _, v := range newTypeIds {
+			newTypeMap[v] = true
+		}
+	}
+	//获取所有当前研报的章节
+	chapterList, tErr := report_chapter.GetListByReportId(reportId)
+	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 {
+			// TODO 如果是周报只展示有权限的章节
+			if  classifyNameFirst == "周报" {
+				if _, ok1 := newTypeMap[item.TypeId]; !ok1 {
+					continue
+				}
+			}
+			temp := new(response.ReportTypeListItem)
+			temp.ReportChapterId = item.ReportChapterId
+			temp.ReportId = item.ReportId
+			temp.TypeId = item.TypeId
+			temp.Title = item.Title
+			temp.ReportId = item.ReportId
+			temp.Sort = item.Sort
+			temp.PublishTime = item.PublishTime
+			temp.BannerUrl = typeItem.BannerUrl
+			temp.PauseEndTime = typeItem.PauseEndTime
+			temp.PauseStartTime = typeItem.PauseStartTime
+			temp.EditImgUrl = typeItem.EditImgUrl
+			temp.ReportChapterTypeKey = typeItem.ReportChapterTypeKey
+			temp.ReportChapterTypeName = typeItem.ReportChapterTypeName
+			temp.ReportChapterTypeThumb = typeItem.ReportChapterTypeThumb
+			reportTypeList = append(reportTypeList, temp)
+		}
+	}
+	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))
+		}
+	}()
 
-	chapter, err := report_chapter.GetLatestChapterByIdsAndClass(newTypeIds,"week")
+	typeIds, err := report_chapter_type.GetEffectTypeID()
 	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("章节类型查询出错")
 		return
 	}
-	reportInfo, err = report.GetByReportId(chapter.ReportId)
-	if err == utils.ErrNoRow {
-		return nil, nil
+	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
+	}
+
+	var authOk bool
+	var chapterAuthOk bool
+	var permissionCheckInfo company.PermissionCheckInfo
+
+	reportInfo, tErr := report.GetByReportId(reportChapter.ReportId)
+	if tErr != nil {
+		errMsg = err.Error()
+		err = errors.New("报告查询出错")
+		return
+	}
+	if reportInfo.Id == 0 {
+		err = errors.New("报告不存在")
+		return
+	}
+	//判断权限
+	permissionIds, tErr := company.GetValidPermissionIdListByCompany2ProductId(user.CompanyID, 1)
+	if tErr != nil && tErr != utils.ErrNoRow {
+		errMsg = tErr.Error()
+		err = errors.New("权限查询出错")
+		return
+	}
+
+	//TODO 修改权限校验接口,如果用户没有权限也要允许用户查看部分内容
+	authOk, permissionCheckInfo, tErr = company.CheckPermissionByPermissionIdList2Ficc(user.CompanyID, int(user.UserID), permissionIds)
+	if tErr != nil && tErr != utils.ErrNoRow{
+		errMsg = tErr.Error()
+		err = errors.New("权限查询出错")
+		return
+	}
+
+
+	if reportInfo.ClassifyNameFirst == "周报" {
+		var newTypeIds []int
+		newTypeIds, err = GetWeekTypeIdsByPermissionIds(permissionIds, typeIds)
+		if err != nil && err != utils.ErrNoRow{
+			errMsg = tErr.Error()
+			err = errors.New("周报章节权限查询出错")
+			return
+		}
+		for _, v := range newTypeIds {
+			if v == reportChapter.TypeId {
+				chapterAuthOk = true
+			}
+		}
+		authOk = chapterAuthOk
+	}
+	reportChapterItem := new(response.ReportChapterItem)
+	reportChapterItem.ReportChapterId = reportChapter.ReportChapterId
+	reportChapterItem.ReportId = reportChapter.ReportId
+	reportChapterItem.TypeId = reportChapter.TypeId
+	reportChapterItem.Title = reportChapter.Title
+	reportChapterItem.ReportId = reportChapter.ReportId
+	reportChapterItem.PublishTime = reportChapter.PublishTime
+	reportChapterItem.VideoPlaySeconds = reportChapter.VideoPlaySeconds
+	reportChapterItem.VideoName = reportChapter.VideoName
+	reportChapterItem.VideoSize = reportChapter.VideoSize
+	if authOk {
+		reportChapterItem.Content = reportChapter.Content
+		reportChapterItem.VideoUrl = reportChapter.VideoUrl
+	}else{
+		reportChapterItem.ContentSub = reportChapter.ContentSub
 	}
+	reportChapterDetail = new(response.ReportChapterDetail)
+	reportChapterDetail.ReportChapterItem = reportChapterItem
+	reportChapterDetail.PermissionCheck = &permissionCheckInfo
+	reportChapterDetail.AuthOk = authOk
 	return
 }