Эх сурвалжийг харах

Merge branch 'feature/jiayue_index' into debug

xyxie 1 жил өмнө
parent
commit
a0f8ecc630

+ 3 - 2
controllers/base_from_manual.go

@@ -4,6 +4,7 @@ import (
 	"encoding/json"
 	"eta/eta_index_lib/logic"
 	"eta/eta_index_lib/models"
+	"eta/eta_index_lib/services"
 	"eta/eta_index_lib/utils"
 	"strconv"
 	"time"
@@ -42,7 +43,7 @@ func (this *ManualController) 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)
-		err = models.AddEdbDataFromManual(req.EdbCode)
+		err = services.AddEdbDataFromManual(req.EdbCode)
 		if err != nil {
 			br.Msg = "获取指标信息失败!"
 			br.ErrMsg = "获取指标信息失败 AddEdbDataFromManual,Err:" + err.Error()
@@ -109,7 +110,7 @@ func (this *ManualController) Refresh() {
 	}
 
 	req.StartDate = `` // 开始日期也给过滤吧,万一研究员补充了之前的数据呢,还是过滤掉吧
-	err = models.RefreshEdbDataFromManual(req.EdbInfoId, req.EdbCode, req.StartDate)
+	err = services.RefreshEdbDataFromManual(req, edbInfo)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "刷新指标信息失败!"
 		br.ErrMsg = "刷新指标信息失败 RefreshEdbDataFromManual,Err:" + err.Error()

+ 87 - 0
controllers/base_from_smm.go

@@ -159,3 +159,90 @@ func (this *SmmController) HandleExcelData() {
 	br.Success = true
 	br.Msg = "处理成功"
 }
+
+// AddIndexToDataSource
+// @Title 添加指标到数据源-SMM
+// @Description 添加指标到数据源-SMM
+// @Success 200 {object} models.AddSmmIndexToDataSourceResp
+// @router /add/index/to_data_source [post]
+func (this *SmmController) AddIndexToDataSource() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.AddSmmIndexToDataSourceResp
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	smmIndexObj := new(models.BaseFromSmmIndex)
+	indexItem, err := smmIndexObj.GetSmmIndexItem(req.EdbCode)
+	var isAdd bool
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			isAdd = true
+		} else {
+			br.Msg = "判断指标是否存在失败"
+			br.ErrMsg = "判断指标是否存在失败,Err:" + err.Error()
+			return
+		}
+	}
+	if indexItem == nil {
+		isAdd = true
+	}
+	if isAdd {
+		smmIndexObj.IndexCode = req.EdbCode
+		smmIndexObj.ClassifyId = req.ClassifyId
+		smmIndexObj.CreateTime = time.Now()
+		smmIndexObj.ModifyTime = time.Now()
+		err = smmIndexObj.Add()
+		if err != nil {
+			br.Msg = "新增指标失败"
+			br.ErrMsg = "新增指标失败,Err:" + err.Error()
+			return
+		}
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "新增成功"
+}
+
+// GetIndexDetailByCode
+// @Title 获取指标详情
+// @Description 获取指标详情
+// @Success 200 {object} models.GetIndexDetailReq
+// @router /index_detail/from_data_source [post]
+func (this *SmmController) GetIndexDetailFromDataSourceByCode() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.GetIndexDetailReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.IndexCode == "" {
+		br.Msg = "参数有误"
+		br.ErrMsg = "参数有误"
+		return
+	}
+
+	indexObj := new(models.BaseFromSmmIndex)
+	item, err := indexObj.GetIndexItem(req.IndexCode)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取指标失败, Err: " + err.Error()
+		return
+	}
+	br.Data = item
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}

+ 64 - 0
controllers/base_from_smm_classify.go

