Browse Source

Merge branch 'bzq/dev' of eta_mini/eta_mini_bridge into master

鲍自强 8 tháng trước cách đây
mục cha
commit
617296d14e

+ 11 - 17
controllers/base_auth.go

@@ -87,23 +87,17 @@ func (c *BaseAuthController) ServeJSON(encoding ...bool) {
 
 	baseRes := c.Data["json"].(*models.BaseResponse)
 	if baseRes != nil && baseRes.Ret != 408 {
-		//body, _ := json.Marshal(baseRes)
-		//var requestBody string
-		//method := c.Ctx.Input.Method()
-		//if method == "GET" {
-		//	requestBody = c.Ctx.Request.RequestURI
-		//} else {
-		//	requestBody, _ = url.QueryUnescape(string(c.Ctx.Input.RequestBody))
-		//}
-		//if baseRes.Ret != 200 && baseRes.IsSendEmail {
-		//	go utils.SendEmail(utils.APP_NAME_CN+"【"+utils.RunMode+"】"+"失败提醒", "URI:"+c.Ctx.Input.URI()+"<br/> "+"Params"+requestBody+" <br/>"+"ErrMsg:"+baseRes.ErrMsg+";<br/>Msg:"+baseRes.Msg+";<br/> Body:"+string(body)+"<br/>", utils.EmailSendToUsers)
-		//}
-
-		// 记录错误日志, 并清掉错误信息避免暴露给外部
-		if baseRes.ErrMsg != "" {
-
-			utils.ApiLog.Info(baseRes.ErrMsg)
-			baseRes.ErrMsg = ""
+		body, _ := json.Marshal(baseRes)
+		var requestBody string
+		method := c.Ctx.Input.Method()
+		if method == "GET" {
+			requestBody = c.Ctx.Request.RequestURI
+		} else {
+			requestBody, _ = url.QueryUnescape(string(c.Ctx.Input.RequestBody))
+		}
+		if baseRes.Ret != 200 {
+			content := "URI:" + c.Ctx.Input.URI() + "<br/> " + "Params" + requestBody + " <br/>" + "ErrMsg:" + baseRes.ErrMsg + ";<br/>Msg:" + baseRes.Msg + ";<br/> Body:" + string(body) + "<br/>"
+			utils.ApiLog.Notice(content)
 		}
 	}
 	c.JSON(c.Data["json"], hasIndent, hasEncoding)

+ 228 - 10
controllers/chart_permission.go

@@ -2,9 +2,9 @@ package controllers
 
 import (
 	"eta/eta_mini_bridge/models"
+	"eta/eta_mini_bridge/services"
 	"eta/eta_mini_bridge/utils"
 	"fmt"
-	"html"
 	"sort"
 	"strconv"
 )
@@ -187,7 +187,64 @@ func (this *ChartPermissionController) Private() {
 
 }
 
-// Private
+// DetailByClassify
+// @Title 获取品种权限根据分类id
+// @Description 获取品种权限根据分类id
+// @Param   ClassifyId   query   int  true       "分类的id"
+// @Param   Scope   query   int  true       "0:获取二级权限,1:获取一级权限,2:获取所有权限"
+// @Success 200 {object} []models.ChartPermission
+// @router /classify/detail [get]
+func (this *ChartPermissionController) DetailByClassify() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	classifyId, _ := this.GetInt("ClassifyId")
+	if classifyId <= 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,分类id小于等于0"
+		return
+	}
+	scope, _ := this.GetInt("Scope")
+	reportChartPermissionIds, err := models.GetChartPermissionIdsListByClassifyId(classifyId)
+	if err != nil {
+		br.Msg = "获取研报权限失败"
+		br.ErrMsg = "获取研报权限失败,Err:" + err.Error()
+		return
+	}
+	chartPermissionList, err := models.GetChartPermissionListByStrIds(reportChartPermissionIds)
+	if err != nil {
+		br.Msg = "获取研报权限失败"
+		br.ErrMsg = "获取研报权限失败,Err:" + err.Error()
+		return
+	}
+	if scope == 1 || scope == 2 {
+		fisrtPermissionIds := make([]string, 0)
+		for _, chartPermission := range chartPermissionList {
+			fisrtPermissionIds = append(fisrtPermissionIds, strconv.Itoa(chartPermission.ParentId))
+		}
+		fisrtPermissionIds = utils.Unique(fisrtPermissionIds)
+		firstPermissionList, err := models.GetChartPermissionListByStrIds(fisrtPermissionIds)
+		if err != nil {
+			br.Msg = "一级品种获取失败"
+			br.ErrMsg = "一级品种获取失败,系统错误,Err:" + err.Error()
+			return
+		}
+		if scope == 1 {
+			chartPermissionList = firstPermissionList
+		} else if scope == 2 {
+			chartPermissionList = append(chartPermissionList, firstPermissionList...)
+		}
+	}
+
+	br.Data = chartPermissionList
+	br.Msg = "权限列表获取成功"
+	br.Success = true
+	br.Ret = 200
+}
+
+// Detail
 // @Title 获取研报的品种权限列表
 // @Description 获取研报的品种权限列表
 // @Param   ReportId   query   int  true       "研报id"
@@ -196,10 +253,6 @@ func (this *ChartPermissionController) Private() {
 func (this *ChartPermissionController) Detail() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
-		if err := recover(); err != nil {
-			utils.ApiLog.Error("获取报告列表获取失败,系统错误,Err:%s", err)
-			return
-		}
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
@@ -210,13 +263,11 @@ func (this *ChartPermissionController) Detail() {
 		return
 	}
 	report, err := models.GetReportById(reportId)
-	if err != nil {
+	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "该报告已删除"
 		br.ErrMsg = "获取报告详情失败,Err:" + err.Error()
 		return
 	}
-	report.ContentSub = html.UnescapeString(report.ContentSub)
-	report.Content = html.UnescapeString(report.Content)
 	if report == nil {
 		br.Msg = "报告不存在"
 		return
@@ -227,7 +278,7 @@ func (this *ChartPermissionController) Detail() {
 		br.ErrMsg = "获取研报权限失败,Err:" + err.Error()
 		return
 	}
-	chartPermissionList, err := models.GetChartPermissionIdsByIds(reportChartPermissionIds)
+	chartPermissionList, err := models.GetChartPermissionListByStrIds(reportChartPermissionIds)
 	if err != nil {
 		br.Msg = "获取研报权限失败"
 		br.ErrMsg = "获取研报权限失败,Err:" + err.Error()
@@ -240,6 +291,162 @@ func (this *ChartPermissionController) Detail() {
 	br.Ret = 200
 }
 
+// ClassifyTree
+// @Title 获取品种下的分类权限树形列表
+// @Description 获取研报的品种权限树形列表
+// @Param   ChartPermissionId   query   int  true       "品种权限id"
+// @Success 200 {object} []models.ChartPermission
+// @router /classify/tree [get]
+func (this *ChartPermissionController) ClassifyTree() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	chartPermissionId, _ := this.GetInt("ChartPermissionId")
+	if chartPermissionId <= 0 {
+		br.Msg = "品种权限错误"
+		return
+	}
+	chartPermission, err := models.GetChartPermissionById(chartPermissionId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "品种权限不存在"
+			return
+		}
+		br.Msg = "品种权限错误"
+		br.ErrMsg = "品种权限错误,系统错误,Err:" + err.Error()
+		return
+	}
+	var classifyIds []int
+	if chartPermission.ParentId == 0 {
+		// 传过来的是一级品种权限的id,那就获取子品种权限的id,通过子品种权限寻找分类id
+		childChartPermissionIdsList, err := models.GetChildChartPermissionIdsById(chartPermission.ChartPermissionId)
+		if err != nil {
+			br.Msg = "获取品种权限失败"
+			br.ErrMsg = "获取子品种权限失败,系统错误,Err:" + err.Error()
+			return
+		}
+		classifyIds, err = models.GetClassifyIdsListByIds(childChartPermissionIdsList)
+		if err != nil {
+			br.Msg = "获取分类失败"
+			br.ErrMsg = "获取类别失败,系统错误,Err:" + err.Error()
+			return
+		}
+	} else {
+		classifyIds, err = models.GetClassifyIdsListById(chartPermission.ChartPermissionId)
+		if err != nil {
+			br.Msg = "获取分类失败"
+			br.ErrMsg = "获取类别失败,系统错误,Err:" + err.Error()
+			return
+		}
+	}
+	classifyList, err := models.GetClassifyListByIds(classifyIds)
+	if err != nil {
+		br.Msg = "获取分类失败"
+		br.ErrMsg = "获取类别信息失败,系统错误,Err:" + err.Error()
+		return
+	}
+	var parentClassifyIds []int
+	for _, v := range classifyList {
+		if v.ParentId != 0 {
+			parentClassifyIds = append(parentClassifyIds, v.ParentId)
+		}
+	}
+	parentClassifyList, err := models.GetClassifyListByIds(parentClassifyIds)
+	if err != nil {
+		br.Msg = "获取分类失败"
+		br.ErrMsg = "获取类别信息失败,系统错误,Err:" + err.Error()
+		return
+	}
+
+	var rootClassifyIds []int
+	for _, v := range parentClassifyList {
+		if v.ParentId != 0 {
+			rootClassifyIds = append(rootClassifyIds, v.ParentId)
+		}
+	}
+	classifyIds = append(classifyIds, parentClassifyIds...)
+	classifyIds = append(classifyIds, rootClassifyIds...)
+	classifyIds = utils.Unique(classifyIds)
+	finalList, err := models.GetClassifyListByIds(classifyIds)
+	if err != nil {
+		br.Msg = "获取分类失败"
+		br.ErrMsg = "获取类别信息失败,系统错误,Err:" + err.Error()
+		return
+	}
+	finalList = services.GetClassifyTree(finalList, 0)
+
+	br.Msg = "分类列表获取成功"
+	br.Data = finalList
+	br.Success = true
+	br.Ret = 200
+}
+
+// ClassifyList
+// @Title 获取品种下的分类权限列表
+// @Description 获取研报的品种权限列表
+// @Param   ChartPermissionId   query   int  true       "品种权限id"
+// @Success 200 {object} []models.ChartPermission
+// @router /classify/list [get]
+func (this *ChartPermissionController) ClassifyList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	chartPermissionId, _ := this.GetInt("ChartPermissionId")
+	if chartPermissionId <= 0 {
+		br.Msg = "品种权限错误"
+		return
+	}
+	chartPermission, err := models.GetChartPermissionById(chartPermissionId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "品种权限不存在"
+			return
+		}
+		br.Msg = "品种权限错误"
+		br.ErrMsg = "品种权限错误,系统错误,Err:" + err.Error()
+		return
+	}
+	var classifyIds []int
+	if chartPermission.ParentId == 0 {
+		// 传过来的是一级品种权限的id,那就获取子品种权限的id,通过子品种权限寻找分类id
+		childChartPermissionIdsList, err := models.GetChildChartPermissionIdsById(chartPermission.ChartPermissionId)
+		if err != nil {
+			br.Msg = "获取品种权限失败"
+			br.ErrMsg = "获取子品种权限失败,系统错误,Err:" + err.Error()
+			return
+		}
+		classifyIds, err = models.GetClassifyIdsListByIds(childChartPermissionIdsList)
+		if err != nil {
+			br.Msg = "获取分类失败"
+			br.ErrMsg = "获取类别失败,系统错误,Err:" + err.Error()
+			return
+		}
+	} else {
+		classifyIds, err = models.GetClassifyIdsListById(chartPermission.ChartPermissionId)
+		if err != nil {
+			br.Msg = "获取分类失败"
+			br.ErrMsg = "获取类别失败,系统错误,Err:" + err.Error()
+			return
+		}
+	}
+	classifyIds = utils.Unique(classifyIds)
+	classifyList, err := models.GetClassifyListByIds(classifyIds)
+	if err != nil {
+		br.Msg = "获取分类失败"
+		br.ErrMsg = "获取类别信息失败,系统错误,Err:" + err.Error()
+		return
+	}
+
+	br.Msg = "分类列表获取成功"
+	br.Data = classifyList
+	br.Success = true
+	br.Ret = 200
+}
+
 // getChartPermissionTree获得品种权限的树形结构
 func getChartPermissionTree(rootMap map[int]*models.ChartPermission, childChartPermissionList []*models.ChartPermission) map[int]*models.ChartPermissionView {
 	resultMap := make(map[int]*models.ChartPermissionView)
@@ -276,3 +483,14 @@ func getChartPermissionTree(rootMap map[int]*models.ChartPermission, childChartP
 	}
 	return resultMap
 }
