Browse Source

fix:新增彭博财务数据接口

Roc 2 years ago
parent
commit
7008b0b75b

+ 144 - 0
controllers/base_from_pb_finance.go

@@ -0,0 +1,144 @@
+package controllers
+
+import (
+	"encoding/json"
+	"hongze/hongze_edb_lib/models"
+	"hongze/hongze_edb_lib/services"
+	"hongze/hongze_edb_lib/utils"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// PbFinanceController 彭博财务
+type PbFinanceController struct {
+	BaseAuthController
+}
+
+// @Title 新增彭博指标接口
+// @Description 新增彭博指标接口
+// @Success 200 {object} models.AddEdbInfoReq
+// @router /add [post]
+func (this *PbFinanceController) Add() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	source := utils.DATA_SOURCE_PB_FINANCE
+	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 = utils.CACHE_EDB_DATA_ADD + strconv.Itoa(source) + "_" + req.EdbCode
+	if !utils.Rc.IsExist(cacheKey) {
+		utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+		defer func() {
+			utils.Rc.Delete(cacheKey)
+		}()
+		//指标编码处理,将指标编码拆分成 company_code和edb_code
+		edbCode := req.EdbCode
+		edbCodeArr := strings.Split(edbCode, "&&")
+		if len(edbCodeArr) != 2 {
+			br.Msg = "指标编码异常,请传入客户编码!"
+			br.ErrMsg = "指标编码异常,请传入客户编码"
+			return
+		}
+		dataItem, err := services.GetEdbDataFromPbFinance(edbCodeArr[0], edbCodeArr[1], utils.BASE_START_DATE_UnSpace, utils.BASE_END_DATE_UnSpace)
+		if err != nil {
+			br.Msg = "获取指标信息失败!"
+			br.ErrMsg = "获取指标信息失败 GetEdbDataFromPb,Err:" + err.Error()
+			return
+		}
+		err = models.AddEdbDataFromPbFinance(req.EdbCode, dataItem)
+		if err != nil {
+			br.Msg = "获取指标信息失败!"
+			br.ErrMsg = "获取指标信息失败 AddEdbDataFromPb,Err:" + err.Error()
+			return
+		}
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+	} else {
+		br.Ret = 501
+		br.Success = true
+		br.Msg = "系统处理中,请稍后重试"
+	}
+}
+
+// @Title 刷新彭博指标接口
+// @Description 刷新彭博指标接口
+// @Success 200 {object} models.RefreshEdbInfoReq
+// @router /refresh [post]
+func (this *PbFinanceController) Refresh() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	source := utils.DATA_SOURCE_PB_FINANCE
+	var req models.RefreshEdbInfoReq
+	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
+	}
+	if req.EdbInfoId <= 0 {
+		br.Msg = "请输入指标ID!"
+		br.ErrMsg = "请输入指标ID"
+		return
+	}
+	cacheKey = utils.CACHE_EDB_DATA_REFRESH + strconv.Itoa(source) + "_" + req.EdbCode
+	if !utils.Rc.IsExist(cacheKey) {
+		utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+		defer func() {
+			utils.Rc.Delete(cacheKey)
+		}()
+		//开始日期格式化
+		startDateTime, _ := time.Parse(utils.FormatDate, req.StartDate)
+
+		//指标编码处理,将指标编码拆分成 company_code和edb_code
+		edbCode := req.EdbCode
+		edbCodeArr := strings.Split(edbCode, "&&")
+		if len(edbCodeArr) != 2 {
+			br.Msg = "指标编码异常,请传入客户编码!"
+			br.ErrMsg = "指标编码异常,请传入客户编码"
+			return
+		}
+		dataItem, err := services.GetEdbDataFromPbFinance(edbCodeArr[0], edbCodeArr[1], startDateTime.Format(utils.FormatDateUnSpace), utils.BASE_END_DATE_UnSpace)
+		if err != nil {
+			br.Msg = "获取指标信息失败!"
+			br.ErrMsg = "获取指标信息失败 GetEdbDataFromPb,Err:" + err.Error()
+			return
+		}
+		err = models.RefreshEdbDataFromPbFinance(req.EdbInfoId, req.EdbCode, req.StartDate, dataItem)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "刷新指标信息失败!"
+			br.ErrMsg = "刷新指标信息失败 RefreshEdbDataFromPb,Err:" + err.Error()
+			return
+		}
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+	} else {
+		br.Ret = 501
+		br.Success = true
+		br.Msg = "系统处理中,请稍后重试"
+	}
+}

