ソースを参照

新增获取同花顺接口信息

longyu 3 年 前
コミット
b4841a0404

+ 122 - 0
controllers/base_auth.go

@@ -0,0 +1,122 @@
+package controllers
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/http"
+	"net/url"
+
+	"github.com/beego/beego/v2/server/web"
+
+	"hongze/hongze_edb_lib/models"
+	"hongze/hongze_edb_lib/utils"
+
+	"github.com/rdlucklib/rdluck_tools/log"
+)
+
+var apiLog *log.Log
+
+func init() {
+	if utils.RunMode == "release" {
+		logDir := `/data/rdlucklog/` + utils.APP_NAME_EN
+		apiLog = log.Init("20060102.api", logDir)
+	} else {
+		apiLog = log.Init("20060102.api")
+	}
+}
+
+type BaseAuthController struct {
+	web.Controller
+}
+
+func (this *BaseAuthController) Prepare() {
+	fmt.Println("enter prepare")
+	method := this.Ctx.Input.Method()
+	uri := this.Ctx.Input.URI()
+	fmt.Println("Url:", uri)
+	if method != "HEAD" {
+		if method == "POST" {
+			authorization := this.Ctx.Input.Header("authorization")
+			if authorization == "" {
+				this.JSON(models.BaseResponse{Ret: 408, Msg: "请重新授权!", ErrMsg: "请重新授权:authorization is empty "}, false, false)
+				this.StopRun()
+				return
+			}
+			checkAuthorization := utils.MD5(utils.APP_NAME_EN + utils.Md5Key)
+			if authorization != checkAuthorization {
+				this.JSON(models.BaseResponse{Ret: 408, Msg: "签名错误!", ErrMsg: "签名错误:authorization is err "}, false, false)
+				this.StopRun()
+				return
+			}
+		} else {
+			this.JSON(models.BaseResponse{Ret: 408, Msg: "请求异常,请联系客服!", ErrMsg: "POST之外的请求,暂不支持"}, false, false)
+			this.StopRun()
+			return
+		}
+	} else {
+		this.JSON(models.BaseResponse{Ret: 408, Msg: "请求异常,请联系客服!", ErrMsg: "method:" + method}, false, false)
+		this.StopRun()
+		return
+	}
+}
+
+func (c *BaseAuthController) ServeJSON(encoding ...bool) {
+	var (
+		hasIndent   = false
+		hasEncoding = false
+	)
+	if web.BConfig.RunMode == web.PROD {
+		hasIndent = false
+	}
+	if len(encoding) > 0 && encoding[0] == true {
+		hasEncoding = true
+	}
+	if c.Data["json"] == nil {
+		go utils.SendEmail("异常提醒:", "接口:"+"URI:"+c.Ctx.Input.URI()+";无返回值", utils.EmailSendToUsers)
+		return
+	}
+
+	baseRes := c.Data["json"].(*models.BaseResponse)
+	if baseRes != nil && baseRes.Ret != 408 {
+		body, _ := json.Marshal(baseRes)
+		var requestBody string
+		method := c.Ctx.Input.Method()
+		if method == "GET" {
+			requestBody = c.Ctx.Request.RequestURI
+		} else {
+			requestBody, _ = url.QueryUnescape(string(c.Ctx.Input.RequestBody))
+		}
+		if baseRes.Ret != 200 && baseRes.IsSendEmail {
+			go utils.SendEmail(utils.APP_NAME_CN+"【"+utils.RunMode+"】"+"失败提醒", "URI:"+c.Ctx.Input.URI()+"<br/> "+"Params"+requestBody+" <br/>"+"ErrMsg:"+baseRes.ErrMsg+";<br/>Msg:"+baseRes.Msg+";<br/> Body:"+string(body)+"<br/>", utils.EmailSendToUsers)
+		}
+	}
+	c.JSON(c.Data["json"], hasIndent, hasEncoding)
+}
+
+func (c *BaseAuthController) JSON(data interface{}, hasIndent bool, coding bool) error {
+	c.Ctx.Output.Header("Content-Type", "application/json; charset=utf-8")
+	var content []byte
+	var err error
+	if hasIndent {
+		content, err = json.MarshalIndent(data, "", "  ")
+	} else {
+		content, err = json.Marshal(data)
+	}
+	if err != nil {
+		http.Error(c.Ctx.Output.Context.ResponseWriter, err.Error(), http.StatusInternalServerError)
+		return err
+	}
+	ip := c.Ctx.Input.IP()
+	requestBody, err := url.QueryUnescape(string(c.Ctx.Input.RequestBody))
+	if err != nil {
+		requestBody = string(c.Ctx.Input.RequestBody)
+	}
+	if requestBody == "" {
+		requestBody = c.Ctx.Input.URI()
+	}
+	apiLog.Println("请求地址:", c.Ctx.Input.URI(), "Authorization:", c.Ctx.Input.Header("Authorization"), "RequestBody:", requestBody, "ResponseBody", string(content), "IP:", ip)
+	if coding {
+		content = []byte(utils.StringsToJSON(string(content)))
+	}
+	return c.Ctx.Output.Body(content)
+}