@@ -0,0 +1,64 @@
+package controllers
+
+import (
+	"encoding/json"
+	"eta/eta_index_lib/models"
+	"eta/eta_index_lib/utils"
+	"strconv"
+)
+
+// @Title 查询/新增分类
+// @Description 查询/新增分类接口
+// @Param	request	body models.AddSmmClassifyReq true "type json string"
+// @Success 200 {object} models.EdbClassify
+// @router /smm_classify/get_or_add [post]
+func (this *SmmController) SmmGetOrAdd() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.AddSmmClassifyReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.ClassifyName == "" {
+		br.Msg = "请输入分类名称"
+		br.IsSendEmail = false
+		return
+	}
+	if req.ParentId < 0 {
+		br.Msg = "参数错误"
+		br.IsSendEmail = false
+		return
+	}
+
+	sysUserId := utils.InitAdminId
+	sysUserName := utils.InitAdminName
+	if req.SysUserId > 0 {
+		sysUserId = strconv.Itoa(req.SysUserId)
+	}
+	if req.SysUserRealName != `` {
+		sysUserName = req.SysUserRealName
+	}
+
+	//添加指标
+	edbClassify, err, errMsg := models.SaveSmmClassify(req.ClassifyName, req.ParentId, req.Level, sysUserId, sysUserName)
+	if errMsg != `` {
+		br.Msg = errMsg
+		br.ErrMsg = errMsg
+		if err != nil {
+			br.ErrMsg = errMsg + ";Err:" + err.Error()
+		} else {
+			br.IsSendEmail = false
+		}
+		return
+	}
+	br.Ret = 200
+	br.Msg = "保存成功"
+	br.Success = true
+	br.Data = edbClassify
+}

+ 73 - 42
controllers/base_from_wind.go

@@ -83,30 +83,48 @@ func (this *WindController) Add() {
 			return
 		}
 
+		// 判断是否调用桥接服务
+		windBridgeUrl, _ := services.GetWindBridgeUrl()
+		if windBridgeUrl != "" {
+			windUrl = windBridgeUrl
+		}
+
 		// 设置指标与终端关系的缓存
 		windUrlCacheKey := utils.CACHE_WIND_URL + ":" + req.EdbCode
 		_ = utils.Rc.SetNX(windUrlCacheKey, windUrl, utils.GetTodayLastSecond())
 
