Преглед на файлове

Merge branch 'chart/12.4'

# Conflicts:
#	routers/router.go
Roc преди 2 години
родител
ревизия
e36b0bc38b

+ 4 - 0
controllers/base_from_wind.go

@@ -63,6 +63,8 @@ func (this *WindController) Add() {
 		//dataItem, errCode, err := services.GetEdbDataFromWind(req.EdbCode, utils.BASE_START_DATE, endDate)
 		if errCode == 421 { //指标超限
 			br.Ret = 421
+			br.Msg = "指标超限!"
+			return
 		}
 		if err != nil {
 			br.Msg = "获取指标信息失败!"
@@ -145,6 +147,8 @@ func (this *WindController) Refresh() {
 	dataItem, errCode, err := services.GetEdbDataFromWindUrl(edbInfo.ServerUrl, req.EdbCode, req.StartDate, endDate)
 	if errCode == 421 { //指标超限
 		br.Ret = 421
+		br.Msg = "指标超限!"
+		return
 	}
 	if err != nil {
 		br.Msg = "获取指标信息失败!"

+ 209 - 0
controllers/future_good/future_good_edb_info.go

@@ -0,0 +1,209 @@
+package future_good
+
+import (
+	"encoding/json"
+	"hongze/hongze_edb_lib/controllers"
+	"hongze/hongze_edb_lib/models"
+	"hongze/hongze_edb_lib/models/future_good"
+	"hongze/hongze_edb_lib/services"
+	"hongze/hongze_edb_lib/utils"
+	"time"
+)
+
+// FutureGoodEdbInfoController 期货数据
+type FutureGoodEdbInfoController struct {
+	controllers.BaseAuthController
+}
+
+// Add
+// @Title 新增wind商品指标接口
+// @Description  新增wind指标接口
+// @Success 200 {object} models.AddEdbInfoReq
+// @router /add [post]
+func (this *FutureGoodEdbInfoController) Add() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.AddEdbInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.EdbCode == "" {
+		br.Msg = "请输入指标编码!"
+		br.ErrMsg = "请输入指标编码,指标编码为空"
+		return
+	}
+	req.EdbCode = utils.TrimStr(req.EdbCode)
+	cacheKey = utils.CACHE_EDB_DATA_ADD + "_futuregood_" + req.EdbCode
+	if true {
+		utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+		defer func() {
+			utils.Rc.Delete(cacheKey)
+		}()
+
+		//期货数据,就默认到今天,特殊处理下
+
+		futureGoodEdbInfo, err := future_good.GetFutureGoodEdbInfoByCode(req.EdbCode)
+		if err != nil {
+			if err.Error() != utils.ErrNoRow() {
+				br.Msg = "系统内找不到该指标"
+			} else {
+				br.Msg = "添加失败"
+				br.ErrMsg = "添加失败,ERR:" + err.Error()
+			}
+			return
+		}
+
+		//endDate := utils.BASE_END_DATE
+		endDateTime := time.Now()
+		//每天下午三点之前刷新数据的话,截止日期就到昨天,三点之后才刷新到今天的日期
+		if endDateTime.Hour() < 15 {
+			endDateTime = endDateTime.AddDate(0, 0, -1)
+		}
+		endDate := time.Now().Format(utils.FormatDate)
+
+		dataItem, err := services.GetFutureGoodDataFromThs(req.EdbCode, utils.BASE_START_DATE, endDate, 0)
+		if err != nil {
+			br.Msg = "获取指标信息失败!"
+			br.ErrMsg = "获取指标信息失败 GetEdbDataFromWind,Err:" + err.Error()
+			return
+		}
+
+		err = future_good.AddEdbDataFromWind(futureGoodEdbInfo.FutureGoodEdbInfoId, req.EdbCode, dataItem)
+		if err != nil {
+			br.Msg = "获取指标信息失败!"
+			br.ErrMsg = "获取指标信息失败 AddEdbDataFromWind,Err:" + err.Error()
+			return
+		}
+
+		// 更新指标最大最小值
+		err, errMsg := future_good.UnifiedModifyEdbInfoMaxAndMinInfo(futureGoodEdbInfo)
+		if err != nil {
+			br.Msg = errMsg
+			br.ErrMsg = err.Error()
+			return
+		}
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+	} else {
+		br.Ret = 501
+		br.Success = true
+		br.Msg = "系统处理中,请稍后重试"
+	}
+}
+
+// Refresh
+// @Title 刷新wind期货数据指标接口
+// @Description 刷新wind指标接口
+// @Success 200 {object} models.RefreshEdbInfoReq
+// @router /refresh [post]
+func (this *FutureGoodEdbInfoController) Refresh() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req future_good.RefreshFutureEdbEdbInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.FutureGoodEdbCode == "" {
+		br.Msg = "请输入指标编码!"
+		br.ErrMsg = "请输入指标编码,指标编码为空"
+		return
+	}
+	if req.FutureGoodEdbInfoId <= 0 {
+		br.Msg = "请输入指标ID!"
+		br.ErrMsg = "请输入指标ID"
+		return
+	}
+	cacheKey = utils.CACHE_EDB_DATA_REFRESH + "_futuregood_" + req.FutureGoodEdbCode
+
+	if utils.Rc.IsExist(cacheKey) {
+		br.Ret = 501
+		br.Success = true
+		br.Msg = "系统处理中,请稍后重试"
+		return
+	}
+
+	utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+	defer func() {
+		utils.Rc.Delete(cacheKey)
+	}()
+
+	//获取指标信息
+	futureGoodEdbInfo, err := future_good.GetFutureGoodEdbInfoByCode(req.FutureGoodEdbCode)
+	if err != nil {
+		if err.Error() != utils.ErrNoRow() {
+			br.Msg = "系统内找不到该指标"
+		} else {
+			br.Msg = "添加失败"
+			br.ErrMsg = "添加失败,ERR:" + err.Error()
+		}
+		return
+	}
+
+	//期货数据,就默认到今天,特殊处理下
+	//endDate := utils.BASE_END_DATE
+	endDateTime := time.Now()
+	//每天下午三点之前刷新数据的话,截止日期就到昨天,三点之后才刷新到今天的日期
+	if endDateTime.Hour() < 15 {
+		endDateTime = endDateTime.AddDate(0, 0, -1)
+	}
+	endDate := endDateTime.Format(utils.FormatDate)
+
+	dataItem, err := services.GetFutureGoodDataFromThs(req.FutureGoodEdbCode, req.StartDate, endDate, 0)
+	if err != nil {
+		br.Msg = "获取指标信息失败!"
+		br.ErrMsg = "获取指标信息失败 GetEdbDataFromWind,Err:" + err.Error()
+		return
+	}
+	err = future_good.RefreshFutureGoodEdbDataFromThs(req.FutureGoodEdbInfoId, req.FutureGoodEdbCode, req.StartDate, dataItem)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "刷新指标信息失败!"
+		br.ErrMsg = "刷新指标信息失败 RefreshEdbDataFromWind,Err:" + err.Error()
+		return
+	}
+	// 更新指标最大最小值
+	err, errMsg := future_good.UnifiedModifyEdbInfoMaxAndMinInfo(futureGoodEdbInfo)
+	if err != nil {
+		br.Msg = errMsg
+		br.ErrMsg = err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+//func init() {
+//
+//	list, err := future_good.GetFutureGoodEdbInfoList(" AND start_date = '0000-00-00' ", []interface{}{})
+//	if err != nil {
+//		fmt.Println("list err:", err)
+//		return
+//	}
+//
+//	fmt.Println("start")
+//	for _, futureGoodEdbInfo := range list {
+//		// 更新指标最大最小值
+//		err, errMsg := future_good.UnifiedModifyEdbInfoMaxAndMinInfo(futureGoodEdbInfo)
+//		if err != nil {
+//			fmt.Println(futureGoodEdbInfo.FutureGoodEdbCode, "更新失败:", errMsg, ";err:", err)
+//			return
+//		}
+//	}
+//	fmt.Println("end")
+//}

+ 13 - 0
models/db.go

@@ -3,6 +3,7 @@ package models
 import (
 	"github.com/beego/beego/v2/client/orm"
 	_ "github.com/go-sql-driver/mysql"
+	"hongze/hongze_edb_lib/models/future_good"
 	"hongze/hongze_edb_lib/utils"
 	"time"
 )
@@ -47,4 +48,16 @@ func init() {
 		new(PredictEdbRuleData),
 		new(EdbDataCalculateNhcc),
 	)
+
+	// 注册期货数据 数据表
+	initFutureGood()
+}
+
+// initFutureGood 注册期货数据 数据表
+func initFutureGood() {
+	//注册对象
+	orm.RegisterModel(
+		new(future_good.FutureGoodEdbInfo), //期货指标表
+		new(future_good.FutureGoodEdbData), //期货指标数据表
+	)
 }

+ 273 - 0
models/future_good/future_good_edb_data.go

@@ -0,0 +1,273 @@
+package future_good
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"hongze/hongze_edb_lib/services"
+	"hongze/hongze_edb_lib/services/alarm_msg"
+	"hongze/hongze_edb_lib/utils"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// FutureGoodEdbData 期货指标数据的表
+type FutureGoodEdbData struct {
+	FutureGoodEdbDataId int       `orm:"column(future_good_edb_data_id);pk"`
+	FutureGoodEdbInfoId int       `description:"期货指标id"`
+	FutureGoodEdbCode   string    `description:"期货指标code"`
+	DataTime            time.Time `description:"数据日期"`
+	TradeCode           string    `description:"证券代码"`
+	Open                float64   `description:"开盘价"`
+	High                float64   `description:"最高价"`
+	Low                 float64   `description:"最低价"`
+	Close               float64   `description:"收盘价"`
+	Volume              float64   `description:"成交量"`
+	Amt                 float64   `description:"成交额"`
+	Oi                  float64   `description:"持仓量"`
+	Settle              float64   `description:"结算价"`
+	DataTimestamp       int64     `description:"数据日期时间戳"`
+	ModifyTime          time.Time
+	CreateTime          time.Time
+}
+
+// FutureGoodEdbDataItem 期货指标数据的表
+type FutureGoodEdbDataItem struct {
+	FutureGoodEdbDataId int     `orm:"column(future_good_edb_data_id);pk"`
+	FutureGoodEdbInfoId int     `description:"期货指标id"`
+	FutureGoodEdbCode   string  `description:"期货指标code"`
+	DataTime            string  `description:"数据日期"`
+	TradeCode           string  `description:"证券代码"`
+	Open                float64 `description:"开盘价"`
+	High                float64 `description:"最高价"`
+	Low                 float64 `description:"最低价"`
+	Close               float64 `description:"收盘价"`
+	Volume              float64 `description:"成交量"`
+	Amt                 float64 `description:"成交额"`
+	Oi                  float64 `description:"持仓量"`
+	Settle              float64 `description:"结算价"`
+	DataTimestamp       int64   `description:"数据日期时间戳"`
+	ModifyTime          time.Time
+	CreateTime          time.Time
+}
+
+// GetFutureGoodEdbDataList 获取期货指标数据列表
+func GetFutureGoodEdbDataList(condition string, pars []interface{}) (list []*FutureGoodEdbDataItem, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM future_good_edb_data WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += `ORDER BY data_time asc `
+	_, err = o.Raw(sql, pars).QueryRows(&list)
+	return
+}
+
+// AddEdbDataFromWind 添加wind商品指标数据
+func AddEdbDataFromWind(futureGoodEdbInfoId int, edbCode string, item *services.FutureGoodDataFromThs) (err error) {
+	var errMsg string
+	o := orm.NewOrm()
+	defer func() {
+		if err != nil {
+			//go utils.SendEmail(utils.APP_NAME_CN+"【"+utils.RunMode+"】"+"失败提醒", " 同花顺数据获取失败:err:"+errMsg, utils.EmailSendToUsers)
+			go alarm_msg.SendAlarmMsg("wind商品数据获取失败:err:"+errMsg, 3)
+		}
+	}()
+
+	var isAdd bool
+	addSql := ` INSERT INTO future_good_edb_data(future_good_edb_info_id,future_good_edb_code,data_time,trade_code,open,high,low,close,volume,amt,oi,settle,create_time,modify_time,data_timestamp) values `
+
+	table := item.Tables
+	dataLen := len(table.Time)
+	for k := 0; k < dataLen; k++ {
+		eDate := table.Time[k]
+		dataTime, err := time.Parse(utils.FormatDate, eDate)
+		if err != nil {
+			errMsg = " time.Parse :" + err.Error()
+			return err
+		}
+		timestamp := dataTime.UnixNano() / 1e6
+		timeStr := fmt.Sprintf("%d", timestamp)
+
+		tradeCode := ``
+		open := utils.SubFloatToString(table.Open[k], 20)
+		high := utils.SubFloatToString(table.High[k], 20)
+		low := utils.SubFloatToString(table.Low[k], 20)
+		closeVal := utils.SubFloatToString(table.Close[k], 20)
+		volume := utils.SubFloatToString(table.Volume[k], 20)
+		amt := utils.SubFloatToString(table.Amount[k], 20)
+		oi := utils.SubFloatToString(table.Ccl[k], 20)
+		settle := utils.SubFloatToString(table.Settlement[k], 20)
+		addSql += GetAddSql(strconv.Itoa(futureGoodEdbInfoId), edbCode, eDate, tradeCode, open, high, low, closeVal, volume, amt, oi, settle, timeStr)
+
+		isAdd = true
+
+	}
+
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = o.Raw(addSql).Exec()
+		if err != nil {
+			errMsg = " tx.Exec Err :" + err.Error()
+			return
+		}
+	}
+	return
+}
+
+// RefreshFutureEdbEdbInfoReq 刷新商品指标请求
+type RefreshFutureEdbEdbInfoReq struct {
+	FutureGoodEdbInfoId int    `description:"指标ID"`
+	FutureGoodEdbCode   string `description:"指标编码"`
+	StartDate           string `description:"开始日期"`
+}
+
+// RefreshFutureGoodEdbDataFromThs 刷新wind期货指标数据
+func RefreshFutureGoodEdbDataFromThs(futureGoodEdbInfoId int, edbCode, startDate string, item *services.FutureGoodDataFromThs) (err error) {
+	o := orm.NewOrm()
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			fmt.Println("RefreshAllCalculateTbz,Err:" + err.Error())
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	var existList []*FutureGoodEdbData
+	// 获取指标中所有存在的数据值
+	{
+		var condition string
+		var pars []interface{}
+
+		condition += " AND future_good_edb_info_id=? "
+		pars = append(pars, futureGoodEdbInfoId)
+
+		//if startDate != "" {
+		//	condition += " AND data_time >= ? "
+		//	pars = append(pars, startDate)
+		//}
+
+		sql := `SELECT * FROM future_good_edb_data WHERE 1=1 `
+		if condition != "" {
+			sql += condition
+		}
+		sql += `ORDER BY data_time asc `
+		_, err = to.Raw(sql, pars).QueryRows(&existList)
+	}
+
+	existMap := make(map[string]*FutureGoodEdbData)
+	for _, v := range existList {
+		existMap[v.DataTime.Format(utils.FormatDate)] = v
+	}
+	addSql := ` INSERT INTO future_good_edb_data(future_good_edb_info_id,future_good_edb_code,data_time,trade_code,open,high,low,close,volume,amt,oi,settle,create_time,modify_time,data_timestamp) values `
+	var isAdd bool
+	addMap := make(map[string]string)
+
+	table := item.Tables
+	dataLen := len(table.Time)
+	for k := 0; k < dataLen; k++ {
+		eDate := table.Time[k]
+		dataTime, tmpErr := time.Parse(utils.FormatDate, eDate)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		timestamp := dataTime.UnixNano() / 1e6
+		timeStr := fmt.Sprintf("%d", timestamp)
+
+		tradeCode := ``
+		open := utils.SubFloatToString(table.Open[k], 20)
+		high := utils.SubFloatToString(table.High[k], 20)
+		low := utils.SubFloatToString(table.Low[k], 20)
+		closeVal := utils.SubFloatToString(table.Close[k], 20)
+		volume := utils.SubFloatToString(table.Volume[k], 20)
+		amt := utils.SubFloatToString(table.Amount[k], 20)
+		oi := utils.SubFloatToString(table.Ccl[k], 20)
+		settle := utils.SubFloatToString(table.Settlement[k], 20)
+
+		if findItem, ok := existMap[eDate]; !ok {
+			if _, existOk := addMap[eDate]; !existOk {
+				addSql += GetAddSql(strconv.Itoa(futureGoodEdbInfoId), edbCode, eDate, tradeCode, open, high, low, closeVal, volume, amt, oi, settle, timeStr)
+
+				addMap[eDate] = "1"
+			}
+			isAdd = true
+		} else {
+			if findItem != nil {
+				updateCol := make([]string, 0)
+				if findItem.TradeCode != tradeCode {
+					findItem.TradeCode = tradeCode
+					updateCol = append(updateCol, "TradeCode")
+				}
+				if utils.SubFloatToString(findItem.Open, 30) != open {
+					findItem.Open = table.Open[k]
+					updateCol = append(updateCol, "Open")
+				}
+				if utils.SubFloatToString(findItem.High, 30) != high {
+					findItem.High = table.High[k]
+					updateCol = append(updateCol, "High")
+				}
+				if utils.SubFloatToString(findItem.Low, 30) != low {
+					findItem.Low = table.Low[k]
+					updateCol = append(updateCol, "Low")
+				}
+				if utils.SubFloatToString(findItem.Close, 30) != closeVal {
+					findItem.Close = table.Close[k]
+					updateCol = append(updateCol, "Close")
+				}
+				if utils.SubFloatToString(findItem.Volume, 30) != volume {
+					findItem.Volume = table.Volume[k]
+					updateCol = append(updateCol, "Volume")
+				}
+				if utils.SubFloatToString(findItem.Amt, 30) != amt {
+					findItem.Amt = table.Amount[k]
+					updateCol = append(updateCol, "Amt")
+				}
+				if utils.SubFloatToString(findItem.Oi, 30) != oi {
+					findItem.Oi = table.Ccl[k]
+					updateCol = append(updateCol, "Oi")
+				}
+				if utils.SubFloatToString(findItem.Settle, 30) != settle {
+					findItem.Settle = table.Settlement[k]
+					updateCol = append(updateCol, "Settle")
+				}
+
+				if len(updateCol) > 0 {
+					_, err = to.Update(findItem, updateCol...)
+					if err != nil {
+						return
+					}
+				}
+			}
+		}
+
+	}
+
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			fmt.Println("RefreshEdbDataFromWind add Err", err.Error())
+			return
+		}
+	}
+
+	return
+}
+
+func GetAddSql(futureGoodEdbInfoId, futureGoodEdbCode, dataTime, tradeCode, open, high, low, close, volume, amt, oi, settle, timestampStr string) (addSql string) {
+	//future_good_edb_info_id,future_good_edb_code,data_time,trade_code,open,high,low,close,volume,amt,oi,settle,create_time,modify_time,data_timestamp
+	nowStr := time.Now().Format(utils.FormatDateTime)
+	//addSql += "("
+	//addSql += futureGoodEdbInfoId + "," + "'" + futureGoodEdbCode + "'" + "," + "'" + dataTime + "'" + "," + value + "," + "'" + nowStr + "'" +
+	//	"," + "'" + nowStr + "'"
+	//addSql += "," + "'" + timestampStr + "'"
+	//addSql += "),"
+	addSql = fmt.Sprintf("(%s,'%s','%s','%s',%s,%s,%s,%s,%s,%s,%s,%s,'%s','%s',%s),", futureGoodEdbInfoId, futureGoodEdbCode, dataTime, tradeCode, open, high, low, close, volume, amt, oi, settle, nowStr, nowStr, timestampStr)
+	return
+}

