|
@@ -0,0 +1,191 @@
|
|
|
+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:"结束日期"`
|
|
|
+}
|
|
|
+
|
|
|
+// 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"`
|
|
|
+ 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"`
|
|
|
+}
|
|
|
+
|
|
|
+// BridgeJiaYueIndexData 桥接服务-嘉悦指标数据
|
|
|
+type BridgeJiaYueIndexData struct {
|
|
|
+ Val float64 `json:"val"`
|
|
|
+ DataTime time.Time `json:"data_time"`
|
|
|
+ UpdateTime time.Time `json:"update_time"`
|
|
|
+}
|
|
|
+
|
|
|
+// 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, 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 //是否找到配置日期的实际数据的值
|
|
|
+ {
|
|
|
+ edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
|
|
|
+ if err != nil && err.Error() != utils.ErrNoRow() {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ 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, 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, 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, exist.EdbDataId, val); e != nil {
|
|
|
+ err = fmt.Errorf("modify edb data err: %s", e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 处理手工数据补充的配置
|
|
|
+ HandleConfigInsertEdbData(realDataMaxDate, edbDataInsertConfig, edbInfoId, source, 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
|
|
|
+}
|