kobe6258 7 сар өмнө
parent
commit
9073ed2a50

+ 6 - 0
common/component/cache/redis.go

@@ -17,6 +17,12 @@ var (
 	redisOnce  sync.Once
 )
 
+func init() {
+	if GetInstance() == nil {
+		panic("初始化redis失败")
+	}
+	logger.Info("redis初始化成功")
+}
 func GetInstance() *RedisCache {
 	redisOnce.Do(func() {
 		// 检查是否成功获取到RedisConfig实例,没有配置则不进行redis初始化

+ 0 - 6
common/component/component.go

@@ -1,7 +1,6 @@
 package component
 
 import (
-	"eta_mini_ht_api/common/component/cache"
 	"eta_mini_ht_api/common/component/config"
 	_ "eta_mini_ht_api/common/component/database"
 	logger "eta_mini_ht_api/common/component/log"
@@ -11,11 +10,6 @@ import (
 )
 
 func init() {
-	//配置redis,不做强校验
-	if redisConf, ok := config.GetConfig(contants.REDIS).(*config.RedisConfig); ok && redisConf != nil {
-		logger.Info("开始加载redis")
-		cache.GetInstance()
-	}
 	//配置SMS平台,没有配置直接报错
 	if smsConf, ok := config.GetConfig(contants.SMS).(*config.SMSConfig); ok && smsConf != nil {
 		logger.Info("开始加载短信平台客户端")

+ 44 - 0
common/component/config/es_config.go

@@ -0,0 +1,44 @@
+package config
+
+import "eta_mini_ht_api/common/contants"
+
+// ESOpts es连接属性
+type ESOpts struct {
+	Url      string
+	Username string
+	Password string
+}
+type ESConfig struct {
+	BaseConfig
+	opts ESOpts
+}
+
+func (e *ESConfig) GetUrl() string {
+	return e.opts.Url
+}
+
+func (e *ESConfig) GetUserName() string {
+	return e.opts.Username
+}
+
+func (e *ESConfig) GetPassword() string {
+	return e.opts.Password
+}
+func (e *ESConfig) InitConfig() {
+	opts := ESOpts{
+		Url:      e.GetString("url"),
+		Username: e.GetString("username"),
+		Password: e.GetString("password"),
+	}
+	e.opts = opts
+}
+func NewES() Config {
+	return &ESConfig{
+		BaseConfig: BaseConfig{prefix: contants.ES},
+		opts:       ESOpts{},
+	}
+}
+
+func init() {
+	Register(contants.ES, NewES)
+}

+ 1 - 1
common/component/config/redis_config.go

@@ -58,5 +58,5 @@ func NewRedis() Config {
 }
 
 func init() {
-	Register("redis", NewRedis)
+	Register(contants.REDIS, NewRedis)
 }

+ 1 - 1
common/component/config/wechat_config.go

@@ -28,7 +28,7 @@ func (w *WechatConfig) InitConfig() {
 }
 func NewWechat() Config {
 	return &WechatConfig{
-		BaseConfig: BaseConfig{prefix: "wechat"},
+		BaseConfig: BaseConfig{prefix: contants.WECHAT},
 		opts:       WechatOpts{},
 	}
 }

+ 229 - 0
common/component/es/es.go

@@ -0,0 +1,229 @@
+package es
+
+import (
+	"bytes"
+	"context"
+	"encoding/json"
+	"eta_mini_ht_api/common/component/config"
+	logger "eta_mini_ht_api/common/component/log"
+	"eta_mini_ht_api/common/contants"
+	"github.com/elastic/go-elasticsearch/v7"
+	"github.com/elastic/go-elasticsearch/v7/esapi"
+	"sync"
+)
+
+type ESBase interface {
+	GetId() string
+}
+
+var (
+	esOnce   sync.Once
+	esClient *ESClient
+)
+
+type ESClient struct {
+	esOp *elasticsearch.Client
+}
+
+func GetInstance() *ESClient {
+	esOnce.Do(func() {
+		// 检查是否成功获取到RedisConfig实例,没有配置则不进行redis初始化
+		if esConf, ok := config.GetConfig(contants.ES).(*config.ESConfig); ok {
+			logger.Info("初始化es")
+			// 这里可以添加初始化Redis的逻辑
+			esClient = newEs(esConf)
+		}
+	})
+	return esClient
+}
+func (es *ESClient) es() *elasticsearch.Client {
+	return es.esOp
+}
+func newEs(config *config.ESConfig) *ESClient {
+	elasticsearch.NewDefaultClient()
+	client, err := elasticsearch.NewClient(
+		elasticsearch.Config{
+			Addresses: []string{config.GetUrl()},
+			// A list of Elasticsearch nodes to use.
+			Username: config.GetUserName(),
+			Password: config.GetPassword(), // Password for HTTP Basic Authentication.
+		},
+	)
+	if err != nil {
+		logger.Error("连接ES失败:%v", err)
+		panic("启动es失败")
+	}
+	return &ESClient{esOp: client}
+}
+
+func init() {
+	if GetInstance() == nil {
+		panic("初始化es失败")
+	}
+	logger.Info("es初始化成功")
+}
+
+//
+//func CreateIndex(indexName string) error {
+//	resp, err := esClient.es().Indices.
+//		Create(indexName).
+//		Do(context.Background())
+//	if err != nil {
+//		logger.Error("创建ES索引失败:%v", err)
+//		return err
+//	}
+//	fmt.Printf("index:%#v\n", resp.Index)
+//	return nil
+//}
+
+// DeleteIndex 删除索引
+//func DeleteIndex(indexName string) error {
+//	_, err := esClient.es().Indices. // 表明是对索引的操作,而Index则表示是要操作具体索引下的文档
+//						Delete(indexName).
+//						Do(context.Background())
+//	if err != nil {
+//		fmt.Printf("delete index failed,err:%v\n", err)
+//		return err
+//	}
+//	fmt.Printf("delete index successed,indexName:%s", indexName)
+//	return nil
+//}
+//
+//// CreateDocument 创建文档
+//func CreateDocument(indexName string, id string, doc interface{}) {
+//	// 添加文档
+//	resp, err := esClient.esOp.Index(indexName).Id(id).Document(doc).Do(context.Background())
+//	if err != nil {
+//		logger.Error("indexing document failed, err:%v\n", err)
+//		return
+//	}
+//	logger.Info("result:%#v\n", resp.Result)
+//	return
+//}
+
+// BulkInsert 批量创建文档
+func (es *ESClient) BulkInsert(indexName string, docs []ESBase) (err error) {
+	// 创建批量请求
+	bulkBody := new(bytes.Buffer)
+	for _, doc := range docs {
+		enc := json.NewEncoder(bulkBody)
+		if err = enc.Encode(map[string]interface{}{
+			"index": map[string]interface{}{
+				"_index": indexName,
+				"_id":    doc.GetId(),
+			},
+		}); err != nil {
+			logger.Error("生成es批处理请求参数失败: %s", err)
+		}
+		if err = enc.Encode(doc); err != nil {
+			logger.Error("生成es批处理文档失败: %s", err)
+		}
+	}
+	bulkReq := esapi.BulkRequest{
+		Body:    bytes.NewReader(bulkBody.Bytes()),
+		Refresh: "true",
+	}
+
+	res, err := bulkReq.Do(context.Background(), es.esOp)
+	if err != nil {
+		logger.Error("es批处理创建失败: %s", err)
+	}
+	defer res.Body.Close()
+	if res.IsError() {
+		var e map[string]interface{}
+		if err = json.NewDecoder(res.Body).Decode(&e); err != nil {
+			logger.Error("解析es应答失败: %v", err)
+		} else {
+			// Print the response status and error information.
+			logger.Error("es请求失败: %s: %v\n", res.Status(), err)
+		}
+	}
+	return
+}
+
+///*
+//*
+//
+//	搜索
+//
+//indexName 访问索引名
+//query	搜索条件
+//from    开始搜索位置
+//size	搜索条数
+//sort 	排序
+//*/
+//func EsSearch(indexName string, query map[string]interface{}, from int, size int, sort []map[string]string) HitsData {
+//	searchQuery := map[string]interface{}{
+//		"query": query,
+//		"from":  from,
+//		"size":  size,
+//		"sort":  sort,
+//	}
+//	esClient.esOp.Create()
+//	req := httplib.Post(esUrl + indexName + "/_search")
+//	req.JSONBody(searchQuery)
+//	str, err := req.String()
+//	if err != nil {
+//		fmt.Println("elasticsearch is error ", err)
+//	}
+//	fmt.Println(str)
+//	var stb ReqSearchData
+//	err = json.Unmarshal([]byte(str), &stb)
+//	return stb.Hits
+//}
+//
+///*
+//*
+//添加es
+//indexName 索引名
+//id es的id
+//body es的值
+//*/
+//func EsAdd(indexName string, id string, body map[string]interface{}) bool {
+//	req := httplib.Post(esUrl + indexName + "/_doc/" + id)
+//	req.JSONBody(body)
+//	_, err := req.String()
+//	if err != nil {
+//		fmt.Println("elasticsearch is error ", err)
+//		return false
+//	}
+//	return true
+//}
+//
+///*
+//*
+//修改es
+//indexName 索引名
+//id es的id
+//body es的值
+//*/
+//func EsUpdate(indexName string, id string, body map[string]interface{}) bool {
+//	bodyData := map[string]interface{}{
+//		"doc": body,
+//	}
+//	req := httplib.Post(esUrl + indexName + "/_doc/" + id + "/_update")
+//	req.JSONBody(bodyData)
+//	_, err := req.String()
+//	if err != nil {
+//		fmt.Println("elasticsearch is error ", err)
+//		return false
+//	}
+//	return true
+//}
+//
+///*
+//*
+//删除
+//indexName 索引名
+//id es的id
+//*/
+//func EsDelete(indexName string, id string) bool {
+//	req := httplib.Delete(esUrl + indexName + "/_doc/" + id)
+//	_, err := req.String()
+//	if err != nil {
+//		fmt.Println("elasticsearch is error ", err)
+//		return false
+//	}
+//	return true
+//
+//}

+ 5 - 1
common/contants/contants.go

@@ -7,5 +7,9 @@ const (
 
 	WECHAT = "wechat"
 
-	ETA = "eta"
+	ETA             = "eta"
+	ES              = "es"
+	PageSizeDefault = 5 //列表页每页数据量
+
+	TaskFormat = "======================== %s ========================"
 )

+ 8 - 0
common/utils/page/page_utils.go

@@ -0,0 +1,8 @@
+package page
+
+func StartIndex(page, pagesize int) int {
+	if page > 1 {
+		return (page - 1) * pagesize
+	}
+	return 0
+}

+ 7 - 12
controllers/base_controller.go

@@ -9,10 +9,10 @@ import (
 	"github.com/beego/beego/v2/server/web"
 )
 
-type BaseController struct {
-	web.Controller
+type WrapData struct {
+	Msg  string
+	Data interface{}
 }
-
 type BaseResponse struct {
 	Ret     int `description:"返回状态码"`
 	Msg     string
@@ -24,6 +24,10 @@ type BaseResponse struct {
 	//IsAddLog    bool `json:"-" description:"true 新增操作日志,false 不新增操作日志" `
 }
 
+type BaseController struct {
+	web.Controller
+}
+
 func (b *BaseController) FailResponse(errInfo error, msg string) {
 
 	var retData BaseResponse
@@ -56,10 +60,6 @@ func (b *BaseController) JsonResult(status int, errCode int, errMsg string, msg
 	b.ServeJSON()
 }
 
-func (b *BaseController) Forbidden() {
-
-}
-
 func (b *BaseController) GetPostParams(data interface{}) {
 	err := json.Unmarshal(b.Ctx.Input.RequestBody, data)
 	if err != nil {
@@ -79,11 +79,6 @@ func Wrap(a *BaseController, fn func() (*WrapData, error)) {
 	a.JsonResult(http.GetHttpStatusByAlias("ok"), http.ErrOK, "", result.Msg, http.Success, result.Data)
 }
 
-type WrapData struct {
-	Msg  string
-	Data interface{}
-}
-
 func (b *BaseController) InitWrapData(msg string) *WrapData {
 	return &WrapData{Msg: msg}
 }

+ 29 - 0
controllers/list_contoller.go

@@ -0,0 +1,29 @@
+package controllers
+
+import "eta_mini_ht_api/common/contants"
+
+type ListController struct {
+	BaseController
+	PageInfo PageInfo
+}
+
+func (l *ListController) Prepare() {
+	pageSize, _ := l.GetInt("pageSize")
+	currentIndex, _ := l.GetInt("currentIndex")
+	if pageSize <= 0 {
+		pageSize = contants.PageSizeDefault
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	l.PageInfo = PageInfo{
+		Current:  currentIndex,
+		PageSize: pageSize,
+	}
+}
+
+type PageInfo struct {
+	id       int
+	Current  int
+	PageSize int
+}

+ 49 - 0
controllers/report/report_controller.go

@@ -0,0 +1,49 @@
+package report
+
+import (
+	"eta_mini_ht_api/controllers"
+	"fmt"
+)
+
+type ReportController struct {
+	controllers.ListController
+}
+
+// @Title 获取报告列表
+// @Description 获取报告列表
+// @Success 200 {object}
+// @router /list [get]
+func (r *ReportController) List(key string) {
+	controllers.Wrap(&r.BaseController, func() (result *controllers.WrapData, err error) {
+		fmt.Println(key)
+		result = r.InitWrapData("查询报告列表失败")
+		r.SuccessResult("查询报告列表成功", r.PageInfo, result)
+		return
+	})
+}
+
+// HotRanked @Title 获取本周最热的报告列表
+// @Description 获取本周最热的报告列表
+// @Success 200 {object}
+// @router /hotRankedList [HOT]
+func (r *ReportController) HotRanked(key string) {
+	controllers.Wrap(&r.BaseController, func() (result *controllers.WrapData, err error) {
+		fmt.Println(key)
+		result = r.InitWrapData("查询报告列表失败")
+		r.SuccessResult("查询报告列表成功", r.PageInfo, result)
+		return
+	})
+}
+
+// PublishRanked @Title 获取最新发布的报告列表
+// @Description 获取最新发布的报告列表
+// @Success 200 {object}
+// @router /publishRankedList [HOT]
+func (r *ReportController) PublishRanked(key string) {
+	controllers.Wrap(&r.BaseController, func() (result *controllers.WrapData, err error) {
+		fmt.Println(key)
+		result = r.InitWrapData("查询报告列表失败")
+		r.SuccessResult("查询报告列表成功", r.PageInfo, result)
+		return
+	})
+}

+ 84 - 0
domian/report/report_service.go

@@ -0,0 +1,84 @@
+package report
+
+import (
+	"eta_mini_ht_api/common/component/es"
+	logger "eta_mini_ht_api/common/component/log"
+	"eta_mini_ht_api/models/eta"
+	"eta_mini_ht_api/models/report"
+	"strconv"
+)
+
+const (
+	indexName = "report_index"
+)
+
+func elastic() *es.ESClient {
+	return es.GetInstance()
+}
+
+// ESReport Report ES研报mapping
+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"`
+}
+
+func (es ESReport) GetId() string {
+	return strconv.Itoa(es.ReportID)
+}
+func GetETALatestReportId() (id int, err error) {
+	return report.GetETALatestReportId()
+}
+
+func SyncETAReportList(list []eta.ETAReport) (err error) {
+	logger.Info("同步研报数量%d", len(list))
+	var reports []report.Report
+	var esReports []es.ESBase
+	for _, etaRp := range list {
+		destRp := convertEtaReport(etaRp)
+		reports = append(reports, destRp)
+	}
+	err = report.BatchInsertReport(&reports)
+	if err != nil {
+		logger.Error("同步ETA研报失败:%v", err)
+		return
+	}
+	for _, etaRp := range reports {
+		esRp := convertEsReport(etaRp)
+		esReports = append(esReports, esRp)
+	}
+	//同步es
+	err = elastic().BulkInsert(indexName, esReports)
+	if err != nil {
+		logger.Error("同步ETA研报到es失败:%v", err)
+		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 convertEsReport(report report.Report) ESReport {
+	return ESReport{
+		ReportID: report.ID,
+		OrgId:    report.OrgID,
+		Author:   report.Author,
+		Source:   report.Source,
+		Abstract: report.Abstract,
+		Status:   report.Status,
+	}
+}
+func GetList(id int, size int) []report.Report {
+	return nil
+}

+ 55 - 0
domian/task/task_service.go

@@ -0,0 +1,55 @@
+package task
+
+import (
+	logger "eta_mini_ht_api/common/component/log"
+	"eta_mini_ht_api/models/task"
+)
+
+type TaskDTO struct {
+	TaskType string
+	Detail   string
+}
+
+func InitTask(dto TaskDTO) (taskId int, err error) {
+	initTask := convertToTask(dto)
+	taskId, err = task.InitTask(initTask)
+	if err != nil {
+		logger.Error("创建任务记录失败:%v", err)
+		return
+	}
+	return
+}
+func InitAndStartTask(dto TaskDTO) (taskId int, err error) {
+	initTask := convertToTask(dto)
+	initTask.Status = task.StatusProcess
+	taskId, err = task.InitTask(initTask)
+	if err != nil {
+		logger.Error("创建任务记录失败:%v", err)
+		return
+	}
+	return
+}
+func StartTask(taskId int) {
+	err := task.UpdateTaskStatusById(taskId, task.StatusProcess)
+	if err != nil {
+		logger.Error("修改任务状态为启动失败:%d", taskId)
+	}
+}
+func UpdateAndFailedTask(taskId int, detail string) {
+	err := task.UpdateDetailsAndStatusById(taskId, task.StatusFailed, detail)
+	if err != nil {
+		logger.Error("修改任务状态为启动失败:%d", taskId)
+	}
+}
+func UpdateAndSuccessTask(taskId int, detail string) {
+	err := task.UpdateDetailsAndStatusById(taskId, task.StatusSuccess, detail)
+	if err != nil {
+		logger.Error("修改任务状态为启动失败:%d", taskId)
+	}
+}
+func convertToTask(dto TaskDTO) task.Task {
+	return task.Task{
+		TaskType: dto.TaskType,
+		Details:  dto.Detail,
+	}
+}

BIN
eta_mini_ht_api.exe~


+ 7 - 5
go.mod

@@ -4,9 +4,9 @@ go 1.21
 
 require (
 	github.com/beego/beego/v2 v2.2.2
+	github.com/dgrijalva/jwt-go v3.2.0+incompatible
 	github.com/go-redis/redis/v8 v8.11.5
 	github.com/gorilla/websocket v1.5.3
-	github.com/medivhzhan/weapp/v3 v3.8.1
 	gorm.io/driver/mysql v1.5.7
 	gorm.io/gorm v1.25.11
 )
@@ -15,22 +15,24 @@ require (
 	filippo.io/edwards25519 v1.1.0 // indirect
 	github.com/beorn7/perks v1.0.1 // indirect
 	github.com/cespare/xxhash/v2 v2.2.0 // indirect
-	github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect
 	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
-	github.com/fatih/color v1.16.0 // indirect
+	github.com/elastic/go-elasticsearch/v7 v7.17.10 // indirect
+	github.com/go-logr/logr v1.4.1 // indirect
+	github.com/go-logr/stdr v1.2.2 // indirect
 	github.com/go-sql-driver/mysql v1.8.1 // indirect
 	github.com/hashicorp/golang-lru v0.5.4 // indirect
 	github.com/jinzhu/inflection v1.0.0 // indirect
 	github.com/jinzhu/now v1.1.5 // indirect
 	github.com/kr/text v0.2.0 // indirect
-	github.com/mattn/go-colorable v0.1.13 // indirect
-	github.com/mattn/go-isatty v0.0.20 // indirect
 	github.com/mitchellh/mapstructure v1.5.0 // indirect
 	github.com/prometheus/client_golang v1.19.0 // indirect
 	github.com/prometheus/client_model v0.5.0 // indirect
 	github.com/prometheus/common v0.48.0 // indirect
 	github.com/prometheus/procfs v0.12.0 // indirect
 	github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 // indirect
+	go.opentelemetry.io/otel v1.24.0 // indirect
+	go.opentelemetry.io/otel/metric v1.24.0 // indirect
+	go.opentelemetry.io/otel/trace v1.24.0 // indirect
 	golang.org/x/crypto v0.23.0 // indirect
 	golang.org/x/net v0.23.0 // indirect
 	golang.org/x/sys v0.20.0 // indirect

+ 19 - 11
go.sum

@@ -13,12 +13,21 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumC
 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
+github.com/elastic/elastic-transport-go/v8 v8.6.0 h1:Y2S/FBjx1LlCv5m6pWAF2kDJAHoSjSRSJCApolgfthA=
+github.com/elastic/elastic-transport-go/v8 v8.6.0/go.mod h1:YLHer5cj0csTzNFXoNQ8qhtGY1GTvSqPnKWKaqQE3Hk=
+github.com/elastic/go-elasticsearch/v7 v7.17.10 h1:TCQ8i4PmIJuBunvBS6bwT2ybzVFxxUhhltAs3Gyu1yo=
+github.com/elastic/go-elasticsearch/v7 v7.17.10/go.mod h1:OJ4wdbtDNk5g503kvlHLyErCgQwwzmDtaFC4XyOxXA4=
+github.com/elastic/go-elasticsearch/v8 v8.14.0 h1:1ywU8WFReLLcxE1WJqii3hTtbPUE2hc38ZK/j4mMFow=
+github.com/elastic/go-elasticsearch/v8 v8.14.0/go.mod h1:WRvnlGkSuZyp83M2U8El/LGXpCjYLrvlkSgkAH4O5I4=
 github.com/elazarl/go-bindata-assetfs v1.0.1 h1:m0kkaHRKEu7tUIUFVwhGGGYClXvyl4RE03qmvRTNfbw=
 github.com/elazarl/go-bindata-assetfs v1.0.1/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4=
-github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
-github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
 github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
+github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
 github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
 github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
 github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
@@ -38,13 +47,6 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
 github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
-github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
-github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
-github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
-github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
-github.com/medivhzhan/weapp/v3 v3.8.1 h1:ZRYcEAU9mz73hI/X7+/qVj2ik+TPEQaI7PuiD2alF8E=
-github.com/medivhzhan/weapp/v3 v3.8.1/go.mod h1:xE4GrGv/3/eR2+GSO8L8wCmvbf261aBHJla/QmoVGQM=
 github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
 github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
 github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
@@ -69,12 +71,18 @@ github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 h1:DAYUYH5869yV94
 github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=
 github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
 github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=
+go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=
+go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=
+go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=
+go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=
+go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=
+go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=
+go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=
 golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI=
 golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
 golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
 golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
-golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
 golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=

+ 0 - 27
job/eta/eta_report_task.go

@@ -1,27 +0,0 @@
-package eta
-
-import (
-	"context"
-	"eta_mini_ht_api/models/eta"
-	"fmt"
-	"github.com/beego/beego/v2/task"
-)
-
-const (
-	TaskName = "etaReportSyncTask"
-)
-
-// Task ETA取研报的数据
-func Task() task.TaskFunc {
-	return func(ctx context.Context) error {
-		fmt.Println("开始同步研报库")
-		eta.GetETAReports()
-
-		return nil
-	}
-}
-func Init() {
-	tk := task.NewTask(TaskName, "* 0/10 * * * *", Task())
-	task.AddTask(TaskName, tk)
-	//task.StartTask()
-}

+ 0 - 11
job/eta/eta_report_task_test.go

@@ -1,11 +0,0 @@
-package eta
-
-import (
-	"eta_mini_ht_api/models/eta"
-	"testing"
-)
-
-func TestInit(t *testing.T) {
-	eta.GetETAReports()
-
-}

+ 0 - 30
job/sms/code_expired_task.go

@@ -1,30 +0,0 @@
-package sms
-
-import (
-	"context"
-	logger "eta_mini_ht_api/common/component/log"
-	"eta_mini_ht_api/domian/sms"
-	"fmt"
-	"github.com/beego/beego/v2/task"
-)
-
-const (
-	TaskName = "expiredCodeTask"
-)
-
-// Task ETA取研报的数据
-func Task() task.TaskFunc {
-	return func(ctx context.Context) error {
-		fmt.Println("开始处理过期短信")
-		err := sms.VerifiedCodeTask()
-		if err != nil {
-			logger.Error("自动更新短信状态失败:%v", err)
-		}
-		return err
-	}
-}
-func Init() {
-	tk := task.NewTask(TaskName, "0/10 * * * * *", Task())
-	task.AddTask(TaskName, tk)
-	task.StartTask()
-}

+ 0 - 15
job/task_service.go

@@ -1,15 +0,0 @@
-package job
-
-import (
-	"eta_mini_ht_api/job/sms"
-	"github.com/beego/beego/v2/task"
-)
-
-type ETATask interface {
-	Task() task.TaskFunc
-}
-
-func init() {
-	//eta.Init()
-	sms.Init()
-}

+ 3 - 2
main.go

@@ -4,9 +4,9 @@ import (
 	_ "eta_mini_ht_api/common/component"
 	logger "eta_mini_ht_api/common/component/log"
 	"eta_mini_ht_api/common/exception"
-	_ "eta_mini_ht_api/job"
 	"eta_mini_ht_api/middleware"
 	_ "eta_mini_ht_api/routers"
+	_ "eta_mini_ht_api/task"
 	"github.com/beego/beego/v2/server/web"
 )
 
@@ -15,7 +15,7 @@ func main() {
 		web.BConfig.WebConfig.DirectoryIndex = true
 		web.BConfig.WebConfig.StaticDir["/swagger"] = "swagger"
 	}
-	logger.Info("初始化成功")
+
 	//web.InsertFilter("*", web.BeforeRouter, cors.Allow(&cors.Options{
 	//	AllowAllOrigins:  true, // 允许所有来源的请求
 	//	AllowMethods:     []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
@@ -32,6 +32,7 @@ func main() {
 		//内存数据预热预加载
 		logger.Info("开始预加载数据")
 	}()
+	logger.Info("初始化成功")
 	web.Run()
 
 }

+ 8 - 2
middleware/auth_middleware.go

@@ -23,6 +23,7 @@ const (
 	NOTFOUND      = "未找到"
 	authorization = "Authorization"
 	baseUrl       = "/htapi"
+	Bearer        = "Bearer"
 )
 
 func rd() *cache.RedisCache {
@@ -46,14 +47,19 @@ func AuthMiddleware() web.FilterFunc {
 				logger.Error("token信息不存在")
 				_ = ctx.JSONResp(unAuthorized)
 			}
-			info, err := jwt.CheckToken(auth)
+			parts := strings.Split(auth, " ")
+			if len(parts) != 2 || parts[0] != Bearer {
+				logger.Error("token参数不符合格式")
+				_ = ctx.JSONResp(unAuthorized)
+			}
+			info, err := jwt.CheckToken(parts[1])
 			if err != nil {
 				logger.Error("token无效:%v", err)
 				_ = ctx.JSONResp(unAuthorized)
 			}
 			//校验redis中是否合法
 			redisToken := rd().GetString(redis.GenerateTokenKey(info.Mobile))
-			if redisToken != auth {
+			if redisToken != parts[1] {
 				logger.Error("token无效:用户token已刷新")
 				_ = ctx.JSONResp(unAuthorized())
 			}

+ 16 - 8
models/eta/eta_report.go

@@ -1,7 +1,6 @@
 package eta
 
 import (
-	"encoding/json"
 	logger "eta_mini_ht_api/common/component/log"
 	"eta_mini_ht_api/models"
 	"strings"
@@ -12,7 +11,7 @@ const (
 	published = 2
 	passed    = 6
 
-	limit = 500
+	limit = 3
 )
 
 var (
@@ -35,15 +34,24 @@ type ETAReport struct {
 	PublishTime      string `gorm:"column:publish_time" json:"publish_time"`
 }
 
-func GetETAReports() (reports []ETAReport, err error) {
-	err = models.ETA().Table("report").Select(colunms+strings.Join(classifyIds, ",")).Where("state =? or state=?", published, passed).Where("id > ?", 0).Order("id").Limit(limit).Find(&reports).Error
+func GetETAReports(id int) (reports []ETAReport, err error) {
+	err = models.ETA().Table("report").Select(colunms+strings.Join(classifyIds, ",")).Where("state =? or state=?", published, passed).Where("id > ?", id).Order("id").Limit(limit).Find(&reports).Error
 	if err != nil {
 		logger.Error("同步eta数据失败", err)
 	}
-	str, _ := json.Marshal(reports[0])
-	logger.Info(string(str))
+	for _, report := range reports {
+		setClassifyIdValue(&report)
+	}
 	return
 }
-func ClassifyId() {
-
+func setClassifyIdValue(report *ETAReport) {
+	if report.ClassifyIDThird > 0 {
+		report.ClassifyID = report.ClassifyIDThird
+		return
+	}
+	if report.ClassifyIDSecond > 0 {
+		report.ClassifyID = report.ClassifyIDSecond
+		return
+	}
+	report.ClassifyID = report.ClassifyIDFirst
 }

+ 63 - 0
models/report/report.go

@@ -0,0 +1,63 @@
+package report
+
+import (
+	logger "eta_mini_ht_api/common/component/log"
+	"eta_mini_ht_api/models"
+	"gorm.io/gorm"
+	"time"
+)
+
+type ReportStatus string
+type ReportSource string
+
+const (
+	SourceETA     ReportSource = "ETA"
+	SourceHT      ReportSource = "HT"
+	StatusInit    ReportStatus = "INIT"
+	StatusPending ReportStatus = "PENDING"
+	StatusDone    ReportStatus = "DONE"
+
+	MaxBatchNum = 1000
+)
+
+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"`
+}
+
+func BatchInsertReport(list *[]Report) error {
+	db := models.Main()
+	//手动事务
+	tx := db.Begin()
+	err := db.CreateInBatches(list, MaxBatchNum).Error
+	if err != nil {
+		logger.Error("批量插入研报失败:%v", err)
+	}
+	tx.Commit()
+	return nil
+}
+
+func (t *Report) BeforeCreate(_ *gorm.DB) (err error) {
+	t.CreatedTime = time.Now()
+	return
+}
+func GetETALatestReportId() (id int, err error) {
+	sql := "select IFNULL(max(org_id),0)  from reports where source = ?"
+	err = DoSql(sql, &id, SourceETA)
+	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
+}

+ 1 - 1
models/sms/verification_record.go

@@ -75,6 +75,6 @@ func InsertVerificationRecord(record VerificationRecord) (smId int, err error) {
 	if err != nil {
 		logger.Error("插入验证码记录失败:%v", err)
 	}
-	smId = int(record.ID)
+	smId = record.ID
 	return
 }

+ 73 - 0
models/task/task.go

@@ -0,0 +1,73 @@
+package task
+
+import (
+	logger "eta_mini_ht_api/common/component/log"
+	"eta_mini_ht_api/models"
+	"gorm.io/gorm"
+	"time"
+)
+
+// VerificationStatus is an enumeration for the status field.
+type TaskStatus string
+
+const (
+	StatusPending TaskStatus = "PENDING"
+	StatusProcess TaskStatus = "PROGRESS"
+	StatusSuccess TaskStatus = "SUCCESS"
+	StatusFailed  TaskStatus = "FAILED"
+)
+
+type Task struct {
+	ID          int        `gorm:"primary_key;auto_increment;comment:'主键'"`
+	TaskType    string     `gorm:"type:enum('');default:null;comment:'任务类型'"`
+	Details     string     `gorm:"type:json;default:null;comment:'任务详情'"`
+	Status      TaskStatus `gorm:"type:enum('PENDING','PROGRESS','SUCCESS','FAILED');not null;comment:'任务状态'"`
+	CreatedTime time.Time  `gorm:"default:null;comment:'创建时间'"`
+	UpdatedTime time.Time  `gorm:"default:null;comment:'更新时间'"`
+}
+
+// 在使用前,需要注册 Enum 类型
+func (v *Task) BeforeCreate(_ *gorm.DB) (err error) {
+	v.CreatedTime = time.Now()
+	if v.Status == "" {
+		v.Status = StatusPending
+	}
+	return
+}
+func InitTask(task Task) (taskId int, err error) {
+	err = models.Main().Create(&task).Error
+	if err != nil {
+		logger.Error("创建任务记录失败:%v", err)
+	}
+	taskId = task.ID
+	return
+}
+
+func UpdateTaskStatusById(taskId int, status TaskStatus) (err error) {
+	err = updateColumnById(taskId, "status", status)
+	if err != nil {
+		logger.Error("修改任务状态失败,id:[%d]:%v", taskId, err)
+	}
+	return
+}
+
+func UpdateDetailsAndStatusById(taskId int, status TaskStatus, details string) (err error) {
+	columns := map[string]interface{}{
+		"details": details,
+		"status":  status,
+	}
+	err = updateColumnsById(taskId, columns)
+	if err != nil {
+		logger.Error("修改任务失败,id:[%d]:%v", taskId, err)
+	}
+	return
+}
+
+func updateColumnsById(id int, value interface{}) (err error) {
+	err = models.Main().Model(&Task{}).Where("id =?", id).UpdateColumns(value).Error
+	return
+}
+func updateColumnById(id int, column string, value interface{}) (err error) {
+	err = models.Main().Model(&Task{}).Where("id =?", id).UpdateColumn(column, value).Error
+	return
+}

+ 11 - 0
routers/commentsRouter.go

@@ -7,6 +7,17 @@ import (
 
 func init() {
 
+    beego.GlobalControllerRouter["eta_mini_ht_api/controllers/report:ReportController"] = append(beego.GlobalControllerRouter["eta_mini_ht_api/controllers/report:ReportController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(
+				param.New("key"),
+			),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta_mini_ht_api/controllers/user:AuthController"] = append(beego.GlobalControllerRouter["eta_mini_ht_api/controllers/user:AuthController"],
         beego.ControllerComments{
             Method: "Login",

+ 6 - 0
routers/router.go

@@ -1,6 +1,7 @@
 package routers
 
 import (
+	"eta_mini_ht_api/controllers/report"
 	"eta_mini_ht_api/controllers/user"
 	beego "github.com/beego/beego/v2/server/web"
 )
@@ -17,6 +18,11 @@ func init() {
 				&user.AuthController{},
 			),
 		),
+		beego.NSNamespace("/report",
+			beego.NSInclude(
+				&report.ReportController{},
+			),
+		),
 	)
 	beego.AddNamespace(ns)
 }

+ 1 - 0
service/report/report_service.go

@@ -0,0 +1 @@
+package report

+ 17 - 0
swagger/swagger.json

@@ -61,6 +61,23 @@
                 }
             }
         },
+        "/report/list": {
+            "get": {
+                "tags": [
+                    "report"
+                ],
+                "description": "get all Users\n\u003cbr\u003e",
+                "operationId": "ReportController.GetAll",
+                "responses": {
+                    "200": {
+                        "description": "",
+                        "schema": {
+                            "$ref": "#/definitions/models.User"
+                        }
+                    }
+                }
+            }
+        },
         "/user/": {
             "get": {
                 "tags": [

+ 13 - 0
swagger/swagger.yml

@@ -42,6 +42,19 @@ paths:
           description: ""
           schema:
             $ref: '#/definitions/controllers.BaseResponse'
+  /report/list:
+    get:
+      tags:
+      - report
+      description: |-
+        get all Users
+        <br>
+      operationId: ReportController.GetAll
+      responses:
+        "200":
+          description: ""
+          schema:
+            $ref: '#/definitions/models.User'
   /user/:
     get:
       tags:

+ 78 - 0
task/base/eta_task.go

@@ -0,0 +1,78 @@
+package base
+
+import (
+	"context"
+	"encoding/json"
+	taskService "eta_mini_ht_api/domian/task"
+	"time"
+)
+
+const (
+	DEV  = "dev"
+	TEST = "test"
+	PROD = "prod"
+)
+
+type TaskType string
+type ETATask struct {
+	RunMode string
+	Name    TaskType
+	TaskFn  Task
+	Cron    string
+}
+type TaskDetail struct {
+	TaskId    int
+	StartTime time.Time
+	EndTime   time.Time
+	Content   string
+}
+
+type Task interface {
+	Execute(taskDetail TaskDetail) error
+}
+
+func NewTask(name TaskType, cron string, taskFunc Task, mode string) ETATask {
+	return ETATask{
+		Name:    name,
+		TaskFn:  taskFunc,
+		Cron:    cron,
+		RunMode: mode,
+	}
+}
+
+var tasks = make(map[TaskType]*ETATask)
+
+func GetTasks() map[TaskType]*ETATask {
+	return tasks
+}
+func RegisterTask(etaTask *ETATask) {
+	if etaTask == nil {
+		panic("不能注册空任务")
+	}
+	if _, ok := tasks[etaTask.Name]; ok {
+		panic("请勿重复创建任务:" + etaTask.Name)
+	}
+	tasks[etaTask.Name] = etaTask
+}
+
+func (eta *ETATask) Run(_ context.Context) (err error) {
+	details := TaskDetail{
+		StartTime: time.Now(),
+	}
+	runTask := taskService.TaskDTO{
+		TaskType: string(eta.Name),
+	}
+	//启动任务
+	taskId, err := taskService.InitAndStartTask(runTask)
+	details.TaskId = taskId
+	err = eta.TaskFn.Execute(details)
+	details.EndTime = time.Now()
+	detailStr, err := json.Marshal(details)
+	//任务状态
+	if err != nil {
+		taskService.UpdateAndFailedTask(taskId, string(detailStr))
+		return
+	}
+	taskService.UpdateAndSuccessTask(taskId, string(detailStr))
+	return
+}

+ 49 - 0
task/eta/eta_report_task.go

@@ -0,0 +1,49 @@
+package eta
+
+import (
+	"encoding/json"
+	logger "eta_mini_ht_api/common/component/log"
+	"eta_mini_ht_api/common/contants"
+	"eta_mini_ht_api/domian/report"
+	"eta_mini_ht_api/models/eta"
+	"eta_mini_ht_api/task/base"
+)
+
+var (
+	taskName base.TaskType = "ETAReportSyncTask"
+	cron                   = "0/10 * * * * *"
+)
+
+// Execute Task ETA取研报的数据
+func (re *ReportTask) Execute(taskDetail base.TaskDetail) error {
+	logger.Info(contants.TaskFormat, "同步ETA研报库开始")
+	id, err := report.GetETALatestReportId()
+	var etaReportList []eta.ETAReport
+	etaReportList, err = eta.GetETAReports(id)
+	if err != nil {
+		logger.Error("获取ETA研报列表失败:%v", err)
+		return err
+	}
+	if len(etaReportList) > 0 {
+		var list []byte
+		list, err = json.Marshal(etaReportList)
+		if err == nil {
+			taskDetail.Content = string(list)
+		}
+		err = report.SyncETAReportList(etaReportList)
+		if err != nil {
+			logger.Error("同步ETA研报列表失败:%v", err)
+			return err
+		}
+	}
+	logger.Info(contants.TaskFormat, "同步ETA研报库结束")
+	return nil
+}
+
+type ReportTask struct {
+}
+
+func init() {
+	reportTask := base.NewTask(taskName, cron, new(ReportTask), base.DEV)
+	base.RegisterTask(&reportTask)
+}

+ 32 - 0
task/sms/code_expired_task.go

@@ -0,0 +1,32 @@
+package sms
+
+import (
+	logger "eta_mini_ht_api/common/component/log"
+	"eta_mini_ht_api/common/contants"
+	"eta_mini_ht_api/domian/sms"
+	"eta_mini_ht_api/task/base"
+)
+
+var (
+	taskName base.TaskType = "ExpiredCodeTask"
+	cron                   = "0/10 * * * * *"
+)
+
+// Execute Task ETA取研报的数据
+func (st *SMSTask) Execute(taskDetail base.TaskDetail) error {
+	logger.Info(contants.TaskFormat, "处理过期短信开始")
+	err := sms.VerifiedCodeTask()
+	if err != nil {
+		logger.Error("自动更新短信状态失败:%v", err)
+	}
+	logger.Info(contants.TaskFormat, "处理过期短信结束")
+	return err
+}
+
+type SMSTask struct {
+}
+
+func init() {
+	smsTask := base.NewTask(taskName, cron, new(SMSTask), base.PROD)
+	base.RegisterTask(&smsTask)
+}

+ 28 - 0
task/task_starter.go

@@ -0,0 +1,28 @@
+package task
+
+import (
+	"eta_mini_ht_api/task/base"
+	_ "eta_mini_ht_api/task/eta"
+	_ "eta_mini_ht_api/task/sms"
+	"github.com/beego/beego/v2/server/web"
+	"github.com/beego/beego/v2/task"
+)
+
+func AddTasksToScheduler() {
+	for _, t := range base.GetTasks() {
+		if t.RunMode == web.BConfig.RunMode {
+			tk := task.NewTask(string(t.Name), t.Cron, t.Run)
+			task.AddTask(string(t.Name), tk)
+		}
+	}
+}
+
+// StartScheduler 启动任务调度器
+func StartScheduler() {
+	task.StartTask()
+}
+
+func init() {
+	AddTasksToScheduler()
+	StartScheduler()
+}