package models import ( "fmt" "github.com/beego/beego/v2/client/orm" "hongze/hongze_edb_lib/utils" "strconv" "strings" "time" ) type BaseFromTradeShfeIndex struct { BaseFromTradeShfeIndexId int `orm:"column(base_from_trade_ine_index_id);pk"` Rank int DealShortName string DealName string DealCode string DealValue string DealChange int BuyShortName string BuyName string BuyCode string BuyValue string BuyChange int SoldShortName string SoldName string SoldCode string SoldValue string SoldChange int Frequency string ClassifyName string ClassifyType string CreateTime time.Time ModifyTime time.Time DataTime string } func GetBaseFromShfeDataAllByIndexCode(indexCode, suffix string) (list []*BaseFromTradeShfeIndex, err error) { o := orm.NewOrm() sql := `SELECT * FROM base_from_trade_ine_index WHERE %s_code=? ` sql = fmt.Sprintf(sql, suffix) _, err = o.Raw(sql, indexCode).QueryRows(&list) return } type BaseFromShfeDataSimple struct { Id int `orm:"column(base_from_trade_ine_index_id);pk"` DealCode string BuyCode string SoldCode string DataTime string DealValue string BuyValue string SoldValue string } func GetShfeDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromShfeDataSimple, err error) { sql := ` SELECT * FROM base_from_trade_ine_index WHERE 1=1 ` o := orm.NewOrm() if condition != "" { sql += condition } sql += ` ORDER BY data_time DESC ` _, err = o.Raw(sql, pars).QueryRows(&item) return } //新增上期能源指标数据 func AddEdbDataFromShfe(edbCode string) (err error) { var suffix string if strings.Contains(edbCode, "deal") { suffix = "deal" } else if strings.Contains(edbCode, "buy") { suffix = "buy" } else if strings.Contains(edbCode, "sold") { suffix = "sold" } o := orm.NewOrm() ineBaseDataAll, err := GetBaseFromShfeDataAllByIndexCode(edbCode, suffix) if err != nil && err.Error() != utils.ErrNoRow() { return } var isAdd bool addSql := ` INSERT INTO edb_data_ine(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values ` existMap := make(map[string]string) for _, sv := range ineBaseDataAll { eDate := sv.DataTime 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) if _, ok := existMap[eDate]; !ok { if suffix == "deal" { addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.DealValue) } else if suffix == "buy" { addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.BuyValue) } else { addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.SoldValue) } isAdd = true } if suffix == "deal" { existMap[eDate] = sv.DealValue } else if suffix == "buy" { existMap[eDate] = sv.BuyValue } else { existMap[eDate] = sv.SoldValue } } if isAdd { addSql = strings.TrimRight(addSql, ",") utils.FileLog.Info("addSql:" + addSql) _, err = o.Raw(addSql).Exec() if err != nil { return err } } return } //刷新上期能源指标数据 func RefreshEdbDataFromShfe(edbInfoId int, edbCode, startDate string) (err error) { source := utils.DATA_SOURCE_SHFE o := orm.NewOrm() if err != nil { return } var suffix string if strings.Contains(edbCode, "deal") { suffix = "deal" } else if strings.Contains(edbCode, "buy") { suffix = "buy" } else if strings.Contains(edbCode, "sold") { suffix = "sold" } edbInfoIdStr := strconv.Itoa(edbInfoId) //计算数据 var condition string var pars []interface{} if edbCode != "" { if suffix == "deal" { condition += " AND deal_code=? " } else if suffix == "buy" { condition += " AND buy_code=? " } else { condition += " AND sold_code=? " } pars = append(pars, edbCode) } if startDate != "" { condition += " AND data_time>=? " pars = append(pars, startDate) } glDataList, err := GetShfeDataByTradeCode(condition, pars) //获取指标所有数据 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_ine(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values ` var isAdd bool for _, v := range glDataList { var value string if suffix == "deal" { value = v.DealValue } else if suffix == "buy" { value = v.BuyValue } else { value = v.SoldValue } item := v itemValue := value if _, ok := existMap[v.DataTime]; !ok { eDate := item.DataTime 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 findItem, ok := existMap[eDate]; !ok { addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, saveValue) isAdd = true } 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 { return err } } return }