Browse Source

Merge branch 'feature/eta2.5.9_api_stat' into debug

# Conflicts:
#	logic/profit_chart_info.go
xyxie 5 days ago
parent
commit
8d15f063b7

+ 1 - 1
controllers/base_from_pb.go

@@ -140,7 +140,7 @@ func (this *PbController) Refresh() {
 		return
 	}
 
-	dataItem, err := services.GetEdbDataFromPb(req.EdbCode, startDateTime.Format(utils.FormatDateUnSpace), endDateTime.Format(utils.FormatDateUnSpace), edbInfo.TerminalCode)
+	dataItem, err := services.GetEdbDataFromPb(req.EdbCode, startDateTime.Format(utils.FormatDateUnSpace), endDateStr, edbInfo.TerminalCode)
 	// 日志记录
 	num := 0
 	if dataItem != nil {

+ 1 - 1
controllers/base_from_pb_finance.go

@@ -160,7 +160,7 @@ func (this *PbFinanceController) Refresh() {
 		br.ErrMsg = "指标编码异常,请传入客户编码"
 		return
 	}
-	dataItem, err := services.GetEdbDataFromPbFinance(edbCodeArr[0], edbCodeArr[1], startDateTime.Format(utils.FormatDateUnSpace), endDateTime.Format(utils.FormatDateUnSpace), edbInfo.TerminalCode)
+	dataItem, err := services.GetEdbDataFromPbFinance(edbCodeArr[0], edbCodeArr[1], startDateTime.Format(utils.FormatDateUnSpace), endDateStr, edbInfo.TerminalCode)
 	// 日志记录
 	num := 0
 	if dataItem != nil {

+ 14 - 3
controllers/base_from_ths.go

@@ -43,7 +43,7 @@ func (this *ThsController) Add() {
 	cacheKey = utils.CACHE_EDB_DATA_ADD + strconv.Itoa(source) + "_" + req.EdbCode
 	if !utils.Rc.IsExist(cacheKey) {
 		utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
-		dataItem, err := services.GetEdbDataFromThs(req.EdbCode, utils.BASE_START_DATE, utils.BASE_END_DATE, "")
+		dataItem, _, err := services.GetEdbDataFromThs(req.EdbCode, utils.BASE_START_DATE, utils.BASE_END_DATE, "")
 		if err != nil {
 			br.Msg = "获取指标信息失败!"
 			br.ErrMsg = "获取指标信息失败 GetEdbDataFromThs,Err:" + err.Error()
@@ -111,16 +111,27 @@ func (this *ThsController) Refresh() {
 	}
 
 	utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+	var hasUpdate bool
+	var updateResult bool
+	var realApiErrMsg string
+	var dataItem models.EdbDataFromThs
 	defer func() {
 		utils.Rc.Delete(cacheKey)
+		var updateFailedReason string
+		if err == nil {
+			updateResult = true
+		} else {
+			updateFailedReason = err.Error()
+		}
+		_ = services.EdbDataUpdateRecord(edbInfo.EdbInfoId, hasUpdate, updateResult, updateFailedReason, realApiErrMsg)
 	}()
-	dataItem, err := services.GetEdbDataFromThs(req.EdbCode, utils.GetEdbRefreshStartDate(req.StartDate), utils.BASE_END_DATE, edbInfo.TerminalCode)
+	dataItem, realApiErrMsg, err = services.GetEdbDataFromThs(req.EdbCode, utils.GetEdbRefreshStartDate(req.StartDate), utils.BASE_END_DATE, edbInfo.TerminalCode)
 	if err != nil {
 		br.Msg = "获取指标信息失败!"
 		br.ErrMsg = "获取指标信息失败 GetEdbDataFromThs,Err:" + err.Error()
 		return
 	}
-	err = models.RefreshEdbDataFromThs(req.EdbInfoId, req.EdbCode, utils.GetEdbRefreshStartDate(req.StartDate), dataItem)
+	hasUpdate, err = models.RefreshEdbDataFromThs(req.EdbInfoId, req.EdbCode, utils.GetEdbRefreshStartDate(req.StartDate), dataItem)
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "刷新指标信息失败!"
 		br.ErrMsg = "刷新指标信息失败 RefreshEdbDataFromThs,Err:" + err.Error()

+ 78 - 42
logic/profit_chart_info.go

@@ -241,6 +241,7 @@ func GetProfitChartEdbData(baseEdbInfo *models.EdbInfo, edbInfoList []*models.Ed
 	}
 	// 指标对应的所有数据
 	//edbDataListMap := make(map[int][]*models.EdbDataList)
+
 	// 普通的指标数据
 	baseDataListMap := make(map[int][]*models.EdbDataList)
 	for _, v := range edbInfoList {
@@ -254,7 +255,7 @@ func GetProfitChartEdbData(baseEdbInfo *models.EdbInfo, edbInfoList []*models.Ed
 
 	latestDate := zlFutureGoodEdbInfoList[0].EndDate
 	latestDateTime, _ := time.ParseInLocation(utils.FormatDate, latestDate, time.Local)
-
+	findDateTimeList := make([]time.Time, 0)
 	earliestDateTime := latestDateTime // 数据的最早日期,目的是为了找出最早的合约
 	for _, barChartInfoDate := range chartInfoDateList {
 		var findDateTime time.Time
@@ -280,14 +281,19 @@ func GetProfitChartEdbData(baseEdbInfo *models.EdbInfo, edbInfoList []*models.Ed
 			return
 		}
 		if findDateTime.Before(earliestDateTime) {
-			earliestDateTime = findDateTime
+		 	earliestDateTime = findDateTime
 		}
+
+		findDateTimeList = append(findDateTimeList, findDateTime)
 	}
 
-	monthNum := (latestDateTime.Year()-earliestDateTime.Year())*12 + int(latestDateTime.Month()-earliestDateTime.Month())
+	monthNumMap := make(map[string]int)
+	for _, findDateTimeTmp := range findDateTimeList {
+		monthNumMap[findDateTimeTmp.Format(utils.FormatDate)] = (latestDateTime.Year()-findDateTimeTmp.Year())*12 + int(latestDateTime.Month()-findDateTimeTmp.Month())
+	}
 
 	// 存储主力合约下的所有月份合约
-	futureGoodEdbInfoDateMap := make(map[int]map[string]*future_good.FutureGoodEdbInfo)
+	futureGoodEdbInfoDateAllMap := make(map[int]map[string]map[string]*future_good.FutureGoodEdbInfo)
 	futureGoodDataListMap := make(map[int][]*models.EdbDataList, 0)
 	// 特殊的商品期货合约(只有M+N的合约,没有固定日期的合约)
 	specialFutureGoodEdbInfoMap := make(map[int]map[int]*future_good.FutureGoodEdbInfo, 0)
@@ -300,7 +306,7 @@ func GetProfitChartEdbData(baseEdbInfo *models.EdbInfo, edbInfoList []*models.Ed
 		}
 	}
 
-	nMap := make(map[string]string)
+	nAllMap := make(map[string][]string)
 	var maxN int // 最大N值
 	for _, v := range zlFutureGoodEdbInfoList {
 		// 如果不是有效的商品期货指标,那么就过滤掉,不做数据查询处理,避免没必要的请求
@@ -314,41 +320,45 @@ func GetProfitChartEdbData(baseEdbInfo *models.EdbInfo, edbInfoList []*models.Ed
 			return
 		}
 
-		childFutureGoodEdbInfoMap, tmpMaxN, tmpErr := getProfitFutureGoodEdbInfoList(earliestDateTime, v, tmpFutureGoodEdbInfoList, monthNum)
+		childFutureGoodEdbInfoAllMap, tmpMaxN, tmpErr := GetProfitFutureGoodEdbInfoList(findDateTimeList, v, tmpFutureGoodEdbInfoList, isAllChina, monthNumMap)
 		if tmpErr != nil {
 			err = tmpErr
 			return
 		}
+	
 		if maxN < tmpMaxN {
 			maxN = tmpMaxN
 		}
-		futureGoodEdbInfoDateMap[v.FutureGoodEdbInfoId] = childFutureGoodEdbInfoMap
+		
+		futureGoodEdbInfoDateAllMap[v.FutureGoodEdbInfoId] = childFutureGoodEdbInfoAllMap
 
 		if v.FutureGoodEdbType == 2 {
 			specialFutureGoodEdbInfoMap[v.FutureGoodEdbInfoId] = make(map[int]*future_good.FutureGoodEdbInfo)
 		}
 		// 获取数据
-		for date, childFutureGoodEdbInfo := range childFutureGoodEdbInfoMap {
-			nMap[date] = date
-			dataList := make([]*models.EdbDataList, 0)
-
-			tmpDataList, tmpErr := future_good.GetFutureGoodEdbDataListByDate(childFutureGoodEdbInfo.FutureGoodEdbInfoId, "", "")
-			if tmpErr != nil {
-				return
-			}
-			for _, tmpData := range tmpDataList {
-				dataList = append(dataList, &models.EdbDataList{
-					EdbDataId:     tmpData.FutureGoodEdbDataId,
-					EdbInfoId:     tmpData.FutureGoodEdbInfoId,
-					DataTime:      tmpData.DataTime.Format(utils.FormatDate),
-					DataTimestamp: tmpData.DataTimestamp,
-					Value:         tmpData.Close,
-				})
-			}
-			futureGoodDataListMap[childFutureGoodEdbInfo.FutureGoodEdbInfoId] = dataList
-
-			if childFutureGoodEdbInfo.FutureGoodEdbType == 2 {
-				specialFutureGoodEdbInfoMap[v.FutureGoodEdbInfoId][childFutureGoodEdbInfo.Month] = childFutureGoodEdbInfo
+		for findDateTime, childFutureGoodEdbInfoMap := range childFutureGoodEdbInfoAllMap {
+			for date, childFutureGoodEdbInfo := range childFutureGoodEdbInfoMap {
+				nAllMap[findDateTime] = append(nAllMap[findDateTime], date)
+				dataList := make([]*models.EdbDataList, 0)
+				if _, ok := futureGoodDataListMap[childFutureGoodEdbInfo.FutureGoodEdbInfoId]; !ok {
+					tmpDataList, tmpErr := future_good.GetFutureGoodEdbDataListByDate(childFutureGoodEdbInfo.FutureGoodEdbInfoId, "", "")
+					if tmpErr != nil {
+						return
+					}
+					for _, tmpData := range tmpDataList {
+						dataList = append(dataList, &models.EdbDataList{
+							EdbDataId:     tmpData.FutureGoodEdbDataId,
+							EdbInfoId:     tmpData.FutureGoodEdbInfoId,
+							DataTime:      tmpData.DataTime.Format(utils.FormatDate),
+							DataTimestamp: tmpData.DataTimestamp,
+							Value:         tmpData.Close,
+						})
+					}
+					futureGoodDataListMap[childFutureGoodEdbInfo.FutureGoodEdbInfoId] = dataList
+				}
+				if childFutureGoodEdbInfo.FutureGoodEdbType == 2 {
+					specialFutureGoodEdbInfoMap[v.FutureGoodEdbInfoId][childFutureGoodEdbInfo.Month] = childFutureGoodEdbInfo
+				}
 			}
 		}
 	}
@@ -359,13 +369,14 @@ func GetProfitChartEdbData(baseEdbInfo *models.EdbInfo, edbInfoList []*models.Ed
 	}
 
 	// 找出所有的N值,并进行正序排列
-	dateList := make([]string, 0)
-	for _, n := range nMap {
-		dateList = append(dateList, n)
+	dateListMap := make(map[string][]string, 0)
+	for key, dateList := range nAllMap {
+		sort.Slice(dateList, func(i, j int) bool {
+			return dateList[i] < dateList[j]
+		})
+		dateListMap[key] = dateList
 	}
-	sort.Slice(dateList, func(i, j int) bool {
-		return dateList[i] < dateList[j]
-	})
+	
 	var reqEdbInfoIds []int
 	for _, v := range edbInfoList {
 		reqEdbInfoIds = append(reqEdbInfoIds, v.EdbInfoId)
@@ -377,7 +388,7 @@ func GetProfitChartEdbData(baseEdbInfo *models.EdbInfo, edbInfoList []*models.Ed
 	}
 	var edbIdList []int
 	futureGoodNameMap := make(map[int]map[int]string)
-	edbIdList, yDataList, futureGoodNameMap, err = ProfitChartChartData(baseEdbInfo, baseDataListMap, futureGoodEdbInfoDateMap, futureGoodDataListMap, chartInfoDateList, baseEdbInfo.EndDate, specialFutureGoodEdbInfoMap, formulaStr, tagEdbIdMap, dateList, maxN, reqEdbInfoIds)
+	edbIdList, yDataList, futureGoodNameMap, err = ProfitChartChartData(baseEdbInfo, baseDataListMap, futureGoodEdbInfoDateAllMap, futureGoodDataListMap, chartInfoDateList, baseEdbInfo.EndDate, specialFutureGoodEdbInfoMap, formulaStr, tagEdbIdMap, dateListMap, maxN, reqEdbInfoIds)
 
 	// todo 最后处理数据
 	tmpXDataList, newYDataList, err := handleProfitResultData(xDataList, futureGoodNameMap, yDataList, earliestDateTime, edbIdList)
@@ -396,7 +407,7 @@ func GetProfitChartEdbData(baseEdbInfo *models.EdbInfo, edbInfoList []*models.Ed
 }
 
 // ProfitChartChartData 获取数据
-func ProfitChartChartData(baseEdbInfo *models.EdbInfo, baseDataListMap map[int][]*models.EdbDataList, futureGoodEdbInfoMap map[int]map[string]*future_good.FutureGoodEdbInfo, futureGoodEdbDataListMap map[int][]*models.EdbDataList, chartInfoDateList []ChartInfoDateReq, latestDate string, specialFutureGoodEdbInfoMap map[int]map[int]*future_good.FutureGoodEdbInfo, formulaStr string, tagEdbIdMap map[string]int, dateList []string, maxN int, reqEdbInfoIds []int) (edbIdList []int, yDataList []YData, futureGoodNameMap map[int]map[int]string, err error) {
+func ProfitChartChartData(baseEdbInfo *models.EdbInfo, baseDataListMap map[int][]*models.EdbDataList, futureGoodEdbInfoAllMap map[int]map[string]map[string]*future_good.FutureGoodEdbInfo, futureGoodEdbDataListMap map[int][]*models.EdbDataList, chartInfoDateList []ChartInfoDateReq, latestDate string, specialFutureGoodEdbInfoMap map[int]map[int]*future_good.FutureGoodEdbInfo, formulaStr string, tagEdbIdMap map[string]int, dateListMap map[string][]string, maxN int, reqEdbInfoIds []int) (edbIdList []int, yDataList []YData, futureGoodNameMap map[int]map[int]string, err error) {
 	// 指标数据数组(10086:{"2022-12-02":100.01,"2022-12-01":102.3})
 	//earliestDateTime time.Time
 	// ETA指标数据
@@ -475,6 +486,7 @@ func ProfitChartChartData(baseEdbInfo *models.EdbInfo, baseDataListMap map[int][
 		if isFind {
 			maxDate = realDateTime
 		}
+		fmt.Println("findDateTime", findDateTime, "realDateTime", realDateTime, "findDataValue", findDataValue, "isFind", isFind)
 		edbIdList = make([]int, 0) //普通指标ID
 		for _, edbInfoId := range reqEdbInfoIds {
 			if edbInfoId == baseEdbInfo.EdbInfoId {
@@ -506,6 +518,7 @@ func ProfitChartChartData(baseEdbInfo *models.EdbInfo, baseDataListMap map[int][
 		mList := make([]int, 0) // 间隔月份
 
 		tmpNameMap := make(map[int]string)
+		dateList := dateListMap[findDateTime.Format(utils.FormatDate)]
 		// 最小开始的n值
 		//minN := (findDateTime.Year()-earliestDateTime.Year())*12 + int(findDateTime.Month()-earliestDateTime.Month())
 		for _, date := range dateList {
@@ -519,17 +532,20 @@ func ProfitChartChartData(baseEdbInfo *models.EdbInfo, baseDataListMap map[int][
 			// 获取当前日期相对开始日期的期数
 			tmpN := (currDate.Year()-realDateTime.Year())*12 + int(currDate.Month()-realDateTime.Month())
 			if tmpN <= 0 {
+				fmt.Println("realDateTime跳出循环",realDateTime,"tmpN", tmpN, "currDate", currDate, "realDateTime", realDateTime)
 				continue
 			}
 
 			// 如果期数大于最大期数,那么就退出当前匹配
 			if tmpN >= maxN {
+				fmt.Println("realDateTime跳出循环",realDateTime,"tmpN >= maxN",tmpN, "maxN", maxN)
 				break
 			}
 
 			zlAndChildEdbId := make(map[int]int)
 			childFutureGoodEdbInfoIdList := make([]int, 0)
-			for zlFutureGoodEdbInfoId, futureGoodEdbInfoList := range futureGoodEdbInfoMap {
+			for zlFutureGoodEdbInfoId, futureGoodEdbInfoListMap := range futureGoodEdbInfoAllMap {
+				futureGoodEdbInfoList := futureGoodEdbInfoListMap[findDateTime.Format(utils.FormatDate)]
 				// 判断是否特殊合约
 				if childFutureGoodEdbInfoIdMap, ok := specialFutureGoodEdbInfoMap[zlFutureGoodEdbInfoId]; ok {
 					if childFutureGoodEdbInfo, ok2 := childFutureGoodEdbInfoIdMap[tmpN]; ok2 {
@@ -552,10 +568,14 @@ func ProfitChartChartData(baseEdbInfo *models.EdbInfo, baseDataListMap map[int][
 
 			calculateMap := make(map[int]float64)
 			for _, childFutureGoodEdbInfoId := range childFutureGoodEdbInfoIdList {
+				fmt.Println("查找childFutureGoodEdbInfoId", childFutureGoodEdbInfoId,"日期为", realDateTime.Format(utils.FormatDate), "的值")
 				tmpFindDataValue, tmpIsFind := edbDataMap[childFutureGoodEdbInfoId][realDateTime.Format(utils.FormatDate)]
-
+				
 				if tmpIsFind && tmpFindDataValue != 0 {
 					calculateMap[childFutureGoodEdbInfoId] = tmpFindDataValue
+					fmt.Println("已找到tmpFindDataValue", tmpFindDataValue, "tmpIsFind", tmpIsFind)
+				} else {
+					fmt.Println("未找到tmpFindDataValue", tmpFindDataValue, "tmpIsFind", tmpIsFind)
 				}
 			}
 			// 合约的数据不全,不参与计算
@@ -567,8 +587,8 @@ func ProfitChartChartData(baseEdbInfo *models.EdbInfo, baseDataListMap map[int][
 
 			for tag, zlEdbId := range tagEdbIdMap {
 				if tag == "A" {
-					nameTmp := strings.Split(futureGoodEdbInfoMap[zlEdbId][date].FutureGoodEdbName, "(")
-					nameTmpEn := strings.Split(futureGoodEdbInfoMap[zlEdbId][date].FutureGoodEdbNameEn, "(")
+					nameTmp := strings.Split(futureGoodEdbInfoAllMap[zlEdbId][findDateTime.Format(utils.FormatDate)][date].FutureGoodEdbName, "(")
+					nameTmpEn := strings.Split(futureGoodEdbInfoAllMap[zlEdbId][findDateTime.Format(utils.FormatDate)][date].FutureGoodEdbNameEn, "(")
 					if len(nameTmp) > 1 && len(nameTmpEn) > 1 {
 						nameTmp[1] = strings.Trim(nameTmp[1], ")")
 						nameTmpEn[1] = strings.Trim(nameTmpEn[1], ")")
@@ -590,8 +610,7 @@ func ProfitChartChartData(baseEdbInfo *models.EdbInfo, baseDataListMap map[int][
 			//calVal, err := calResult.Float64()
 			if e != nil {
 				err = errors.New("计算失败:获取计算值失败 Err:" + e.Error() + ";formulaStr:" + formulaFormStr)
-				fmt.Println(err)
-				return
+				utils.FileLog.Info("计算失败:获取计算值失败 Err:" + e.Error() + ";formulaStr:" + formulaFormStr)
 			}
 			//yDataMap[n] = calVal
 			//xEdbInfoIdList = append(xEdbInfoIdList, n)
@@ -737,6 +756,23 @@ func getProfitFutureGoodEdbInfoList(earliestDateTime time.Time, zlFutureGoodEdbI
 	return
 }
 
+func GetProfitFutureGoodEdbInfoList(earliestDateTimeList []time.Time, zlFutureGoodEdbInfo *future_good.FutureGoodEdbInfo, tmpFutureGoodEdbInfoList []*future_good.FutureGoodEdbInfo, isAllChina bool, monthNumMap  map[string]int) (futureGoodEdbInfoDateAllMap map[string]map[string]*future_good.FutureGoodEdbInfo, newMaxN int, err error) {
+	futureGoodEdbInfoDateAllMap = make(map[string]map[string]*future_good.FutureGoodEdbInfo)
+	for _, earliestDateTime := range earliestDateTimeList {
+		futureGoodEdbInfoDateMap := make(map[string]*future_good.FutureGoodEdbInfo)
+		var newMaxNTmp int
+		futureGoodEdbInfoDateMap, newMaxNTmp, err = getProfitFutureGoodEdbInfoList(earliestDateTime, zlFutureGoodEdbInfo, tmpFutureGoodEdbInfoList, isAllChina, monthNumMap[earliestDateTime.Format(utils.FormatYearMonthDate)])
+		if err != nil {
+			return
+		}
+		if newMaxN < newMaxNTmp {
+			newMaxN = newMaxNTmp
+		}
+		futureGoodEdbInfoDateAllMap[earliestDateTime.Format(utils.FormatDate)] = futureGoodEdbInfoDateMap
+	}
+	return
+}
+
 // handleProfitResultData 处理成最终的结果数据
 func handleProfitResultData(xDataListInit []XData, futureNameMap map[int]map[int]string, yDataList []YData, earliestDateTime time.Time, allEdbInfoIds []int) (xDataList []XData, newYDataList []YData, err error) {
 	newYDataList = yDataList

+ 6 - 5
models/base_from_smm.go

@@ -282,11 +282,12 @@ type BaseFromSmmIndex struct {
 }
 
 func (e *BaseFromSmmIndex) AfterFind(db *gorm.DB) (err error) {
-	e.ApiStartTime = utils.GormDateStrToDateTimeStr(e.ApiStartTime)
-	e.ApiUpdateTime = utils.GormDateStrToDateTimeStr(e.ApiUpdateTime)
-	e.StartTime = utils.GormDateStrToDateTimeStr(e.StartTime)
-	e.FinishTime = utils.GormDateStrToDateTimeStr(e.FinishTime)
-
+	e.ApiStartTime = utils.GormDateStrToDateStr(e.ApiStartTime)
+	e.ApiUpdateTime = utils.GormDateStrToDateStr(e.ApiUpdateTime)
+	e.StartTime = utils.GormDateStrToDateStr(e.StartTime)
+	e.FinishTime = utils.GormDateStrToDateStr(e.FinishTime)
+	e.StartDate = utils.GormDateStrToDateStr(e.StartDate)
+	e.EndDate = utils.GormDateStrToDateStr(e.EndDate)
 	return
 }
 

+ 7 - 5
models/base_from_ths.go

@@ -73,7 +73,7 @@ func AddEdbDataFromThs(edbCode string, item EdbDataFromThs) (err error) {
 }
 
 // 刷新同花顺指标数据
-func RefreshEdbDataFromThs(edbInfoId int, edbCode, startDate string, item EdbDataFromThs) (err error) {
+func RefreshEdbDataFromThs(edbInfoId int, edbCode, startDate string, item EdbDataFromThs) (hasUpdate bool, err error) {
 	//o := orm.NewOrm()
 	source := utils.DATA_SOURCE_THS
 	subSource := utils.DATA_SUB_SOURCE_EDB
@@ -105,7 +105,7 @@ func RefreshEdbDataFromThs(edbInfoId int, edbCode, startDate string, item EdbDat
 
 		existList, err := GetEdbDataByCondition(source, subSource, condition, pars)
 		if err != nil {
-			return err
+			return false, err
 		}
 
 		existMap := make(map[string]*EdbInfoSearchData)
@@ -127,7 +127,7 @@ func RefreshEdbDataFromThs(edbInfoId int, edbCode, startDate string, item EdbDat
 
 			dataTime, err := time.ParseInLocation(utils.FormatDate, eDate, time.Local)
 			if err != nil {
-				return err
+				return false, err
 			}
 			if findItem, ok := existMap[eDate]; !ok {
 				if _, addOk := addMap[eDate]; !addOk {
@@ -141,8 +141,9 @@ func RefreshEdbDataFromThs(edbInfoId int, edbCode, startDate string, item EdbDat
 				if findItem != nil && utils.SubFloatToString(findItem.Value, 30) != utils.SubFloatToString(sValue, 30) {
 					err = ModifyEdbDataById(source, subSource, findItem.EdbDataId, sValueStr)
 					if err != nil {
-						return err
+						return false, err
 					}
+					hasUpdate = true
 				}
 			}
 
@@ -165,8 +166,9 @@ func RefreshEdbDataFromThs(edbInfoId int, edbCode, startDate string, item EdbDat
 			//_, err = o.Raw(addSql).Exec()
 			err = global.DEFAULT_DB.Exec(addSql).Error
 			if err != nil {
-				return err
+				return false, err
 			}
+			hasUpdate = true
 		}
 	}
 	return

+ 5 - 4
services/base_from_ths.go

@@ -25,7 +25,7 @@ type EdbDataFromThsInterface struct {
 	} `json:"tables"`
 }
 
-func GetEdbDataFromThs(edbCode, startDate, endDate, edbTerminalCode string) (item models.EdbDataFromThs, err error) {
+func GetEdbDataFromThs(edbCode, startDate, endDate, edbTerminalCode string) (item models.EdbDataFromThs, apiErrMsg string, err error) {
 	terminal, err := GetTerminal(utils.DATA_SOURCE_THS, edbTerminalCode)
 	if err != nil {
 		err = fmt.Errorf("获取同花顺接口配置出错 Err: %s", err)
@@ -49,10 +49,11 @@ func GetEdbDataFromThs(edbCode, startDate, endDate, edbTerminalCode string) (ite
 		if err != nil {
 			return
 		}
-		return getEdbDataFromThsHttp(edbCode, startDate, endDate, terminal.Value, token)
+		item, apiErrMsg, err = getEdbDataFromThsHttp(edbCode, startDate, endDate, terminal.Value, token)
+		return
 	}
-
-	return getEdbDataFromThsApp(edbCode, startDate, endDate, 0, terminal.ServerUrl)
+	item, err = getEdbDataFromThsApp(edbCode, startDate, endDate, 0, terminal.ServerUrl)
+	return
 }
 
 // getEdbDataFromThs 获取同花顺接口数据

+ 4 - 1
services/base_from_ths_http.go

@@ -19,7 +19,7 @@ import (
 var tokenRedisKey = `THS_SERVER_ACCESS_TOKEN`
 
 // getEdbDataFromThsHttp 通过url获取同花顺的普通数据
-func getEdbDataFromThsHttp(edbCode, startDate, endDate, thsRefreshToken, token string) (item models.EdbDataFromThs, err error) {
+func getEdbDataFromThsHttp(edbCode, startDate, endDate, thsRefreshToken, token string) (item models.EdbDataFromThs, apiErrMsg string, err error) {
 	thsUrl := `https://quantapi.51ifind.com/api/v1/edb_service`
 	//indicators 是 半角逗号分隔的所有指标,宏观指标过多,推荐使用Windows超级命令生成。 "indicators":"M001620326,M002822183"
 	//functionpara 否 key-value格式,省略时不进行更新时间筛选。两个时间控件更新起始时间(startrtime)和更新结束时间(endrtime),不勾选时省略见下方代码块
@@ -34,6 +34,8 @@ func getEdbDataFromThsHttp(edbCode, startDate, endDate, thsRefreshToken, token s
 
 	body, err, _ := postCurl(thsUrl, dataMap, 0, thsRefreshToken, token)
 	if err != nil {
+		// 返回接口报错的实际原因
+		apiErrMsg = err.Error()
 		return
 	}
 
@@ -45,6 +47,7 @@ func getEdbDataFromThsHttp(edbCode, startDate, endDate, thsRefreshToken, token s
 	}
 	if tmpItems.Errorcode != 0 {
 		err = errors.New(tmpItems.Errmsg)
+		apiErrMsg = fmt.Sprintf("%d:%s", tmpItems.Errorcode, tmpItems.Errmsg)
 		return
 	}
 	// 因为table里面的value有的时候返回的是string,有的是float64,所以需要用interface来反射取值

+ 38 - 0
services/edb_info_stat.go

@@ -420,3 +420,41 @@ func SetEdbSourceStat(needStat bool) (err error) {
 	}
 	return
 }
+
+// 根据标识判断指标数据是否更新成功
+func EdbDataUpdateRecord(edbInfoId int, hasUpdate bool, updateResult bool, updateFailedReason string, updateRealReason string) (err error) {
+	defer func() {
+		if err != nil {
+			tips := fmt.Sprintf("ETA指标刷新统计异常, 指标ID: %d, err: %s", edbInfoId, err.Error())
+			alarm_msg.SendAlarmMsg(tips, 3)
+		}
+	}()
+	dataUpdateResult := 2
+	dataUpdateFailedReason := "服务异常"
+	if !updateResult {
+		if updateRealReason != "" {
+			dataUpdateFailedReason = updateRealReason
+		}
+		err = AddEdbInfoUpdateLog(edbInfoId, 2, updateFailedReason, dataUpdateResult, dataUpdateFailedReason, 0, 0)
+		if err != nil {
+			err = fmt.Errorf("新增指标更新日志失败,Err: %s", err)
+			return
+		}
+		return
+	}
+
+	if hasUpdate {
+		dataUpdateResult = 1
+		dataUpdateFailedReason = ""
+	} else {
+		dataUpdateFailedReason = "未刷新到数据"
+	}
+
+	// 添加刷新成功日志
+	err = AddEdbInfoUpdateLog(edbInfoId, 1, "", dataUpdateResult, dataUpdateFailedReason, 0, 0)
+	if err != nil {
+		err = fmt.Errorf("新增指标更新日志失败,Err: %s", err)
+		return
+	}
+	return
+}