123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- package models
- import (
- "eta/eta_index_lib/utils"
- "fmt"
- "github.com/beego/beego/v2/client/orm"
- "strconv"
- "strings"
- "time"
- )
- // BridgeJiaYueIndexDataParams 桥接服务-获取嘉悦指标数据入参
- type BridgeJiaYueIndexDataParams struct {
- IndexCode string `json:"index_code" form:"index_code" description:"指标编码"`
- SourceExtend string `json:"source_extend" form:"source_extend" description:"来源"`
- StartDate string `json:"start_date" form:"start_date" description:"开始日期"`
- EndDate string `json:"end_date" form:"end_date" description:"结束日期"`
- IndexCodeRequired int `json:"index_code_required" form:"index_code_required" description:"指标编码是否必填: 0-否; 1-是"`
- }
- // BridgeJiaYueResultIndexData 桥接服务-获取嘉悦指标数据响应体
- type BridgeJiaYueResultIndexData struct {
- Code int `json:"code" description:"状态码"`
- Msg string `json:"msg" description:"提示信息"`
- Data BridgeJiaYueIndexAndData `json:"data" description:"返回数据"`
- }
- // BridgeJiaYueIndexAndData 桥接服务-嘉悦指标和数据
- type BridgeJiaYueIndexAndData struct {
- Id int `description:"指标自增ID" json:"id"`
- IndexCode string `description:"指标编码" json:"index_code"`
- IndexName string `description:"指标名称" json:"index_name"`
- SourceType string `description:"指标来源" json:"source_type"`
- Unit string `description:"单位" json:"unit"`
- Frequency string `description:"频度" json:"frequency"`
- LastDate time.Time `description:"指标最新时间" json:"last_date"`
- LastUpdateTime time.Time `description:"最新更新时间" json:"last_update_time"`
- Status int `description:"指标状态" json:"status"`
- IndexData []BridgeJiaYueIndexData `description:"指标数据" json:"index_data"`
- MenuData BridgeJiaYueIndexMenuData `description:"指标目录信息" json:"menu_data"`
- }
- // BridgeJiaYueIndexData 桥接服务-嘉悦指标数据
- type BridgeJiaYueIndexData struct {
- Val float64 `json:"val"`
- DataTime time.Time `json:"data_time"`
- UpdateTime time.Time `json:"update_time"`
- }
- // BridgeJiaYueIndexMenuData 桥接服务-嘉悦指标目录信息
- type BridgeJiaYueIndexMenuData struct {
- Id int `description:"目录ID" json:"id"`
- Type string `description:"目录类型" json:"type"`
- Code string `description:"目录编码" json:"code"`
- Name string `description:"目录名称" json:"name"`
- Icon string `description:"目录图标" json:"icon"`
- Sort int `description:"排序" json:"sort"`
- ParentId int `description:"父级目录ID" json:"parent_id"`
- ParentName string `description:"父级目录名称" json:"parent_name"`
- Path string `description:"目录全路径" json:"path"`
- }
- // BridgeJiaYueIndexMenuWithLevel 桥接服务-嘉悦指标目录带层级
- type BridgeJiaYueIndexMenuWithLevel struct {
- Level int `description:"层级"`
- Menu BridgeJiaYueIndexMenuData
- }
- // BridgeJiaYueResultNewIndexData 桥接服务-获取嘉悦增量指标数据响应体
- type BridgeJiaYueResultNewIndexData struct {
- Code int `json:"code" description:"状态码"`
- Msg string `json:"msg" description:"提示信息"`
- Data []BridgeJiaYueIndexAndData `json:"data" description:"返回数据"`
- }
- // BridgeJiaYueResultMenuListData 桥接服务-获取嘉悦指标目录数据响应体
- type BridgeJiaYueResultMenuListData struct {
- Code int `json:"code" description:"状态码"`
- Msg string `json:"msg" description:"提示信息"`
- Data []BridgeJiaYueIndexMenuData `json:"data" description:"返回数据"`
- }
- // AddEdbDataFromJiaYue 新增嘉悦指标数据
- func AddEdbDataFromJiaYue(tableName, edbCode string, dataList []BridgeJiaYueIndexData) (err error) {
- if tableName == "" {
- err = fmt.Errorf("数据表名为空")
- return
- }
- if edbCode == "" {
- err = fmt.Errorf("指标编码为空")
- return
- }
- if len(dataList) == 0 {
- return
- }
- sql := fmt.Sprintf(`INSERT INTO %s(edb_info_id, edb_code, data_time, value, create_time, modify_time, data_timestamp) VALUES `, tableName)
- for _, v := range dataList {
- val := utils.SubFloatToString(v.Val, 20)
- stamp := fmt.Sprint(v.DataTime.UnixMilli())
- sql += GetAddSql("0", edbCode, v.DataTime.Format(utils.FormatDate), stamp, val)
- }
- sql = strings.TrimRight(sql, ",")
- // 新增入库
- o := orm.NewOrm()
- _, e := o.Raw(sql).Exec()
- if e != nil {
- err = fmt.Errorf("insert data err: %s", e.Error())
- }
- return
- }
- // RefreshEdbDataFromJiaYue 刷新嘉悦指标数据
- func RefreshEdbDataFromJiaYue(source, subSource, edbInfoId int, tableName, edbCode, startDate string, dataList []BridgeJiaYueIndexData) (err error) {
- if source <= 0 {
- err = fmt.Errorf("指标来源有误")
- return
- }
- if edbInfoId <= 0 {
- err = fmt.Errorf("指标ID有误")
- return
- }
- if tableName == "" {
- err = fmt.Errorf("数据表名为空")
- return
- }
- // 真实数据的最大日期, 插入规则配置的日期
- var realDataMaxDate, edbDataInsertConfigDate time.Time
- var edbDataInsertConfig *EdbDataInsertConfig
- var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
- {
- conf, e := GetEdbDataInsertConfigByEdbId(edbInfoId)
- if e != nil && e.Error() != utils.ErrNoRow() {
- return
- }
- edbDataInsertConfig = conf
- if edbDataInsertConfig != nil {
- edbDataInsertConfigDate = edbDataInsertConfig.Date
- }
- }
- // 获取已有数据
- cond := ` AND edb_info_id = ?`
- pars := make([]interface{}, 0)
- pars = append(pars, edbInfoId)
- var startDateTime time.Time
- if startDate != "" {
- cond += ` AND data_time >= ?`
- pars = append(pars, startDate)
- startDateTime, _ = time.ParseInLocation(utils.FormatDate, startDate, time.Local)
- }
- existList, e := GetEdbDataByCondition(source, subSource, cond, pars)
- if e != nil {
- err = fmt.Errorf("获取指标已有数据失败, Err: %s", e.Error())
- return
- }
- existMap := make(map[string]*EdbInfoSearchData)
- for _, v := range existList {
- existMap[v.DataTime] = v
- }
- // 比对数据
- hasNew := false
- strEdbInfoId := strconv.Itoa(edbInfoId)
- addExists := make(map[string]bool)
- sqlInsert := fmt.Sprintf(`INSERT INTO %s(edb_info_id, edb_code, data_time, value, create_time, modify_time, data_timestamp) VALUES `, tableName)
- for _, v := range dataList {
- val := utils.SubFloatToString(v.Val, 30)
- stamp := fmt.Sprint(v.DataTime.UnixMilli())
- dataTime := v.DataTime.Format(utils.FormatDate)
- // 如果传入的开始时间是空的, 且当前数据日期早于传入的开始日期, 那么需要判断下当前日期的数据是否存在
- if !startDateTime.IsZero() && v.DataTime.Before(startDateTime) {
- t, e := GetEdbDataByDate(source, subSource, edbCode, dataTime)
- if e == nil && t != nil {
- existMap[t.DataTime] = t
- }
- }
- // 下面代码主要目的是处理掉手动插入的数据判断
- {
- if realDataMaxDate.IsZero() || v.DataTime.After(realDataMaxDate) {
- realDataMaxDate = v.DataTime
- }
- if edbDataInsertConfigDate.IsZero() || v.DataTime.Equal(edbDataInsertConfigDate) {
- isFindConfigDateRealData = true
- }
- }
- // 新增数据
- exist, ok := existMap[dataTime]
- if !ok {
- // 不在历史数据中且与新增中的数据不重复
- if _, o := addExists[dataTime]; !o {
- hasNew = true
- sqlInsert += GetAddSql(strEdbInfoId, edbCode, dataTime, stamp, val)
- addExists[dataTime] = true
- }
- continue
- }
- // 更新数据
- if exist != nil && utils.SubFloatToString(exist.Value, 30) != val {
- if e = ModifyEdbDataById(source, subSource, exist.EdbDataId, val); e != nil {
- err = fmt.Errorf("modify edb data err: %s", e.Error())
- return
- }
- }
- }
- // 处理手工数据补充的配置
- HandleConfigInsertEdbData(realDataMaxDate, edbDataInsertConfig, edbInfoId, source, subSource, existMap, isFindConfigDateRealData)
- // 执行新增
- if !hasNew {
- return
- }
- o := orm.NewOrm()
- sqlInsert = strings.TrimRight(sqlInsert, ",")
- _, e = o.Raw(sqlInsert).Exec()
- if e != nil {
- err = fmt.Errorf("insert edb data err: %s", e.Error())
- return
- }
- return
- }
|