package models import ( "fmt" "github.com/beego/beego/v2/client/orm" "hongze/hongze_edb_lib/utils" "strconv" "strings" "time" ) type BaseFromTradeEicIndex struct { BaseFromEicIndexId int `orm:"column(base_from_eic_index_id);pk"` Country string Type string EicCode string ShortName string Name string Status string GasDayStartedOn string GasInStorage string GasInStorageCode string Full string FullCode string Trend string TrendCode string Injection string InjectionCode string Withdrawal string WithdrawalCode string WorkingGasVolume string WorkingGasVolumeCode string InjectionCapacity string InjectionCapacityCode string WithdrawalCapacity string WithdrawalCapacityCode string Info string CreateTime time.Time ModifyTime time.Time } func GetBaseFromEicDataAllByIndexCode(indexCode, suffix string) (list []*BaseFromTradeEicIndex, err error) { o := orm.NewOrm() var name string if suffix == "" { name = "eic_code" } else if suffix == "GS" { name = "gas_in_storage_code" } else if suffix == "F" { name = "full_code" } else if suffix == "T" { name = "trend_code" } else if suffix == "In" { name = "injection_code" } else if suffix == "Out" { name = "withdrawal_code" } else if suffix == "WGV" { name = "working_gas_volume_code" } else if suffix == "IC" { name = "injection_capacity_code" } else if suffix == "WC" { name = "withdrawal_capacity_code" } sql := `SELECT * FROM base_from_trade_eic_index WHERE %s=? ` sql = fmt.Sprintf(sql, name) _, err = o.Raw(sql, indexCode).QueryRows(&list) return } func GetGieDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromTradeEicIndex, err error) { sql := ` SELECT * FROM base_from_trade_eic_index WHERE 1=1 ` o := orm.NewOrm() if condition != "" { sql += condition } sql += ` ORDER BY gas_day_started_on DESC ` fmt.Println(sql, pars) _, err = o.Raw(sql, pars).QueryRows(&item) return } //新增上期能源指标数据 func AddEdbDataFromGie(edbCode string) (err error) { var suffix string l := len(edbCode) if strings.Contains(edbCode[l-2:], "GS") { suffix = "GS" } else if strings.Contains(edbCode[l-1:], "F") { suffix = "F" } else if strings.Contains(edbCode[l-1:], "T") { suffix = "T" } else if strings.Contains(edbCode[l-2:], "In") { suffix = "In" } else if strings.Contains(edbCode[l-3:], "Out") { suffix = "Out" } else if strings.Contains(edbCode[l-3:], "WGV") { suffix = "WGV" } else if strings.Contains(edbCode[l-2:], "IC") { suffix = "IC" } else if strings.Contains(edbCode[l-2:], "WC") { suffix = "WC" } else { suffix = "" } o := orm.NewOrm() eicBaseDataAll, err := GetBaseFromEicDataAllByIndexCode(edbCode, suffix) if err != nil && err.Error() != utils.ErrNoRow() { fmt.Println("GetBaseFromEicDataAllByIndexCode err:", err) return } var isAdd bool addSql := ` INSERT INTO edb_data_gie(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values ` existMap := make(map[string]string) for _, sv := range eicBaseDataAll { eDate := sv.GasDayStartedOn dataTime, err := time.Parse(utils.FormatDate, eDate) if err != nil { fmt.Println("time.Parse Err:" + eDate) return err } timestamp := dataTime.UnixNano() / 1e6 timeStr := fmt.Sprintf("%d", timestamp) //var name string if _, ok := existMap[eDate]; !ok { if suffix == "GS" { //name = "gas_in_storage" addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.GasInStorage) existMap[eDate] = sv.GasInStorage } else if suffix == "F" { //name = "full" addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.Full) existMap[eDate] = sv.Full } else if suffix == "T" { //name = "trend" addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.Trend) existMap[eDate] = sv.Trend } else if suffix == "In" { //name = "injection" addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.Injection) existMap[eDate] = sv.Injection } else if suffix == "Out" { //name = "withdrawal" addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.Withdrawal) existMap[eDate] = sv.Withdrawal } else if suffix == "WGV" { //name = "working_gas_volume" addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.WorkingGasVolume) existMap[eDate] = sv.WorkingGasVolume } else if suffix == "IC" { //name = "injection_capacity" addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.InjectionCapacity) existMap[eDate] = sv.InjectionCapacity } else if suffix == "WC" { //name = "withdrawal_capacity" addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.WithdrawalCapacity) existMap[eDate] = sv.WithdrawalCapacity } isAdd = true } } if isAdd { addSql = strings.TrimRight(addSql, ",") utils.FileLog.Info("addSql:" + addSql) _, err = o.Raw(addSql).Exec() if err != nil { fmt.Println("addSql err:", err) return err } } return } //刷新欧洲天然气指标数据 func RefreshEdbDataFromGie(edbInfoId int, edbCode, startDate string) (err error) { source := utils.DATA_SOURCE_GIE o := orm.NewOrm() if err != nil { return } var suffix string l := len(edbCode) if strings.Contains(edbCode[l-2:], "GS") { suffix = "GS" } else if strings.Contains(edbCode[l-1:], "F") { suffix = "F" } else if strings.Contains(edbCode[l-1:], "T") { suffix = "T" } else if strings.Contains(edbCode[l-2:], "In") { suffix = "In" } else if strings.Contains(edbCode[l-3:], "Out") { suffix = "Out" } else if strings.Contains(edbCode[l-3:], "WGV") { suffix = "WGV" } else if strings.Contains(edbCode[l-2:], "IC") { suffix = "IC" } else if strings.Contains(edbCode[l-2:], "WC") { suffix = "WC" } else { suffix = "" } edbInfoIdStr := strconv.Itoa(edbInfoId) //计算数据 var condition string var pars []interface{} if edbCode != "" { condition += " AND eic_code=? " pars = append(pars, edbCode[:l-len(suffix)]) } if startDate != "" { condition += " AND gas_day_started_on>=? " pars = append(pars, startDate) } eicDataList, err := GetGieDataByTradeCode(condition, pars) fmt.Println("all eicDataList", len(eicDataList)) //获取指标所有数据 var existCondition string var existPars []interface{} existCondition += " AND edb_info_id=? " existPars = append(existPars, edbInfoId) if startDate != "" { existCondition += " AND data_time>=? " existPars = append(existPars, startDate) } existList, err := GetEdbDataByCondition(source, existCondition, existPars) if err != nil { return err } existMap := make(map[string]*EdbInfoSearchData) for _, v := range existList { existMap[v.DataTime] = v } addSql := ` INSERT INTO edb_data_gie(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values ` var isAdd bool dataMap := make(map[string]interface{}) for _, v := range eicDataList { var value string if suffix == "GS" { value = v.GasInStorage } else if suffix == "F" { value = v.Full } else if suffix == "T" { value = v.Trend } else if suffix == "In" { value = v.Injection } else if suffix == "Out" { value = v.Withdrawal } else if suffix == "WGV" { value = v.WorkingGasVolume } else if suffix == "IC" { value = v.InjectionCapacity } else if suffix == "WC" { value = v.WithdrawalCapacity } item := v itemValue := value if findItem, ok := existMap[v.GasDayStartedOn]; !ok { eDate := item.GasDayStartedOn sValue := itemValue if sValue != "" { dataTime, err := time.Parse(utils.FormatDate, eDate) if err != nil { return err } timestamp := dataTime.UnixNano() / 1e6 timeStr := fmt.Sprintf("%d", timestamp) saveValue := sValue if _, ok := dataMap[eDate]; !ok { addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, saveValue) isAdd = true } } } else { if findItem != nil && utils.SubFloatToString(findItem.Value, 30) != itemValue { err = ModifyEdbDataById(source, findItem.EdbDataId, itemValue) if err != nil { return err } } } dataMap[v.GasDayStartedOn] = v.GasDayStartedOn } if isAdd { addSql = strings.TrimRight(addSql, ",") _, err = o.Raw(addSql).Exec() if err != nil { return err } } return }