+ 124 - 0
models/future_good/future_good_edb_info.go

@@ -0,0 +1,124 @@
+package future_good
+
+import (
+	"errors"
+	"github.com/beego/beego/v2/client/orm"
+	"hongze/hongze_edb_lib/utils"
+	"time"
+)
+
+type FutureGoodEdbInfo struct {
+	FutureGoodEdbInfoId int       `orm:"column(future_good_edb_info_id);pk"`
+	FutureGoodEdbCode   string    `description:"期货指标code"`
+	FutureGoodEdbName   string    `description:"期货指标名称"`
+	ParentId            int       `description:"上级期货id"`
+	Exchange            string    `description:"所属交易所"`
+	Month               int       `description:"所属月份"`
+	StartDate           string    `description:"起始日期"`
+	EndDate             string    `description:"终止日期"`
+	MinValue            float64   `description:"最小值"`
+	MaxValue            float64   `description:"最大值"`
+	LatestValue         float64   `description:"数据最新的值"`
+	LatestDate          time.Time `description:"数据最新的日期"`
+	ServerUrl           string    `description:"服务器地址"`
+	CreateTime          time.Time
+	ModifyTime          time.Time
+}
+
+// GetFutureGoodEdbInfoByCode 根据指标code获取指标信息
+func GetFutureGoodEdbInfoByCode(edbCode string) (item *FutureGoodEdbInfo, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM future_good_edb_info  WHERE future_good_edb_code = ? limit 1 `
+	err = o.Raw(sql, edbCode).QueryRow(&item)
+	return
+}
+
+// GetFutureGoodEdbInfoList 获取指标数据列表
+func GetFutureGoodEdbInfoList(condition string, pars []interface{}) (list []*FutureGoodEdbInfo, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM future_good_edb_info WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += `ORDER BY future_good_edb_info_id DESC `
+	_, err = o.Raw(sql, pars).QueryRows(&list)
+	return
+}
+
+// GetAllFutureGoodEdbInfoList 获取指标数据列表
+func GetAllFutureGoodEdbInfoList() (list []*FutureGoodEdbInfo, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM future_good_edb_info  ORDER BY future_good_edb_info_id DESC `
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+// AddFutureGoodEdbInfo 添加期货数据库指标
+func AddFutureGoodEdbInfo(item *FutureGoodEdbInfo) (err error) {
+	o := orm.NewOrm()
+	lastId, err := o.Insert(item)
+	if err != nil {
+		return
+	}
+	item.FutureGoodEdbInfoId = int(lastId)
+	return
+}
+
+// Update 更新指标基础信息
+func (FutureGoodEdbInfo *FutureGoodEdbInfo) Update(cols []string) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Update(FutureGoodEdbInfo, cols...)
+	return
+}
+
+// UnifiedModifyEdbInfoMaxAndMinInfo 统一修改指标的最大最小值
+func UnifiedModifyEdbInfoMaxAndMinInfo(futureGoodEdbInfo *FutureGoodEdbInfo) (err error, errMsg string) {
+	// 修改最大最小值
+	maxAndMinItem, err := GetEdbInfoMaxAndMinInfo(futureGoodEdbInfo.FutureGoodEdbCode)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			err = nil
+			return
+		}
+
+		errMsg = "刷新期货指标失败!"
+		err = errors.New("获取期货指标最大最小值失败,err:" + err.Error())
+		return
+	}
+
+	if maxAndMinItem != nil {
+		o := orm.NewOrm()
+		sql := ` UPDATE future_good_edb_info SET start_date=?,end_date=?,min_value=?,max_value=?,latest_date=?,latest_value=?,modify_time=NOW() WHERE future_good_edb_info_id=? `
+		_, err = o.Raw(sql, maxAndMinItem.MinDate, maxAndMinItem.MaxDate, maxAndMinItem.MinValue, maxAndMinItem.MaxValue, maxAndMinItem.MaxDate, maxAndMinItem.LatestValue, futureGoodEdbInfo.FutureGoodEdbInfoId).Exec()
+		if err != nil {
+			errMsg = "刷新指标失败!"
+			err = errors.New("修改指标最大最小值失败,err:" + err.Error())
+			return
+		}
+	}
+	return
+}
+
+// FutureGoodEdbInfoMaxAndMinInfo 指标最新数据记录结构体
+type FutureGoodEdbInfoMaxAndMinInfo struct {
+	MinDate     string  `description:"最小日期"`
+	MaxDate     string  `description:"最大日期"`
+	MinValue    float64 `description:"最小值"`
+	MaxValue    float64 `description:"最大值"`
+	LatestValue float64 `description:"最新值"`
+	LatestDate  string  `description:"实际数据最新日期"`
+}
+
+// GetEdbInfoMaxAndMinInfo 获取指标的最新数据记录信息
+func GetEdbInfoMaxAndMinInfo(futureGoodEdbCode string) (item *FutureGoodEdbInfoMaxAndMinInfo, err error) {
+	o := orm.NewOrm()
+	sql := ``
+	sql = ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date,MIN(close) AS min_value,MAX(close) AS max_value FROM future_good_edb_data WHERE future_good_edb_code=? `
+	err = o.Raw(sql, futureGoodEdbCode).QueryRow(&item)
+
+	var latest_value float64
+	sql = ` SELECT close AS latest_value FROM future_good_edb_data WHERE future_good_edb_code=? ORDER BY data_time DESC LIMIT 1 `
+	err = o.Raw(sql, futureGoodEdbCode).QueryRow(&latest_value)
+	item.LatestValue = latest_value
+	return
+}

+ 18 - 0
routers/commentsRouter.go

@@ -7,6 +7,24 @@ import (
 
 func init() {
 
+    beego.GlobalControllerRouter["hongze/hongze_edb_lib/controllers/future_good:FutureGoodEdbInfoController"] = append(beego.GlobalControllerRouter["hongze/hongze_edb_lib/controllers/future_good:FutureGoodEdbInfoController"],
+        beego.ControllerComments{
+            Method: "Add",
+            Router: `/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_edb_lib/controllers/future_good:FutureGoodEdbInfoController"] = append(beego.GlobalControllerRouter["hongze/hongze_edb_lib/controllers/future_good:FutureGoodEdbInfoController"],
+        beego.ControllerComments{
+            Method: "Refresh",
+            Router: `/refresh`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_edb_lib/controllers:CalculateController"] = append(beego.GlobalControllerRouter["hongze/hongze_edb_lib/controllers:CalculateController"],
         beego.ControllerComments{
             Method: "Add",

+ 115 - 0
services/base_from_ths.go

@@ -124,3 +124,118 @@ func getEdbDataFromThs(edbCode, startDate, endDate string, num int) (item *EdbDa
 	}
 	return item, nil
 }
+
+// FutureGoodDataFromThsInterface 同花顺商品数据类型转为interface
+type FutureGoodDataFromThsInterface struct {
+	Errmsg    string      `json:"errmsg"`
+	Errorcode int64       `json:"errorcode"`
+	DataVol   int64       `json:"dataVol"`
+	Perf      interface{} `json:"perf"`
+	Tables    []struct {
+		ThsCode string   `json:"thscode"`
+		Time    []string `json:"time"`
+		Table   struct {
+			LastClose      []float64 `json:"lastclose"`
+			Open           []float64 `json:"open"`
+			High           []float64 `json:"high"`
+			Low            []float64 `json:"low"`
+			Close          []float64 `json:"close"`
+			AvgPrice       []float64 `json:"avgprice"`
+			Change         []float64 `json:"change"`
+			ChangePer      []float64 `json:"changeper"`
+			Volume         []float64 `json:"volume"`
+			Amount         []float64 `json:"amount"`
+			Hsl            []float64 `json:"hsl"`
+			LastSettlement []float64 `json:"lastsettlement"`
+			Settlement     []float64 `json:"settlement"`
+			ZdSettlement   []float64 `json:"zdsettlement"`
+			ZdfSettlement  []float64 `json:"zdfsettlement"`
+			Ccl            []float64 `json:"ccl"`
+			Ccbd           []float64 `json:"ccbd"`
+			Zf             []float64 `json:"zf"`
+			Zjlx           []float64 `json:"zjlx"`
+			Zjcd           []float64 `json:"zjcd"`
+		} `json:"table"`
+	} `json:"tables"`
+}
+
+// FutureGoodDataFromThs 同花顺期货数据
+type FutureGoodDataFromThs struct {
+	DataVol   int64                `json:"dataVol"`
+	Errmsg    string               `json:"errmsg"`
+	Errorcode int64                `json:"errorcode"`
+	Perf      interface{}          `json:"perf"`
+	Tables    FutureGoodDataTables `json:"tables"`
+}
+
+// FutureGoodDataTables 同花顺表格数据
+type FutureGoodDataTables struct {
+	//TradeCode    []string  `json:"id"`
+	Time       []string  `json:"time"`
+	Open       []float64 `json:"open"`
+	High       []float64 `json:"high"`
+	Low        []float64 `json:"low"`
+	Close      []float64 `json:"close"`
+	Volume     []float64 `json:"volume"`
+	Amount     []float64 `json:"amount"`
+	Ccl        []float64 `json:"ccl"`
+	Settlement []float64 `json:"settlement"`
+}
+
+// GetFutureGoodDataFromThs 通过url获取wind的商品数据
+func GetFutureGoodDataFromThs(edbCode, startDate, endDate string, num int) (item *FutureGoodDataFromThs, err error) {
+	thsUrl := utils.Hz_Wind_Data_Url + `edbInfo/ths/future_good?EdbCode=%s&StartDate=%s&EndDate=%s`
+	thsUrl = fmt.Sprintf(thsUrl, edbCode, startDate, endDate)
+	utils.FileLog.Info("thsUrl:" + thsUrl)
+	body, err := http.Get(thsUrl)
+	utils.FileLog.Info("ths result:" + string(body))
+	if err != nil {
+		err = errors.New(" Err:" + err.Error() + ";result:" + string(body))
+		return
+	}
+	if string(body) == "null" {
+		err = errors.New("同花顺数据获取异常:" + err.Error() + ";result:" + string(body))
+		return
+	}
+
+	tmpItems := new(FutureGoodDataFromThsInterface)
+	err = json.Unmarshal(body, &tmpItems)
+	if err != nil {
+		err = errors.New("GetEdbDataFromThs json.Unmarshal Err:" + err.Error())
+		return
+	}
+	if tmpItems.Errorcode != 0 {
+
+		//session has expired,please re-login after using the system
+		//如果是同花顺登录session失效了,那么就重新请求获取数据
+		if tmpItems.Errorcode == -1020 && num == 0 {
+			return GetFutureGoodDataFromThs(edbCode, startDate, endDate, 1)
+		}
+
+		err = errors.New(string(body))
+		return
+	}
+
+	if len(tmpItems.Tables) <= 0 {
+		return
+	}
+	table := tmpItems.Tables[0]
+	item = &FutureGoodDataFromThs{
+		DataVol:   tmpItems.DataVol,
+		Errmsg:    tmpItems.Errmsg,
+		Errorcode: tmpItems.Errorcode,
+		Perf:      tmpItems.Perf,
+		Tables: FutureGoodDataTables{
+			Time:       table.Time,
+			Open:       table.Table.Open,
+			High:       table.Table.High,
+			Low:        table.Table.Low,
+			Close:      table.Table.Close,
+			Volume:     table.Table.Volume,
+			Amount:     table.Table.Amount,
+			Ccl:        table.Table.Ccl,
+			Settlement: table.Table.Settlement,
+		},
+	}
+	return
+}