+ 70 - 0
controllers/base_from_ths.go

@@ -0,0 +1,70 @@
+package controllers
+
+import (
+	"encoding/json"
+	"hongze/hongze_edb_lib/models"
+	"hongze/hongze_edb_lib/utils"
+	"strconv"
+)
+
+type ThsController struct {
+	BaseAuthController
+}
+
+// @Title 编辑指标接口
+// @Description 编辑指标接口
+// @Success 200 {object} data_manage.EditEdbInfoReq
+// @router /add [post]
+func (this *ThsController) EdbInfoEdit() {
+	br := new(models.BaseResponse).Init()
+	deleteCache := true
+	var cacheKey string
+	defer func() {
+		if deleteCache {
+			utils.Rc.Delete(cacheKey)
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	source := utils.DATA_SOURCE_THS
+	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
+	}
+	cacheKey = "CACHE_EDB_DATA_ADD_" + strconv.Itoa(source) + "_" + req.EdbCode
+	err = models.AddEdbDataFromThs(req.EdbCode, utils.BASE_START_DATE, utils.BASE_END_DATE)
+	if err != nil {
+		br.Msg = "获取指标信息失败!"
+		br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
+		return
+	}
+	item := new(models.EdbDataItem)
+	item.EdbCode = req.EdbCode
+	maxAndMinInfo, err := models.GetEdbDataMaxAndMinInfo(source, req.EdbCode)
+	if err != nil {
+		br.Msg = "获取指标信息失败!"
+		br.ErrMsg = "获取最大最小值信息失败,Err:" + err.Error()
+		return
+	}
+	item.StartDate = maxAndMinInfo.MinDate
+	item.EndDate = maxAndMinInfo.MaxDate
+	dataList, err := models.GetEdbDataAllByEdbCode(req.EdbCode, source, utils.EDB_DATA_LIMIT)
+	if err != nil {
+		br.Msg = "获取指标信息失败!"
+		br.ErrMsg = "GetEdbDataAllByEdbCode,Err:" + err.Error()
+		return
+	}
+	item.DataList = dataList
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = item
+}

+ 0 - 7
controllers/home.go

@@ -1,7 +0,0 @@
-package controllers
-
-import beego "github.com/beego/beego/v2/server/web"
-
-type HomeController struct {
-	beego.Controller
-}

+ 38 - 0
main.go

@@ -1,9 +1,15 @@
 package main
 
 import (
+	"fmt"
 	_ "hongze/hongze_edb_lib/routers"
+	"hongze/hongze_edb_lib/utils"
+	"runtime"
+	"time"
 
 	"github.com/beego/beego/v2/server/web"
+	"github.com/beego/beego/v2/adapter/logs"
+	"github.com/beego/beego/v2/server/web/context"
 )
 
 func main() {
@@ -11,5 +17,37 @@ func main() {
 		web.BConfig.WebConfig.DirectoryIndex = true
 		web.BConfig.WebConfig.StaticDir["/swagger"] = "swagger"
 	}
+	web.BConfig.RecoverFunc = Recover
 	web.Run()
 }
+
+func Recover(ctx *context.Context, conf *web.Config) {
+	if err := recover(); err != nil {
+		if err == web.ErrAbort {
+			return
+		}
+		if !web.BConfig.RecoverPanic {
+			panic(err)
+		}
+		stack := ""
+		msg := fmt.Sprintf("The request url is  %v", ctx.Input.URL())
+		stack += msg + "</br>"
+		logs.Critical(msg)
+		msg = fmt.Sprintf("The request data is %v", string(ctx.Input.RequestBody))
+		stack += msg + "</br>"
+		logs.Critical(msg)
+		msg = fmt.Sprintf("Handler crashed with error %v", err)
+		stack += msg + "</br>"
+		logs.Critical(msg)
+		for i := 1; ; i++ {
+			_, file, line, ok := runtime.Caller(i)
+			if !ok {
+				break
+			}
+			logs.Critical(fmt.Sprintf("%s:%d", file, line))
+			stack = stack + fmt.Sprintln(fmt.Sprintf("%s:%d</br>", file, line))
+		}
+		go utils.SendEmail(utils.APP_NAME_CN+"崩了"+time.Now().Format("2006-01-02 15:04:05"), stack, utils.EmailSendToUsers)
+	}
+	return
+}

+ 23 - 0
models/base.go

@@ -0,0 +1,23 @@
+package models
+
+type BaseResponse struct {
+	Ret         int
+	Msg         string
+	ErrMsg      string
+	ErrCode     string
+	Data        interface{}
+	Success     bool `description:"true 执行成功,false 执行失败"`
+	IsSendEmail bool `json:"-" description:"true 发送邮件,false 不发送邮件"`
+	IsAddLog    bool `json:"-" description:"true 新增操作日志,false 不新增操作日志" `
+}
+
+func (r *BaseResponse) Init() *BaseResponse {
+	return &BaseResponse{Ret: 403, IsSendEmail: true}
+}
+
+type BaseRequest struct {
+}
+
+func (br *BaseRequest) Init() *BaseRequest {
+	return &BaseRequest{}
+}

+ 99 - 0
models/base_from_ths.go

@@ -0,0 +1,99 @@
+package models
+
+import (
+	"encoding/json"
+	"errors"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/http"
+	"hongze/hongze_edb_lib/utils"
+	"strings"
+	"time"
+)
+
+type EdbDataFromThs struct {
+	DataVol   int64       `json:"dataVol"`
+	Errmsg    string      `json:"errmsg"`
+	Errorcode int64       `json:"errorcode"`
+	Perf      interface{} `json:"perf"`
+	Tables    []struct {
+		ID    []string  `json:"id"`
+		Time  []string  `json:"time"`
+		Value []float64 `json:"value"`
+	} `json:"tables"`
+}
+
+func AddEdbDataFromThs(edbCode, startDate, endDate string) (err error) {
+	var errMsg string
+	o := orm.NewOrm()
+	tx, err := o.Begin()
+	defer func() {
+		if err != nil {
+			err = tx.Rollback()
+			if err != nil {
+				errMsg = " Rollback err:" + err.Error()
+			}
+		} else {
+			err = tx.Commit()
+			if err != nil {
+				errMsg = " Commit err:" + err.Error()
+			}
+		}
+		if err != nil {
+			go utils.SendEmail(utils.APP_NAME_CN+"【"+utils.RunMode+"】"+"失败提醒", " 同花顺数据获取失败:err:"+errMsg, utils.EmailSendToUsers)
+		}
+	}()
+
+	thsUrl := utils.Hz_Ths_Data_Url + `edbInfo/ths?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
+	}
+	item := new(EdbDataFromThs)
+	err = json.Unmarshal(body, &item)
+	if err != nil {
+		err = errors.New("GetEdbDataFromThs json.Unmarshal Err:" + err.Error())
+		return
+	}
+	if item.Errorcode != 0 {
+		err = errors.New(string(body))
+		errMsg ="获取同花顺信息失败:"+ string(body)
+		return
+	}
+	if len(item.Tables) > 0 {
+		table := item.Tables[0]
+		dataLen := len(table.Time)
+
+		var isAdd bool
+		addSql := ` INSERT INTO %s(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
+		tableName := GetEdbDataTableName(utils.DATA_SOURCE_THS)
+		addSql = fmt.Sprintf(addSql, tableName)
+
+		for i := 0; i < dataLen; i++ {
+			eDate := table.Time[i]
+			sValue := table.Value[i]
+			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)
+			addSql += GetAddSql("0", edbCode, eDate, timeStr, utils.SubFloatToString(sValue, 20))
+			isAdd = true
+		}
+		if isAdd {
+			addSql = strings.TrimRight(addSql, ",")
+			_, err = tx.Raw(addSql).Exec()
+			if err != nil {
+				errMsg = " tx.Exec Err :" + err.Error()
+				return
+			}
+		}
+	}
+	return
+}

