kobe6258 il y a 7 mois
Parent
commit
799eeead31

+ 21 - 4
common/exception/exc_enums.go

@@ -16,8 +16,11 @@ const (
 	SysErrCode int = iota + 10000 // iota 自动递增,从 1 开始
 	SysErrCode int = iota + 10000 // iota 自动递增,从 1 开始
 	UnknownError
 	UnknownError
 	Unauthorized
 	Unauthorized
-	// SMSErrCode BIZErrCode 业务错误
-	SMSErrCode int = iota + 20000 // iota 自动递增,从 1 开始
+)
+
+// BIZErrCode  业务错误
+const (
+	BIZErrCode int = iota + 20000 // iota 自动递增,从 1 开始
 	//短信
 	//短信
 	IllegalCodeLength
 	IllegalCodeLength
 	IllegalPhoneNumber
 	IllegalPhoneNumber
@@ -26,7 +29,10 @@ const (
 	SMSCodeAlreadySent
 	SMSCodeAlreadySent
 	SMSCodeExpired
 	SMSCodeExpired
 	SMSCodeError
 	SMSCodeError
-	// UserErrCode 用户
+)
+
+// UserErrCode 用户
+const (
 	UserErrCode int = iota + 30000 // iota 自动递增,从 1 开始
 	UserErrCode int = iota + 30000 // iota 自动递增,从 1 开始
 	TemplateUserNotFound
 	TemplateUserNotFound
 	TemplateUserCreateFailed
 	TemplateUserCreateFailed
@@ -35,7 +41,10 @@ const (
 
 
 	JWTTokenExpired
 	JWTTokenExpired
 	JWTTokenInvalid
 	JWTTokenInvalid
-	// WechatErrCode 微信
+)
+
+// WechatErrCode 微信
+const (
 	WechatErrCode int = iota + 40000 // iota 自动递增,从 1 开始
 	WechatErrCode int = iota + 40000 // iota 自动递增,从 1 开始
 	WeChatServerError
 	WeChatServerError
 	WeChatResponseError
 	WeChatResponseError
@@ -43,6 +52,11 @@ const (
 	WeChatCodeEmpty
 	WeChatCodeEmpty
 	WeChatIllegalRequest
 	WeChatIllegalRequest
 )
 )
+const (
+	ReportErrCode int = iota + 50000 // iota 自动递增,从 1 开始
+	GetPublishedRandListFailed
+	GetPermissionListFailed
+)
 
 
 // ErrorMap 用于存储错误码和错误信息的映射
 // ErrorMap 用于存储错误码和错误信息的映射
 var ErrorMap = map[int]string{
 var ErrorMap = map[int]string{
@@ -68,6 +82,9 @@ var ErrorMap = map[int]string{
 	WeChatResponseError:  "解析微信响应数据失败",
 	WeChatResponseError:  "解析微信响应数据失败",
 	WeChatCodeEmpty:      "微信获取用户信息,code不能为空",
 	WeChatCodeEmpty:      "微信获取用户信息,code不能为空",
 	WeChatIllegalRequest: "不合法的微信请求",
 	WeChatIllegalRequest: "不合法的微信请求",
+	//研报
+	GetPublishedRandListFailed: "获取已发布研报列表失败",
+	GetPermissionListFailed:    "获取品种列表失败",
 }
 }
 
 
 func Equals(code int, message string) bool {
 func Equals(code int, message string) bool {

+ 0 - 2
controllers/base_controller.go

@@ -20,8 +20,6 @@ type BaseResponse struct {
 	ErrCode int
 	ErrCode int
 	Data    interface{}
 	Data    interface{}
 	Success bool `description:"true 执行成功,false 执行失败"`
 	Success bool `description:"true 执行成功,false 执行失败"`
-	//IsSendEmail bool `json:"-" description:"true 发送邮件,false 不发送邮件"`
-	//IsAddLog    bool `json:"-" description:"true 新增操作日志,false 不新增操作日志" `
 }
 }
 
 
 type BaseController struct {
 type BaseController struct {

+ 32 - 8
controllers/report/report_controller.go

@@ -2,6 +2,7 @@ package report
 
 
 import (
 import (
 	"eta_mini_ht_api/controllers"
 	"eta_mini_ht_api/controllers"
+	"eta_mini_ht_api/service/report"
 	"fmt"
 	"fmt"
 )
 )
 
 
@@ -25,10 +26,9 @@ func (r *ReportController) List(key string) {
 // HotRanked @Title 获取本周最热的报告列表
 // HotRanked @Title 获取本周最热的报告列表
 // @Description 获取本周最热的报告列表
 // @Description 获取本周最热的报告列表
 // @Success 200 {object}
 // @Success 200 {object}
-// @router /hotRankedList [HOT]
-func (r *ReportController) HotRanked(key string) {
+// @router /hotRankedList [get]
+func (r *ReportController) HotRanked() {
 	controllers.Wrap(&r.BaseController, func() (result *controllers.WrapData, err error) {
 	controllers.Wrap(&r.BaseController, func() (result *controllers.WrapData, err error) {
-		fmt.Println(key)
 		result = r.InitWrapData("查询报告列表失败")
 		result = r.InitWrapData("查询报告列表失败")
 		r.SuccessResult("查询报告列表成功", r.PageInfo, result)
 		r.SuccessResult("查询报告列表成功", r.PageInfo, result)
 		return
 		return
@@ -38,12 +38,36 @@ func (r *ReportController) HotRanked(key string) {
 // PublishRanked @Title 获取最新发布的报告列表
 // PublishRanked @Title 获取最新发布的报告列表
 // @Description 获取最新发布的报告列表
 // @Description 获取最新发布的报告列表
 // @Success 200 {object}
 // @Success 200 {object}
-// @router /publishRankedList [HOT]
-func (r *ReportController) PublishRanked(key string) {
+// @router /publishRankedList [get]
+func (r *ReportController) PublishRanked() {
 	controllers.Wrap(&r.BaseController, func() (result *controllers.WrapData, err error) {
 	controllers.Wrap(&r.BaseController, func() (result *controllers.WrapData, err error) {
-		fmt.Println(key)
-		result = r.InitWrapData("查询报告列表失败")
-		r.SuccessResult("查询报告列表成功", r.PageInfo, result)
+		result = r.InitWrapData("获取最新发布报告列表失败")
+		//获取最新的报告列表
+		list, err := report.GetRandedReportByPublishTime()
+		if err != nil {
+			r.FailedResult("获取最新发布报告列表失败", result)
+			return
+		}
+
+		r.SuccessResult("获取最新发布报告列表成功", list, result)
+		return
+	})
+}
+
+// GetPermissions  @Title 获取品种列表
+// @Description 获取最新发布的报告列表
+// @Success 200 {object}
+// @router /permissionList [get]
+func (r *ReportController) GetPermissions() {
+	controllers.Wrap(&r.BaseController, func() (result *controllers.WrapData, err error) {
+		result = r.InitWrapData("获取品种列表失败")
+		//获取最新的报告列表
+		json, err := report.GetPermissionList()
+		if err != nil {
+			r.FailedResult("获取品种列表失败", result)
+			return
+		}
+		r.SuccessResult("获取最新发布报告列表成功", json.Children, result)
 		return
 		return
 	})
 	})
 }
 }

+ 0 - 6
controllers/user/auth_controller.go

@@ -12,12 +12,6 @@ type AuthController struct {
 	controllers.BaseController
 	controllers.BaseController
 }
 }
 
 
-//func (a *AuthController) Prepare() {
-//	if wechatClient == nil {
-//		wechatClient = wechat.GetInstance()
-//	}
-//}
-
 // LoginReq  获取验证码请求
 // LoginReq  获取验证码请求
 type LoginReq struct {
 type LoginReq struct {
 	Code       string `json:"code"`
 	Code       string `json:"code"`

+ 2 - 2
controllers/user/user_controller.go

@@ -7,7 +7,7 @@ import (
 	"fmt"
 	"fmt"
 )
 )
 
 
-// Operations about Users
+// UserController Operations about Users
 type UserController struct {
 type UserController struct {
 	controllers.BaseController
 	controllers.BaseController
 	redis *cache.RedisCache
 	redis *cache.RedisCache
@@ -22,7 +22,7 @@ type LoginCode struct {
 	Msg  string `json:"msg"`
 	Msg  string `json:"msg"`
 }
 }
 
 
-// @Title GetAll
+// Get @Title GetAll
 // @Description get all Users
 // @Description get all Users
 // @Success 200 {object} models.User
 // @Success 200 {object} models.User
 // @router / [get]
 // @router / [get]

+ 104 - 21
domian/report/report_service.go

@@ -3,8 +3,10 @@ package report
 import (
 import (
 	"eta_mini_ht_api/common/component/es"
 	"eta_mini_ht_api/common/component/es"
 	logger "eta_mini_ht_api/common/component/log"
 	logger "eta_mini_ht_api/common/component/log"
+	"eta_mini_ht_api/models"
 	"eta_mini_ht_api/models/eta"
 	"eta_mini_ht_api/models/eta"
-	"eta_mini_ht_api/models/report"
+	etaDao "eta_mini_ht_api/models/eta"
+	reportDao "eta_mini_ht_api/models/report"
 	"strconv"
 	"strconv"
 )
 )
 
 
@@ -18,30 +20,69 @@ func elastic() *es.ESClient {
 
 
 // ESReport Report ES研报mapping
 // ESReport Report ES研报mapping
 type ESReport struct {
 type ESReport struct {
-	ReportID int                 `json:"report_id"`
-	OrgId    int                 `json:"org_id"`
-	Author   string              `json:"author"`
-	Source   report.ReportSource `json:"source"`
-	Abstract string              `json:"abstract"`
-	Status   report.ReportStatus `json:"status"`
+	ReportID int                    `json:"report_id"`
+	OrgId    int                    `json:"org_id"`
+	Author   string                 `json:"author"`
+	Source   reportDao.ReportSource `json:"source"`
+	Abstract string                 `json:"abstract"`
+	Status   reportDao.ReportStatus `json:"status"`
 }
 }
 
 
+type ReportDTO struct {
+	ReportID      int                    `json:"report_id"`
+	OrgId         int                    `json:"org_id"`
+	Title         string                 `json:"title"`
+	Author        string                 `json:"author"`
+	Source        reportDao.ReportSource `json:"source"`
+	Abstract      string                 `json:"abstract"`
+	PublishedTime string                 `json:"published_time"`
+}
+
+type PermissionDTO struct {
+	ID       int
+	Name     string
+	ParentID int
+}
+
+func GetPermissionList() (dtoList []PermissionDTO, err error) {
+	list, err := etaDao.GetChartPermissionList()
+	if err != nil {
+		logger.Error("获取研报列表失败")
+		return
+	}
+	dtoList = make([]PermissionDTO, 0)
+	for _, node := range list {
+		dto := convertPermissionDTO(node)
+		dtoList = append(dtoList, dto)
+	}
+	return
+}
+
+func GetReportLabelsById(id int, source reportDao.ReportSource) {
+	switch source {
+	case reportDao.SourceETA:
+		//eta.GetReportLabelById()
+		return
+	case reportDao.SourceHT:
+		return
+	}
+}
 func (es ESReport) GetId() string {
 func (es ESReport) GetId() string {
 	return strconv.Itoa(es.ReportID)
 	return strconv.Itoa(es.ReportID)
 }
 }
 func GetETALatestReportId() (id int, err error) {
 func GetETALatestReportId() (id int, err error) {
-	return report.GetETALatestReportId()
+	return reportDao.GetETALatestReportId()
 }
 }
 
 
 func SyncETAReportList(list []eta.ETAReport) (err error) {
 func SyncETAReportList(list []eta.ETAReport) (err error) {
 	logger.Info("同步研报数量%d", len(list))
 	logger.Info("同步研报数量%d", len(list))
-	var reports []report.Report
+	var reports []reportDao.Report
 	var esReports []es.ESBase
 	var esReports []es.ESBase
 	for _, etaRp := range list {
 	for _, etaRp := range list {
 		destRp := convertEtaReport(etaRp)
 		destRp := convertEtaReport(etaRp)
 		reports = append(reports, destRp)
 		reports = append(reports, destRp)
 	}
 	}
-	err = report.BatchInsertReport(&reports)
+	err = reportDao.BatchInsertReport(&reports)
 	if err != nil {
 	if err != nil {
 		logger.Error("同步ETA研报失败:%v", err)
 		logger.Error("同步ETA研报失败:%v", err)
 		return
 		return
@@ -59,17 +100,42 @@ func SyncETAReportList(list []eta.ETAReport) (err error) {
 	return
 	return
 }
 }
 
 
-func convertEtaReport(etaRp eta.ETAReport) report.Report {
-	return report.Report{
-		OrgID:    etaRp.ID,
-		Title:    etaRp.Title,
-		Abstract: etaRp.Abstract,
-		Author:   etaRp.Author,
-		Source:   report.SourceETA,
-		Status:   report.StatusInit,
+func GetListByConditionDesc(column string, limit int) (dtoList []ReportDTO, err error) {
+	reports, err := reportDao.GetListByCondition(column, limit, models.Desc)
+	if err != nil {
+		logger.Error("获取研报失败:%v", err)
+		return
 	}
 	}
+	dtoList = []ReportDTO{}
+	for _, report := range reports {
+		dtoList = append(dtoList, convertReportDTO(report))
+	}
+	return
+}
+func GetListByConditionAsc(column string, limit int) (dtoList []ReportDTO, err error) {
+	reports, err := reportDao.GetListByCondition(column, limit, models.Asc)
+	if err != nil {
+		logger.Error("获取研报失败:%v", err)
+		return
+	}
+	for _, report := range reports {
+		dtoList = append(dtoList, convertReportDTO(report))
+	}
+	return
 }
 }
-func convertEsReport(report report.Report) ESReport {
+
+func convertEtaReport(etaRp eta.ETAReport) reportDao.Report {
+	return reportDao.Report{
+		OrgID:         etaRp.ID,
+		Title:         etaRp.Title,
+		Abstract:      etaRp.Abstract,
+		Author:        etaRp.Author,
+		PublishedTime: etaRp.PublishTime,
+		Source:        reportDao.SourceETA,
+		Status:        reportDao.StatusInit,
+	}
+}
+func convertEsReport(report reportDao.Report) ESReport {
 	return ESReport{
 	return ESReport{
 		ReportID: report.ID,
 		ReportID: report.ID,
 		OrgId:    report.OrgID,
 		OrgId:    report.OrgID,
@@ -79,6 +145,23 @@ func convertEsReport(report report.Report) ESReport {
 		Status:   report.Status,
 		Status:   report.Status,
 	}
 	}
 }
 }
-func GetList(id int, size int) []report.Report {
-	return nil
+
+func convertReportDTO(report reportDao.Report) ReportDTO {
+	return ReportDTO{
+		ReportID:      report.ID,
+		Title:         report.Title,
+		OrgId:         report.OrgID,
+		Author:        report.Author,
+		Source:        report.Source,
+		Abstract:      report.Abstract,
+		PublishedTime: report.PublishedTime,
+	}
+}
+
+func convertPermissionDTO(node etaDao.ChartPermission) PermissionDTO {
+	return PermissionDTO{
+		ID:       node.ChartPermissionID,
+		Name:     node.PermissionName,
+		ParentID: node.ParentID,
+	}
 }
 }

+ 0 - 5
facade/user/user_facade.go

@@ -1,5 +0,0 @@
-package user
-
-func Login() {
-
-}

+ 11 - 4
middleware/auth_middleware.go

@@ -18,7 +18,7 @@ var (
 )
 )
 
 
 const (
 const (
-	UNAUTHORIZED  = "未授权"
+	UNAUTHORIZED  = "请重新登录"
 	FORBIDDEN     = "禁止访问"
 	FORBIDDEN     = "禁止访问"
 	NOTFOUND      = "未找到"
 	NOTFOUND      = "未找到"
 	authorization = "Authorization"
 	authorization = "Authorization"
@@ -42,28 +42,35 @@ func AuthMiddleware() web.FilterFunc {
 		path := ctx.Input.URL()
 		path := ctx.Input.URL()
 		logger.Info("请求路径:%v", path)
 		logger.Info("请求路径:%v", path)
 		if !allowed(path) {
 		if !allowed(path) {
+			rep := unAuthorized()
 			auth := ctx.Input.Header(authorization)
 			auth := ctx.Input.Header(authorization)
 			if auth == "" {
 			if auth == "" {
 				logger.Error("token信息不存在")
 				logger.Error("token信息不存在")
-				_ = ctx.JSONResp(unAuthorized)
+				_ = ctx.JSONResp(rep)
+				return
 			}
 			}
 			parts := strings.Split(auth, " ")
 			parts := strings.Split(auth, " ")
 			if len(parts) != 2 || parts[0] != Bearer {
 			if len(parts) != 2 || parts[0] != Bearer {
 				logger.Error("token参数不符合格式")
 				logger.Error("token参数不符合格式")
-				_ = ctx.JSONResp(unAuthorized)
+				_ = ctx.JSONResp(rep)
+				return
 			}
 			}
 			info, err := jwt.CheckToken(parts[1])
 			info, err := jwt.CheckToken(parts[1])
 			if err != nil {
 			if err != nil {
 				logger.Error("token无效:%v", err)
 				logger.Error("token无效:%v", err)
-				_ = ctx.JSONResp(unAuthorized)
+				_ = ctx.JSONResp(rep)
+				return
 			}
 			}
 			//校验redis中是否合法
 			//校验redis中是否合法
 			redisToken := rd().GetString(redis.GenerateTokenKey(info.Mobile))
 			redisToken := rd().GetString(redis.GenerateTokenKey(info.Mobile))
 			if redisToken != parts[1] {
 			if redisToken != parts[1] {
 				logger.Error("token无效:用户token已刷新")
 				logger.Error("token无效:用户token已刷新")
 				_ = ctx.JSONResp(unAuthorized())
 				_ = ctx.JSONResp(unAuthorized())
+				return
 			}
 			}
+			return
 		}
 		}
+		return
 	}
 	}
 }
 }
 
 

+ 7 - 0
models/base_db.go

@@ -5,6 +5,13 @@ import (
 	"gorm.io/gorm"
 	"gorm.io/gorm"
 )
 )
 
 
+type Order string
+
+const (
+	Desc Order = "desc"
+	Asc  Order = "asc"
+)
+
 func Main() *gorm.DB {
 func Main() *gorm.DB {
 	return database.Select(database.MAIN)
 	return database.Select(database.MAIN)
 }
 }

+ 50 - 0
models/eta/eta_permission.go

@@ -0,0 +1,50 @@
+package eta
+
+import (
+	logger "eta_mini_ht_api/common/component/log"
+	"eta_mini_ht_api/models"
+)
+
+const (
+	Columns = "chart_permission_id,permission_name,parent_id"
+)
+
+// ChartPermission represents the structure of the chart_permission table.
+type ChartPermission struct {
+	ChartPermissionID     int    `gorm:"primaryKey;autoIncrement;column:chart_permission_id;comment:主键"`
+	ChartPermissionName   string `gorm:"size:20;column:chart_permission_name;comment:名称"`
+	PermissionName        string `gorm:"size:50;default:'';column:permission_name;comment:权限名"`
+	Sort                  int    `gorm:"size:10;default:1;column:sort;comment:排序"`
+	Enabled               bool   `gorm:"size:1;default:true;column:enabled;comment:是否可用"`
+	ClassifyName          string `gorm:"size:50;column:classify_name"`
+	ProductName           string `gorm:"size:50;default:'';column:product_name"`
+	ProductID             int    `gorm:"size:11;default:0;column:product_id"`
+	ImageURL              string `gorm:"size:255;column:image_url;comment:图片地址"`
+	ShowType              int    `gorm:"size:4;default:0;column:show_type;comment:1:查研观向小程序展示"`
+	IsOther               bool   `gorm:"size:2;default:false;column:is_other;comment:是否是其他,用于查研观向小程序后台展示"`
+	IsReport              bool   `gorm:"size:4;default:false;column:is_report;comment:是否是报告,用于查研观向小程序前台报告展示"`
+	CygxAuth              bool   `gorm:"size:4;default:false;column:cygx_auth;comment:是否是权限,用于查研观向小程序前台权限校验"`
+	PermissionType        uint16 `gorm:"size:2;unsigned;default:0;column:permission_type;comment:1主观,2客观"`
+	ProductPermissionName string `gorm:"size:50;default:'';column:product_permission_name;comment:种类权限名称"`
+	ParentID              int    `gorm:"size:11;default:0;column:parent_id;comment:父级权限id"`
+	IsPublic              bool   `gorm:"size:4;default:false;column:is_public;comment:是否是公有权限1:公有权限,0私有权限"`
+}
+
+// TableName sets the insert table name for this struct type
+func (c *ChartPermission) TableName() string {
+	return "chart_permission"
+}
+
+func GetChartPermissionList() (chartPermissionList []ChartPermission, err error) {
+	db := models.ETA()
+	err = db.Select(Columns).Where("product_id =?", 1).Order("parent_id asc").Order("sort asc").Find(&chartPermissionList).Error
+	if err != nil {
+		logger.Error("查询eta品种列表失败:%v", err)
+		return
+	}
+	if chartPermissionList == nil {
+		chartPermissionList = []ChartPermission{}
+		return
+	}
+	return
+}

+ 19 - 1
models/eta/eta_report.go

@@ -11,7 +11,7 @@ const (
 	published = 2
 	published = 2
 	passed    = 6
 	passed    = 6
 
 
-	limit = 3
+	limit = 50
 )
 )
 
 
 var (
 var (
@@ -44,6 +44,24 @@ func GetETAReports(id int) (reports []ETAReport, err error) {
 	}
 	}
 	return
 	return
 }
 }
+
+func DoSql(sql string, result interface{}, values ...interface{}) (err error) {
+	db := models.Main()
+	err = db.Raw(sql, values...).Scan(&result).Error
+	if err != nil {
+		logger.Error("执行sql[%v]失败:%v", sql, err)
+	}
+	return
+}
+func GetReportLabelById(id int) (err error) {
+	var classifyId int
+	err = models.ETA().Table("report").Select(" COALESCE( NULLIF(classify_id_third,0) ,NULLIF(classify_id_second,0),classify_id_first) classify_id").Where("id =?", id).First(classifyId).Preload("").Error
+	if err != nil || classifyId <= 0 {
+		logger.Error("获取ETA报告分类失败", err)
+	}
+
+	return
+}
 func setClassifyIdValue(report *ETAReport) {
 func setClassifyIdValue(report *ETAReport) {
 	if report.ClassifyIDThird > 0 {
 	if report.ClassifyIDThird > 0 {
 		report.ClassifyID = report.ClassifyIDThird
 		report.ClassifyID = report.ClassifyIDThird

+ 25 - 10
models/report/report.go

@@ -3,6 +3,7 @@ package report
 import (
 import (
 	logger "eta_mini_ht_api/common/component/log"
 	logger "eta_mini_ht_api/common/component/log"
 	"eta_mini_ht_api/models"
 	"eta_mini_ht_api/models"
+	"fmt"
 	"gorm.io/gorm"
 	"gorm.io/gorm"
 	"time"
 	"time"
 )
 )
@@ -17,19 +18,21 @@ const (
 	StatusPending ReportStatus = "PENDING"
 	StatusPending ReportStatus = "PENDING"
 	StatusDone    ReportStatus = "DONE"
 	StatusDone    ReportStatus = "DONE"
 
 
-	MaxBatchNum = 1000
+	MaxBatchNum   = 1000
+	CommonColumns = "id,org_id,author,abstract,title,published_time"
 )
 )
 
 
 type Report struct {
 type Report struct {
-	ID          int          `gorm:"column:id;primary_key;comment:'id'" json:"id"`
-	OrgID       int          `gorm:"column:org_id;comment:'原始id'" json:"org_id"`
-	Source      ReportSource `gorm:"column:source;comment:'研报来源1:eta 2:海通'" json:"source"`
-	Title       string       `gorm:"column:title;comment:'标题'" json:"title"`
-	Abstract    string       `gorm:"column:abstract;comment:'摘要'" json:"abstract"`
-	Author      string       `gorm:"column:author;comment:'作者'" json:"author"`
-	Status      ReportStatus `gorm:"column:status;comment:'报告状态 init:初始化 pending:同步中 done:完成同步'" json:"status"`
-	CreatedTime time.Time    `gorm:"column:created_time;comment:'创建时间'" json:"created_time"`
-	UpdatedTime time.Time    `gorm:"column:updated_time;comment:'修改时间'" json:"updated_time"`
+	ID            int          `gorm:"column:id;primary_key;comment:'id'" json:"id"`
+	OrgID         int          `gorm:"column:org_id;comment:'原始id'" json:"org_id"`
+	Source        ReportSource `gorm:"column:source;comment:'研报来源1:eta 2:海通'" json:"source"`
+	Title         string       `gorm:"column:title;comment:'标题'" json:"title"`
+	Abstract      string       `gorm:"column:abstract;comment:'摘要'" json:"abstract"`
+	Author        string       `gorm:"column:author;comment:'作者'" json:"author"`
+	Status        ReportStatus `gorm:"column:status;comment:'报告状态 init:初始化 pending:同步中 done:完成同步'" json:"status"`
+	PublishedTime string       `gorm:"column:published_time;comment:'发布时间'" json:"published_time"`
+	CreatedTime   time.Time    `gorm:"column:created_time;comment:'创建时间'" json:"created_time"`
+	UpdatedTime   time.Time    `gorm:"column:updated_time;comment:'修改时间'" json:"updated_time"`
 }
 }
 
 
 func BatchInsertReport(list *[]Report) error {
 func BatchInsertReport(list *[]Report) error {
@@ -61,3 +64,15 @@ func DoSql(sql string, result interface{}, values ...interface{}) (err error) {
 	}
 	}
 	return
 	return
 }
 }
+
+func GetListByCondition(column string, limit int, order models.Order) (reports []Report, err error) {
+	db := models.Main()
+	err = db.Select(CommonColumns).Order(fmt.Sprintf("%s %s", column, order)).Limit(limit).Find(&reports).Error
+	if err != nil {
+		logger.Error("查询报告列表失败:%v", err)
+	}
+	if reports == nil {
+		return []Report{}, nil
+	}
+	return
+}

+ 27 - 0
routers/commentsRouter.go

@@ -7,6 +7,15 @@ import (
 
 
 func init() {
 func init() {
 
 
+    beego.GlobalControllerRouter["eta_mini_ht_api/controllers/report:ReportController"] = append(beego.GlobalControllerRouter["eta_mini_ht_api/controllers/report:ReportController"],
+        beego.ControllerComments{
+            Method: "HotRanked",
+            Router: `/hotRankedList`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta_mini_ht_api/controllers/report:ReportController"] = append(beego.GlobalControllerRouter["eta_mini_ht_api/controllers/report:ReportController"],
     beego.GlobalControllerRouter["eta_mini_ht_api/controllers/report:ReportController"] = append(beego.GlobalControllerRouter["eta_mini_ht_api/controllers/report:ReportController"],
         beego.ControllerComments{
         beego.ControllerComments{
             Method: "List",
             Method: "List",
@@ -18,6 +27,24 @@ func init() {
             Filters: nil,
             Filters: nil,
             Params: nil})
             Params: nil})
 
 
+    beego.GlobalControllerRouter["eta_mini_ht_api/controllers/report:ReportController"] = append(beego.GlobalControllerRouter["eta_mini_ht_api/controllers/report:ReportController"],
+        beego.ControllerComments{
+            Method: "GetPermissions",
+            Router: `/permissionList`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_mini_ht_api/controllers/report:ReportController"] = append(beego.GlobalControllerRouter["eta_mini_ht_api/controllers/report:ReportController"],
+        beego.ControllerComments{
+            Method: "PublishRanked",
+            Router: `/publishRankedList`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta_mini_ht_api/controllers/user:AuthController"] = append(beego.GlobalControllerRouter["eta_mini_ht_api/controllers/user:AuthController"],
     beego.GlobalControllerRouter["eta_mini_ht_api/controllers/user:AuthController"] = append(beego.GlobalControllerRouter["eta_mini_ht_api/controllers/user:AuthController"],
         beego.ControllerComments{
         beego.ControllerComments{
             Method: "Login",
             Method: "Login",

+ 98 - 0
service/report/report_service.go

@@ -1 +1,99 @@
 package report
 package report
+
+import (
+	logger "eta_mini_ht_api/common/component/log"
+	"eta_mini_ht_api/common/exception"
+	reportService "eta_mini_ht_api/domian/report"
+	"sync"
+	"time"
+)
+
+type PublishRankedReport struct {
+	Id            int
+	OrgId         int
+	Title         string
+	PublishedTime string
+}
+
+type PermissionNode struct {
+	ID       int               `json:"id"`
+	Name     string            `json:"name"`
+	ParentID int               `json:"parentId"`
+	Children []*PermissionNode `json:"children"`
+}
+
+func GetRandedReportByPublishTime() (reports []PublishRankedReport, err error) {
+	dtoList, err := reportService.GetListByConditionDesc("published_time", 3)
+	if err != nil {
+		logger.Error("获取最新发布的研报列表失败:%v", err)
+		err = exception.New(exception.GetPublishedRandListFailed)
+		return
+	}
+	reports = convertToPublishRankedReportList(dtoList)
+	//并发获取研报的标签
+	var wg sync.WaitGroup
+	wg.Add(len(dtoList))
+	for _, report := range reports {
+		go func(report *PublishRankedReport) {
+			defer wg.Done()
+			_, err = getReportTags(report.OrgId)
+			if err != nil {
+				logger.Error("获取研报标签失败:%v", err)
+			}
+		}(&report)
+	}
+	wg.Wait()
+	return
+}
+func getReportTags(id int) (labels []string, err error) {
+	//reportService.getReportLabelsById(id)
+	return
+}
+func convertToPublishRankedReportList(dtoList []reportService.ReportDTO) (reports []PublishRankedReport) {
+	reports = []PublishRankedReport{}
+	for _, dto := range dtoList {
+		report := PublishRankedReport{
+			Id:            dto.ReportID,
+			OrgId:         dto.OrgId,
+			PublishedTime: dto.PublishedTime,
+			Title:         dto.Title,
+		}
+		date, err := time.Parse(time.DateTime, report.PublishedTime)
+		if err == nil {
+			report.PublishedTime = date.Format(time.DateOnly)
+		}
+		reports = append(reports, report)
+	}
+	return
+}
+
+func GetPermissionList() (root *PermissionNode, err error) {
+	list, err := reportService.GetPermissionList()
+	if err != nil {
+		logger.Error("获取品种列表失败:%v", err)
+		err = exception.New(exception.GetPermissionListFailed)
+		return
+	}
+	root = &PermissionNode{
+		ID:       0,
+		ParentID: 0,
+	}
+	assemblePermissionNode(list, root, 0, 2)
+	return
+}
+
+func assemblePermissionNode(list []reportService.PermissionDTO, node *PermissionNode, current int, level int) {
+	if node != nil && current < level {
+		for _, permission := range list {
+			if permission.ParentID == node.ID {
+				childNode := &PermissionNode{
+					ID:       permission.ID,
+					Name:     permission.Name,
+					ParentID: permission.ParentID,
+				}
+				node.Children = append(node.Children, childNode)
+				assemblePermissionNode(list, childNode, current+1, level)
+			}
+		}
+	}
+}

+ 6 - 6
task/base/eta_task.go

@@ -22,13 +22,13 @@ type ETATask struct {
 }
 }
 type TaskDetail struct {
 type TaskDetail struct {
 	TaskId    int
 	TaskId    int
-	StartTime time.Time
-	EndTime   time.Time
+	StartTime string
+	EndTime   string
 	Content   string
 	Content   string
 }
 }
 
 
 type Task interface {
 type Task interface {
-	Execute(taskDetail TaskDetail) error
+	Execute(taskDetail *TaskDetail) error
 }
 }
 
 
 func NewTask(name TaskType, cron string, taskFunc Task, mode string) ETATask {
 func NewTask(name TaskType, cron string, taskFunc Task, mode string) ETATask {
@@ -57,7 +57,7 @@ func RegisterTask(etaTask *ETATask) {
 
 
 func (eta *ETATask) Run(_ context.Context) (err error) {
 func (eta *ETATask) Run(_ context.Context) (err error) {
 	details := TaskDetail{
 	details := TaskDetail{
-		StartTime: time.Now(),
+		StartTime: time.Now().Format(time.DateTime),
 	}
 	}
 	runTask := taskService.TaskDTO{
 	runTask := taskService.TaskDTO{
 		TaskType: string(eta.Name),
 		TaskType: string(eta.Name),
@@ -65,8 +65,8 @@ func (eta *ETATask) Run(_ context.Context) (err error) {
 	//启动任务
 	//启动任务
 	taskId, err := taskService.InitAndStartTask(runTask)
 	taskId, err := taskService.InitAndStartTask(runTask)
 	details.TaskId = taskId
 	details.TaskId = taskId
-	err = eta.TaskFn.Execute(details)
-	details.EndTime = time.Now()
+	err = eta.TaskFn.Execute(&details)
+	details.EndTime = time.Now().Format(time.DateTime)
 	detailStr, err := json.Marshal(details)
 	detailStr, err := json.Marshal(details)
 	//任务状态
 	//任务状态
 	if err != nil {
 	if err != nil {

+ 2 - 2
task/eta/eta_report_task.go

@@ -15,7 +15,7 @@ var (
 )
 )
 
 
 // Execute Task ETA取研报的数据
 // Execute Task ETA取研报的数据
-func (re *ReportTask) Execute(taskDetail base.TaskDetail) error {
+func (re *ReportTask) Execute(taskDetail *base.TaskDetail) error {
 	logger.Info(contants.TaskFormat, "同步ETA研报库开始")
 	logger.Info(contants.TaskFormat, "同步ETA研报库开始")
 	id, err := report.GetETALatestReportId()
 	id, err := report.GetETALatestReportId()
 	var etaReportList []eta.ETAReport
 	var etaReportList []eta.ETAReport
@@ -44,6 +44,6 @@ type ReportTask struct {
 }
 }
 
 
 func init() {
 func init() {
-	reportTask := base.NewTask(taskName, cron, new(ReportTask), base.DEV)
+	reportTask := base.NewTask(taskName, cron, new(ReportTask), base.PROD)
 	base.RegisterTask(&reportTask)
 	base.RegisterTask(&reportTask)
 }
 }

+ 1 - 1
task/sms/code_expired_task.go

@@ -13,7 +13,7 @@ var (
 )
 )
 
 
 // Execute Task ETA取研报的数据
 // Execute Task ETA取研报的数据
-func (st *SMSTask) Execute(taskDetail base.TaskDetail) error {
+func (st *SMSTask) Execute(taskDetail *base.TaskDetail) error {
 	logger.Info(contants.TaskFormat, "处理过期短信开始")
 	logger.Info(contants.TaskFormat, "处理过期短信开始")
 	err := sms.VerifiedCodeTask()
 	err := sms.VerifiedCodeTask()
 	if err != nil {
 	if err != nil {