Explorar o código

Merge branch 'pool/all_chart_refresh'

Roc hai 1 ano
pai
achega
3a79a96d99

+ 49 - 10
controllers/data_manage/chart_info.go

@@ -5,6 +5,7 @@ import (
 	"eta/eta_api/controllers"
 	"eta/eta_api/models"
 	"eta/eta_api/models/data_manage"
+	"eta/eta_api/models/data_manage/response"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services"
 	"eta/eta_api/services/data"
@@ -2297,24 +2298,22 @@ func (this *EdbInfoController) BatchChartInfoRefresh() {
 		return
 	}
 
-	err, isAsync := data.BatchChartInfoRefreshV2(chartInfoList)
+	redisKey := data.GetBatchChartRefreshKey(req.Source, req.ReportId, req.ReportChapterId)
+
+	// 图表中的指标刷新
+	err, isAsync := data.BatchChartInfoRefreshV2(chartInfoList, redisKey)
 	if err != nil {
 		br.Msg = "刷新失败"
 		br.ErrMsg = "刷新图表关联指标信息失败,Err:" + err.Error()
 		return
 	}
-
-	//清除图表缓存
-	for _, v := range chartInfoList {
-		key := utils.HZ_CHART_LIB_DETAIL + v.UniqueCode
-		_ = utils.Rc.Delete(key)
-	}
-	br.Ret = 200
-	br.Success = true
 	br.Msg = "刷新成功"
 	if isAsync {
-		br.Msg = "图表关联指标较多,请10分钟后刷新页面查看最新数据"
+		br.Msg = "研报中图表关联指标较多,请10分钟后刷新页面查看最新数据"
 	}
+	br.Ret = 200
+	br.Success = true
+
 }
 
 // CopyChartInfo
@@ -2744,6 +2743,46 @@ func (this *ChartInfoController) PreviewSectionScatterChartInfo() {
 	br.Data = resp
 }
 
+// GetBatchChartRefreshResult
+// @Title 获取批量刷新图表结果的接口
+// @Description 获取批量刷新图表结果的接口
+// @Param	request	body data_manage.BatchChartRefreshReq true "type json string"
+// @Success Ret=200 刷新成功
+// @router /chart_info/batch_refresh/result [post]
+func (this *EdbInfoController) GetBatchChartRefreshResult() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req data_manage.BatchChartRefreshReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	// 刷新结果,默认是刷新完成了
+	refreshResult := data.CheckBatchChartRefreshResult(req.Source, req.ReportId, req.ReportChapterId)
+
+	resp := response.ChartRefreshResp{
+		RefreshResult: refreshResult,
+	}
+
+	br.Data = resp
+	br.Ret = 200
+	br.Success = true
+
+}
+
 //
 //修复数据时间戳
 

+ 11 - 0
controllers/english_report/report.go