+ 1 - 2
models/db.go

@@ -8,7 +8,6 @@ import (
 )
 
 func init() {
-
 	_ = orm.RegisterDataBase("default", "mysql", utils.MYSQL_URL)
 	orm.SetMaxIdleConns("default", 50)
 	orm.SetMaxOpenConns("default", 100)
@@ -29,7 +28,7 @@ func init() {
 
 	gl, _ := orm.GetDB("gl")
 	gl.SetConnMaxLifetime(10 * time.Minute)
-	
+
 	//注册对象
 	orm.RegisterModel(
 

+ 84 - 0
models/edb_data_base.go

@@ -0,0 +1,84 @@
+package models
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"hongze/hongze_edb_lib/utils"
+	"time"
+)
+
+//指标检索数据
+type EdbDataItem struct {
+	EdbCode   string `description:"指标编码"`
+	StartDate string `description:"起始日期"`
+	EndDate   string `description:"终止日期"`
+	EdbName   string `description:"指标名称"`
+	Unit      string `description:"单位"`
+	Frequency string `description:"频率"`
+	DataList  []*EdbData
+}
+
+type EdbData struct {
+	EdbDataId     int `orm:"column(edb_data_id);pk"`
+	EdbInfoId     int
+	EdbCode       string
+	DataTime      string
+	Value         string
+	Status        int
+	CreateTime    time.Time
+	ModifyTime    time.Time
+	DataTimestamp int64
+}
+
+func GetEdbDataAllByEdbCode(edbCode string, source, limit int) (items []*EdbData, err error) {
+	var pars []interface{}
+	pars = append(pars, edbCode)
+	o := orm.NewOrm()
+	tableName := GetEdbDataTableName(source)
+	sql := ` SELECT * FROM %s WHERE edb_code=? ORDER BY data_time DESC`
+	if limit > 0 {
+		sql += `  LIMIT ?  `
+		pars = append(pars, limit)
+	}
+	sql = fmt.Sprintf(sql, tableName)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+func GetAddSql(edbInfoId, edbCode, dataTime, timestampStr string, value string) (addSql string) {
+	nowStr := time.Now().Format(utils.FormatDateTime)
+	addSql += "("
+	addSql += edbInfoId + "," + "'" + edbCode + "'" + "," + "'" + dataTime + "'" + "," + value + "," + "'" + nowStr + "'" +
+		"," + "'" + nowStr + "'" + "," + "1"
+	addSql += "," + "'" + timestampStr + "'"
+	addSql += "),"
+	return
+}
+
+type EdbDataMaxAndMinInfo struct {
+	MinDate     string  `description:"最小日期"`
+	MaxDate     string  `description:"最大日期"`
+	MinValue    float64 `description:"最小值"`
+	MaxValue    float64 `description:"最大值"`
+	LatestValue float64 `description:"最新值"`
+}
+
+func GetEdbDataMaxAndMinInfo(source int, edbCode string) (item *EdbDataMaxAndMinInfo, err error) {
+	o := orm.NewOrm()
+	sql := ``
+	tableName := GetEdbDataTableName(source)
+	sql = ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date,MIN(value) AS min_value,MAX(value) AS max_value FROM %s WHERE edb_code=? `
+	sql = fmt.Sprintf(sql, tableName)
+	err = o.Raw(sql, edbCode).QueryRow(&item)
+
+	var latest_value float64
+	sql = ` SELECT value AS latest_value FROM %s WHERE edb_code=? ORDER BY data_time DESC LIMIT 1 `
+	sql = fmt.Sprintf(sql, tableName)
+	err = o.Raw(sql, edbCode).QueryRow(&latest_value)
+	item.LatestValue = latest_value
+	return
+}
+
+type AddEdbInfoReq struct {
+	EdbCode    string `description:"指标编码"`
+}

+ 62 - 0
models/edb_data_table.go

@@ -0,0 +1,62 @@
+package models
+
+import (
+	"hongze/hongze_edb_lib/utils"
+)
+
+//指标数据->存储表
+func GetEdbDataTableName(source int) (tableName string) {
+	switch source {
+	case utils.DATA_SOURCE_THS:
+		tableName = "edb_data_ths"
+	case utils.DATA_SOURCE_WIND:
+		tableName = "edb_data_wind"
+	case utils.DATA_SOURCE_PB:
+		tableName = "edb_data_pb"
+	case utils.DATA_SOURCE_CALCULATE:
+		tableName = "edb_data_calculate"
+	case utils.DATA_SOURCE_CALCULATE_LJZZY:
+		tableName = "edb_data_calculate_ljzzy"
+	case utils.DATA_SOURCE_CALCULATE_TBZ:
+		tableName = "edb_data_calculate_tbz"
+	case utils.DATA_SOURCE_CALCULATE_TCZ:
+		tableName = "edb_data_calculate_tcz"
+	case utils.DATA_SOURCE_CALCULATE_NSZYDPJJS:
+		tableName = "edb_data_calculate_nszydpjjs"
+	case utils.DATA_SOURCE_MANUAL:
+		tableName = "edb_data_manual"
+	case utils.DATA_SOURCE_LZ:
+		tableName = "edb_data_lz"
+	case utils.DATA_SOURCE_YS:
+		tableName = "edb_data_ys"
+	case utils.DATA_SOURCE_CALCULATE_HBZ:
+		tableName = "edb_data_calculate_hbz"
+	case utils.DATA_SOURCE_CALCULATE_HCZ:
+		tableName = "edb_data_calculate_hcz"
+	case utils.DATA_SOURCE_CALCULATE_BP:
+		tableName = "edb_data_calculate_bp"
+	case utils.DATA_SOURCE_GL:
+		tableName = "edb_data_gl"
+	case utils.DATA_SOURCE_ZZ:
+		tableName = "edb_data_zz"
+	case utils.DATA_SOURCE_DL:
+		tableName = "edb_data_dl"
+	case utils.DATA_SOURCE_SH:
+		tableName = "edb_data_sh"
+	case utils.DATA_SOURCE_CFFEX:
+		tableName = "edb_data_cffex"
+	case utils.DATA_SOURCE_SHFE:
+		tableName = "edb_data_ine"
+	case utils.DATA_SOURCE_GIE:
+		tableName = "edb_data_gie"
+	case utils.DATA_SOURCE_CALCULATE_ZJPJ:
+		tableName = "edb_data_calculate_zjpj"
+	case utils.DATA_SOURCE_CALCULATE_TIME_SHIFT:
+		tableName = "edb_data_calculate_time_shift"
+	case utils.DATA_SOURCE_CALCULATE_LJZTBPJ:
+		tableName = "edb_data_calculate_ljztbpj"
+	default:
+		tableName = ""
+	}
+	return
+}

+ 2 - 2
routers/router.go

@@ -15,9 +15,9 @@ import (
 
 func init() {
 	ns := beego.NewNamespace("/edbapi",
-		beego.NSNamespace("/object",
+		beego.NSNamespace("/ths",
 			beego.NSInclude(
-				&controllers.HomeController{},
+				&controllers.ThsController{},
 			),
 		),
 	)

+ 0 - 12
utils/common.go

@@ -216,18 +216,6 @@ func ErrNoRow() string {
 	return "<QuerySeter> no row found"
 }
 
-//校验邮箱格式
-func ValidateEmailFormatat(email string) bool {
-	reg := regexp.MustCompile(RegularEmail)
-	return reg.MatchString(email)
-}
-
-//验证是否是手机号
-func ValidateMobileFormatat(mobileNum string) bool {
-	reg := regexp.MustCompile(RegularMobile)
-	return reg.MatchString(mobileNum)
-}
-
 //判断文件是否存在
 func FileIsExist(filePath string) bool {
 	_, err := os.Stat(filePath)

+ 2 - 2
utils/config.go

@@ -54,9 +54,9 @@ func init() {
 	}
 
 	if RunMode == "release" {
-
+		Hz_Ths_Data_Url = "http://172.19.173.231:7000/"
 	} else {
-
+		Hz_Ths_Data_Url = "http://139.196.136.213:7000/"
 	}
 
 }

+ 50 - 13
utils/constants.go

@@ -1,18 +1,19 @@
 package utils
 
+import "time"
+
 const (
-	Md5Key = "Ks@h64WJ#tcVgG8$&WlNfqvLAtMgpxWN"
+	Md5Key = "GuRaB6dY1bXOJcwG"
 )
 
 //常量定义
 const (
-	FormatTime            = "15:04:05"                //时间格式
-	FormatDate            = "2006-01-02"              //日期格式
-	FormatDateUnSpace     = "20060102"                //日期格式
-	FormatDateTime        = "2006-01-02 15:04:05"     //完整时间格式
-	HlbFormatDateTime     = "2006-01-02_15:04:05.999" //完整时间格式
-	FormatDateTimeUnSpace = "20060102150405"          //完整时间格式
-	PageSize15            = 15                        //列表页每页数据量
+	FormatTime            = "15:04:05"            //时间格式
+	FormatDate            = "2006-01-02"          //日期格式
+	FormatDateUnSpace     = "20060102"            //日期格式
+	FormatDateTime        = "2006-01-02 15:04:05" //完整时间格式
+	FormatDateTimeUnSpace = "20060102150405"      //完整时间格式
+	PageSize15            = 15                    //列表页每页数据量
 	PageSize5             = 5
 	PageSize10            = 10
 	PageSize20            = 20
@@ -20,12 +21,48 @@ const (
 )
 
 const (
-	APPNAME          = "弘则-ETA数据刷新"
+	APP_NAME_CN      = "弘则-ETA数据刷新"
+	APP_NAME_EN      = "hongze_edb_lib"
 	EmailSendToUsers = "glji@hzinsights.com;pyan@hzinsights.com;cxzhang@hzinsights.com"
 )
 
-//手机号,电子邮箱正则
+//数据来源渠道
 const (
-	RegularMobile = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0-9])|(17[0-9])|(16[0-9])|(19[0-9]))\\d{8}$" //手机号码
-	RegularEmail  = `\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*`                                             //匹配电子邮箱
-)
+	DATA_SOURCE_THS                  = iota + 1 //同花顺
+	DATA_SOURCE_WIND                            //wind
+	DATA_SOURCE_PB                              //彭博
+	DATA_SOURCE_CALCULATE                       //指标运算
+	DATA_SOURCE_CALCULATE_LJZZY                 //累计值转月
+	DATA_SOURCE_CALCULATE_TBZ                   //同比值
+	DATA_SOURCE_CALCULATE_TCZ                   //同差值
+	DATA_SOURCE_CALCULATE_NSZYDPJJS             //N数值移动平均计算
+	DATA_SOURCE_MANUAL                          //手工指标
+	DATA_SOURCE_LZ                              //隆众
+	DATA_SOURCE_YS                              //有色
+	DATA_SOURCE_CALCULATE_HBZ                   //环比值->12
+	DATA_SOURCE_CALCULATE_HCZ                   //环差值->13
+	DATA_SOURCE_CALCULATE_BP                    //变频->14
+	DATA_SOURCE_GL                              //钢联->15
+	DATA_SOURCE_ZZ                              //郑商所->16
+	DATA_SOURCE_DL                              //大商所->17
+	DATA_SOURCE_SH                              //上期所->18
+	DATA_SOURCE_CFFEX                           //中金所->19
+	DATA_SOURCE_SHFE                            //上期能源->20
+	DATA_SOURCE_GIE                             //欧洲天然气->21
+	DATA_SOURCE_CALCULATE_TIME_SHIFT            //时间移位->22
+	DATA_SOURCE_CALCULATE_ZJPJ                  //直接拼接->23
+	DATA_SOURCE_CALCULATE_LJZTBPJ               //累计值同比拼接->24
+)
+
+//基础数据初始化日期
+var (
+	BASE_START_DATE = time.Now().AddDate(-30, 0, 0).Format(FormatDate) //基础数据开始日期
+	BASE_END_DATE   = time.Now().AddDate(4, 0, 0).Format(FormatDate)   //基础数据结束日期
+)
+
+var (
+	Hz_Ths_Data_Url  string                                   //同花顺,万得接口服务地址(阿里云windows服务器地址)
+	Hz_Wind_Data_Url = "http://datawind.hzinsights.com:8040/" //万得接口服务地址
+	Hz_Pb_Data_Url   = "http://datapb.hzinsights.com:8040/"   //彭博接口地址
+	EDB_DATA_LIMIT = 10
+)