+
+func getClassifyTree(classifyList []*models.ClassifyView, parentClassifyList []*models.ClassifyView) []*models.ClassifyView {
+	for _, v := range parentClassifyList {
+		for _, v1 := range classifyList {
+			if v.Id == v1.ParentId {
+				v.Child = append(v.Child, v1)
+			}
+		}
+	}
+	return parentClassifyList
+}

+ 116 - 0
controllers/classify.go

@@ -0,0 +1,116 @@
+package controllers
+
+import (
+	"encoding/json"
+	"eta/eta_mini_bridge/models"
+	"eta/eta_mini_bridge/models/request"
+	"eta/eta_mini_bridge/models/response"
+	"eta/eta_mini_bridge/utils"
+)
+
+type ClassifyController struct {
+	BaseAuthController
+}
+
+// @Title 根据分类id获取一级品种
+// @Description 根据分类id获取一级品种
+// @Param	request	body request.ClassifyReq true "type json string"
+// @Success 200 {object} response.ReportDetailResp
+// @router /chart_permission/first [post]
+func (this *ClassifyController) FirstChartPermission() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req request.ClassifyReq
+	if err := json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,Err:" + err.Error()
+		return
+	}
+	if len(req.ClassifyIds) == 0 {
+		br.Msg = "分类id错误,获取失败"
+		return
+	}
+	permissionClassifyMap, err := models.GetChartPermissionListByClassifyIds(req.ClassifyIds)
+	if err != nil {
+		br.Msg = "品种获取失败"
+		br.ErrMsg = "获取品种和分类的映射失败,系统错误,Err:" + err.Error()
+		return
+	}
+
+	classifyToPermissionMap2 := make(map[int][]int)
+	chartPermissionIds := make([]int, 0)
+	for _, v := range permissionClassifyMap {
+		classifyToPermissionMap2[v.ClassifyId] = append(classifyToPermissionMap2[v.ClassifyId], v.ChartPermissionId)
+		chartPermissionIds = append(chartPermissionIds, v.ChartPermissionId)
+	}
+
+	// 获取二级品种的权限,并建立映射
+	chartPermissionList2, err := models.GetChartPermissionListByIds(chartPermissionIds)
+	if err != nil {
+		br.Msg = "二级品种获取失败"
+		br.ErrMsg = "二级品种获取失败,系统错误,Err:" + err.Error()
+		return
+	}
+	chartPermissionViewMap2 := make(map[int]*models.ChartPermission)
+	for _, v := range chartPermissionList2 {
+		chartPermissionViewMap2[v.ChartPermissionId] = v
+	}
+
+	// 获取一级品种的权限,并建立映射
+	chartPermissionList1, err := models.GetChildChartPermissionListById(0)
+	if err != nil {
+		br.Msg = "获取研报一级品种权限失败"
+		br.ErrMsg = "获取研报一级品种权限失败,Err:" + err.Error()
+		return
+	}
+	chartPermissionMap1 := make(map[int]*models.ChartPermission)
+	for _, v := range chartPermissionList1 {
+		chartPermissionMap1[v.ChartPermissionId] = v
+	}
+
+	var resp []*response.ClassifyPermissionItemResp
+	for _, v := range req.ClassifyIds {
+		t := new(response.ClassifyPermissionItemResp)
+		t.ClassifyId = v
+		for _, vv := range classifyToPermissionMap2[v] {
+			if item, ok := chartPermissionViewMap2[vv]; ok {
+				parent2 := item.ParentId
+				t.PermissionNames = append(t.PermissionNames, chartPermissionMap1[parent2].PermissionName)
+			}
+		}
+		t.PermissionNames = utils.Unique(t.PermissionNames)
+		resp = append(resp, t)
+	}
+
+	br.Data = resp
+	br.Success = true
+	br.Ret = 200
+	br.Msg = "获取成功"
+}
+
+// @Title 获取所有分类
+// @Description 获取所有分类
+// @Success 200 {object} []models.ClassifyView
+// @router /list [get]
+func (this *ClassifyController) AllClassify() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	classifyList, err := models.GetClassifyList()
+	if err != nil {
+		br.Msg = "获取分类失败"
+		br.ErrMsg = "获取分类失败,系统错误,Err:" + err.Error()
+		return
+	}
+
+	br.Data = classifyList
+	br.Success = true
+	br.Ret = 200
+	br.Msg = "获取成功"
+}

+ 167 - 37
controllers/report.go