+ 124 - 0
models/base_from_pb_finance.go

@@ -0,0 +1,124 @@
+package models
+
+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"
+)
+
+func AddEdbDataFromPbFinance(edbCode string, item *services.EdbDataFromPb) (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("彭博数据获取失败:err:"+errMsg, 3)
+
+		}
+	}()
+
+	if len(item.Date) > 0 {
+		var isAdd bool
+		dateMap := item.Date
+		addSql := ` INSERT INTO edb_data_pb(edb_info_id,edb_code,data_time,value,create_time,modify_time,ticker,field,data_timestamp) values `
+		nowStr := time.Now().Format(utils.FormatDateTime)
+		for k, v := range dateMap {
+			timeStr := fmt.Sprintf("%d", v)
+			v = v / 1000
+			t := time.Unix(v, 0)
+			dateTime := t.Format(utils.FormatDate)
+
+			val := item.Value[k]
+			field := item.Field[k]
+			ticker := item.Ticker[k]
+
+			addSql += "("
+			addSql += "0," + "'" + edbCode + "'" + "," + "'" + dateTime + "'" + "," + utils.SubFloatToString(val, 20) + "," + "'" + nowStr + "'" +
+				"," + "'" + nowStr + "'" + "," + "'" + ticker + "'" + "," + "'" + field + "'" + "," + "'" + timeStr + "'"
+			addSql += "),"
+			isAdd = true
+		}
+		if isAdd {
+			addSql = strings.TrimRight(addSql, ",")
+			_, err = o.Raw(addSql).Exec()
+			if err != nil {
+				errMsg = " tx.Exec Err :" + err.Error()
+				return
+			}
+		}
+	}
+	return
+}
+
+//刷新彭博指标数据
+func RefreshEdbDataFromPbFinance(edbInfoId int, edbCode, startDate string, item *services.EdbDataFromPb) (err error) {
+	o := orm.NewOrm()
+	source := utils.DATA_SOURCE_PB_FINANCE
+
+	var condition string
+	var pars []interface{}
+
+	condition += " AND edb_info_id=? "
+	pars = append(pars, edbInfoId)
+
+	condition += " AND data_time>=? "
+	pars = append(pars, startDate)
+	existList, err := GetEdbDataByCondition(source, condition, pars)
+	existMap := make(map[string]*EdbInfoSearchData)
+	for _, v := range existList {
+		existMap[v.DataTime] = v
+	}
+
+	edbInfoIdStr := strconv.Itoa(edbInfoId)
+	addMap := make(map[string]string)
+	if len(item.Date) > 0 {
+		dateMap := item.Date
+		var isAdd bool
+		addSql := ` INSERT INTO edb_data_pb(edb_info_id,edb_code,data_time,value,create_time,modify_time,ticker,field,data_timestamp) values `
+		nowStr := time.Now().Format(utils.FormatDateTime)
+		for k, v := range dateMap {
+			timeStr := fmt.Sprintf("%d", v)
+			v = v / 1000
+			t := time.Unix(v, 0)
+			dateTime := t.Format(utils.FormatDate)
+			val := item.Value[k]
+			field := item.Field[k]
+			ticker := item.Ticker[k]
+			saveValue := utils.SubFloatToString(val, 30)
+			if field == "PX_LAST" {
+				if findItem, ok := existMap[dateTime]; !ok {
+					if _, addOk := addMap[dateTime]; !addOk {
+						addSql += "("
+						addSql += edbInfoIdStr + "," + "'" + edbCode + "'" + "," + "'" + dateTime + "'" + "," + saveValue + "," + "'" + nowStr + "'" +
+							"," + "'" + nowStr + "'" + "," + "'" + ticker + "'" + "," + "'" + field + "'" + "," + "'" + timeStr + "'"
+						addSql += "),"
+						isAdd = true
+						addMap[dateTime] = saveValue
+					}
+				} else {
+					if findItem != nil && utils.SubFloatToString(findItem.Value, 30) != saveValue {
+						err = ModifyEdbDataById(source, findItem.EdbDataId, saveValue)
+						if err != nil {
+							return err
+						}
+					}
+				}
+			}
+		}
+
+		if isAdd {
+			addSql = strings.TrimRight(addSql, ",")
+			_, err = o.Raw(addSql).Exec()
+			if err != nil {
+				fmt.Println("RefreshAllEdbDataByPbFinance add Err", err.Error())
+				return
+			}
+		}
+	}
+	return
+}