@@ -8,6 +8,7 @@ import (
 	"eta/eta_api/models/system"
 	"eta/eta_api/services"
 	"eta/eta_api/services/alarm_msg"
+	"eta/eta_api/services/data"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
@@ -643,6 +644,7 @@ func (this *EnglishReportController) ListReport() {
 	br.Data = resp
 }
 
+// PublishReport
 // @Title 发布报告接口
 // @Description 发布报告
 // @Param	request	body models.PublishReq true "type json string"
@@ -687,6 +689,15 @@ func (this *EnglishReportController) PublishReport() {
 			return
 		}
 
+		// 图表刷新状态
+		refreshResult := data.CheckBatchChartRefreshResult("report", vint, 0)
+		if !refreshResult {
+			br.Msg = "图表刷新未完成,请稍后操作"
+			br.ErrMsg = "图表刷新未完成,请稍后操作"
+			br.IsSendEmail = false
+			return
+		}
+
 		var tmpErr error
 
 		if report.Content == "" {

+ 29 - 0
controllers/report.go

@@ -6,6 +6,7 @@ import (
 	"eta/eta_api/models/company"
 	"eta/eta_api/services"
 	"eta/eta_api/services/alarm_msg"
+	"eta/eta_api/services/data"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/server/web"
@@ -283,6 +284,15 @@ func (this *ReportController) PublishReport() {
 			br.Msg = "报告不存在"
 			return
 		}
+
+		refreshResult := data.CheckBatchChartRefreshResult("report", vint, 0)
+		if !refreshResult {
+			br.Msg = "图表刷新未完成,请稍后操作"
+			br.ErrMsg = "图表刷新未完成,请稍后操作"
+			br.IsSendEmail = false
+			return
+		}
+
 		var publishTime time.Time
 		if report.MsgIsSend == 1 && report.PublishTime != "" { //如果报告曾经发布过,并且已经发送过模版消息,则章节的发布时间为报告的发布时间
 			publishTime, _ = time.ParseInLocation(utils.FormatDateTime, report.PublishTime, time.Local)
@@ -2738,6 +2748,15 @@ func (this *ReportController) PublishDayWeekReportChapter() {
 		return
 	}
 
+	// 图表刷新状态
+	refreshResult := data.CheckBatchChartRefreshResult("report", chapterInfo.ReportId, chapterInfo.ReportChapterId)
+	if !refreshResult {
+		br.Msg = "图表刷新未完成,请稍后操作"
+		br.ErrMsg = "图表刷新未完成,请稍后操作"
+		br.IsSendEmail = false
+		return
+	}
+
 	// 获取规则配置
 	reportChapterTypeRule, err := models.GetReportChapterTypeById(chapterInfo.TypeId)
 	if err != nil {
@@ -2910,6 +2929,16 @@ func (this *ReportController) PublishDayWeekReport() {
 		br.Msg = "该报告已发布"
 		return
 	}
+
+	// 图表刷新状态
+	refreshResult := data.CheckBatchChartRefreshResult("report", reportId, 0)
+	if !refreshResult {
+		br.Msg = "图表刷新未完成,请稍后操作"
+		br.ErrMsg = "图表刷新未完成,请稍后操作"
+		br.IsSendEmail = false
+		return
+	}
+
 	tips, err := services.PublishDayWeekReport(reportId)
 	if err != nil {
 		br.Msg = "发布失败"

+ 11 - 1
controllers/smart_report/smart_report.go

@@ -7,6 +7,7 @@ import (
 	"eta/eta_api/models/smart_report"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services"
+	"eta/eta_api/services/data"
 	smartReportService "eta/eta_api/services/smart_report"
 	"eta/eta_api/utils"
 	"fmt"
@@ -426,6 +427,15 @@ func (this *SmartReportController) Publish() {
 		return
 	}
 
+	// 图表刷新状态
+	refreshResult := data.CheckBatchChartRefreshResult("report", item.SmartReportId, 0)
+	if !refreshResult {
+		br.Msg = "图表刷新未完成,请稍后操作"
+		br.ErrMsg = "图表刷新未完成,请稍后操作"
+		br.IsSendEmail = false
+		return
+	}
+
 	cols := []string{"State", "ModifyTime"}
 	item.State = req.PublishState
 	item.ModifyTime = time.Now().Local()
@@ -453,7 +463,7 @@ func (this *SmartReportController) Publish() {
 	recordItem := &models.ReportStateRecord{
 		ReportId:   req.SmartReportId,
 		ReportType: 2,
-		State:     req.PublishState,
+		State:      req.PublishState,
 		AdminId:    this.SysUser.AdminId,
 		AdminName:  this.SysUser.AdminName,
 		CreateTime: time.Now(),

+ 4 - 1
models/data_manage/chart_info.go

@@ -1376,7 +1376,10 @@ func GetChartInfoByClassifyIdAndName(classifyId int, chartName string) (item *Ch
 
 // BatchChartRefreshReq 批量刷新图表请求
 type BatchChartRefreshReq struct {
-	ChartInfoCode []string `description:"图表编码数组"`
+	ChartInfoCode   []string `description:"图表编码数组"`
+	ReportId        int      `description:"报告id"`
+	ReportChapterId int      `description:"报告章节id"`
+	Source          string   `description:"来源,枚举值:report、english_report、smart_report"`
 }
 
 // GetChartInfoListByUniqueCodeSlice 根据图表编码获取图表列表数据

+ 7 - 0
models/data_manage/response/chart.go

@@ -0,0 +1,7 @@
+package response
+
+// ChartRefreshResp
+// @Description: 图表更新结果
+type ChartRefreshResp struct {
+	RefreshResult bool `description:"刷新结果"`
+}

+ 9 - 0
routers/commentsRouter.go

@@ -2266,6 +2266,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "GetBatchChartRefreshResult",
+            Router: `/chart_info/batch_refresh/result`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
         beego.ControllerComments{
             Method: "ChartInfoRefresh",

+ 100 - 8
services/data/chart_info.go

@@ -1434,6 +1434,7 @@ func ChartInfoRefreshV2(chartInfoId int) (err error, isAsync bool) {
 
 	// 批量刷新
 	err, isAsync = EdbInfoRefreshAllFromBaseV3(edbIdList, false, false)
+
 	if err != nil {
 		return
 	}
@@ -1445,7 +1446,7 @@ func ChartInfoRefreshV2(chartInfoId int) (err error, isAsync bool) {
 // @author Roc
 // @datetime 2022-09-16 10:15:38
 // @description 将原来自己写的一套获取所有关联指标,然后刷新指标逻辑 改成  只获取使用的指标id,然后遍历去调用“指标刷新服务”
-func BatchChartInfoRefreshV2(chartInfoList []*data_manage.ChartInfo) (err error, isAsync bool) {
+func BatchChartInfoRefreshV2(chartInfoList []*data_manage.ChartInfo, redisKey string) (err error, isAsync bool) {
 	if len(chartInfoList) <= 0 {
 		return
 	}
@@ -1454,15 +1455,28 @@ func BatchChartInfoRefreshV2(chartInfoList []*data_manage.ChartInfo) (err error,
 		chartInfoIdSlice = append(chartInfoIdSlice, chartInfo.ChartInfoId)
 	}
 
-	var errmsg string
+	var errMsg string
 	defer func() {
 		if err != nil {
-			go alarm_msg.SendAlarmMsg("ChartInfoRefresh:"+errmsg, 3)
+			go alarm_msg.SendAlarmMsg("ChartInfoRefresh:"+errMsg, 3)
 			//go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "ChartInfoRefresh:"+errmsg, utils.EmailSendToUsers)
-			fmt.Println("ChartInfoRefresh Err:" + errmsg)
+			fmt.Println("ChartInfoRefresh Err:" + errMsg)
 		}
 	}()
 
+	// 是否删除缓存
+	isDeleteCache := true
+	if redisKey != `` {
+		//设置最多10分钟缓存
+		utils.Rc.SetNX(redisKey, 1, time.Minute*10)
+		defer func() {
+			if isDeleteCache {
+				utils.Rc.Delete(redisKey)
+			}
+		}()
+	}
+
+	// 获取需要刷新的指标信息
 	edbIdList := make([]int, 0)
 	edbInfoIdMap := make(map[int]int)
 	edbMappingList, err := data_manage.GetChartEdbMappingListByIdList(chartInfoIdSlice)
@@ -1473,10 +1487,88 @@ func BatchChartInfoRefreshV2(chartInfoList []*data_manage.ChartInfo) (err error,
 		}
 	}
 
-	// 批量刷新
-	err, isAsync = EdbInfoRefreshAllFromBaseV3(edbIdList, false, false)
-	if err != nil {
-		return
+	// 获取需要刷新的指标列表
+	newBaseEdbInfoArr, newBasePredictEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr := getEdbInfoIdList(edbIdList)
+
+	// 需要刷新的指标数量
+	totalEdbInfo := len(newBaseEdbInfoArr) + len(calculateArr) + len(predictCalculateArr)
+
+	if totalEdbInfo > 20 { // 关联指标过多的时候,异步刷新
+		isAsync = true
+		isDeleteCache = false // 不删除缓存
+		go refreshChartEdbInfo(chartInfoList, redisKey, newBaseEdbInfoArr, newBasePredictEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr)
+	} else {
+		err = edbInfoRefreshAll(false, newBaseEdbInfoArr, newBasePredictEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr)
+
+		//清除图表缓存
+		for _, v := range chartInfoList {
+			key := utils.HZ_CHART_LIB_DETAIL + v.UniqueCode
+			_ = utils.Rc.Delete(key)
+		}
+	}
+
+	return
+}
+
+// refreshChartEdbInfo
+// @Description: 刷新图表中的质保列表
+// @author: Roc
+// @datetime 2023-12-01 16:05:39
+// @param chartInfoList []*data_manage.ChartInfo
+// @param redisKey string
+// @param newBaseEdbInfoArr []*data_manage.EdbInfo
+// @param newBasePredictEdbInfoArr []*data_manage.EdbInfo
+// @param newCalculateMap map[int]*data_manage.EdbInfo
+// @param newPredictCalculateMap map[int]*data_manage.EdbInfo
+// @param calculateArr []int
+// @param predictCalculateArr []int
+func refreshChartEdbInfo(chartInfoList []*data_manage.ChartInfo, redisKey string, newBaseEdbInfoArr, newBasePredictEdbInfoArr []*data_manage.EdbInfo, newCalculateMap, newPredictCalculateMap map[int]*data_manage.EdbInfo, calculateArr, predictCalculateArr []int) {
+	edbInfoRefreshAll(false, newBaseEdbInfoArr, newBasePredictEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr)
+
+	//清除图表缓存
+	for _, v := range chartInfoList {
+		key := utils.HZ_CHART_LIB_DETAIL + v.UniqueCode
+		_ = utils.Rc.Delete(key)
+	}
+	// 如果是有插入redisKey,那么刷新结束后就清除缓存
+	if redisKey != `` {
+		utils.Rc.Delete(redisKey)
+	}
+}
+
+// GetBatchChartRefreshKey
+// @Description: 获取批量刷新key
+// @author: Roc
+// @datetime 2023-11-30 13:30:26
+// @param source string
+// @param reportId int
+// @param reportChapterId int
+// @return string
+func GetBatchChartRefreshKey(source string, reportId, reportChapterId int) string {
+	if source == `` {
+		return ``
+	}
+
+	return fmt.Sprint("batch_chart_refresh:", source, ":", reportId, ":", reportChapterId)
+}
+
+// CheckBatchChartRefreshResult
+// @Description: 判断报告中的图表是否刷新完成
+// @author: Roc
+// @datetime 2023-11-30 13:30:26
+// @param source string
+// @param reportId int
+// @param reportChapterId int
+// @return string
+func CheckBatchChartRefreshResult(source string, reportId, reportChapterId int) (refreshResult bool) {
+	refreshResult = true
+	redisKey := GetBatchChartRefreshKey(source, reportId, reportChapterId)
+	if redisKey != `` {
+		// 如果找到了key,那么就是还在更新中
+		isOk := utils.Rc.IsExist(redisKey)
+		if isOk {
+			refreshResult = false
+		}
 	}
 
 	return

+ 37 - 18
services/data/edb_info.go

@@ -73,9 +73,9 @@ func EdbInfoRefreshAllFromBaseV3Bak(edbInfoIdList []int, refreshAll, isSync bool
 //	@datetime2023-10-23 09:57:55
 //	@param edbInfoIdList []int
 //	@param refreshAll bool
-//	@param isSync bool
+//	@param isSync bool 是否同步执行
 //	@return err error
-//	@return isAsync bool
+//	@return isAsync bool 是否异步刷新
 func EdbInfoRefreshAllFromBaseV3(edbInfoIdList []int, refreshAll, isSync bool) (err error, isAsync bool) {
 	var errmsg string
 	defer func() {
@@ -84,6 +84,35 @@ func EdbInfoRefreshAllFromBaseV3(edbInfoIdList []int, refreshAll, isSync bool) (
 			go alarm_msg.SendAlarmMsg("EdbInfoRefreshAllFromBaseV3,Err"+err.Error()+";errMsg:"+errmsg, 3)
 		}
 	}()
+
+	// 获取需要刷新的指标列表
+	newBaseEdbInfoArr, newBasePredictEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr := getEdbInfoIdList(edbInfoIdList)
+
+	// 需要刷新的指标数量
+	totalEdbInfo := len(newBaseEdbInfoArr) + len(calculateArr) + len(predictCalculateArr)
+
+	if totalEdbInfo <= 20 || isSync {
+		err = edbInfoRefreshAll(refreshAll, newBaseEdbInfoArr, newBasePredictEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr)
+	} else {
+		isAsync = true
+		go edbInfoRefreshAll(refreshAll, newBaseEdbInfoArr, newBasePredictEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr)
+	}
+
+	return
+}
+
+// getEdbInfoIdList
+// @Description: 获取待更新的指标列表
+// @author: Roc
+// @datetime 2023-12-01 16:19:42
+// @param edbInfoIdList []int
+// @return newBaseEdbInfoArr []*data_manage.EdbInfo
+// @return newBasePredictEdbInfoArr []*data_manage.EdbInfo
+// @return newCalculateMap map[int]*data_manage.EdbInfo
+// @return newPredictCalculateMap map[int]*data_manage.EdbInfo
+// @return calculateArr []int
+// @return predictCalculateArr []int
+func getEdbInfoIdList(edbInfoIdList []int) (newBaseEdbInfoArr, newBasePredictEdbInfoArr []*data_manage.EdbInfo, newCalculateMap, newPredictCalculateMap map[int]*data_manage.EdbInfo, calculateArr, predictCalculateArr []int) {
 	traceEdbInfoList, err := TraceEdbInfoByEdbInfoIdList(edbInfoIdList)
 	if err != nil {
 		return
@@ -92,16 +121,16 @@ func EdbInfoRefreshAllFromBaseV3(edbInfoIdList []int, refreshAll, isSync bool) (
 	existEdbInfoIdMap := make(map[int]int)
 
 	// 基础指标
-	newBaseEdbInfoArr := make([]*data_manage.EdbInfo, 0)
-	newBasePredictEdbInfoArr := make([]*data_manage.EdbInfo, 0)
+	newBaseEdbInfoArr = make([]*data_manage.EdbInfo, 0)
+	newBasePredictEdbInfoArr = make([]*data_manage.EdbInfo, 0)
 	newBaseMap := make(map[int]*data_manage.EdbInfo)
 	newPredictBaseMap := make(map[int]*data_manage.EdbInfo)
 
 	// 计算指标
-	newCalculateMap := make(map[int]*data_manage.EdbInfo)
-	newPredictCalculateMap := make(map[int]*data_manage.EdbInfo)
-	calculateArr := make([]int, 0)
-	predictCalculateArr := make([]int, 0)
+	newCalculateMap = make(map[int]*data_manage.EdbInfo)
+	newPredictCalculateMap = make(map[int]*data_manage.EdbInfo)
+	calculateArr = make([]int, 0)
+	predictCalculateArr = make([]int, 0)
 
 	// 获取关联指标
 	for _, traceEdbInfo := range traceEdbInfoList {
@@ -145,16 +174,6 @@ func EdbInfoRefreshAllFromBaseV3(edbInfoIdList []int, refreshAll, isSync bool) (
 	// 预测计算指标的id
 	sort.Ints(predictCalculateArr)
 
-	// 需要刷新的指标数量
-	totalEdbInfo := len(newBaseEdbInfoArr) + len(calculateArr) + len(predictCalculateArr)
-
-	if totalEdbInfo <= 20 || isSync {
-		err = edbInfoRefreshAll(refreshAll, newBaseEdbInfoArr, newBasePredictEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr)
-	} else {
-		isAsync = true
-		go edbInfoRefreshAll(refreshAll, newBaseEdbInfoArr, newBasePredictEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr)
-	}
-
 	return
 }