-		//windUrl = utils.Hz_Wind_Data_Url_LIST[1].Url
-		dataItem, errCode, err := services.GetEdbDataFromWindUrl(windUrl, req.EdbCode, utils.BASE_START_DATE, endDate)
-		//dataItem, errCode, err := services.GetEdbDataFromWind(req.EdbCode, utils.BASE_START_DATE, endDate)
-		if errCode == 421 { //指标超限
-			br.Ret = 421
-			br.Msg = "指标超限!"
-			return
-		}
-		// 指标下架
-		if errCode == services.WindNoAuthCode {
-			br.Ret = 4052
-			br.Msg = "指标已下架"
-			return
-		}
-		if err != nil {
-			br.Msg = "获取指标信息失败!"
-			br.ErrMsg = "获取指标信息失败 GetEdbDataFromWind,Err:" + err.Error()
-			return
+		var dataList []*models.EdbDataFromWindSimple
+
+		if windBridgeUrl != "" {
+			var errMsg string
+			dataList, err, errMsg = services.GetEdbDataFromBridge(windUrl, req, endDate)
+			if err != nil {
+				br.Msg = "获取指标信息失败!"
+				br.ErrMsg = "获取桥接服务指标信息失败,Err:" + errMsg + err.Error()
+				return
+			}
+		} else {
+			dataItem, errCode, err := services.GetEdbDataFromWindUrl(windUrl, req.EdbCode, utils.BASE_START_DATE, endDate)
+			//dataItem, errCode, err := services.GetEdbDataFromWind(req.EdbCode, utils.BASE_START_DATE, endDate)
+			if errCode == 421 { //指标超限
+				br.Ret = 421
+				br.Msg = "指标超限!"
+				return
+			}
+			// 指标下架
+			if errCode == services.WindNoAuthCode {
+				br.Ret = 4052
+				br.Msg = "指标已下架"
+				return
+			}
+			if err != nil {
+				br.Msg = "获取指标信息失败!"
+				br.ErrMsg = "获取指标信息失败 GetEdbDataFromWind,Err:" + err.Error()
+				return
+			}
+			dataList = models.DealWindData(dataItem)
 		}
-		err = models.AddEdbDataFromWind(req.EdbCode, dataItem)
+		err = models.AddEdbDataFromWind(req.EdbCode, dataList)
 		if err != nil {
 			br.Msg = "获取指标信息失败!"
 			br.ErrMsg = "获取指标信息失败 AddEdbDataFromWind,Err:" + err.Error()
@@ -178,32 +196,45 @@ func (this *WindController) Refresh() {
 	if strings.Contains(req.EdbCode, ".") {
 		endDate = time.Now().Format(utils.FormatDate)
 	}
-
-	dataItem, errCode, err := services.GetEdbDataFromWindUrl(edbInfo.ServerUrl, req.EdbCode, req.StartDate, endDate)
-	if errCode == 421 { //指标超限
-		br.Ret = 421
-		br.Msg = "指标超限!"
-		return
-	}
-	// 忽略掉指标下架的错误, 并更新指标为停止更新
-	if errCode == services.WindNoAuthCode {
-		edbInfo.NoUpdate = 1
-		edbInfo.ModifyTime = time.Now().Local()
-		if e := edbInfo.Update([]string{"NoUpdate", "ModifyTime"}); e != nil {
-			br.Msg = "刷新失败"
-			br.ErrMsg = "更新wind指标停更失败, Err: " + e.Error()
+	// 判断是否调用桥接服务
+	windUrl, _ := services.GetWindBridgeUrl()
+	var dataList []*models.EdbDataFromWindSimple
+	if windUrl != "" && windUrl == edbInfo.ServerUrl {
+		var errMsg string
+		dataList, err, errMsg = services.RefreshEdbDataFromWindBridge(edbInfo.ServerUrl, req, edbInfo, endDate)
+		if err != nil {
+			br.Msg = "获取指标信息失败!"
+			br.ErrMsg = "获取桥接服务指标信息失败,Err:" + errMsg + err.Error()
 			return
 		}
-		br.Ret = 200
-		br.Msg = "操作成功"
-		return
-	}
-	if err != nil {
-		br.Msg = "获取指标信息失败!"
-		br.ErrMsg = "获取指标信息失败 GetEdbDataFromWind,Err:" + err.Error()
-		return
+	} else {
+		dataItem, errCode, err := services.GetEdbDataFromWindUrl(edbInfo.ServerUrl, req.EdbCode, req.StartDate, endDate)
+		if errCode == 421 { //指标超限
+			br.Ret = 421
+			br.Msg = "指标超限!"
+			return
+		}
+		// 忽略掉指标下架的错误, 并更新指标为停止更新
+		if errCode == services.WindNoAuthCode {
+			edbInfo.NoUpdate = 1
+			edbInfo.ModifyTime = time.Now().Local()
+			if e := edbInfo.Update([]string{"NoUpdate", "ModifyTime"}); e != nil {
+				br.Msg = "刷新失败"
+				br.ErrMsg = "更新wind指标停更失败, Err: " + e.Error()
+				return
+			}
+			br.Ret = 200
+			br.Msg = "操作成功"
+			return
+		}
+		if err != nil {
+			br.Msg = "获取指标信息失败!"
+			br.ErrMsg = "获取指标信息失败 GetEdbDataFromWind,Err:" + err.Error()
+			return
+		}
+		dataList = models.DealWindData(dataItem)
 	}
-	err = models.RefreshEdbDataFromWind(req.EdbInfoId, req.EdbCode, req.StartDate, dataItem)
+	err = models.RefreshEdbDataFromWind(req.EdbInfoId, req.EdbCode, req.StartDate, dataList)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "刷新指标信息失败!"
 		br.ErrMsg = "刷新指标信息失败 RefreshEdbDataFromWind,Err:" + err.Error()

+ 21 - 0
models/base_from_bridge.go

@@ -0,0 +1,21 @@
+package models
+
+type EdbDataFromWindBridge struct {
+	Code int                        `json:"code"`
+	Msg  string                     `json:"msg"`
+	Data EdbDataFromWindBridgeIndex `json:"data"`
+}
+
+type EdbDataFromWindBridgeIndex struct {
+	IndexCode      string                      `json:"index_code"`
+	LastDate       string                      `description:"指标最新时间" json:"last_date"`
+	LastUpdateTime string                      `description:"最新更新时间" json:"last_update_time"`
+	Status         int                         `description:"指标状态" json:"status"`
+	IndexData      []EdbDataFromWindBridgeData `json:"index_data"`
+}
+
+type EdbDataFromWindBridgeData struct {
+	Val        float64 `json:"val"`
+	DataTime   string  `json:"data_time"`
+	UpdateTime string  `json:"update_time"`
+}

+ 6 - 6
models/base_from_manual.go

@@ -31,10 +31,10 @@ func GetEdbdataManualByCondition(condition string, pars []interface{}) (item []*
 }
 
 // AddEdbDataFromManual 新增弘则手工指标数据
-func AddEdbDataFromManual(edbCode string) (err error) {
+func AddEdbDataFromManual(edbCode string, manualDataList []*ManualEdbdata) (err error) {
 	o := orm.NewOrm()
 
-	var condition string
+	/*var condition string
 	var pars []interface{}
 
 	if edbCode != "" {
@@ -45,7 +45,7 @@ func AddEdbDataFromManual(edbCode string) (err error) {
 	manualDataList, err := GetEdbdataManualByCondition(condition, pars)
 	if err != nil {
 		return
-	}
+	}*/
 	dataLen := len(manualDataList)
 
 	if dataLen > 0 {
@@ -82,7 +82,7 @@ func AddEdbDataFromManual(edbCode string) (err error) {
 }
 
 // RefreshEdbDataFromManual 刷新手工指标数据
-func RefreshEdbDataFromManual(edbInfoId int, edbCode, startDate string) (err error) {
+func RefreshEdbDataFromManual(edbInfoId int, edbCode, startDate string, manualDataList []*ManualEdbdata) (err error) {
 	source := utils.DATA_SOURCE_MANUAL
 	o := orm.NewOrm()
 	if err != nil {
@@ -90,7 +90,7 @@ func RefreshEdbDataFromManual(edbInfoId int, edbCode, startDate string) (err err
 	}
 	edbInfoIdStr := strconv.Itoa(edbInfoId)
 	//计算数据
-	var condition string
+	/*var condition string
 	var pars []interface{}
 
 	if edbCode != "" {
@@ -109,7 +109,7 @@ func RefreshEdbDataFromManual(edbInfoId int, edbCode, startDate string) (err err
 	manualDataList, err := GetEdbdataManualByCondition(condition, pars)
 	if err != nil {
 		return
-	}
+	}*/
 
 	// 真实数据的最大日期  , 插入规则配置的日期
 	var realDataMaxDate, edbDataInsertConfigDate time.Time

+ 22 - 0
models/base_from_smm.go

@@ -191,6 +191,7 @@ func RefreshEdbDataFromSmm(edbInfoId int, edbCode, startDate string) (err error)
 
 type BaseFromSmmIndex struct {
 	BaseFromSmmIndexId int64 `orm:"column(base_from_smm_index_id);pk"`
+	ClassifyId         int
 	Interface          string
 	Name               string
 	IndexCode          string
@@ -227,6 +228,13 @@ func (d *BaseFromSmmIndex) GetSmmIndexItem(indexCode string) (item *BaseFromSmmI
 	return
 }
 
+// Add 新增
+func (m *BaseFromSmmIndex) Add() (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(m)
+	return
+}
+
 func GetBaseFromSmmDataBySmmCode(smmCode string) (list []*BaseFromSmmData, err error) {
 	o := orm.NewOrm()
 	sql := ` SELECT * FROM base_from_smm_data WHERE index_code=? `
@@ -292,3 +300,17 @@ func MultiUpdateBaseFromSmmDataValue(items []*BaseFromSmmData) (err error) {
 	}
 	return
 }
+
+type AddSmmIndexToDataSourceResp struct {
+	EdbCode         string `description:"指标编码"`
+	ClassifyId      int    `description:"指标分类"`
+	SysUserId       int    `description:"操作人id"`
+	SysUserRealName string `description:"操作人真实名称"`
+}
+
+func (m *BaseFromSmmIndex) GetIndexItem(indexCode string) (item *BaseFromSmmIndex, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM base_from_smm_index WHERE index_code = ? `
+	err = o.Raw(sql, indexCode).QueryRow(&item)
+	return
+}

+ 85 - 0
models/base_from_smm_classify.go

@@ -0,0 +1,85 @@
+package models
+
+import (
+	"eta/eta_index_lib/utils"
+	"github.com/beego/beego/v2/client/orm"
+	"strconv"
+	"time"
+)
+
+type BaseFromSmmClassify struct {
+	ClassifyId      int       `orm:"column(classify_id);pk"`
+	ClassifyName    string    `description:"分类名称"`
+	ParentId        int       `description:"父级id"`
+	SysUserId       int       `description:"创建人id"`
+	SysUserRealName string    `description:"创建人姓名"`
+	Level           int       `description:"层级"`
+	Sort            int       `description:"排序字段,越小越靠前,默认值:10"`
+	ModifyTime      time.Time `description:"修改时间"`
+	CreateTime      time.Time `description:"创建时间"`
+}
+
+func AddSmmClassify(item *BaseFromSmmClassify) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}
+
+type AddSmmClassifyReq struct {
+	ClassifyName    string `description:"分类名称"`
+	ParentId        int    `description:"父级id,第一级传0"`
+	Level           int    `description:"层级,第一级传0,其余传上一级的层级"`
+	SysUserId       int    `description:"操作人id"`
+	SysUserRealName string `description:"操作人真实名称"`
+}
+
+// 判断分类名称是否存在
+func GetSmmClassify(classifyName string, parentId int) (item *BaseFromSmmClassify, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM base_from_smm_classify WHERE parent_id=? AND classify_name=? `
+	err = o.Raw(sql, parentId, classifyName).QueryRow(&item)
+	return
+}
+
+// 添加指标分类
+func SaveSmmClassify(classifyName string, parentId, level int, sysUserId, sysUserName string) (classifyInfo *BaseFromSmmClassify, err error, errMsg string) {
+	edbClassify, err := GetSmmClassify(classifyName, parentId)
+
+	var isAdd bool
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			isAdd = true
+		} else {
+			errMsg = `判断名称是否已存在失败`
+			return
+		}
+	}
+
+	if edbClassify != nil && edbClassify.ClassifyId > 0 {
+		classifyInfo = edbClassify
+		return edbClassify, nil, ""
+	} else {
+		isAdd = true
+	}
+	if isAdd {
+		sysUserIdInt, _ := strconv.Atoi(sysUserId)
+		//获取该层级下最大的排序数
+		maxSort, err := GetMysteelClassifyMaxSort(parentId)
+		classifyInfo = &BaseFromSmmClassify{
+			ClassifyName:    classifyName,
+			ParentId:        parentId,
+			CreateTime:      time.Now(),
+			ModifyTime:      time.Now(),
+			SysUserId:       sysUserIdInt,
+			SysUserRealName: sysUserName,
+			Level:           level + 1,
+			Sort:            maxSort,
+		}
+		classifyId, err := AddSmmClassify(classifyInfo)
+		if err != nil {
+			errMsg = "保存分类失败"
+		}
+		classifyInfo.ClassifyId = int(classifyId)
+	}
+	return
+}

+ 30 - 11
models/base_from_wind.go

@@ -16,20 +16,36 @@ type EdbDataFromWind struct {
 	ErrMsg    string
 }
 
-func AddEdbDataFromWind(edbCode string, item *EdbDataFromWind) (err error) {
-	o := orm.NewOrm()
+type EdbDataFromWindSimple struct {
+	Val          string
+	DateTime     string
+	TimestampStr string
+}
 
-	var isAdd bool
-	addSql := ` INSERT INTO edb_data_wind(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+func DealWindData(item *EdbDataFromWind) (list []*EdbDataFromWindSimple) {
 	for k, v := range item.Dt {
 		timeStr := fmt.Sprintf("%d", v)
 		v = v / 1000
 		t := time.Unix(v, 0)
 		dateTime := t.Format(utils.FormatDate)
 		val := item.Close[k]
-		saveVal := utils.SubFloatToString(val, 20)
-		addSql += GetAddSql("0", edbCode, dateTime, timeStr, saveVal)
+		saveVal := utils.SubFloatToString(val, 30)
+		tmp := &EdbDataFromWindSimple{
+			Val:          saveVal,
+			DateTime:     dateTime,
+			TimestampStr: timeStr,
+		}
+		list = append(list, tmp)
+	}
+	return
+}
 
+func AddEdbDataFromWind(edbCode string, dataList []*EdbDataFromWindSimple) (err error) {
+	o := orm.NewOrm()
+	var isAdd bool
+	addSql := ` INSERT INTO edb_data_wind(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	for _, v := range dataList {
+		addSql += GetAddSql("0", edbCode, v.DateTime, v.TimestampStr, v.Val)
 		isAdd = true
 	}
 
@@ -44,7 +60,7 @@ func AddEdbDataFromWind(edbCode string, item *EdbDataFromWind) (err error) {
 }
 
 // RefreshEdbDataFromWind 刷新wind指标数据
-func RefreshEdbDataFromWind(edbInfoId int, edbCode, startDate string, item *EdbDataFromWind) (err error) {
+func RefreshEdbDataFromWind(edbInfoId int, edbCode, startDate string, dataList []*EdbDataFromWindSimple) (err error) {
 	o := orm.NewOrm()
 	source := utils.DATA_SOURCE_WIND
 
@@ -84,16 +100,19 @@ func RefreshEdbDataFromWind(edbInfoId int, edbCode, startDate string, item *EdbD
 	var isAdd bool
 	addMap := make(map[string]string)
 	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	for k, v := range item.Dt {
-		timeStr := fmt.Sprintf("%d", v)
+	for _, v := range dataList {
+		/*timeStr := fmt.Sprintf("%d", v)
 		v = v / 1000
 		t := time.Unix(v, 0)
 		dateTime := t.Format(utils.FormatDate)
 		t, _ = time.ParseInLocation(utils.FormatDate, dateTime, time.Local) // 这里的目的是为了处理成北京时间,所以多转一遍
 
 		val := item.Close[k]
-		saveVal := utils.SubFloatToString(val, 30)
-
+		saveVal := utils.SubFloatToString(val, 30)*/
+		timeStr := v.TimestampStr
+		saveVal := v.Val
+		dateTime := v.DateTime
+		t, _ := time.ParseInLocation(utils.FormatDate, v.DateTime, time.Local)
 		//如果传入的开始时间是空的,且当前数据日期早于传入的开始日期,那么需要判断下当前日期的数据是否存在
 		if !startDateTime.IsZero() && t.Before(startDateTime) {
 			tmpItem, tmpErr := GetEdbDataByDate(source, edbCode, dateTime)

+ 1 - 0
models/db.go

@@ -101,5 +101,6 @@ func initBaseIndex() {
 		new(BaseFromMysteelChemicalData),
 		new(BaseFromTradeShanghaiIndex),
 		new(BaseFromTradeIneIndex),
+		new(BaseFromSmmClassify),
 	)
 }

+ 18 - 0
routers/commentsRouter.go

@@ -826,6 +826,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_index_lib/controllers:SmmController"] = append(beego.GlobalControllerRouter["eta/eta_index_lib/controllers:SmmController"],
+        beego.ControllerComments{
+            Method: "AddIndexToDataSource",
+            Router: `/add/index/to_data_source`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_index_lib/controllers:SmmController"] = append(beego.GlobalControllerRouter["eta/eta_index_lib/controllers:SmmController"],
         beego.ControllerComments{
             Method: "HandleExcelData",
@@ -844,6 +853,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_index_lib/controllers:SmmController"] = append(beego.GlobalControllerRouter["eta/eta_index_lib/controllers:SmmController"],
+        beego.ControllerComments{
+            Method: "SmmGetOrAdd",
+            Router: `/smm_classify/get_or_add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_index_lib/controllers:StockPlantController"] = append(beego.GlobalControllerRouter["eta/eta_index_lib/controllers:StockPlantController"],
         beego.ControllerComments{
             Method: "Calculate",

+ 74 - 0
services/base_from_manual.go

@@ -0,0 +1,74 @@
+package services
+
+import (
+	"errors"
+	"eta/eta_index_lib/models"
+	"eta/eta_index_lib/utils"
+)
+
+func AddEdbDataFromManual(edbCode string) (err error) {
+	// 判断是否调用桥接服务
+	var manualDataList []*models.ManualEdbdata
+	url, _ := GetWindBridgeUrl()
+	if url != "" {
+		manualDataList, err = GetManualEdbDataFromBridgeJy(url, edbCode, "", "")
+		if err != nil {
+			return
+		}
+	} else {
+		var condition string
+		var pars []interface{}
+
+		if edbCode != "" {
+			condition += " AND TRADE_CODE=? "
+			pars = append(pars, edbCode)
+		}
+		manualDataList, err = models.GetEdbdataManualByCondition(condition, pars)
+		if err != nil {
+			return
+		}
+	}
+
+	err = models.AddEdbDataFromManual(edbCode, manualDataList)
+	return
+}
+
+func RefreshEdbDataFromManual(req models.RefreshEdbInfoReq, edbinfo *models.EdbInfo) (err error) {
+	var manualDataList []*models.ManualEdbdata
+	url, _ := GetWindBridgeUrl()
+	if url != "" && edbinfo.ServerUrl == url {
+		manualDataList, err = GetManualEdbDataFromBridgeJy(url, req.EdbCode, "", "")
+		if err != nil {
+			err = errors.New("查询桥接服务手工数据失败,Err:" + err.Error())
+			return
+		}
+	} else {
+		var condition string
+		var pars []interface{}
+
+		if req.EdbCode != "" {
+			condition += " AND TRADE_CODE=? "
+			pars = append(pars, req.EdbCode)
+		}
+
+		if req.StartDate != "" {
+			condition += " AND DT>=? "
+			pars = append(pars, req.StartDate)
+		} else {
+			condition += " AND DT != ? "
+			pars = append(pars, `0000-00-00`)
+		}
+
+		manualDataList, err = models.GetEdbdataManualByCondition(condition, pars)
+		if err != nil {
+			err = errors.New("查询手工数据失败,Err:" + err.Error())
+			return
+		}
+	}
+	err = models.RefreshEdbDataFromManual(req.EdbInfoId, req.EdbCode, req.StartDate, manualDataList)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		err = errors.New("刷新指标信息失败 service RefreshEdbDataFromManual,Err:" + err.Error())
+		return
+	}
+	return
+}

+ 64 - 0
services/base_from_wind.go

@@ -225,3 +225,67 @@ func DeleteEdbCodeInWindUrl(edbCode string) (err error) {
 	err = utils.Rc.Delete(cacheKey)
 	return
 }
+
+func GetEdbDataFromBridge(windUrl string, req models.AddEdbInfoReq, endDate string) (list []*models.EdbDataFromWindSimple, err error, errMsg string) {
+	dataItem, err := GetEdbDataFromBridgeJy(windUrl, req.EdbCode, utils.BASE_START_DATE, endDate)
+	if err != nil {
+		errMsg = "桥接服务里获取指标信息失败 GetEdbDataFromBridgeJy,Err:" + err.Error()
+		err = errors.New("获取指标信息失败!")
+		return
+	}
+	for _, v := range dataItem.IndexData {
+		tmp := new(models.EdbDataFromWindSimple)
+		dataTime, tErr := time.Parse(utils.FormatDate, v.DataTime)
+		if tErr != nil {
+			err = tErr
+			return
+		}
+		timestamp := dataTime.UnixNano() / 1e6
+		timeStr := fmt.Sprintf("%d", timestamp)
+		saveVal := utils.SubFloatToString(v.Val, 30)
+
+		tmp.TimestampStr = timeStr
+		tmp.DateTime = v.DataTime
+		tmp.Val = saveVal
+		list = append(list, tmp)
+	}
+	return
+}
+
+// RefreshEdbDataFromWindBridge 桥接服务刷新wind指标数据
+func RefreshEdbDataFromWindBridge(windUrl string, req models.RefreshEdbInfoReq, edbInfo *models.EdbInfo, endDate string) (list []*models.EdbDataFromWindSimple, err error, errMsg string) {
+	dataItem, err := GetEdbDataFromBridgeJy(windUrl, edbInfo.EdbCode, req.StartDate, endDate)
+	if err != nil {
+		errMsg = "获取指标信息失败 GetEdbDataFromWind,Err:" + err.Error()
+		err = errors.New("获取指标信息失败!")
+		return
+	}
+
+	// 忽略掉指标下架的错误, 并更新指标为停止更新
+	if dataItem.Status == -1 {
+		edbInfo.NoUpdate = 1
+		edbInfo.ModifyTime = time.Now().Local()
+		if e := edbInfo.Update([]string{"NoUpdate", "ModifyTime"}); e != nil {
+			errMsg = "更新wind指标停更失败, Err: " + e.Error()
+			err = errors.New("刷新失败")
+			return
+		}
+		return
+	}
+	for _, v := range dataItem.IndexData {
+		tmp := new(models.EdbDataFromWindSimple)
+		dataTime, tErr := time.Parse(utils.FormatDate, v.DataTime)
+		if tErr != nil {
+			err = tErr
+		}
+		timestamp := dataTime.UnixNano() / 1e6
+		timeStr := fmt.Sprintf("%d", timestamp)
+		saveVal := utils.SubFloatToString(v.Val, 20)
+
+		tmp.TimestampStr = timeStr
+		tmp.DateTime = v.DataTime
+		tmp.Val = saveVal
+		list = append(list, tmp)
+	}
+	return
+}

+ 136 - 0
services/base_from_wind_bridge.go

@@ -0,0 +1,136 @@
+package services
+
+import (
+	"encoding/json"
+	"errors"
+	"eta/eta_index_lib/models"
+	"eta/eta_index_lib/services/alarm_msg"
+	"eta/eta_index_lib/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/http"
+	"time"
+)
+
+// GetEdbDataFromBridgeJy 从桥接服务里的嘉悦物产数据中心获取数据
+func GetEdbDataFromBridgeJy(windUrl, edbCode, startDate, endDate string) (index *models.EdbDataFromWindBridgeIndex, err error) {
+	if windUrl == `` {
+		windUrl, err = GetWindBridgeUrl()
+		if err != nil {
+			return
+		}
+	}
+	source := "wind"
+	index, err = getEdbDataFromBridgeJy(windUrl, source, edbCode, startDate, endDate)
+	return
+}
+
+// GetWindBridgeUrl 获取桥接服务地址
+func GetWindBridgeUrl() (windUrl string, err error) {
+	defer func() {
+		if err == nil && windUrl == "" {
+			err = errors.New("wind桥接服务器地址为空")
+		}
+	}()
+	// 先配置中获取,如果有指定配置的话,那么取配置中的数据
+	tmpConfig, err := models.GetConfigDetailByCode("wind_from_bridge")
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		err = errors.New("获取配置的wind地址失败,err:" + err.Error())
+		return
+	}
+	err = nil
+	if tmpConfig != nil {
+		windFrom := tmpConfig.ConfigValue
+		tmpConfig, err = models.GetConfigDetailByCode(windFrom)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			err = errors.New("获取配置的wind地址失败,err:" + err.Error())
+			return
+		}
+		windUrl = tmpConfig.ConfigValue
+		return
+	}
+	return
+}
+
+// GetManualBridgeUrl 获取桥接服务地址
+func GetManualBridgeUrl() (manualUrl string, err error) {
+	defer func() {
+		if err == nil && manualUrl == "" {
+			err = errors.New("wind桥接服务器地址为空")
+		}
+	}()
+	// 先配置中获取,如果有指定配置的话,那么取配置中的数据
+	tmpConfig, err := models.GetConfigDetailByCode("manual_from_bridge")
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		err = errors.New("获取配置的wind地址失败,err:" + err.Error())
+		return
+	}
+	err = nil
+	if tmpConfig != nil {
+		windFrom := tmpConfig.ConfigValue
+		tmpConfig, err = models.GetConfigDetailByCode(windFrom)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			err = errors.New("获取配置的wind地址失败,err:" + err.Error())
+			return
+		}
+		manualUrl = tmpConfig.ConfigValue
+		return
+	}
+	return
+}
+
+// GetManualEdbDataFromBridgeJy 从桥接服务里的嘉悦物产数据中心获取数据
+func GetManualEdbDataFromBridgeJy(windUrl, edbCode, startDate, endDate string) (list []*models.ManualEdbdata, err error) {
+	if windUrl == `` {
+		windUrl, err = GetManualBridgeUrl()
+		if err != nil {
+			return
+		}
+	}
+	source := "manual"
+	index, err := getEdbDataFromBridgeJy(windUrl, source, edbCode, startDate, endDate)
+	if err != nil {
+		return
+	}
+	for _, v := range index.IndexData {
+		tmp := new(models.ManualEdbdata)
+		t, _ := time.ParseInLocation(utils.FormatDateTime, v.UpdateTime, time.Local)
+		tmp = &models.ManualEdbdata{
+			TradeCode:  index.IndexCode,
+			Dt:         v.DataTime,
+			Close:      fmt.Sprintf("%f", v.Val),
+			ModifyTime: t,
+		}
+		list = append(list, tmp)
+	}
+	return
+}
+
+// getEdbDataFromBridgeJy 从桥接服务里的嘉悦物产数据中心获取数据
+func getEdbDataFromBridgeJy(url, source, edbCode, startDate, endDate string) (index *models.EdbDataFromWindBridgeIndex, err error) {
+	requestWindUrl := url + `?index_code=%s&start_date=%s&end_date=%s&source=%s`
+	requestWindUrl = fmt.Sprintf(requestWindUrl, edbCode, startDate, endDate, source)
+	utils.FileLog.Info(fmt.Sprintf("windUrl:%s", requestWindUrl))
+	body, err := http.Get(requestWindUrl)
+	fmt.Println("GetEdbDataFromBridgeJy body:")
+	fmt.Println(string(body))
+	utils.FileLog.Info(fmt.Sprint("GetEdbDataFromBridgeJy result:", string(body)))
+
+	if err != nil {
+		return
+	}
+	ret := new(models.EdbDataFromWindBridge)
+	err = json.Unmarshal(body, &ret)
+	if err != nil {
+		err = errors.New("返回值格式错误,json解析失败,Err: " + err.Error())
+		return
+	}
+	//异常的话,需要邮件通知
+	if ret.Code != 200 {
+		errMsg := fmt.Sprintf("	桥接服务 指标数据接口报错,地址:%s, Code: %d, Err: %s", requestWindUrl, ret.Code, ret.Msg)
+		err = errors.New(errMsg)
+		go alarm_msg.SendAlarmMsg(errMsg, 3)
+		return
+	}
+	index = &ret.Data
+	return
+}