+ 1 - 1
models/edb_data_table.go

@@ -11,7 +11,7 @@ func GetEdbDataTableName(source int) (tableName string) {
 		tableName = "edb_data_ths"
 	case utils.DATA_SOURCE_WIND:
 		tableName = "edb_data_wind"
-	case utils.DATA_SOURCE_PB:
+	case utils.DATA_SOURCE_PB, utils.DATA_SOURCE_PB_FINANCE:
 		tableName = "edb_data_pb"
 	case utils.DATA_SOURCE_CALCULATE:
 		tableName = "edb_data_calculate"

+ 18 - 0
routers/commentsRouter_controllers.go

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

+ 5 - 0
routers/router.go

@@ -25,6 +25,11 @@ func init() {
 				&controllers.PbController{},
 			),
 		),
+		beego.NSNamespace("/pb_finance",
+			beego.NSInclude(
+				&controllers.PbFinanceController{},
+			),
+		),
 		beego.NSNamespace("/wind",
 			beego.NSInclude(
 				&controllers.WindController{},

+ 23 - 0
services/base_from_pb.go

@@ -36,3 +36,26 @@ func GetEdbDataFromPb(edbCode, startDate, endDate string) (item *EdbDataFromPb,
 	edbCode, _ = url.QueryUnescape(edbCode)
 	return
 }
+
+// GetEdbDataFromPbFinance 获取Pb财务数据
+func GetEdbDataFromPbFinance(companyCode, edbCode, startDate, endDate string) (item *EdbDataFromPb, err error) {
+	companyCode = url.QueryEscape(companyCode)
+	edbCode = url.QueryEscape(edbCode)
+	bpUrl := utils.Hz_Pb_Data_Url + `edbInfo/pb/finance?CompanyCode=%s&EdbCode=%s&StartDate=%s&EndDate=%s`
+	bpUrl = fmt.Sprintf(bpUrl, companyCode, edbCode, startDate, endDate)
+	utils.FileLog.Info("bpUrl:" + bpUrl)
+	body, err := http.Get(bpUrl)
+	if err != nil {
+		utils.FileLog.Info("GetEdbDataByPb Err:" + err.Error())
+		return
+	}
+	utils.FileLog.Info("GetEdbDataByPb result:" + string(body))
+	item = new(EdbDataFromPb)
+	err = json.Unmarshal(body, &item)
+	if err != nil {
+		utils.FileLog.Info("GetEdbDataByPb Unmarshal Err:" + err.Error())
+		return
+	}
+	edbCode, _ = url.QueryUnescape(edbCode)
+	return
+}

+ 1 - 0
utils/constants.go

@@ -55,6 +55,7 @@ const (
 	DATA_SOURCE_LT                              //路透->25
 	DATA_SOURCE_COAL                            //煤炭网->26
 	DATA_SOURCE_PYTHON                          //python代码->27
+	DATA_SOURCE_PB_FINANCE                      //彭博财务数据->28
 )
 
 //基础数据初始化日期