@@ -23,6 +23,7 @@ type ReportController struct {
 // @Param   PageSize   query   int  true       "每页数据条数"
 // @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
 // @Param   RangeType   query   string  true       "范围类型,1-一天内,2-一周内,3-半年内"
+// @Param   ClassifyId   query   int  true       "分类id"
 // @Success 200 {object} response.ReportListResp
 // @router /list [get]
 func (this *ReportController) List() {
@@ -37,6 +38,7 @@ func (this *ReportController) List() {
 	chartPermissionId, _ := this.GetInt("ChartPermissionId")
 	level, _ := this.GetInt("Level")
 	rangeType, _ := this.GetInt("RangeType")
+	classifyId, _ := this.GetInt("ClassifyId")
 
 	if chartPermissionId <= 0 {
 		br.Msg = "品种参数错误"
@@ -60,9 +62,36 @@ func (this *ReportController) List() {
 		currentIndex = 1
 	}
 	startSize = utils.StartIndex(currentIndex, pageSize)
-
+	classifyList, err := models.GetClassifyList()
+	if err != nil {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	classifyMap := make(map[int]*models.ClassifyView)
+	isHas := false
+	for _, v := range classifyList {
+		if v.Id == classifyId && classifyId != 0 {
+			isHas = true
+		}
+		classifyMap[v.Id] = v
+	}
+	if !isHas && classifyId != 0 {
+		br.Msg = "分类不存在"
+		return
+	}
+	classifyIdMap := make(map[int]struct{})
+	if classifyId > 0 {
+		leafClassifyIds := getLeafClassifyIds(classifyMap, classifyId)
+		for _, v := range leafClassifyIds {
+			classifyIdMap[v] = struct{}{}
+		}
+	}
 	var total int
 	var reportList []*models.ReportList
+	classifyFirstIds := make([]int, 0)
+	classifySecondIds := make([]int, 0)
+	classifyThirdIds := make([]int, 0)
 	switch level {
 	case 2:
 		classifyIds, err := models.GetClassifyIdsListById(chartPermissionId)
@@ -76,14 +105,44 @@ func (this *ReportController) List() {
 			br.ErrMsg = "获取数据失败,品种id:" + strconv.Itoa(chartPermissionId)
 			return
 		}
-		tmptotal, err := models.GetReportCountByClassifyIds(classifyIds, condition)
+
+		classifyIds = utils.Unique(classifyIds)
+		// 根据分类筛选报告
+		var selectedClassifyId []int
+		if classifyId > 0 {
+			for _, v := range classifyIds {
+				if _, ok := classifyIdMap[v]; ok {
+					selectedClassifyId = append(selectedClassifyId, v)
+				}
+			}
+		} else {
+			selectedClassifyId = classifyIds
+		}
+
+		classifyList, err := models.GetClassifyListByIds(selectedClassifyId)
+		if err != nil {
+			br.Msg = "获取报告列表失败"
+			br.ErrMsg = "获取数据失败,Err:" + err.Error()
+			return
+		}
+		for _, v := range classifyList {
+			switch v.Level {
+			case 1:
+				classifyFirstIds = append(classifyFirstIds, v.Id)
+			case 2:
+				classifySecondIds = append(classifySecondIds, v.Id)
+			case 3:
+				classifyThirdIds = append(classifyThirdIds, v.Id)
+			}
+		}
+		tmptotal, err := models.GetReportCountByClassifyIds(classifyFirstIds, classifySecondIds, classifyThirdIds, condition)
 		if err != nil {
 			br.Msg = "获取数据失败"
 			br.ErrMsg = "获取数据失败,Err:" + err.Error()
 			return
 		}
 		total = tmptotal
-		tmpReportList, err := models.GetReportListByClassifyIds(classifyIds, condition, startSize, pageSize)
+		tmpReportList, err := models.GetReportListByClassifyIds(classifyFirstIds, classifySecondIds, classifyThirdIds, condition, startSize, pageSize)
 		if err != nil {
 			br.Msg = "获取报告列表失败"
 			br.ErrMsg = "获取数据失败,Err:" + err.Error()
@@ -112,14 +171,43 @@ func (this *ReportController) List() {
 			br.Msg = "该品种下没有绑定分类"
 			return
 		}
-		tmptotal, err := models.GetReportCountByClassifyIds(classifyIds, condition)
+		classifyIds = utils.Unique(classifyIds)
+		// 根据分类筛选报告
+		var selectedClassifyId []int
+		if classifyId > 0 {
+			for _, v := range classifyIds {
+				if _, ok := classifyIdMap[v]; ok {
+					selectedClassifyId = append(selectedClassifyId, v)
+				}
+			}
+		} else {
+			selectedClassifyId = classifyIds
+		}
+
+		classifyList, err := models.GetClassifyListByIds(selectedClassifyId)
+		if err != nil {
+			br.Msg = "获取报告列表失败"
+			br.ErrMsg = "获取数据失败,Err:" + err.Error()
+			return
+		}
+		for _, v := range classifyList {
+			switch v.Level {
+			case 1:
+				classifyFirstIds = append(classifyFirstIds, v.Id)
+			case 2:
+				classifySecondIds = append(classifySecondIds, v.Id)
+			case 3:
+				classifyThirdIds = append(classifyThirdIds, v.Id)
+			}
+		}
+		tmptotal, err := models.GetReportCountByClassifyIds(classifyFirstIds, classifySecondIds, classifyThirdIds, condition)
 		if err != nil {
 			br.Msg = "获取数据失败"
 			br.ErrMsg = "获取数据失败,Err:" + err.Error()
 			return
 		}
 		total = tmptotal
-		tmpReportList, err := models.GetReportListByClassifyIds(classifyIds, condition, startSize, pageSize)
+		tmpReportList, err := models.GetReportListByClassifyIds(classifyFirstIds, classifySecondIds, classifyThirdIds, condition, startSize, pageSize)
 		if err != nil {
 			br.Msg = "获取报告列表失败"
 			br.ErrMsg = "获取报告列表失败,Err:" + err.Error()
@@ -142,6 +230,25 @@ func (this *ReportController) List() {
 	br.Data = resp
 }
 
+func getLeafClassifyIds(classifyMap map[int]*models.ClassifyView, keyId int) []int {
+	var leafClassifyIds []int
+	curClassify := classifyMap[keyId]
+	if curClassify.HasChild == 0 {
+		leafClassifyIds = append(leafClassifyIds, curClassify.Id)
+		return leafClassifyIds
+	}
+	for _, v := range classifyMap {
+		if v.ParentId == curClassify.Id {
+			if v.HasChild == 0 {
+				leafClassifyIds = append(leafClassifyIds, v.Id)
+			} else {
+				leafClassifyIds = append(leafClassifyIds, getLeafClassifyIds(classifyMap, v.Id)...)
+			}
+		}
+	}
+	return leafClassifyIds
+}
+
 // @Title 研报详情
 // @Description 研报详情接口
 // @Param   ReportId   query   int  true       "报告id"
@@ -179,7 +286,7 @@ func (this *ReportController) Detail() {
 	}
 	// 有效期是否到期
 	var vailStatus int
-	if user.Status == utils.UserStatusFormal || user.Status == utils.UserStatusNo {
+	if user.Status == utils.UserStatusFormal {
 		if user.ValidEndTime.After(time.Now()) && user.ValidStartTime.Before(time.Now()) {
 			vailStatus = 2
 		} else {
@@ -202,6 +309,35 @@ func (this *ReportController) Detail() {
 		br.ErrMsg = "获取报告详情失败,Err:" + err.Error()
 		return
 	}
+	if report.HeadResourceId > 0 || report.EndResourceId > 0 {
+		headImg, err := models.GetSmartReportResourceById(report.HeadResourceId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			utils.FileLog.Warn("版头数据获取失败,Err:" + err.Error())
+		}
+		endImg, err := models.GetSmartReportResourceById(report.EndResourceId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			utils.FileLog.Warn("版尾数据获取失败,Err:" + err.Error())
+		}
+		if headImg != nil {
+			report.HeadResource = headImg
+		}
+		if endImg != nil {
+			report.EndResource = endImg
+		}
+	}
+
+	if report.HasChapter == 1 {
+		chapterList, err := models.GetReportChapterList(report.Id)
+		if err != nil {
+			br.Msg = "该报告已删除"
+			br.ErrMsg = "获取章节列表失败,Err:" + err.Error()
+			return
+		}
+		for _, v := range chapterList {
+			v.Content = html.UnescapeString(v.Content)
+		}
+		report.ChapterContent = chapterList
+	}
 	report.ContentSub = html.UnescapeString(report.ContentSub)
 	report.Content = html.UnescapeString(report.Content)
 	if report == nil {
@@ -214,7 +350,7 @@ func (this *ReportController) Detail() {
 		br.ErrMsg = "获取研报权限失败,Err:" + err.Error()
 		return
 	}
-	chartPermissionList, err := models.GetChartPermissionIdsByIds(reportChartPermissionIds)
+	chartPermissionList, err := models.GetChartPermissionListByStrIds(reportChartPermissionIds)
 	if err != nil {
 		br.Msg = "获取研报权限失败"
 		br.ErrMsg = "获取研报权限失败,Err:" + err.Error()
@@ -281,9 +417,8 @@ func (this *ReportController) Detail() {
 			br.Msg = "用户权限不足"
 			return
 		}
-		reportClassifyIdStr := strconv.Itoa(report.ClassifyIdSecond)
 		for _, v := range classifyIds {
-			if v == reportClassifyIdStr {
+			if v == report.ClassifyIdSecond {
 				IsHas = true
 			}
 		}
@@ -362,8 +497,6 @@ func (this *ReportController) DetailNoUser() {
 
 // @Title 今日研报列表
 // @Description 今日研报列表
-// @Param   PageSize   query   int  true       "每页数据条数"
-// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
 // @Success 200 {object} response.ReportListResp
 // @router /daily/list [get]
 func (this *ReportController) Today() {
@@ -373,18 +506,6 @@ func (this *ReportController) Today() {
 		this.ServeJSON()
 	}()
 
-	pageSize, _ := this.GetInt("PageSize")
-	currentIndex, _ := this.GetInt("CurrentIndex")
-
-	var startSize int
-	if pageSize <= 0 {
-		pageSize = utils.PageSize30
-	}
-	if currentIndex <= 0 {
-		currentIndex = 1
-	}
-	startSize = utils.StartIndex(currentIndex, pageSize)
-
 	total, err := models.GetReportDailyListCount()
 	if err != nil {
 		br.Msg = "获取数据失败"
@@ -392,7 +513,7 @@ func (this *ReportController) Today() {
 		return
 	}
 
-	list, err := models.GetReportDailyList(startSize, pageSize)
+	list, err := models.GetReportDailyList(0, total)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
@@ -404,7 +525,7 @@ func (this *ReportController) Today() {
 	}
 	classifyIds = utils.Unique(classifyIds)
 	// 获取二级分类和二级品种权限的映射
-	chartPermissionMapping, err := models.GetChartPermissionIdsListByClassifyIds(classifyIds)
+	chartPermissionMapping, err := models.GetChartPermissionListByClassifyStrIds(classifyIds)
 	if err != nil {
 		br.Msg = "获取研报权限失败"
 		br.ErrMsg = "获取研报权限失败,Err:" + err.Error()
@@ -417,7 +538,7 @@ func (this *ReportController) Today() {
 		chartPermissionIds = append(chartPermissionIds, strconv.Itoa(v.ChartPermissionId))
 	}
 	// 获取二级品种的权限,并建立映射
-	chartPermissionList2, err := models.GetParentChartPermissionListByIds(chartPermissionIds)
+	chartPermissionList2, err := models.GetChartPermissionListByStrIds(chartPermissionIds)
 	if err != nil {
 		br.Msg = "获取研报二级品种权限失败"
 		br.ErrMsg = "获取研报二级品种权限失败,Err:" + err.Error()
@@ -439,20 +560,23 @@ func (this *ReportController) Today() {
 		chartPermissionMap1[v.ChartPermissionId] = v
 	}
 	// 组合数据
+	finalList := make([]*models.ReportList, 0)
 	for _, v := range list {
 		var permissionNames []string
 		for _, vv := range classifyToPermissionMap2[v.ClassifyIdSecond] {
-			parent2 := chartPermissionViewMap2[vv].ParentId
-			permissionNames = append(permissionNames, chartPermissionMap1[parent2].PermissionName)
+			if item, ok := chartPermissionViewMap2[vv]; ok {
+				parent2 := item.ParentId
+				permissionNames = append(permissionNames, chartPermissionMap1[parent2].PermissionName)
+			}
 		}
 		v.PermissionNames = utils.Unique(permissionNames)
+		if len(v.PermissionNames) != 0 {
+			finalList = append(finalList, v)
+		}
 	}
 
-	page := paging.GetPaging(currentIndex, pageSize, total)
-
 	resp := new(response.ReportListResp)
-	resp.Paging = page
-	resp.List = list
+	resp.List = finalList
 
 	br.Ret = 200
 	br.Success = true
@@ -504,7 +628,7 @@ func (this *ReportController) RecentList() {
 	}
 	classifyIds = utils.Unique(classifyIds)
 	// 获取二级分类和二级品种权限的映射
-	chartPermissionMapping, err := models.GetChartPermissionIdsListByClassifyIds(classifyIds)
+	chartPermissionMapping, err := models.GetChartPermissionListByClassifyStrIds(classifyIds)
 	if err != nil {
 		br.Msg = "获取研报权限失败"
 		br.ErrMsg = "获取研报权限失败,Err:" + err.Error()
@@ -517,7 +641,7 @@ func (this *ReportController) RecentList() {
 		chartPermissionIds = append(chartPermissionIds, strconv.Itoa(v.ChartPermissionId))
 	}
 	// 获取二级品种的权限,并建立映射
-	chartPermissionList2, err := models.GetParentChartPermissionListByIds(chartPermissionIds)
+	chartPermissionList2, err := models.GetChartPermissionListByStrIds(chartPermissionIds)
 	if err != nil {
 		br.Msg = "获取研报二级品种权限失败"
 		br.ErrMsg = "获取研报二级品种权限失败,Err:" + err.Error()
@@ -539,20 +663,26 @@ func (this *ReportController) RecentList() {
 		chartPermissionMap1[v.ChartPermissionId] = v
 	}
 	// 组合数据
+	finalList := make([]*models.ReportList, 0)
 	for _, v := range list {
 		var permissionNames []string
 		for _, vv := range classifyToPermissionMap2[v.ClassifyIdSecond] {
-			parent2 := chartPermissionViewMap2[vv].ParentId
-			permissionNames = append(permissionNames, chartPermissionMap1[parent2].PermissionName)
+			if item, ok := chartPermissionViewMap2[vv]; ok {
+				parent2 := item.ParentId
+				permissionNames = append(permissionNames, chartPermissionMap1[parent2].PermissionName)
+			}
 		}
 		v.PermissionNames = utils.Unique(permissionNames)
+		if len(v.PermissionNames) != 0 {
+			finalList = append(finalList, v)
+		}
 	}
 
 	page := paging.GetPaging(currentIndex, pageSize, total)
 
 	resp := new(response.ReportListResp)
 	resp.Paging = page
-	resp.List = list
+	resp.List = finalList
 
 	br.Ret = 200
 	br.Success = true

+ 3 - 3
controllers/wechat.go

@@ -58,7 +58,7 @@ func (this *WeChatController) SendTemplateMsg() {
 		br.Msg = "该研报所在分类未关联品种权限,不能推送"
 		return
 	}
-	chartPermissionList, err := models.GetChartPermissionIdsByIds(reportChartPermissionIdStrs)
+	chartPermissionList, err := models.GetChartPermissionListByStrIds(reportChartPermissionIdStrs)
 	if err != nil {
 		br.Msg = "获取研报权限失败"
 		br.ErrMsg = "获取研报权限失败,Err:" + err.Error()
@@ -166,13 +166,13 @@ func (this *WeChatController) SendTemplateMsg() {
 	sendData["keyword3"] = map[string]interface{}{"value": report.PublishTime, "color": "#173177"}
 	sendData["keyword4"] = map[string]interface{}{"value": report.Abstract, "color": "#173177"}
 	// 推送模板消息
-	go func(sendData map[string]interface{}, items []*services.OpenIdList, sendType, reportId int) {
+	go func() {
 		fmt.Println("推送模板消息:", reportId)
 		err = services.SendMultiTemplateMsg(sendData, openIds, 1, reportId)
 		if err != nil {
 			utils.FileLog.Info("推送模板消息失败, Err:" + err.Error())
 		}
-	}(sendData, openIds, 1, reportId)
+	}()
 
 	br.Ret = 200
 	br.Msg = "发送成功"

+ 2 - 0
main.go

@@ -3,6 +3,7 @@ package main
 import (
 	"eta/eta_mini_bridge/controllers"
 	_ "eta/eta_mini_bridge/routers"
+	"eta/eta_mini_bridge/scheduler"
 	"fmt"
 	"runtime"
 
@@ -22,6 +23,7 @@ func main() {
 	web.BConfig.MaxMemory = 1024 * 1024 * 128
 
 	web.BConfig.RecoverFunc = Recover
+	go scheduler.InitJob()
 
 	web.Run()
 }

+ 47 - 18
models/chart_permission.go

@@ -1,6 +1,7 @@
 package models
 
 import (
+	"eta/eta_mini_bridge/utils"
 	"fmt"
 	"strings"
 	"time"
@@ -58,7 +59,7 @@ func GetChartPermissionList() (items []*ChartPermission, err error) {
 	return
 }
 
-// GetChildChartPermissionListById 获取子品种权限列表
+// GetChildChartPermissionListById 根据品种id获取子品种权限列表
 func GetChildChartPermissionListById(id int) (items []*ChartPermission, err error) {
 	o := orm.NewOrmUsingDB("rddp")
 	sql := `SELECT * FROM chart_permission WHERE enabled=1 AND product_id=1 AND parent_id=? ORDER BY sort ASC`
@@ -66,8 +67,8 @@ func GetChildChartPermissionListById(id int) (items []*ChartPermission, err erro
 	return
 }
 
-// GetChartPermissionListByIds 根据品种ids获取品种权限列表
-func GetChartPermissionIdsByIds(chartPermissionIds []string) (items []*ChartPermission, err error) {
+// GetChartPermissionListByStrIds 根据品种ids获取品种权限列表
+func GetChartPermissionListByStrIds(chartPermissionIds []string) (items []*ChartPermission, err error) {
 	// 没有品种权限就返回空
 	if len(chartPermissionIds) == 0 {
 		return
@@ -83,25 +84,53 @@ func GetChartPermissionIdsByIds(chartPermissionIds []string) (items []*ChartPerm
 	return
 }
 
-// GetChildChartPermissionListById 获取品种权限id列表
-func GetChildChartPermissionIdsById(chartPermissionId int) (items []string, err error) {
+// GetChartPermissionListByIds 根据品种ids获取品种权限列表
+func GetChartPermissionListByIds(chartPermissionIds []int) (items []*ChartPermission, err error) {
+	// 没有品种权限就返回空
+	if len(chartPermissionIds) == 0 {
+		return
+	}
 	o := orm.NewOrmUsingDB("rddp")
-	sql := `SELECT chart_permission_id FROM chart_permission WHERE enabled=1 AND product_id=1 AND parent_id=? ORDER BY sort ASC`
-	_, err = o.Raw(sql, chartPermissionId).QueryRows(&items)
+	sql := `SELECT * FROM chart_permission WHERE enabled=1 AND product_id=1 `
+	if len(chartPermissionIds) > 0 {
+		sql += fmt.Sprintf(" AND chart_permission_id IN (%s) ", utils.GetOrmReplaceHolder(len(chartPermissionIds)))
+	}
+	sql += ` ORDER BY sort ASC `
+
+	_, err = o.Raw(sql, chartPermissionIds).QueryRows(&items)
 	return
 }
 
-// GetChildChartPermissionListById 获取品种权限id列表
-func GetParentChartPermissionListByIds(chartPermissionIds []string) (items []*ChartPermission, err error) {
+// GetChartPermissionById 根据品种id获取品种权限
+func GetChartPermissionById(chartPermissionId int) (item *ChartPermission, err error) {
 	o := orm.NewOrmUsingDB("rddp")
-	sql := `SELECT * FROM chart_permission 
-	WHERE enabled=1 AND product_id=1 `
-	var idsStr string
-	if len(chartPermissionIds) > 0 {
-		idsStr = strings.Join(chartPermissionIds, ",")
-		sql += fmt.Sprintf(" AND chart_permission_id in (%s) ", idsStr)
-	}
-	sql += ` ORDER BY sort ASC`
-	_, err = o.Raw(sql).QueryRows(&items)
+	sql := `SELECT * FROM chart_permission WHERE enabled=1 AND product_id=1 AND chart_permission_id=?`
+	err = o.Raw(sql, chartPermissionId).QueryRow(&item)
 	return
 }
+
+// GetChildChartPermissionIdsById 根据品种id获取子品种权限的id列表
+func GetChildChartPermissionIdsById(chartPermissionId int) (items []int, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT chart_permission_id FROM chart_permission WHERE enabled=1 AND product_id=1 AND parent_id=? ORDER BY sort ASC`
+	_, err = o.Raw(sql, chartPermissionId).QueryRows(&items)
+	return
+}
+
+// // GetChartPermissionListByIds2 根据品种ids获取品种权限列表
+// func GetChartPermissionListByIds2(chartPermissionIds []string) (items []*ChartPermission, err error) {
+// 	if len(chartPermissionIds) == 0 {
+// 		return
+// 	}
+// 	o := orm.NewOrmUsingDB("rddp")
+// 	sql := `SELECT * FROM chart_permission
+// 	WHERE enabled=1 AND product_id=1 `
+// 	var idsStr string
+// 	if len(chartPermissionIds) > 0 {
+// 		idsStr = strings.Join(chartPermissionIds, ",")
+// 		sql += fmt.Sprintf(" AND chart_permission_id in (%s) ", idsStr)
+// 	}
+// 	sql += ` ORDER BY sort ASC`
+// 	_, err = o.Raw(sql).QueryRows(&items)
+// 	return
+// }

+ 39 - 7
models/chart_permission_search_key_word_mapping.go

@@ -1,6 +1,7 @@
 package models
 
 import (
+	"eta/eta_mini_bridge/utils"
 	"fmt"
 	"strings"
 
@@ -13,7 +14,7 @@ type ChartPermissionSearchKeyWordMapping struct {
 	ClassifyId        int `description:"分类id"`
 }
 
-func GetClassifyIdsListById(chartPermissionId int) (classifyIds []string, err error) {
+func GetClassifyIdsListById(chartPermissionId int) (classifyIds []int, err error) {
 	o := orm.NewOrmUsingDB("rddp")
 	sql := ` SELECT classify_id
 		FROM chart_permission_search_key_word_mapping	
@@ -31,7 +32,24 @@ func GetChartPermissionIdsListByClassifyId(classifyId int) (chartPermissionIds [
 	return
 }
 
-func GetChartPermissionIdsListByClassifyIds(classifyIds []string) (items []*ChartPermissionSearchKeyWordMapping, err error) {
+func GetChartPermissionIdsListByClassifyIds(classifyId []int) (chartPermissionIds []int, err error) {
+	if len(classifyId) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("rddp")
+	sql := ` SELECT chart_permission_id
+		FROM chart_permission_search_key_word_mapping	
+		WHERE classify_id = (%s) `
+	sql = fmt.Sprintf(sql, utils.GetOrmReplaceHolder(len(classifyId)))
+
+	_, err = o.Raw(sql, classifyId).QueryRows(&chartPermissionIds)
+	return
+}
+
+func GetChartPermissionListByClassifyStrIds(classifyIds []string) (items []*ChartPermissionSearchKeyWordMapping, err error) {
+	if len(classifyIds) == 0 {
+		return
+	}
 	o := orm.NewOrmUsingDB("rddp")
 	sql := ` SELECT * FROM chart_permission_search_key_word_mapping	WHERE 1=1 `
 	var idsStr string
@@ -43,16 +61,30 @@ func GetChartPermissionIdsListByClassifyIds(classifyIds []string) (items []*Char
 	return
 }
 
-func GetClassifyIdsListByIds(chartPermissionIds []string) (classifyIds []string, err error) {
+func GetChartPermissionListByClassifyIds(classifyIds []int) (items []*ChartPermissionSearchKeyWordMapping, err error) {
+	if len(classifyIds) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("rddp")
+	sql := ` SELECT * FROM chart_permission_search_key_word_mapping	WHERE 1=1 `
+	if len(classifyIds) > 0 {
+		sql += fmt.Sprintf(" AND classify_id in (%s) ", utils.GetOrmReplaceHolder(len(classifyIds)))
+	}
+	_, err = o.Raw(sql, classifyIds).QueryRows(&items)
+	return
+}
+
+func GetClassifyIdsListByIds(chartPermissionIds []int) (classifyIds []int, err error) {
+	if len(chartPermissionIds) == 0 {
+		return
+	}
 	o := orm.NewOrmUsingDB("rddp")
 	sql := ` SELECT classify_id
 		FROM chart_permission_search_key_word_mapping	
 		WHERE 1=1 `
-	var idsStr string
 	if len(chartPermissionIds) > 0 {
-		idsStr = strings.Join(chartPermissionIds, ",")
-		sql += fmt.Sprintf(" AND chart_permission_id in (%s) ", idsStr)
+		sql += fmt.Sprintf(" AND chart_permission_id in (%s) ", utils.GetOrmReplaceHolder(len(chartPermissionIds)))
 	}
-	_, err = o.Raw(sql).QueryRows(&classifyIds)
+	_, err = o.Raw(sql, chartPermissionIds).QueryRows(&classifyIds)
 	return
 }

+ 59 - 0
models/classify.go

@@ -1,9 +1,34 @@
 package models
 
 import (
+	"eta/eta_mini_bridge/utils"
 	"time"
+
+	"github.com/beego/beego/v2/client/orm"
 )
 
+type Classify struct {
+	Id           int       `description:"分类id"`
+	ClassifyName string    `description:"分类名称"`
+	Sort         int       `json:"-"`
+	ParentId     int       `description:"父级分类id"`
+	CreateTime   time.Time `description:"创建时间"`
+	ModifyTime   time.Time `description:"修改时间"`
+	Level        int       `description:"分类层级"`
+}
+
+type ClassifyView struct {
+	Id           int             `description:"分类id"`
+	ClassifyName string          `description:"分类名称"`
+	Sort         int             `json:"-"`
+	ParentId     int             `description:"父级分类id"`
+	CreateTime   time.Time       `description:"创建时间"`
+	ModifyTime   time.Time       `description:"修改时间"`
+	Level        int             `description:"分类层级"`
+	HasChild     int             `description:"是否有子分类0:下面没有子分类,1:下面有子分类"`
+	Child        []*ClassifyView `description:"子分类"`
+}
+
 type ClassifyDetail struct {
 	ClassifyId     int       `description:"分类id"`
 	ClassifyName   string    `description:"分类名称"`
@@ -22,3 +47,37 @@ type ClassifyDetail struct {
 	HomeImgUrl     string    `description:"首页配图"`
 	Stage          int       `description:"最新期数"`
 }
+
+func GetClassifyListByIds(ids []int) (items []*ClassifyView, err error) {
+	if len(ids) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT * FROM classify WHERE enabled=1 AND id IN (` + utils.GetOrmReplaceHolder(len(ids)) + `)`
+	_, err = o.Raw(sql, ids).QueryRows(&items)
+	return
+}
+
+func GetChildClassifyListByIds(ids []int) (items []*ClassifyView, err error) {
+	if len(ids) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT * FROM classify WHERE enabled=1 AND parent_id IN (` + utils.GetOrmReplaceHolder(len(ids)) + `)`
+	_, err = o.Raw(sql, ids).QueryRows(&items)
+	return
+}
+
+func GetClassifyById(id int) (item *ClassifyView, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT * FROM classify WHERE id = ?`
+	err = o.Raw(sql, id).QueryRow(&item)
+	return
+}
+
+func GetClassifyList() (items []*ClassifyView, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT * FROM classify`
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}

+ 129 - 65
models/report.go

@@ -1,8 +1,8 @@
 package models
 
 import (
+	"eta/eta_mini_bridge/utils"
 	"fmt"
-	"strings"
 	"time"
 
 	"github.com/beego/beego/v2/client/orm"
@@ -15,6 +15,8 @@ type ReportList struct {
 	ClassifyNameFirst  string    `description:"一级分类名称"`
 	ClassifyIdSecond   int       `description:"二级分类id"`
 	ClassifyNameSecond string    `description:"二级分类名称"`
+	ClassifyIdThird    int       `description:"三级分类id"`
+	ClassifyNameThird  string    `description:"三级分类名称"`
 	PermissionNames    []string  `description:"二级分类名称"`
 	Title              string    `description:"标题"`
 	Abstract           string    `description:"摘要"`
@@ -45,19 +47,22 @@ func GetReportDailyListCount() (count int, err error) {
 	return
 }
 
+//	func GetReportDailyList(startSize, pageSize int) (items []*ReportList, err error) {
+//		o := orm.NewOrmUsingDB("rddp")
+//		sql := ` SELECT a.id,a.add_type,a.classify_id_first,a.classify_name_first,a.classify_id_second,a.classify_name_second,a.title,a.abstract,a.author,a.frequency,
+//				a.create_time,a.modify_time,a.state,a.publish_time,a.stage,a.msg_is_send,b.id AS classify_id,b.classify_name,b.descript,b.report_author,b.author_descript,
+//	            b.report_img_url,b.head_img_url,b.avatar_img_url,b.column_img_url,a.video_url,a.video_name,a.video_play_seconds,a.video_size,
+//	            CASE WHEN DATE(a.publish_time)=DATE(NOW()) THEN 1 ELSE 0 END AS is_current_date
+//	            FROM report AS a
+//				INNER JOIN  classify AS b ON a.classify_id_second=b.id
+//				WHERE (a.state=2 OR a.state=6) AND DATE(a.publish_time)=DATE(NOW())
+//				ORDER BY  a.publish_time DESC LIMIT ?,?  `
+//		_, err = o.Raw(sql, startSize, pageSize).QueryRows(&items)
+//		return
+//	}
 func GetReportDailyList(startSize, pageSize int) (items []*ReportList, err error) {
 	o := orm.NewOrmUsingDB("rddp")
-	sql := ` SELECT a.id,a.add_type,a.classify_id_first,a.classify_name_first,a.classify_id_second,a.classify_name_second,a.title,a.abstract,a.author,a.frequency,
-			a.create_time,a.modify_time,a.state,a.publish_time,a.stage,a.msg_is_send,b.id AS classify_id,b.classify_name,b.descript,b.report_author,b.author_descript,
-            b.report_img_url,b.head_img_url,b.avatar_img_url,b.column_img_url,a.video_url,a.video_name,a.video_play_seconds,a.video_size,
-            CASE WHEN DATE(a.publish_time)=DATE(NOW()) THEN 1 ELSE 0 END AS is_current_date
-            FROM report AS a
-			INNER JOIN  classify AS b ON a.classify_id_second=b.id
-			WHERE (a.state=2 OR a.state=6) AND DATE(a.publish_time)=DATE(NOW()) AND a.classify_id_second IN (
-				SELECT DISTINCT classify_id
-				FROM chart_permission_search_key_word_mapping
-			)
-			ORDER BY  a.publish_time DESC LIMIT ?,?  `
+	sql := ` SELECT * FROM report WHERE (state=2 OR state=6) AND DATE(publish_time)=DATE(NOW()) ORDER BY publish_time DESC LIMIT ?,?  `
 	_, err = o.Raw(sql, startSize, pageSize).QueryRows(&items)
 	return
 }
@@ -76,38 +81,54 @@ func GetReportRecentListCount() (count int, err error) {
 
 func GetReportRecentList(startSize, pageSize int) (items []*ReportList, err error) {
 	o := orm.NewOrmUsingDB("rddp")
-	sql := ` SELECT a.id,a.add_type,a.classify_id_first,a.classify_name_first,a.classify_id_second,a.classify_name_second,a.title,a.abstract,a.author,a.frequency,
-			a.create_time,a.modify_time,a.state,a.publish_time,a.stage,a.msg_is_send,b.id AS classify_id,b.classify_name,b.descript,b.report_author,b.author_descript,
-            b.report_img_url,b.head_img_url,b.avatar_img_url,b.column_img_url,a.video_url,a.video_name,a.video_play_seconds,a.video_size,
-            CASE WHEN DATE(a.publish_time)=DATE(NOW()) THEN 1 ELSE 0 END AS is_current_date
-            FROM report AS a
-			INNER JOIN  classify AS b ON a.classify_id_second=b.id
-			WHERE (a.state=2 OR a.state=6) AND a.classify_id_second IN (
-				SELECT DISTINCT classify_id
-				FROM chart_permission_search_key_word_mapping
-			)
-			ORDER BY  a.publish_time DESC LIMIT ?,?  `
+	sql := ` SELECT * FROM report WHERE (state=2 OR state=6) ORDER BY publish_time DESC LIMIT ?,?  `
 	_, err = o.Raw(sql, startSize, pageSize).QueryRows(&items)
 	return
 }
 
-func GetReportCountByClassifyIds(classifyIds []string, condition string) (count int, err error) {
+func GetReportCountByClassifyIds(classifyFirstIds, classifySecondIds, classifyThirdIds []int, condition string) (count int, err error) {
+	if len(classifyFirstIds) == 0 && len(classifySecondIds) == 0 && len(classifyThirdIds) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT  COUNT(*) AS count  FROM report AS a WHERE (a.state=2 OR a.state=6) AND (1=2 `
+
+	if len(classifyFirstIds) > 0 {
+		sql += fmt.Sprintf(" OR a.classify_id_first IN (%s) ", utils.GetOrmReplaceHolder(len(classifyFirstIds)))
+	}
+	if len(classifySecondIds) > 0 {
+		sql += fmt.Sprintf(" OR a.classify_id_second IN (%s) ", utils.GetOrmReplaceHolder(len(classifySecondIds)))
+	}
+	if len(classifyThirdIds) > 0 {
+		sql += fmt.Sprintf(" OR a.classify_id_third IN (%s) ", utils.GetOrmReplaceHolder(len(classifyThirdIds)))
+	}
+	sql += ` ) `
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, classifyFirstIds, classifySecondIds, classifyThirdIds).QueryRow(&count)
+	return
+}
+
+func GetReportByClassifyIds(classifyIds []int, condition string) (count int, err error) {
+	if len(classifyIds) == 0 {
+		return
+	}
 	o := orm.NewOrmUsingDB("rddp")
 	sql := `SELECT  COUNT(*) AS count  FROM report AS a
 			WHERE (a.state=2 OR a.state=6) AND a.classify_id_second IN (%s) `
-	var reportIdsStr string
-	if len(classifyIds) > 0 {
-		reportIdsStr = strings.Join(classifyIds, ",")
-		sql = fmt.Sprintf(sql, reportIdsStr)
-	}
+	sql = fmt.Sprintf(sql, utils.GetOrmReplaceHolder(len(classifyIds)))
 	if condition != "" {
 		sql += condition
 	}
-	err = o.Raw(sql).QueryRow(&count)
+	err = o.Raw(sql, classifyIds).QueryRow(&count)
 	return
 }
 
-func GetReportListByClassifyIds(classifyIds []string, condition string, startSize, pageSize int) (items []*ReportList, err error) {
+func GetReportListByClassifyIds(classifyFirstIds, classifySecondIds, classifyThirdIds []int, condition string, startSize, pageSize int) (items []*ReportList, err error) {
+	if len(classifyFirstIds) == 0 && len(classifySecondIds) == 0 && len(classifyThirdIds) == 0 {
+		return
+	}
 	o := orm.NewOrmUsingDB("rddp")
 	sql := `SELECT a.id,a.add_type,a.classify_id_first,a.classify_name_first,a.classify_id_second,a.classify_name_second,a.title,a.abstract,a.author,a.frequency,
 			a.create_time,a.modify_time,a.state,a.publish_time,a.stage,a.msg_is_send,b.id AS classify_id,b.classify_name,b.descript,b.report_author,b.author_descript,
@@ -115,49 +136,76 @@ func GetReportListByClassifyIds(classifyIds []string, condition string, startSiz
             CASE WHEN DATE(a.modify_time)=DATE(NOW()) THEN 1 ELSE 0 END AS is_current_date
             FROM report AS a
 			INNER JOIN  classify AS b ON a.classify_id_second=b.id
-			WHERE (a.state=2 OR a.state=6) AND a.classify_id_second IN (%s) `
-
-	var reportIdsStr string
-	if len(classifyIds) > 0 {
-		reportIdsStr = strings.Join(classifyIds, ",")
-		sql = fmt.Sprintf(sql, reportIdsStr)
+			WHERE (a.state=2 OR a.state=6) AND (1=2 `
+	// AND (a.classify_id_first IN (%s) OR a.classify_id_second IN (%s) OR a.classify_id_third IN (%s)) `
+	if len(classifyFirstIds) > 0 {
+		sql += fmt.Sprintf(" OR a.classify_id_first IN (%s) ", utils.GetOrmReplaceHolder(len(classifyFirstIds)))
+	}
+	if len(classifySecondIds) > 0 {
+		sql += fmt.Sprintf(" OR a.classify_id_second IN (%s) ", utils.GetOrmReplaceHolder(len(classifySecondIds)))
+	}
+	if len(classifyThirdIds) > 0 {
+		sql += fmt.Sprintf(" OR a.classify_id_third IN (%s) ", utils.GetOrmReplaceHolder(len(classifyThirdIds)))
 	}
+	sql += `) `
 	if condition != "" {
 		sql += condition
 	}
 	sql += ` ORDER BY  a.publish_time DESC LIMIT ?,? `
-	_, err = o.Raw(sql, startSize, pageSize).QueryRows(&items)
+	_, err = o.Raw(sql, classifyFirstIds, classifySecondIds, classifyThirdIds, startSize, pageSize).QueryRows(&items)
 	return
 }
 
 type ReportDetail struct {
-	Id                 int    `description:"报告Id"`
-	AddType            int    `description:"新增方式:1:新增报告,2:继承报告"`
-	ClassifyIdFirst    int    `description:"一级分类id"`
-	ClassifyNameFirst  string `description:"一级分类名称"`
-	ClassifyIdSecond   int    `description:"二级分类id"`
-	ClassifyNameSecond string `description:"二级分类名称"`
-	Title              string `description:"标题"`
-	Abstract           string `description:"摘要"`
-	Author             string `description:"作者"`
-	Frequency          string `description:"频度"`
-	CreateTime         string `description:"创建时间"`
-	ModifyTime         string `description:"修改时间"`
-	State              int    `description:"1:未发布,2:已发布"`
-	PublishTime        string `description:"发布时间"`
-	Stage              int    `description:"期数"`
-	MsgIsSend          int    `description:"消息是否已发送,0:否,1:是"`
-	Content            string `description:"内容"`
-	VideoUrl           string `description:"音频文件URL"`
-	VideoName          string `description:"音频文件名称"`
-	VideoPlaySeconds   string `description:"音频播放时长"`
-	VideoSize          string `description:"音频文件大小,单位M"`
-	ContentSub         string `description:"内容前两个章节"`
-	IsShowNewLabel     int    `description:"是否显示新标签"`
-	IsCurrentDate      int    `description:"是否当前日期"`
-	ClassifyName       string `description:"分类名称"`
-	TitleType          string `description:"标题类型,FICC或者权益"`
-	IsPublic           bool   `description:"是否是公共报告 "`
+	Id                 int                  `description:"报告Id"`
+	AddType            int                  `description:"新增方式:1:新增报告,2:继承报告"`
+	ClassifyIdFirst    int                  `description:"一级分类id"`
+	ClassifyNameFirst  string               `description:"一级分类名称"`
+	ClassifyIdSecond   int                  `description:"二级分类id"`
+	ClassifyNameSecond string               `description:"二级分类名称"`
+	ClassifyIdThird    int                  `description:"三级分类id"`
+	ClassifyNameThird  string               `description:"三级分类名称"`
+	Title              string               `description:"标题"`
+	Abstract           string               `description:"摘要"`
+	Author             string               `description:"作者"`
+	Frequency          string               `description:"频度"`
+	CreateTime         string               `description:"创建时间"`
+	ModifyTime         string               `description:"修改时间"`
+	State              int                  `description:"1:未发布,2:已发布"`
+	PublishTime        string               `description:"发布时间"`
+	Stage              int                  `description:"期数"`
+	MsgIsSend          int                  `description:"消息是否已发送,0:否,1:是"`
+	Content            string               `description:"内容"`
+	ChapterContent     []*ReportChapter     `description:"章节内容"`
+	VideoUrl           string               `description:"音频文件URL"`
+	VideoName          string               `description:"音频文件名称"`
+	VideoPlaySeconds   string               `description:"音频播放时长"`
+	VideoSize          string               `description:"音频文件大小,单位M"`
+	ContentSub         string               `description:"内容前两个章节"`
+	IsShowNewLabel     int                  `description:"是否显示新标签"`
+	IsCurrentDate      int                  `description:"是否当前日期"`
+	ClassifyName       string               `description:"分类名称"`
+	TitleType          string               `description:"标题类型,FICC或者权益"`
+	IsPublic           bool                 `description:"是否是公共报告 "`
+	HeadResourceId     int                  `description:"版头资源库id"`
+	EndResourceId      int                  `description:"版尾资源库id"`
+	HeadResource       *SmartReportResource `description:"版头资源库"`
+	EndResource        *SmartReportResource `description:"版尾资源库"`
+	CollaborateType    int                  `description:"合作类型, 1:个人,2:多人协作"`
+	ReportLayout       int                  `description:"报告布局, 1:常规布局,2:智能布局"`
+	HasChapter         int                  `description:"是否有章节: 0-否 1-是"`
+}
+
+type ReportChapter struct {
+	Title   string `description:"章节标题"`
+	Content string `description:"章节内容"`
+}
+
+func GetReportChapterList(reportId int) (items []*ReportChapter, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT * FROM report_chapter WHERE report_id=?`
+	_, err = o.Raw(sql, reportId).QueryRows(&items)
+	return
 }
 
 func GetReportById(reportId int) (item *ReportDetail, err error) {
@@ -181,4 +229,20 @@ type ReportCollectListItem struct {
 	Abstract            string    `description:"摘要"`
 	Stage               string    `description:"期数"`
 	Author              string    `description:"作者"`
+	PdfUrl              string    `description:"pdf文件url"`
+	ReportType          int       `description:"报告类型:1:eta报告,2:小程序pdf报告"`
+}
+
+type SmartReportResource struct {
+	ResourceId int    `description:"资源库id"`
+	ImgUrl     string `description:"图片url"`
+	Type       int    `description:"资源类型:1-版头 2-版尾"`
+	Style      string `description:"版图样式"`
+}
+
+func GetSmartReportResourceById(resourceId int) (item *SmartReportResource, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT * FROM smart_report_resource WHERE resource_id=?`
+	err = o.Raw(sql, resourceId).QueryRow(&item)
+	return
 }

+ 58 - 0
models/report_pdf.go

@@ -0,0 +1,58 @@
+package models
+
+import (
+	"time"
+
+	"github.com/beego/beego/v2/client/orm"
+)
+
+type ReportPdf struct {
+	ReportPdfId        int       `orm:"pk" description:"id"`
+	PdfUrl             string    `description:"pdf文件URL"`
+	PdfName            string    `description:"pdf文件名称"`
+	Title              string    `description:"pdf文件标题"`
+	Author             string    `description:"作者"`
+	Abstract           string    `description:"摘要"`
+	ClassifyIdFirst    int       `description:"一级分类id"`
+	ClassifyNameFirst  string    `description:"一级分类名称"`
+	ClassifyIdSecond   int       `description:"二级分类id"`
+	ClassifyNameSecond string    `description:"二级分类名称"`
+	ClassifyIdThird    int       `description:"三级分类id"`
+	ClassifyNameThird  string    `description:"三级分类名称"`
+	Stage              int       `description:"期数"`
+	PublishTime        time.Time `description:"发布时间"`
+	ModifyTime         time.Time `description:"更新时间"`
+	Pv                 int       `description:"pv"`
+	Uv                 int       `description:"uv"`
+	SysUserId          int       `description:"创建人id"`
+	SysRealName        string    `description:"创建人姓名"`
+	State              int       `description:"状态"`
+}
+
+func GetReportPdfClasssify() (items []*ReportPdf, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT report_pdf_id,classify_id_first, classify_id_second, classify_id_third, classify_name_first, classify_name_second, classify_name_third FROM report_pdf `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// MultiUpdateReportPdfClassify修改pdf研报的分类
+func MultiUpdateReportPdfClassify(items []*ReportPdf) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	o := orm.NewOrm()
+
+	sql := `UPDATE report_pdf SET classify_id_first=?, classify_id_second=?, classify_id_third=?, classify_name_first=?,classify_name_second=?,classify_name_third=? WHERE report_pdf_id=?`
+	db, err := o.Raw(sql).Prepare()
+	if err != nil {
+		return
+	}
+	for _, v := range items {
+		_, err = db.Exec(v.ClassifyIdFirst, v.ClassifyIdSecond, v.ClassifyIdThird, v.ClassifyNameFirst, v.ClassifyNameSecond, v.ClassifyNameThird, v.ReportPdfId)
+		if err != nil {
+			return
+		}
+	}
+	return
+}

+ 5 - 0
models/request/classify.go

@@ -0,0 +1,5 @@
+package request
+
+type ClassifyReq struct {
+	ClassifyIds []int `description:"二级分类id"`
+}

+ 6 - 0
models/response/classify.go

@@ -0,0 +1,6 @@
+package response
+
+type ClassifyPermissionItemResp struct {
+	ClassifyId      int      `description:"二级分类id"`
+	PermissionNames []string `description:"权限名称列表"`
+}

+ 5 - 0
models/response/report.go

@@ -19,12 +19,15 @@ type ReportDetailResp struct {
 	Report *models.ReportDetail `description:"报告"`
 	Status int                  `description:"报告状态"`
 }
+
 type ReportSearchResp struct {
 	Paging *paging.PagingItem
 	List   []*models.ReportCollectListItem
 }
 
 type EsReportItem struct {
+	ReportPdfId        int    `description:"pdf文件id"`
+	PdfUrl             string `description:"pdf文件URL"`
 	Author             string `description:"作者"`
 	BodyContent        string `description:"内容"`
 	Categories         string `description:"品种名称"`
@@ -33,10 +36,12 @@ type EsReportItem struct {
 	ClassifyIdSecond   int    `description:"二级分类id"`
 	ClassifyNameSecond string `description:"二级分类名称"`
 	PublishState       int    `description:"1:未发布,2:已发布"`
+	State              int    `description:"pdf报告:1:已发布,2:未发布"`
 	PublishTime        string `description:"发布时间"`
 	ReportChapterId    int    `description:"报告章节Id"`
 	ReportId           int    `description:"报告Id"`
 	Title              string `description:"标题"`
 	Abstract           string `description:"摘要"`
 	StageStr           string `description:"期数"`
+	Stage              int    `description:"pdf期数"`
 }

+ 1 - 1
models/user_chart_permission_mapping.go

@@ -8,7 +8,7 @@ type UserChartPermissionMapping struct {
 	ChartPermissionId            int `description:"品种id"`
 }
 
-func GetChartPermissionIdByUserId(UserId int) (items []string, err error) {
+func GetChartPermissionIdByUserId(UserId int) (items []int, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT chart_permission_id FROM user_chart_permission_mapping WHERE user_id=?`
 	_, err = o.Raw(sql, UserId).QueryRows(&items)

+ 45 - 0
routers/commentsRouter.go

@@ -34,6 +34,33 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mini_bridge/controllers:ChartPermissionController"] = append(beego.GlobalControllerRouter["eta/eta_mini_bridge/controllers:ChartPermissionController"],
+        beego.ControllerComments{
+            Method: "DetailByClassify",
+            Router: `/classify/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mini_bridge/controllers:ChartPermissionController"] = append(beego.GlobalControllerRouter["eta/eta_mini_bridge/controllers:ChartPermissionController"],
+        beego.ControllerComments{
+            Method: "ClassifyList",
+            Router: `/classify/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mini_bridge/controllers:ChartPermissionController"] = append(beego.GlobalControllerRouter["eta/eta_mini_bridge/controllers:ChartPermissionController"],
+        beego.ControllerComments{
+            Method: "ClassifyTree",
+            Router: `/classify/tree`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_mini_bridge/controllers:ChartPermissionController"] = append(beego.GlobalControllerRouter["eta/eta_mini_bridge/controllers:ChartPermissionController"],
         beego.ControllerComments{
             Method: "Detail",
@@ -79,6 +106,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mini_bridge/controllers:ClassifyController"] = append(beego.GlobalControllerRouter["eta/eta_mini_bridge/controllers:ClassifyController"],
+        beego.ControllerComments{
+            Method: "FirstChartPermission",
+            Router: `/chart_permission/first`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mini_bridge/controllers:ClassifyController"] = append(beego.GlobalControllerRouter["eta/eta_mini_bridge/controllers:ClassifyController"],
+        beego.ControllerComments{
+            Method: "AllClassify",
+            Router: `/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_mini_bridge/controllers:ReportController"] = append(beego.GlobalControllerRouter["eta/eta_mini_bridge/controllers:ReportController"],
         beego.ControllerComments{
             Method: "Today",

+ 5 - 0
routers/router.go

@@ -43,6 +43,11 @@ func init() {
 				&controllers.WeChatController{},
 			),
 		),
+		web.NSNamespace("/classify",
+			web.NSInclude(
+				&controllers.ClassifyController{},
+			),
+		),
 	)
 	web.AddNamespace(ns)
 }

+ 156 - 0
scheduler/task.go

@@ -0,0 +1,156 @@
+package scheduler
+
+import (
+	"context"
+	"eta/eta_mini_bridge/models"
+	"eta/eta_mini_bridge/utils"
+	"fmt"
+	"strconv"
+	"strings"
+
+	"github.com/beego/beego/v2/task"
+)
+
+func InitJob() {
+	fmt.Println("定时任务开启。。。")
+	// 每天凌晨12点10分检测, 发送消息
+	tk1 := task.NewTask("UpdateReportClassify", "0 */1 * * * *", UpdateReportClassify)
+	task.AddTask("UpdateReportClassify", tk1)
+	task.StartTask()
+}
+
+func UpdateReportClassify(ctx context.Context) (err error) {
+	reportPdfClassifys, err := models.GetReportPdfClasssify()
+	if err != nil {
+		return
+	}
+	classifyList, err := models.GetClassifyList()
+	if err != nil {
+		return
+	}
+	updateReportOriginClassifyName(reportPdfClassifys, classifyList)
+	classifyIdFirsts := make([]int, 0)
+	classifyIdSeconds := make([]int, 0)
+	for _, v := range reportPdfClassifys {
+		if v.ClassifyIdFirst == 0 {
+			utils.FileLog.Info("分类id错误,获取失败,错误pdf研报id:" + fmt.Sprintf("%d", v.ReportPdfId))
+			continue
+		}
+		if v.ClassifyIdThird == 0 && v.ClassifyIdSecond == 0 {
+			classifyIdFirsts = append(classifyIdFirsts, v.ClassifyIdFirst)
+		} else if v.ClassifyIdThird == 0 {
+			classifyIdSeconds = append(classifyIdSeconds, v.ClassifyIdSecond)
+		}
+
+	}
+
+	updateReportClassify(reportPdfClassifys, classifyIdFirsts, 1)
+	updateReportClassify(reportPdfClassifys, classifyIdSeconds, 2)
+	return nil
+}
+
+// updateReportOriginClassifyName 更新原始的pdf报告的分类
+func updateReportOriginClassifyName(reportList []*models.ReportPdf, classifyList []*models.ClassifyView) (err error) {
+	classifyMap := make(map[int]*models.ClassifyView)
+	for _, v := range classifyList {
+		classifyMap[v.Id] = v
+	}
+	modifyReportPdfList := make([]*models.ReportPdf, 0)
+	var isModify bool
+	for _, v := range reportList {
+		isModify = false
+		if v.ClassifyIdFirst != 0 {
+			firstName := classifyMap[v.ClassifyIdFirst].ClassifyName
+			if v.ClassifyNameFirst != firstName {
+				v.ClassifyNameFirst = firstName
+				isModify = true
+			}
+		}
+		if v.ClassifyIdSecond != 0 {
+			secondName := classifyMap[v.ClassifyIdSecond].ClassifyName
+			if v.ClassifyNameSecond != secondName {
+				v.ClassifyNameSecond = secondName
+				isModify = true
+			}
+		}
+		if v.ClassifyIdThird != 0 {
+			thirdName := classifyMap[v.ClassifyIdThird].ClassifyName
+			if v.ClassifyNameThird != thirdName {
+				v.ClassifyNameThird = thirdName
+				isModify = true
+			}
+		}
+		if isModify {
+			modifyReportPdfList = append(modifyReportPdfList, v)
+		}
+	}
+
+	err = models.MultiUpdateReportPdfClassify(modifyReportPdfList)
+	if err != nil {
+		utils.FileLog.Warn("研报更新分类失败")
+	}
+	if len(modifyReportPdfList) > 0 {
+		var reportIds []string
+		for _, v := range modifyReportPdfList {
+			reportIds = append(reportIds, strconv.Itoa(v.ReportPdfId))
+		}
+		utils.FileLog.Info(fmt.Sprintf("更新分类成功,更新研报为:%s", strings.Join(reportIds, ",")))
+	}
+	return
+}
+
+// updateReportClassify 更新增加分类pdf报告
+func updateReportClassify(reportList []*models.ReportPdf, classifyList []int, level int) (err error) {
+	modifyReportList := make([]*models.ReportPdf, 0)
+	preClassifyList, err := models.GetClassifyListByIds(classifyList)
+	if err != nil {
+		utils.FileLog.Info("获取一级分类失败,错误分类id:" + fmt.Sprintf("%v", classifyList))
+	}
+	if len(preClassifyList) > 0 {
+		tmpClassifyIds := make([]int, 0)
+		for _, v := range preClassifyList {
+			if v.HasChild == 1 {
+				tmpClassifyIds = append(tmpClassifyIds, v.Id)
+			}
+		}
+		childClassify, err := models.GetChildClassifyListByIds(tmpClassifyIds)
+		if err != nil {
+			utils.FileLog.Info("获取二级分类失败,错误分类id:" + fmt.Sprintf("%v", tmpClassifyIds))
+		}
+		var isModify bool
+		for _, v := range reportList {
+			isModify = false
+			for _, vv := range childClassify {
+				switch level {
+				case 1:
+					if v.ClassifyIdFirst == vv.ParentId {
+						v.ClassifyIdSecond = vv.Id
+						v.ClassifyNameSecond = vv.ClassifyName
+						isModify = true
+					}
+				case 2:
+					if v.ClassifyIdSecond == vv.ParentId {
+						v.ClassifyIdThird = vv.Id
+						v.ClassifyNameThird = vv.ClassifyName
+						isModify = true
+					}
+				}
+			}
+			if isModify {
+				modifyReportList = append(modifyReportList, v)
+			}
+		}
+		err = models.MultiUpdateReportPdfClassify(modifyReportList)
+		if err != nil {
+			utils.FileLog.Warn("研报更新分类失败")
+		}
+		if len(modifyReportList) > 0 {
+			var reportIds []string
+			for _, v := range modifyReportList {
+				reportIds = append(reportIds, strconv.Itoa(v.ReportPdfId))
+			}
+			utils.FileLog.Info(fmt.Sprintf("更新分类成功,更新研报为:%s", strings.Join(reportIds, ",")))
+		}
+	}
+	return
+}

+ 22 - 0
services/user_permission.go → services/chart_permission.go

@@ -2,6 +2,7 @@ package services
 
 import (
 	"errors"
+	"eta/eta_mini_bridge/models"
 	"eta/eta_mini_bridge/utils"
 	"strconv"
 )
@@ -30,3 +31,24 @@ func CheckUserPermission(userId int) (status int, err error) {
 	}
 	return
 }
+
+// GetClassifyTree 递归获取分类目录树
+func GetClassifyTree(list []*models.ClassifyView, parentId int) []*models.ClassifyView {
+	res := make([]*models.ClassifyView, 0)
+	for _, v := range list {
+		if v.ParentId == parentId {
+			t := new(models.ClassifyView)
+			t.Id = v.Id
+			t.ClassifyName = v.ClassifyName
+			t.CreateTime = v.CreateTime
+			t.HasChild = v.HasChild
+			t.Level = v.Level
+			t.ModifyTime = v.ModifyTime
+			t.ParentId = v.ParentId
+			t.Sort = v.Sort
+			t.Child = GetClassifyTree(list, v.Id)
+			res = append(res, t)
+		}
+	}
+	return res
+}

+ 45 - 1
services/elastic/report.go

@@ -120,7 +120,8 @@ func SearchReport(keyWord string, classifyIdFirsts []int, classifyIdSeconds []in
 	fmt.Printf("%s", jsonstr)
 
 	request := utils.EsClient.Search(indexName).Source(source) // sets the JSON request
-
+	// request := utils.EsClient.Search().Index(indice...).Source(source) // sets the JSON request
+	fmt.Println(source)
 	searchResp, err = request.Do(context.Background())
 	if err != nil {
 		fmt.Print("结果err:")
@@ -137,6 +138,49 @@ func SearchReport(keyWord string, classifyIdFirsts []int, classifyIdSeconds []in
 	return
 }
 
+func SearchReportV2(keyWord string, classifyIdFirsts []int, classifyIdSeconds []int, pageIndex, pageSize int) (searchResp *elastic.SearchResult, total int64, err error) {
+	indices := []string{utils.EsReportIndexName, utils.MINI_REPORT_INDEX_NAME}
+	query := elastic.NewBoolQuery().
+		Filter(
+			elastic.NewBoolQuery().Should(
+				elastic.NewTermQuery("PublishState", 2),
+				elastic.NewTermQuery("State", 1),
+			),
+		).
+		Must(
+			elastic.NewBoolQuery().Should(
+				elastic.NewMatchPhraseQuery("Title", keyWord).Boost(5),
+			),
+		)
+
+	sort1 := elastic.NewFieldSort("PublishTime.keyword").Desc()
+	sort2 := elastic.NewScoreSort().Desc()
+	searchResp, err = utils.EsClient.Search().
+		Index(indices...).
+		Query(query).
+		SortBy(sort1, sort2).
+		Highlight(elastic.NewHighlight().
+			PreTags("<span class=\"report-title_color\">").
+			PostTags("</span>").
+			Field("Title")).
+		From((pageIndex - 1) * pageSize).
+		Size(pageSize).
+		Pretty(true).
+		Do(context.Background())
+	// searchResp, err = request.Do(context.Background())
+	if err != nil {
+		fmt.Print("结果err:")
+		fmt.Println(err.Error())
+		return
+	}
+	total = searchResp.TotalHits()
+
+	if searchResp.Status != 0 {
+		err = errors.New("查询失败")
+	}
+	return
+}
+
 // ReportListSearch 报告列表页的搜索
 func ReportListSearch(keyWord string, classifyIdFirst int, classifyIdSeconds []int, pageIndex, pageSize int) (searchResp *elastic.SearchResult, total int64, err error) {
 	indexName := utils.EsReportIndexName

+ 14 - 5
services/report.go

@@ -8,6 +8,7 @@ import (
 	"eta/eta_mini_bridge/services/elastic"
 	"eta/eta_mini_bridge/utils"
 	"html"
+	"strconv"
 	"strings"
 	"time"
 
@@ -52,7 +53,7 @@ func addAliasToKeyword(keyword string) string {
 func SearchReport(keyWord string, pageIndex, pageSize int) (ret *response.ReportSearchResp, err error, errMsg string) {
 	//查询正常状态的分类
 	keyWord = addAliasToKeyword(keyWord)
-	searchResp, total, err := elastic.SearchReport(keyWord, []int{}, []int{}, pageIndex, pageSize)
+	searchResp, total, err := elastic.SearchReportV2(keyWord, []int{}, []int{}, pageIndex, pageSize)
 	if err != nil {
 		errMsg = err.Error()
 		err = errors.New("查询失败")
@@ -75,18 +76,26 @@ func SearchReport(keyWord string, pageIndex, pageSize int) (ret *response.Report
 				err = errors.New("解析json出错")
 				return
 			}
-			temp.ReportId = reportItem.ReportId
+			if reportItem.ReportPdfId != 0 {
+				temp.ReportId = reportItem.ReportPdfId
+				temp.ReportType = utils.ReportTypePdf
+				temp.Stage = strconv.Itoa(reportItem.Stage)
+			} else {
+				temp.ReportId = reportItem.ReportId
+				temp.ReportType = utils.ReportTypeEta
+				temp.Stage = reportItem.StageStr
+				temp.ContentSub = reportItem.BodyContent
+			}
+			temp.PdfUrl = reportItem.PdfUrl
 			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)
+			temp.Title = reportItem.Title
 			temp.Abstract = reportItem.Abstract
 			temp.Author = reportItem.Author
-			temp.Stage = reportItem.StageStr
 
 			if len(v.Highlight["Title"]) > 0 {
 				temp.Title = v.Highlight["Title"][0]

+ 3 - 3
services/template_msg.go

@@ -171,18 +171,18 @@ func SendMultiTemplateMsg(sendData map[string]interface{}, items []*OpenIdList,
 		}
 		// 推送消息记录
 		{
-			go func(v *OpenIdList) {
+			go func() {
 				sendStatus := 1
 				if e != nil {
 					sendStatus = 0
 				}
 				resultJson, _ := json.Marshal(result)
-				err = AddUserTemplateRecord(v.UserId, sendStatus, sendType, v.OpenId, string(data), string(resultJson))
+				err = AddUserTemplateRecord(item.UserId, sendStatus, sendType, item.OpenId, string(data), string(resultJson))
 				if err != nil {
 					utils.FileLog.Info("新增模板消息推送记录失败, Err:" + err.Error())
 					return
 				}
-			}(item)
+			}()
 		}
 	}
 	return

+ 11 - 0
utils/common.go

@@ -101,3 +101,14 @@ func Unique[T comparable](slice []T) []T {
 	}
 	return unique
 }
+
+func GetOrmReplaceHolder(num int) string {
+	var stringBuffer strings.Builder
+	for i := 0; i < num; i++ {
+		stringBuffer.WriteString("?")
+		if i != num-1 {
+			stringBuffer.WriteString(",")
+		}
+	}
+	return stringBuffer.String()
+}

+ 5 - 2
utils/config.go

@@ -57,9 +57,9 @@ var (
 
 // ES索引配置
 var (
+	MINI_REPORT_INDEX_NAME         string // 小程序的pdf报告索引
 	EsReportIndexName              string //研报ES索引
 	EsSemanticAnalysisDocIndexName string //ES语义分析文档索引名
-	SmartReportIndexName           string //智能研报ES索引
 )
 
 func init() {
@@ -123,9 +123,12 @@ func init() {
 	}
 	// ES 索引
 	{
+		MINI_REPORT_INDEX_NAME = config["es_mini_report_index_name"]
+		if MINI_REPORT_INDEX_NAME == "" {
+			MINI_REPORT_INDEX_NAME = "test_dw_mini_pdf_report_v1"
+		}
 		EsReportIndexName = config["es_report_index_name"]
 		EsSemanticAnalysisDocIndexName = config["es_semantic_analysis_doc_index_name"]
-		SmartReportIndexName = config["es_smart_report_index_name"]
 	}
 	initEs()
 

+ 6 - 0
utils/constants.go

@@ -38,3 +38,9 @@ const (
 	UserStatusPotential = 1 //潜在用户
 	UserStatusFormal    = 2 //正式用户
 )
+
+// 报告类型
+const (
+	ReportTypeEta = 1 // eta的研报
+	ReportTypePdf = 2 // pdf的研报
+)