|
@@ -0,0 +1,3676 @@
|
|
|
+package chart
|
|
|
+
|
|
|
+import (
|
|
|
+ "crypto/md5"
|
|
|
+ "encoding/hex"
|
|
|
+ "encoding/json"
|
|
|
+ "errors"
|
|
|
+ "fmt"
|
|
|
+ "github.com/shopspring/decimal"
|
|
|
+ "github.com/yidane/formula"
|
|
|
+ "hongze/hongze_yb/global"
|
|
|
+ edbDataModel "hongze/hongze_yb/models/tables/edb_data"
|
|
|
+ edbInfoModel "hongze/hongze_yb/models/tables/edb_info"
|
|
|
+ "hongze/hongze_yb/utils"
|
|
|
+ "io/ioutil"
|
|
|
+ "net/http"
|
|
|
+ "net/url"
|
|
|
+ "reflect"
|
|
|
+ "sort"
|
|
|
+ "strconv"
|
|
|
+ "strings"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+type EdbDataFromThs struct {
|
|
|
+ DataVol int64 `json:"dataVol"`
|
|
|
+ Errmsg string `json:"errmsg"`
|
|
|
+ Errorcode int64 `json:"errorcode"`
|
|
|
+ Perf interface{} `json:"perf"`
|
|
|
+ Tables []struct {
|
|
|
+ ID []string `json:"id"`
|
|
|
+ Time []string `json:"time"`
|
|
|
+ Value []float64 `json:"value"`
|
|
|
+ } `json:"tables"`
|
|
|
+}
|
|
|
+
|
|
|
+func RefreshEdbDataByThs(edbInfoId int, edbCode, startDate, endDate string) (err error) {
|
|
|
+ HzServerDataUrl := ""
|
|
|
+ if global.CONFIG.Serve.RunMode == "release" {
|
|
|
+ HzServerDataUrl = "http://172.19.173.231:7000/"
|
|
|
+ } else {
|
|
|
+ HzServerDataUrl = "http://139.196.136.213:7000/"
|
|
|
+ }
|
|
|
+
|
|
|
+ thsUrl := HzServerDataUrl + `edbInfo/ths?EdbCode=%s&StartDate=%s&EndDate=%s`
|
|
|
+ thsUrl = fmt.Sprintf(thsUrl, edbCode, startDate, endDate)
|
|
|
+ //utils.FileLog.Info("thsUrl:%s", thsUrl)
|
|
|
+
|
|
|
+ reqRes, err := http.Get(thsUrl)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer reqRes.Body.Close()
|
|
|
+ body, err := ioutil.ReadAll(reqRes.Body)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ fmt.Println("GetEdbDataByThs body:")
|
|
|
+ fmt.Println(string(body))
|
|
|
+
|
|
|
+ item := new(EdbDataFromThs)
|
|
|
+ err = json.Unmarshal(body, &item)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if item.Errorcode != 0 {
|
|
|
+ err = errors.New(string(body))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if len(item.Tables) > 0 {
|
|
|
+ table := item.Tables[0]
|
|
|
+ dataLen := len(table.Time)
|
|
|
+ addSql := ` INSERT INTO edb_data_ths(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
|
|
|
+ nowStr := time.Now().Format(utils.FormatDateTime)
|
|
|
+ var isAdd bool
|
|
|
+ for i := 0; i < dataLen; i++ {
|
|
|
+ eDate := table.Time[i]
|
|
|
+ sValue := table.Value[i]
|
|
|
+
|
|
|
+ count, err := edbDataModel.GetEdbDataThsByCodeAndDate(edbCode, eDate)
|
|
|
+ if err != nil && err != utils.ErrNoRow {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if count <= 0 {
|
|
|
+ dataTime, err := time.Parse(utils.FormatDate, eDate)
|
|
|
+ if err != nil {
|
|
|
+
|
|
|
+ }
|
|
|
+ timestamp := dataTime.UnixNano() / 1e6
|
|
|
+ timeStr := fmt.Sprintf("%d", timestamp)
|
|
|
+
|
|
|
+ addSql += "("
|
|
|
+ addSql += strconv.Itoa(edbInfoId) + "," + "'" + edbCode + "'" + "," + "'" + eDate + "'" + "," + utils.SubFloatToString(sValue, 30) + "," + "'" + nowStr + "'" +
|
|
|
+ "," + "'" + nowStr + "'"
|
|
|
+ addSql += "," + "'" + timeStr + "'"
|
|
|
+ addSql += "),"
|
|
|
+ isAdd = true
|
|
|
+ } else {
|
|
|
+ err = edbDataModel.ModifyEdbDataThs(int64(edbInfoId), eDate, sValue)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if isAdd {
|
|
|
+ addSql = strings.TrimRight(addSql, ",")
|
|
|
+ err = edbDataModel.AddEdbDataThsBySql(addSql)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("AddEdbDataThs Err", err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+type EdbDataFromWind struct {
|
|
|
+ Close map[string]float64 `json:"CLOSE"`
|
|
|
+ Dt map[string]int64 `json:"DT"`
|
|
|
+ ErrMsg string
|
|
|
+}
|
|
|
+
|
|
|
+func RefreshEdbDataByWind(edbInfoId int, edbCode, startDate, endDate string) (err error) {
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("GetEdbDataByWind Err:" + err.Error())
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ fmt.Println("startDate,endDate:",startDate,endDate)
|
|
|
+
|
|
|
+ thsUrl := utils.Hz_Data_Url + `edbInfo/wind?EdbCode=%s&StartDate=%s&EndDate=%s`
|
|
|
+ thsUrl = fmt.Sprintf(thsUrl, edbCode, startDate, endDate)
|
|
|
+ //utils.FileLog.Info("thsUrl:%s", thsUrl)
|
|
|
+
|
|
|
+ reqRes, err := http.Get(thsUrl)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer reqRes.Body.Close()
|
|
|
+ body, err := ioutil.ReadAll(reqRes.Body)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ fmt.Println("GetEdbDataByThs body:")
|
|
|
+ fmt.Println(string(body))
|
|
|
+ //utils.FileLog.Info("wind result:"+string(body))
|
|
|
+
|
|
|
+ item := new(EdbDataFromWind)
|
|
|
+ err = json.Unmarshal(body, &item)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ addSql := ` INSERT INTO edb_data_wind(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
|
|
|
+ nowStr := time.Now().Format(utils.FormatDateTime)
|
|
|
+ var isAdd bool
|
|
|
+ for k, v := range item.Dt {
|
|
|
+ timeStr := fmt.Sprintf("%d", v)
|
|
|
+
|
|
|
+ v = v / 1000
|
|
|
+ t := time.Unix(v, 0)
|
|
|
+ dateTime := t.Format(utils.FormatDate)
|
|
|
+ val := item.Close[k]
|
|
|
+
|
|
|
+ count, err := edbDataModel.GetEdbDataWindByCodeAndDate(edbCode, dateTime)
|
|
|
+ if err != nil && err != utils.ErrNoRow {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if count <= 0 {
|
|
|
+ isAdd = true
|
|
|
+ fmt.Println(dateTime)
|
|
|
+ addSql += "("
|
|
|
+ addSql += strconv.Itoa(edbInfoId) + "," + "'" + edbCode + "'" + "," + "'" + dateTime + "'" + "," + utils.SubFloatToString(val, 30) + "," + "'" + nowStr + "'" +
|
|
|
+ "," + "'" + nowStr + "'"
|
|
|
+ addSql += "," + "'" + timeStr + "'"
|
|
|
+ addSql += "),"
|
|
|
+ } else {
|
|
|
+ err = edbDataModel.ModifyEdbDataWind(int64(edbInfoId), dateTime, val)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if isAdd {
|
|
|
+ addSql = strings.TrimRight(addSql, ",")
|
|
|
+ err = edbDataModel.AddEdbDataWindBySql(addSql)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("AddEdbDataWind Err", err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+type EdbDataFromPb struct {
|
|
|
+ Date map[string]int64 `json:"date"`
|
|
|
+ Ticker map[string]string `json:"ticker"`
|
|
|
+ Field map[string]string `json:"field"`
|
|
|
+ Value map[string]float64 `json:"value"`
|
|
|
+}
|
|
|
+
|
|
|
+func RefreshEdbDataByPb(edbInfoId int, edbCode, startDate, endDate string) (err error) {
|
|
|
+ refreshEdbCode := edbCode
|
|
|
+ edbCode = url.QueryEscape(edbCode)
|
|
|
+ bpUrl := utils.Hz_Data_PB_Url + `edbInfo/pb?EdbCode=%s&StartDate=%s&EndDate=%s`
|
|
|
+ bpUrl = fmt.Sprintf(bpUrl, edbCode, startDate, endDate)
|
|
|
+ //utils.FileLog.Info("bpUrl+" + bpUrl)
|
|
|
+
|
|
|
+ reqRes, err := http.Get(bpUrl)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer reqRes.Body.Close()
|
|
|
+ body, err := ioutil.ReadAll(reqRes.Body)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ fmt.Println("RefreshEdbDataByPb body:")
|
|
|
+ fmt.Println(string(body))
|
|
|
+ //utils.FileLog.Info("RefreshEdbDataByPb:" + string(body))
|
|
|
+
|
|
|
+ item := new(EdbDataFromPb)
|
|
|
+ err = json.Unmarshal(body, &item)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if len(item.Date) > 0 {
|
|
|
+ dateMap := item.Date
|
|
|
+ pbList := make([]*edbDataModel.EdbDataPb, 0)
|
|
|
+ for k, v := range dateMap {
|
|
|
+ timestamp := 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]
|
|
|
+ if field == "PX_LAST" {
|
|
|
+ //判断数据是否已经存在
|
|
|
+ count, err := edbDataModel.GetEdbDataPbByCodeAndDate(refreshEdbCode, dateTime)
|
|
|
+ if err != nil && err != utils.ErrNoRow {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ fmt.Println("field:", field)
|
|
|
+ if count <= 0 {
|
|
|
+ item := new(edbDataModel.EdbDataPb)
|
|
|
+ item.EdbCode, _ = url.QueryUnescape(edbCode)
|
|
|
+ item.EdbInfoId = edbInfoId
|
|
|
+ item.CreateTime = time.Now()
|
|
|
+ item.ModifyTime = time.Now()
|
|
|
+ item.DataTime = dateTime
|
|
|
+ item.Value = val
|
|
|
+ item.Status = 1
|
|
|
+ item.Field = field
|
|
|
+ item.Ticker = ticker
|
|
|
+ item.DataTimestamp = timestamp
|
|
|
+ pbList = append(pbList, item)
|
|
|
+ } else {
|
|
|
+ err = edbDataModel.ModifyEdbDataPb(edbInfoId, dateTime, val)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if len(pbList) > 0 {
|
|
|
+ err = edbDataModel.AddEdbDataPb(pbList)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("AddEdbDataPb Err", err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+//刷新手工指标数据
|
|
|
+func RefreshAllEdbDataByManual(edbInfoId, source int, edbCode string) (err error) {
|
|
|
+ tx := global.MYSQL["data"].Begin()
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ } else {
|
|
|
+ tx.Commit()
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ edbInfoIdStr := strconv.Itoa(edbInfoId)
|
|
|
+ //计算数据
|
|
|
+ var condition string
|
|
|
+ var pars []interface{}
|
|
|
+
|
|
|
+ if edbCode != "" {
|
|
|
+ condition += " AND TRADE_CODE=? "
|
|
|
+ pars = append(pars, edbCode)
|
|
|
+ }
|
|
|
+
|
|
|
+ manualDataList, err := edbDataModel.GetEdbdataManualByTradeCode(condition, pars)
|
|
|
+ //获取指标所有数据
|
|
|
+ existDataList := make([]*edbDataModel.EdbDataBase, 0)
|
|
|
+ dataTableName := edbDataModel.GetEdbDataTableName(source)
|
|
|
+ sql := `SELECT * FROM %s WHERE edb_info_id=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = global.MYSQL["data"].Raw(sql, edbInfoId).Scan(&existDataList).Error
|
|
|
+ //_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ existDataMap := make(map[string]*edbDataModel.EdbDataBase)
|
|
|
+ for _, v := range existDataList {
|
|
|
+ existDataMap[v.DataTime] = v
|
|
|
+ }
|
|
|
+
|
|
|
+ addSql := ` INSERT INTO edb_data_manual(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
|
|
|
+ var isAdd bool
|
|
|
+ manualMap := make(map[string]*edbDataModel.ManualEdbdata)
|
|
|
+ for _, v := range manualDataList {
|
|
|
+ item := v
|
|
|
+ if findItem, ok := existDataMap[v.Dt]; !ok {
|
|
|
+ eDate := item.Dt
|
|
|
+ sValue := item.Close
|
|
|
+
|
|
|
+ dataTime, err := time.Parse(utils.FormatDate, eDate)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ timestamp := dataTime.UnixNano() / 1e6
|
|
|
+ timeStr := fmt.Sprintf("%d", timestamp)
|
|
|
+
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
|
|
|
+ isAdd = true
|
|
|
+ } else {
|
|
|
+ if findItem.Value != item.Close {
|
|
|
+ sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = tx.Exec(sql, item.Close, edbInfoId, item.Dt).Error
|
|
|
+ //err = global.MYSQL["data"].Exec(sql, item.Close, edbInfoId, item.Dt).Error
|
|
|
+ //_, err = o.Raw(sql, item.Close, edbInfoId, item.Dt).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ manualMap[v.Dt] = v
|
|
|
+ }
|
|
|
+ for _, v := range existDataList {
|
|
|
+ if _, ok := manualMap[v.DataTime]; !ok {
|
|
|
+ go func() {
|
|
|
+ sql := ` DELETE FROM %s WHERE edb_data_id=? `
|
|
|
+ tableName := edbDataModel.GetEdbDataTableName(utils.DATA_SOURCE_MANUAL)
|
|
|
+ sql = fmt.Sprintf(sql, tableName)
|
|
|
+ err = tx.Exec(sql, v.EdbInfoId).Error
|
|
|
+ //err = global.MYSQL["data"].Exec(sql, edbDataId).Error
|
|
|
+ }()
|
|
|
+ //go DeleteEdbDataByIdAndSource(v.EdbDataId, utils.DATA_SOURCE_MANUAL)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if isAdd {
|
|
|
+ addSql = strings.TrimRight(addSql, ",")
|
|
|
+ err = tx.Exec(addSql).Error
|
|
|
+ //_, err = o.Raw(addSql).Exec()
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("RefreshAllEdbDataByManual add Err", err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func DeleteEdbDataByIdAndSource(edbDataId, source int) (err error) {
|
|
|
+ sql := ` DELETE FROM %s WHERE edb_data_id=? `
|
|
|
+ tableName := edbDataModel.GetEdbDataTableName(source)
|
|
|
+ sql = fmt.Sprintf(sql, tableName)
|
|
|
+ err = global.MYSQL["data"].Exec(sql, edbDataId).Error
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func GetAddSql(edbInfoId, edbCode, dataTime, timestampStr string, value string) (addSql string) {
|
|
|
+ nowStr := time.Now().Format(utils.FormatDateTime)
|
|
|
+ addSql += "("
|
|
|
+ addSql += edbInfoId + "," + "'" + edbCode + "'" + "," + "'" + dataTime + "'" + "," + value + "," + "'" + nowStr + "'" +
|
|
|
+ "," + "'" + nowStr + "'"
|
|
|
+ addSql += "," + "'" + timestampStr + "'"
|
|
|
+ addSql += "),"
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+//刷新隆众指标数据
|
|
|
+func RefreshEdbDataByLz(edbInfoId int, edbCode, startDate, endDate string) (err error) {
|
|
|
+
|
|
|
+ tx := global.MYSQL["data"].Begin()
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ } else {
|
|
|
+ tx.Commit()
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ edbInfoIdStr := strconv.Itoa(edbInfoId)
|
|
|
+ //计算数据
|
|
|
+ var condition string
|
|
|
+ var pars []interface{}
|
|
|
+
|
|
|
+ if edbCode != "" {
|
|
|
+ condition += " AND b.lz_code=? "
|
|
|
+ pars = append(pars, edbCode)
|
|
|
+ }
|
|
|
+
|
|
|
+ if startDate != "" {
|
|
|
+ condition += " AND a.data_time>=? "
|
|
|
+ pars = append(pars, startDate)
|
|
|
+ }
|
|
|
+
|
|
|
+ if endDate != "" {
|
|
|
+ condition += " AND a.data_time<=? "
|
|
|
+ pars = append(pars, endDate)
|
|
|
+ }
|
|
|
+
|
|
|
+ lzDataList, err := edbDataModel.GetLzSurveyDataByTradeCode(condition, pars)
|
|
|
+
|
|
|
+ addSql := ` INSERT INTO edb_data_lz(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
|
|
|
+ var isAdd bool
|
|
|
+ for _, v := range lzDataList {
|
|
|
+ item := v
|
|
|
+ count, err := edbDataModel.GetEdbDataLzByCodeAndDate(edbCode, v.DataTime)
|
|
|
+ if err != nil && err != utils.ErrNoRow {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if count <= 0 {
|
|
|
+ nowStr := time.Now().Format(utils.FormatDateTime)
|
|
|
+ eDate := item.DataTime
|
|
|
+ sValue := item.InputValue
|
|
|
+ dataTime, err := time.Parse(utils.FormatDate, eDate)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ timestamp := dataTime.UnixNano() / 1e6
|
|
|
+ timeStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ addSql += "("
|
|
|
+ addSql += edbInfoIdStr + "," + "'" + edbCode + "'" + "," + "'" + eDate + "'" + "," + sValue + "," + "'" + nowStr + "'" +
|
|
|
+ "," + "'" + nowStr + "'" + "," + "'" + timeStr + "'"
|
|
|
+ addSql += "),"
|
|
|
+ isAdd = true
|
|
|
+ } else {
|
|
|
+ //edbInfoId int64, dataTime, value string
|
|
|
+ //o := orm.NewOrm()
|
|
|
+ //o.Using("data")
|
|
|
+ sql := ` UPDATE edb_data_lz SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ err = tx.Exec(sql, v.InputValue, int64(edbInfoId), v.DataTime).Error
|
|
|
+ //_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
|
|
|
+
|
|
|
+ //err = ModifyEdbDataLz(int64(edbInfoId), v.DataTime, v.InputValue)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if isAdd {
|
|
|
+ addSql = strings.TrimRight(addSql, ",")
|
|
|
+ err = tx.Exec(addSql).Error
|
|
|
+ //_, err = o.Raw(addSql).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+//全部刷新有色数据
|
|
|
+func RefreshAllEdbDataByYs(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
|
|
|
+
|
|
|
+ tx := global.MYSQL["data"].Begin()
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ } else {
|
|
|
+ tx.Commit()
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ edbInfoIdStr := strconv.Itoa(edbInfoId)
|
|
|
+ //获取数据
|
|
|
+ err = SyncSmmIndexDataBase(edbCode, startDate, endDate)
|
|
|
+ if err != nil {
|
|
|
+ err = errors.New("SyncSmmIndexDataBase Err:" + err.Error())
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ //获取已存在指标所有数据
|
|
|
+ existDataList := make([]*edbDataModel.EdbDataBase, 0)
|
|
|
+ dataTableName := edbDataModel.GetEdbDataTableName(source)
|
|
|
+ sql := `SELECT * FROM %s WHERE edb_info_id=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+
|
|
|
+ err = global.MYSQL["data"].Raw(sql, edbInfoId).Scan(&existDataList).Error
|
|
|
+ //_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ existDataMap := make(map[string]string)
|
|
|
+ for _, v := range existDataList {
|
|
|
+ existDataMap[v.DataTime] = v.Value
|
|
|
+ }
|
|
|
+
|
|
|
+ smmDateList := make([]*edbDataModel.BaseFromSmmDataSimple, 0)
|
|
|
+ smmSql := ` SELECT * FROM base_from_smm_data WHERE index_code=? AND data_time>=? `
|
|
|
+ err = global.MYSQL["data"].Raw(smmSql, edbCode, startDate).Scan(&existDataList).Error
|
|
|
+ //_, err = o.Raw(smmSql, edbCode, startDate).QueryRows(&smmDateList)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ addSql := ` INSERT INTO edb_data_ys(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
|
|
|
+ var isAdd bool
|
|
|
+ for _, sv := range smmDateList {
|
|
|
+ if existVal, ok := existDataMap[sv.DataTime]; !ok {
|
|
|
+ dataTime, err := time.Parse(utils.FormatDate, sv.DataTime)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ timestamp := dataTime.UnixNano() / 1e6
|
|
|
+ timeStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, sv.DataTime, timeStr, sv.Value)
|
|
|
+ isAdd = true
|
|
|
+ } else {
|
|
|
+ if existVal != sv.Value {
|
|
|
+ sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+
|
|
|
+ err = tx.Exec(sql, sv.Value, edbInfoId, sv.DataTime).Error
|
|
|
+ //_, err = o.Raw(sql, sv.Value, edbInfoId, sv.DataTime).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if isAdd {
|
|
|
+ addSql = strings.TrimRight(addSql, ",")
|
|
|
+ err = tx.Exec(addSql).Error
|
|
|
+ //_, err = o.Raw(addSql).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+const (
|
|
|
+ dataUrl = "https://dataapi.smm.cn/GetData/" //data url (中文)
|
|
|
+ //dataUrl = "https://dataapi.smm.cn/GetDataEn/" //data url (english edition)
|
|
|
+ authUrl = "https://platform.smm.cn/usercenter/auth" // auth url (for all)
|
|
|
+)
|
|
|
+
|
|
|
+type TokenResp struct {
|
|
|
+ Code int `json:"Code"`
|
|
|
+ Msg string `json:"Msg"`
|
|
|
+ Data TokenData `json:"Data"`
|
|
|
+}
|
|
|
+
|
|
|
+type TokenData struct {
|
|
|
+ Token string `json:"Token"`
|
|
|
+}
|
|
|
+
|
|
|
+//获取token
|
|
|
+func getToken(userName string, password string) (string, error) {
|
|
|
+ encryptAuth := md5.New()
|
|
|
+ encryptAuth.Write([]byte(password)) //encrypt password with md5
|
|
|
+ newPassword := hex.EncodeToString(encryptAuth.Sum(nil))
|
|
|
+
|
|
|
+ resp, err := http.PostForm(authUrl, url.Values{"user_name": {userName}, "password": {newPassword}})
|
|
|
+ if err != nil {
|
|
|
+ return "", err
|
|
|
+ }
|
|
|
+
|
|
|
+ defer resp.Body.Close()
|
|
|
+
|
|
|
+ body, err := ioutil.ReadAll(resp.Body)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("reponse error", err)
|
|
|
+ return "", err
|
|
|
+ }
|
|
|
+
|
|
|
+ var bodyJsonContent TokenResp
|
|
|
+
|
|
|
+ if err = json.Unmarshal([]byte(body), &bodyJsonContent); err != nil {
|
|
|
+ fmt.Println(err, "unmarsal failure")
|
|
|
+ return "", err
|
|
|
+ }
|
|
|
+
|
|
|
+ var token string
|
|
|
+ if bodyJsonContent.Code == 0 {
|
|
|
+ token = bodyJsonContent.Data.Token
|
|
|
+ }
|
|
|
+
|
|
|
+ //print(token)
|
|
|
+ return token, nil
|
|
|
+}
|
|
|
+
|
|
|
+func SyncSmmIndexDataBase(edbCode, startDate, endDate string) (err error) {
|
|
|
+ //utils.FileLog.Info("start:" + time.Now().Format(utils.FormatDateTime))
|
|
|
+
|
|
|
+ var smmCode string
|
|
|
+ if strings.Contains(edbCode, "#") {
|
|
|
+ smmCode = strings.Split(edbCode, "#")[0]
|
|
|
+ } else {
|
|
|
+ smmCode = edbCode
|
|
|
+ }
|
|
|
+ token, err := getToken("pqian@hzinsights.com", "hz123456")
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println(err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ baseSmmItem, err := edbDataModel.GetBaseFromSmmBySmmCode(smmCode)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println(err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if baseSmmItem == nil {
|
|
|
+ err = errors.New("GetBaseFromSmmBySmmCode Err:" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ smmIndexAll, err := edbDataModel.GetBaseFromSmmIndexBySmmCode(smmCode)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("GetBaseFromSmmIndex Err:" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ existIndexMap := make(map[string]*edbDataModel.BaseFromSmmIndex)
|
|
|
+ for _, item := range smmIndexAll {
|
|
|
+ existIndexMap[item.IndexCode] = item
|
|
|
+ }
|
|
|
+
|
|
|
+ ysItem, err := getApiData(token, edbCode, startDate, endDate)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println(err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if ysItem != nil && ysItem.Code == 200 {
|
|
|
+
|
|
|
+ frequency := ysItem.Data.Frequency
|
|
|
+
|
|
|
+ indexMap := make(map[string]int)
|
|
|
+ smmIndexIdMap := make(map[int]int)
|
|
|
+ indexCodeMap := make(map[int]string)
|
|
|
+
|
|
|
+ indexKey := 0
|
|
|
+ var isDateIndex int
|
|
|
+ for fk, fv := range ysItem.Data.Field {
|
|
|
+ if fv.IsDate == "1" {
|
|
|
+ isDateIndex = fk
|
|
|
+ } else {
|
|
|
+ if !strings.Contains(fv.Name, "产品名称") &&
|
|
|
+ !strings.Contains(fv.Name, "单位") &&
|
|
|
+ !strings.Contains(fv.Name, "时间") &&
|
|
|
+ !strings.Contains(fv.Name, "备注") {
|
|
|
+
|
|
|
+ indexMap[fv.DBColName] = fk
|
|
|
+
|
|
|
+ indexKey += 1
|
|
|
+ indexCode := smmCode + "#" + strconv.Itoa(indexKey)
|
|
|
+
|
|
|
+ if findItem, ok := existIndexMap[indexCode]; !ok {
|
|
|
+ ssmIndex := new(edbDataModel.BaseFromSmmIndex)
|
|
|
+ ssmIndex.Interface = smmCode
|
|
|
+ ssmIndex.Name = baseSmmItem.Name
|
|
|
+ ssmIndex.IndexCode = indexCode
|
|
|
+ ssmIndex.IndexName = baseSmmItem.Name + "_" + fv.Name
|
|
|
+ ssmIndex.Type1 = baseSmmItem.Type1
|
|
|
+ ssmIndex.Type2 = baseSmmItem.Type2
|
|
|
+ ssmIndex.Type3 = baseSmmItem.Type3
|
|
|
+ ssmIndex.Frequency = frequency
|
|
|
+ ssmIndex.Unit = fv.Unit
|
|
|
+ ssmIndex.ApiStartTime = baseSmmItem.ApiStartTime
|
|
|
+ ssmIndex.ApiUpdateTime = baseSmmItem.ApiUpdateTime
|
|
|
+ ssmIndex.StartTime = baseSmmItem.StartTime
|
|
|
+ ssmIndex.FinishTime = baseSmmItem.FinishTime
|
|
|
+ ssmIndex.CreateTime = time.Now()
|
|
|
+ ssmIndex.ModifyTime = time.Now()
|
|
|
+ lastIndexId, err := edbDataModel.AddBaseFromSmmIndex(ssmIndex)
|
|
|
+ if err != nil {
|
|
|
+ err = errors.New("AddBaseFromSmmIndex Err:" + err.Error())
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ smmIndexIdMap[fk] = int(lastIndexId)
|
|
|
+ indexCodeMap[fk] = indexCode
|
|
|
+ } else {
|
|
|
+ smmIndexIdMap[fk] = findItem.BaseFromSmmIndexId
|
|
|
+ indexCodeMap[fk] = findItem.IndexCode
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ existDataMap := make(map[string]*edbDataModel.BaseFromSmmData)
|
|
|
+ for _, mv := range indexCodeMap {
|
|
|
+ indexCode := mv
|
|
|
+ dataAllList, err := edbDataModel.GetBaseFromSmmDataAllByIndexCode(indexCode)
|
|
|
+ if err != nil {
|
|
|
+ err = errors.New("GetBaseFromSmmData Err:" + err.Error())
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ for _, item := range dataAllList {
|
|
|
+ key := item.IndexCode + item.DataTime
|
|
|
+ existDataMap[key] = item
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ addExistDataMap := make(map[string]string)
|
|
|
+
|
|
|
+ for _, dv := range ysItem.Data.Content {
|
|
|
+ var dataTime string
|
|
|
+ dataTime = dv[isDateIndex]
|
|
|
+ if strings.Contains(dataTime, "Q1") {
|
|
|
+ dataTime = strings.Replace(dataTime, "Q1", "-01", -1)
|
|
|
+ dataTime += "-31"
|
|
|
+ }
|
|
|
+ if strings.Contains(dataTime, "Q2") {
|
|
|
+ dataTime = strings.Replace(dataTime, "Q2", "-06", -1)
|
|
|
+ dataTime += "-30"
|
|
|
+ }
|
|
|
+ if strings.Contains(dataTime, "Q3") {
|
|
|
+ dataTime = strings.Replace(dataTime, "Q3", "-09", -1)
|
|
|
+ dataTime += "-30"
|
|
|
+ }
|
|
|
+ if strings.Contains(dataTime, "Q4") {
|
|
|
+ dataTime = strings.Replace(dataTime, "Q4", "-12", -1)
|
|
|
+ dataTime += "-31"
|
|
|
+ }
|
|
|
+
|
|
|
+ if strings.Contains(dataTime, "H1") {
|
|
|
+ dataTime = strings.Replace(dataTime, "H1", "-06", -1)
|
|
|
+ dataTime += "-30"
|
|
|
+ }
|
|
|
+
|
|
|
+ if strings.Contains(dataTime, "H2") {
|
|
|
+ dataTime = strings.Replace(dataTime, "H2", "-12", -1)
|
|
|
+ dataTime += "-31"
|
|
|
+ }
|
|
|
+
|
|
|
+ if frequency == "月" {
|
|
|
+ monthDate, err := time.Parse("2006-01", dataTime)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("time.Parse:" + err.Error())
|
|
|
+ }
|
|
|
+ lastTime := monthDate.AddDate(0, 1, -1)
|
|
|
+ lastYear, lastMonth, lastDay := lastTime.Date()
|
|
|
+ var lastDate string
|
|
|
+ if int(lastMonth) < 10 {
|
|
|
+ lastDate = strconv.Itoa(lastYear) + "-" + "0" + strconv.Itoa(int(lastMonth)) + "-" + strconv.Itoa(lastDay)
|
|
|
+ } else {
|
|
|
+ lastDate = strconv.Itoa(lastYear) + "-" + strconv.Itoa(int(lastMonth)) + "-" + strconv.Itoa(lastDay)
|
|
|
+ }
|
|
|
+ dataTime = lastDate
|
|
|
+ } else if frequency == "年" {
|
|
|
+ dataTime = dataTime + "-12-31"
|
|
|
+ }
|
|
|
+ saveDataTime, err := time.Parse(utils.FormatDate, dataTime)
|
|
|
+ if err != nil {
|
|
|
+ err = errors.New("time.Parse Err:" + err.Error())
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ timestamp := saveDataTime.UnixNano() / 1e6
|
|
|
+ //循环指标
|
|
|
+ for _, v := range indexMap {
|
|
|
+
|
|
|
+ indexCode := indexCodeMap[v]
|
|
|
+ smmIndexId := smmIndexIdMap[v]
|
|
|
+ dataVal := dv[v]
|
|
|
+
|
|
|
+ if indexCode != "" {
|
|
|
+
|
|
|
+ key := indexCode + dataTime
|
|
|
+ val := strings.Replace(dataVal, ",", "", -1)
|
|
|
+ if findData, dataOk := existDataMap[key]; !dataOk {
|
|
|
+ if _, addOK := addExistDataMap[key]; !addOK {
|
|
|
+ if val != "" && val != "-" {
|
|
|
+ dataItem := new(edbDataModel.BaseFromSmmData)
|
|
|
+ dataItem.BaseFromSmmIndexId = smmIndexId
|
|
|
+ dataItem.IndexCode = indexCode
|
|
|
+ dataItem.DataTime = dataTime
|
|
|
+ dataItem.Value = val
|
|
|
+ dataItem.CreateTime = time.Now()
|
|
|
+ dataItem.ModifyTime = time.Now()
|
|
|
+ dataItem.DataTimestamp = timestamp
|
|
|
+ _, err = edbDataModel.AddBaseFromSmmData(dataItem)
|
|
|
+ if err != nil && !strings.Contains(err.Error(), "idx_index_code_date") {
|
|
|
+ fmt.Println("AddBaseFromSmmData Err:" + err.Error())
|
|
|
+ err = errors.New("AddBaseFromSmmData Err:" + err.Error())
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if findData != nil && findData.Value != val { //修改
|
|
|
+ if _, addOK := addExistDataMap[key]; !addOK {
|
|
|
+ if val != "" && val != "-" {
|
|
|
+ err = edbDataModel.ModifyBaseFromSmmData(findData.SmmDataId, val)
|
|
|
+ if err != nil {
|
|
|
+ err = errors.New("ModifyBaseFromSmmData Err:" + err.Error())
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ addExistDataMap[key] = key
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //修改数据开始,结束日期
|
|
|
+ {
|
|
|
+ indexList, err := edbDataModel.GetBaseFromSmmIndexBySmmCode(smmCode)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("GetBaseFromSmmIndexBySmmCode Err:" + err.Error())
|
|
|
+ }
|
|
|
+ for _, sv := range indexList {
|
|
|
+ minDate, maxDate, err := edbDataModel.GetBaseFromSmmMaxOrMinDate(sv.IndexCode)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("GetEdbDataSmmMaxOrMinDate Err:" + err.Error())
|
|
|
+ } else {
|
|
|
+ err = edbDataModel.ModifyBaseFromSmmMinDateAndMaxDate(sv.BaseFromSmmIndexId, minDate, maxDate)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("ModifyBaseFromSmmMinDateAndMaxDate Err:" + err.Error())
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * request data
|
|
|
+ * sdatetime,edatetime ==>format:yyyy-mm-dd,
|
|
|
+ * apiName ==> data.metal.com(for english)/data.smm.cn (for chinese)
|
|
|
+ */
|
|
|
+func getApiData(token string, apiName string, sdatetime string, edatetime string) (item *edbDataModel.YsResult, err error) {
|
|
|
+ reqUrl := dataUrl + apiName
|
|
|
+ resp, err := http.PostForm(reqUrl, url.Values{"token": {token}, "sdatetime": {sdatetime}, "edatetime": {edatetime}})
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ defer resp.Body.Close()
|
|
|
+ body, err := ioutil.ReadAll(resp.Body)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("response error")
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ //utils.FileLog.Info("ys result:" + string(body))
|
|
|
+ dataJsonContent := new(edbDataModel.YsResult)
|
|
|
+ if err = json.Unmarshal([]byte(body), &dataJsonContent); err != nil {
|
|
|
+ fmt.Println(err, "data unmarshal failure")
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ if dataJsonContent.Code == 200 && len(dataJsonContent.Data.Content) > 0 {
|
|
|
+ return dataJsonContent, nil
|
|
|
+ } else {
|
|
|
+ err = errors.New("code:" + strconv.Itoa(int(dataJsonContent.Code)) + "msg:" + dataJsonContent.Msg)
|
|
|
+ }
|
|
|
+ return nil, nil
|
|
|
+}
|
|
|
+
|
|
|
+func RefreshEdbDataByGl(edbInfoId int, edbCode, startDate, endDate string) (err error) {
|
|
|
+ tx := global.MYSQL["data"].Begin()
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ } else {
|
|
|
+ tx.Commit()
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ edbInfoIdStr := strconv.Itoa(edbInfoId)
|
|
|
+ //计算数据
|
|
|
+ var condition string
|
|
|
+ var pars []interface{}
|
|
|
+
|
|
|
+ if edbCode != "" {
|
|
|
+ condition += " AND INDEX_CODE=? "
|
|
|
+ pars = append(pars, edbCode)
|
|
|
+ }
|
|
|
+
|
|
|
+ if startDate != "" {
|
|
|
+ condition += " AND DATA_DATE>=? "
|
|
|
+ pars = append(pars, startDate)
|
|
|
+ }
|
|
|
+
|
|
|
+ if endDate != "" {
|
|
|
+ condition += " AND DATA_DATE<=? "
|
|
|
+ pars = append(pars, endDate)
|
|
|
+ }
|
|
|
+
|
|
|
+ glDataList, err := edbDataModel.GetGlDataByTradeCode(condition, pars)
|
|
|
+
|
|
|
+ addSql := ` INSERT INTO edb_data_gl(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
|
|
|
+ var isAdd bool
|
|
|
+ existMap := make(map[string]string)
|
|
|
+ for _, v := range glDataList {
|
|
|
+ item := v
|
|
|
+ if _, ok := existMap[v.DataTime]; !ok {
|
|
|
+ count, err := edbDataModel.GetEdbDataGlByCodeAndDate(edbCode, v.DataTime)
|
|
|
+ if err != nil && err != utils.ErrNoRow {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if count <= 0 {
|
|
|
+ eDate := item.DataTime
|
|
|
+ sValue := item.InputValue
|
|
|
+ if sValue != "" {
|
|
|
+ dataTime, err := time.Parse(utils.FormatDate, eDate)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ timestamp := dataTime.UnixNano() / 1e6
|
|
|
+ timeStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
|
|
|
+ isAdd = true
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ updateSql := ` UPDATE edb_data_gl SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ //err = global.MYSQL["data"].Exec(sql, value, edbInfoId, dataTime).Error
|
|
|
+ err = tx.Exec(updateSql, v.InputValue, edbInfoId, v.DataTime).Error
|
|
|
+ //err = edbDataModel.ModifyEdbDataGl(int64(edbInfoId), v.DataTime, v.InputValue)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ existMap[v.DataTime] = v.InputValue
|
|
|
+ }
|
|
|
+ if isAdd {
|
|
|
+ addSql = strings.TrimRight(addSql, ",")
|
|
|
+ err = tx.Exec(addSql).Error
|
|
|
+ //_, err = o.Raw(addSql).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// RefreshEdbDataByZz 刷新路透社数据
|
|
|
+func RefreshAllEdbDataByLt(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
|
|
|
+ // 获取路透社数据
|
|
|
+ ltDataList, err := QueryEdbDataByLt(edbCode, startDate, endDate)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ tx := global.MYSQL["data"].Begin()
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ } else {
|
|
|
+ tx.Commit()
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ //获取指标所有数据
|
|
|
+ dataList := make([]*edbDataModel.EdbDataBase, 0)
|
|
|
+ dataTableName := edbDataModel.GetEdbDataTableName(source)
|
|
|
+ sql := `SELECT * FROM %s WHERE edb_info_id=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = global.MYSQL["data"].Raw(sql, dataTableName).Scan(&dataList).Error
|
|
|
+ //_, err = o.Raw(sql, edbInfoId).QueryRows(&dataList)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ dataMap := make(map[string]string)
|
|
|
+ for _, v := range dataList {
|
|
|
+ dataMap[v.DataTime] = v.Value
|
|
|
+ }
|
|
|
+ edbInfoIdStr := strconv.Itoa(edbInfoId)
|
|
|
+
|
|
|
+ addSql := ` INSERT INTO edb_data_lt(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
|
|
|
+ var isAdd bool
|
|
|
+
|
|
|
+ for timestampInt, edbValue := range ltDataList {
|
|
|
+ dataTime := time.Unix(timestampInt/1000, 0)
|
|
|
+
|
|
|
+ //校验数据类型对不对
|
|
|
+ valType := reflect.TypeOf(edbValue)
|
|
|
+ if valType == nil {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ if valType.String() != "float64" {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ sValue := edbValue.(float64)
|
|
|
+
|
|
|
+ eDate := dataTime.Format(utils.FormatDate)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ saveValue := utils.SubFloatToString(sValue, 30)
|
|
|
+ if existVal, ok := dataMap[eDate]; !ok {
|
|
|
+ timestamp := dataTime.UnixNano() / 1e6
|
|
|
+ timeStr := fmt.Sprintf("%d", timestamp)
|
|
|
+
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, saveValue)
|
|
|
+ isAdd = true
|
|
|
+ } else {
|
|
|
+ if existVal != saveValue {
|
|
|
+ sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = tx.Exec(sql, sValue, edbInfoId, eDate).Error
|
|
|
+ //_, err = o.Raw(sql, sValue, edbInfoId, eDate).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if isAdd {
|
|
|
+ addSql = strings.TrimRight(addSql, ",")
|
|
|
+ err = tx.Exec(addSql).Error
|
|
|
+ //_, err = o.Raw(addSql).Exec()
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("RefreshAllEdbDataByLt add Err", err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// QueryEdbDataByLt 获取路透社数据
|
|
|
+func QueryEdbDataByLt(edbCode, startDate, endDate string) (dataList map[int64]interface{}, err error) {
|
|
|
+ dataList = make(map[int64]interface{})
|
|
|
+
|
|
|
+ ltUrl := utils.Hz_Data_LT_Url + `edbInfo/ek?EdbCode=%s&StartDate=%s&EndDate=%s`
|
|
|
+ ltUrl = fmt.Sprintf(ltUrl, edbCode, startDate, endDate)
|
|
|
+ //utils.FileLogData.Info("ltUrl:%s", ltUrl)
|
|
|
+ //body, err := http.Get(ltUrl)
|
|
|
+
|
|
|
+ reqRes, err := http.Get(ltUrl)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer reqRes.Body.Close()
|
|
|
+ body, err := ioutil.ReadAll(reqRes.Body)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ //utils.FileLogData.Info("lt result:%s", string(body))
|
|
|
+
|
|
|
+ //if err != nil {
|
|
|
+ // return
|
|
|
+ //}
|
|
|
+ //fmt.Println(string(body))
|
|
|
+ item := new(edbDataModel.EdbDataFromLt)
|
|
|
+ err = json.Unmarshal(body, &item)
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ dataList = item.Close
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// RefreshEdbDataByZz 刷新郑商所指标数据
|
|
|
+func RefreshEdbDataByZz(edbInfoId int, edbCode, startDate, endDate string) (err error) {
|
|
|
+
|
|
|
+ tx := global.MYSQL["data"].Begin()
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ } else {
|
|
|
+ tx.Commit()
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ 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)
|
|
|
+ }
|
|
|
+
|
|
|
+ if endDate != "" {
|
|
|
+ condition += " AND data_time<=? "
|
|
|
+ pars = append(pars, endDate)
|
|
|
+ }
|
|
|
+
|
|
|
+ glDataList, err := edbDataModel.GetZzDataByTradeCode(condition, pars)
|
|
|
+
|
|
|
+ addSql := ` INSERT INTO edb_data_zz(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
|
|
|
+ var isAdd bool
|
|
|
+ existMap := make(map[string]string)
|
|
|
+ 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 {
|
|
|
+ count, err := edbDataModel.GetEdbDataZzByCodeAndDate(edbCode, v.DataTime)
|
|
|
+ if err != nil && err != utils.ErrNoRow {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if count <= 0 {
|
|
|
+ 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)
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
|
|
|
+ isAdd = true
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ updateSql := ` UPDATE edb_data_zz SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ err = tx.Exec(updateSql, value, edbInfoId, v.DataTime).Error
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ existMap[v.DataTime] = value
|
|
|
+ }
|
|
|
+ if isAdd {
|
|
|
+ addSql = strings.TrimRight(addSql, ",")
|
|
|
+ err = tx.Exec(addSql).Error
|
|
|
+ //_, err = o.Raw(addSql).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func RefreshEdbDataByDl(edbInfoId int, edbCode, startDate, endDate string) (err error) {
|
|
|
+
|
|
|
+ tx := global.MYSQL["data"].Begin()
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ } else {
|
|
|
+ tx.Commit()
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ 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)
|
|
|
+ }
|
|
|
+
|
|
|
+ if endDate != "" {
|
|
|
+ condition += " AND data_time<=? "
|
|
|
+ pars = append(pars, endDate)
|
|
|
+ }
|
|
|
+
|
|
|
+ glDataList, err := edbDataModel.GetDlDataByTradeCode(condition, pars)
|
|
|
+
|
|
|
+ addSql := ` INSERT INTO edb_data_dl(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
|
|
|
+ var isAdd bool
|
|
|
+ existMap := make(map[string]string)
|
|
|
+ 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 {
|
|
|
+ count, err := edbDataModel.GetEdbDataDlByCodeAndDate(edbCode, v.DataTime)
|
|
|
+ if err != nil && err != utils.ErrNoRow {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if count <= 0 {
|
|
|
+ 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)
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
|
|
|
+ isAdd = true
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ updataSql := ` UPDATE edb_data_dl SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ err = tx.Exec(updataSql, value, edbInfoId, v.DataTime).Error
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ existMap[v.DataTime] = value
|
|
|
+ }
|
|
|
+ if isAdd {
|
|
|
+ addSql = strings.TrimRight(addSql, ",")
|
|
|
+ err = tx.Exec(addSql).Error
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// RefreshEdbDataBySh 刷新上期所指标数据
|
|
|
+func RefreshEdbDataBySh(edbInfoId int, edbCode, startDate, endDate string) (err error) {
|
|
|
+
|
|
|
+ tx := global.MYSQL["data"].Begin()
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ } else {
|
|
|
+ tx.Commit()
|
|
|
+ }
|
|
|
+ }()
|
|
|
+ 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)
|
|
|
+ }
|
|
|
+
|
|
|
+ if endDate != "" {
|
|
|
+ condition += " AND data_time<=? "
|
|
|
+ pars = append(pars, endDate)
|
|
|
+ }
|
|
|
+
|
|
|
+ glDataList, err := edbDataModel.GetShDataByTradeCode(condition, pars)
|
|
|
+
|
|
|
+ addSql := ` INSERT INTO edb_data_sh(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
|
|
|
+ var isAdd bool
|
|
|
+ existMap := make(map[string]string)
|
|
|
+ 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 {
|
|
|
+ count, err := edbDataModel.GetEdbDataShByCodeAndDate(edbCode, v.DataTime)
|
|
|
+ if err != nil && err != utils.ErrNoRow {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if count <= 0 {
|
|
|
+ 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)
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
|
|
|
+ isAdd = true
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ updataSql := ` UPDATE edb_data_sh SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ err = tx.Exec(updataSql, value, edbInfoId, v.DataTime).Error
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ existMap[v.DataTime] = value
|
|
|
+ }
|
|
|
+ if isAdd {
|
|
|
+ addSql = strings.TrimRight(addSql, ",")
|
|
|
+ err = tx.Exec(addSql).Error
|
|
|
+ //_, err = o.Raw(addSql).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// RefreshEdbDataByCffex 刷新中金所指标数据
|
|
|
+func RefreshEdbDataByCffex(edbInfoId int, edbCode, startDate, endDate string) (err error) {
|
|
|
+ tx := global.MYSQL["data"].Begin()
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ } else {
|
|
|
+ tx.Commit()
|
|
|
+ }
|
|
|
+ }()
|
|
|
+ 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)
|
|
|
+ }
|
|
|
+
|
|
|
+ if endDate != "" {
|
|
|
+ condition += " AND data_time<=? "
|
|
|
+ pars = append(pars, endDate)
|
|
|
+ }
|
|
|
+
|
|
|
+ glDataList, err := edbDataModel.GetCffexDataByTradeCode(condition, pars)
|
|
|
+
|
|
|
+ addSql := ` INSERT INTO edb_data_cffex(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
|
|
|
+ var isAdd bool
|
|
|
+ existMap := make(map[string]string)
|
|
|
+ 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 {
|
|
|
+ count, err := edbDataModel.GetEdbDataCffexByCodeAndDate(edbCode, v.DataTime)
|
|
|
+ if err != nil && err != utils.ErrNoRow {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if count <= 0 {
|
|
|
+ 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)
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
|
|
|
+ isAdd = true
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ updateSql := ` UPDATE edb_data_cffex SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ err = tx.Exec(updateSql, value, edbInfoId, v.DataTime).Error
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ existMap[v.DataTime] = value
|
|
|
+ }
|
|
|
+ if isAdd {
|
|
|
+ addSql = strings.TrimRight(addSql, ",")
|
|
|
+ err = tx.Exec(addSql).Error
|
|
|
+ //_, err = o.Raw(addSql).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// RefreshEdbDataByShfe 刷新上期能源指标数据
|
|
|
+func RefreshEdbDataByShfe(edbInfoId int, edbCode, startDate, endDate string) (err error) {
|
|
|
+
|
|
|
+ tx := global.MYSQL["data"].Begin()
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ } else {
|
|
|
+ tx.Commit()
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ 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)
|
|
|
+ }
|
|
|
+
|
|
|
+ if endDate != "" {
|
|
|
+ condition += " AND data_time<=? "
|
|
|
+ pars = append(pars, endDate)
|
|
|
+ }
|
|
|
+
|
|
|
+ glDataList, err := edbDataModel.GetShfeDataByTradeCode(condition, pars)
|
|
|
+
|
|
|
+ addSql := ` INSERT INTO edb_data_ine(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
|
|
|
+ var isAdd bool
|
|
|
+ existMap := make(map[string]string)
|
|
|
+ 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 {
|
|
|
+ count, err := edbDataModel.GetEdbDataShfeByCodeAndDate(edbCode, v.DataTime)
|
|
|
+ if err != nil && err != utils.ErrNoRow {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if count <= 0 {
|
|
|
+ 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)
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
|
|
|
+ isAdd = true
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ updateSql := ` UPDATE edb_data_ine SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ err = tx.Exec(updateSql, value, edbInfoId, v.DataTime).Error
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ existMap[v.DataTime] = value
|
|
|
+ }
|
|
|
+ if isAdd {
|
|
|
+ addSql = strings.TrimRight(addSql, ",")
|
|
|
+ err = tx.Exec(addSql).Error
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// RefreshEdbDataByGie 刷新欧洲天然气指标数据
|
|
|
+func RefreshEdbDataByGie(edbInfoId int, edbCode, startDate, endDate string) (err error) {
|
|
|
+
|
|
|
+ tx := global.MYSQL["data"].Begin()
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ } else {
|
|
|
+ tx.Commit()
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("refresh err:", err)
|
|
|
+ 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)
|
|
|
+ }
|
|
|
+
|
|
|
+ if endDate != "" {
|
|
|
+ condition += " AND gas_day_started_on<=? "
|
|
|
+ pars = append(pars, endDate)
|
|
|
+ }
|
|
|
+
|
|
|
+ eicDataList, err := edbDataModel.GetGieDataByTradeCode(condition, pars)
|
|
|
+ fmt.Println("eicDataList", len(eicDataList))
|
|
|
+ addSql := ` INSERT INTO edb_data_gie(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
|
|
|
+ var isAdd bool
|
|
|
+ existMap := make(map[string]string)
|
|
|
+ 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 _, ok := existMap[v.GasDayStartedOn]; !ok {
|
|
|
+ count, err := edbDataModel.GetEdbDataGieByCodeAndDate(edbCode, v.GasDayStartedOn)
|
|
|
+ if err != nil && err != utils.ErrNoRow {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if count <= 0 {
|
|
|
+ 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)
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
|
|
|
+ isAdd = true
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ updateSql := ` UPDATE edb_data_gie SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ err = tx.Exec(updateSql, value, edbInfoId, v.GasDayStartedOn).Error
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ existMap[v.GasDayStartedOn] = value
|
|
|
+ }
|
|
|
+ if isAdd {
|
|
|
+ addSql = strings.TrimRight(addSql, ",")
|
|
|
+ err = tx.Exec(addSql).Error
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+//刷新全部数据
|
|
|
+func RefreshAllCalculate(edbInfoIdArr []*edbInfoModel.EdbInfo, edbInfoId, source int, edbCode, formulaStr, startDate, endDate string, edbInfoIdBytes []string) (err error) {
|
|
|
+
|
|
|
+ tx := global.MYSQL["data"].Begin()
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ } else {
|
|
|
+ tx.Commit()
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ fmt.Println(startDate, endDate)
|
|
|
+ saveDataMap := make(map[string]map[int]float64)
|
|
|
+ for _, v := range edbInfoIdArr {
|
|
|
+ var condition string
|
|
|
+ var pars []interface{}
|
|
|
+ condition += " AND edb_info_id=? "
|
|
|
+ pars = append(pars, v.EdbInfoId)
|
|
|
+ if startDate != "" {
|
|
|
+ condition += " AND data_time>=? "
|
|
|
+ pars = append(pars, startDate)
|
|
|
+ }
|
|
|
+ if endDate != "" {
|
|
|
+ condition += " AND data_time<=? "
|
|
|
+ pars = append(pars, endDate)
|
|
|
+ }
|
|
|
+ fmt.Println("v.Source:", v.Source)
|
|
|
+ dataList, err := edbDataModel.GetEdbDataListAll(condition, pars, v.Source, 1)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ dataMap := make(map[string]float64)
|
|
|
+ for _, dv := range dataList {
|
|
|
+ if val, ok := saveDataMap[dv.DataTime]; ok {
|
|
|
+ if _, ok := val[v.EdbInfoId]; !ok {
|
|
|
+ val[v.EdbInfoId] = dv.Value
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ temp := make(map[int]float64)
|
|
|
+ temp[v.EdbInfoId] = dv.Value
|
|
|
+ saveDataMap[dv.DataTime] = temp
|
|
|
+ }
|
|
|
+ }
|
|
|
+ item := new(edbDataModel.CalculateItems)
|
|
|
+ item.EdbInfoId = v.EdbInfoId
|
|
|
+ item.DataMap = dataMap
|
|
|
+ }
|
|
|
+
|
|
|
+ formulaMap := CheckFormula(formulaStr)
|
|
|
+ addSql := ` INSERT INTO edb_data_calculate(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
|
|
|
+ var isAdd bool
|
|
|
+
|
|
|
+ //获取指标所有数据
|
|
|
+ dataList := make([]*edbDataModel.EdbDataBase, 0)
|
|
|
+ dataTableName := edbDataModel.GetEdbDataTableName(source)
|
|
|
+ sql := `SELECT * FROM %s WHERE edb_info_id=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = global.MYSQL["data"].Raw(sql, edbInfoId).Scan(&dataList).Error
|
|
|
+ //_, err = o.Raw(sql, edbInfoId).QueryRows(&dataList)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ dataMap := make(map[string]string)
|
|
|
+ for _, v := range dataList {
|
|
|
+ dataMap[v.DataTime] = v.Value
|
|
|
+ }
|
|
|
+ edbInfoIdStr := strconv.Itoa(edbInfoId)
|
|
|
+ existDataMap := make(map[string]string)
|
|
|
+ for sk, sv := range saveDataMap {
|
|
|
+ fmt.Println(sk, sv)
|
|
|
+ formulaStr = strings.ToUpper(formulaStr)
|
|
|
+ formulaFormStr := ReplaceFormula(edbInfoIdArr, sv, formulaMap, formulaStr, edbInfoIdBytes)
|
|
|
+ if formulaFormStr != "" {
|
|
|
+ //utils.FileLog.Info("formulaFormStr:%s", formulaFormStr)
|
|
|
+ expression := formula.NewExpression(formulaFormStr)
|
|
|
+ calResult, err := expression.Evaluate()
|
|
|
+ if err != nil {
|
|
|
+ err = errors.New("计算失败:Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
|
|
|
+ fmt.Println(err)
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ calVal, err := calResult.Float64()
|
|
|
+ if err != nil {
|
|
|
+ err = errors.New("计算失败:获取计算值失败 Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
|
|
|
+ fmt.Println(err)
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ saveValue := utils.SubFloatToString(calVal, 4)
|
|
|
+ if existVal, ok := dataMap[sk]; !ok {
|
|
|
+ dataTime, _ := time.Parse(utils.FormatDate, sk)
|
|
|
+ timestamp := dataTime.UnixNano() / 1e6
|
|
|
+ timeStr := fmt.Sprintf("%d", timestamp)
|
|
|
+
|
|
|
+ if _, existOk := existDataMap[sk]; !existOk {
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, sk, timeStr, saveValue)
|
|
|
+ isAdd = true
|
|
|
+ }
|
|
|
+ existDataMap[sk] = sk
|
|
|
+ } else {
|
|
|
+ if existVal != saveValue {
|
|
|
+ sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = tx.Exec(sql, saveValue, edbInfoId, sk).Error
|
|
|
+ //_, err = o.Raw(sql, saveValue, edbInfoId, sk).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if isAdd {
|
|
|
+ addSql = strings.TrimRight(addSql, ",")
|
|
|
+ err = tx.Exec(addSql).Error
|
|
|
+ //_, err = o.Raw(addSql).Exec()
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("RefreshAllCalculate add Err", err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func CheckFormula(formula string) map[string]string {
|
|
|
+ mathFormula := []string{"MAX", "MIN", "ABS", "ACOS", "ASIN", "CEIL", "MOD", "POW", "ROUND", "SIGN", "SIN", "TAN", "LOG10", "LOG2", "LOG"}
|
|
|
+
|
|
|
+ str := strings.ToUpper(formula)
|
|
|
+ for _, v := range mathFormula {
|
|
|
+ str = strings.Replace(str, v, "", -1)
|
|
|
+ }
|
|
|
+ str = strings.Replace(str, "(", "", -1)
|
|
|
+ str = strings.Replace(str, ")", "", -1)
|
|
|
+
|
|
|
+ byteMap := make(map[string]string)
|
|
|
+ for i := 0; i < len(str); i++ {
|
|
|
+ byteInt := str[i]
|
|
|
+ if byteInt >= 65 && byteInt <= 90 {
|
|
|
+ byteStr := string(byteInt)
|
|
|
+ if _, ok := byteMap[byteStr]; !ok {
|
|
|
+ byteMap[byteStr] = byteStr
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return byteMap
|
|
|
+}
|
|
|
+
|
|
|
+func GetFormulaMap() map[string]string {
|
|
|
+ funMap := make(map[string]string)
|
|
|
+ funMap["MAX"] = "[@@]"
|
|
|
+ funMap["MIN"] = "[@!]"
|
|
|
+ funMap["ABS"] = "[@#]"
|
|
|
+ funMap["CEIL"] = "[@$]"
|
|
|
+ funMap["COS"] = "[@%]"
|
|
|
+ funMap["FLOOR"] = "[@^]"
|
|
|
+ funMap["MOD"] = "[@&]"
|
|
|
+ funMap["POW"] = "[@*]"
|
|
|
+ funMap["ROUND"] = "[@(]"
|
|
|
+ return funMap
|
|
|
+}
|
|
|
+
|
|
|
+func ReplaceFormula(edbInfoIdArr []*edbInfoModel.EdbInfo, valArr map[int]float64, formulaMap map[string]string, formulaStr string, edbInfoIdBytes []string) string {
|
|
|
+ funMap := GetFormulaMap()
|
|
|
+ for k, v := range funMap {
|
|
|
+ formulaStr = strings.Replace(formulaStr, k, v, -1)
|
|
|
+ }
|
|
|
+
|
|
|
+ replaceCount := 0
|
|
|
+ for dk, dv := range edbInfoIdArr {
|
|
|
+ if dk == 0 {
|
|
|
+ dKey := edbInfoIdBytes[dk]
|
|
|
+ if _, ok := formulaMap[dKey]; ok { //公式中存在
|
|
|
+ if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
|
|
|
+ dvStr := fmt.Sprintf("%v", val)
|
|
|
+ formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
|
|
|
+ replaceCount++
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if dk == 1 {
|
|
|
+ dKey := edbInfoIdBytes[dk]
|
|
|
+ if _, ok := formulaMap[dKey]; ok { //公式中存在
|
|
|
+ if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
|
|
|
+ dvStr := fmt.Sprintf("%v", val)
|
|
|
+ formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
|
|
|
+ replaceCount++
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if dk == 2 {
|
|
|
+ dKey := edbInfoIdBytes[dk]
|
|
|
+ if _, ok := formulaMap[dKey]; ok { //公式中存在
|
|
|
+ if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
|
|
|
+ dvStr := fmt.Sprintf("%v", val)
|
|
|
+ formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
|
|
|
+ replaceCount++
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if dk == 3 {
|
|
|
+ dKey := edbInfoIdBytes[dk]
|
|
|
+ if _, ok := formulaMap[dKey]; ok { //公式中存在
|
|
|
+ if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
|
|
|
+ dvStr := fmt.Sprintf("%v", val)
|
|
|
+ formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
|
|
|
+ replaceCount++
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if dk == 4 {
|
|
|
+ dKey := edbInfoIdBytes[dk]
|
|
|
+ if _, ok := formulaMap[dKey]; ok { //公式中存在
|
|
|
+ if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
|
|
|
+ dvStr := fmt.Sprintf("%v", val)
|
|
|
+ formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
|
|
|
+ replaceCount++
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if dk == 5 {
|
|
|
+ dKey := edbInfoIdBytes[dk]
|
|
|
+ if _, ok := formulaMap[dKey]; ok { //公式中存在
|
|
|
+ if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
|
|
|
+ dvStr := fmt.Sprintf("%v", val)
|
|
|
+ formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
|
|
|
+ replaceCount++
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if dk == 6 {
|
|
|
+ dKey := edbInfoIdBytes[dk]
|
|
|
+ if _, ok := formulaMap[dKey]; ok { //公式中存在
|
|
|
+ if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
|
|
|
+ dvStr := fmt.Sprintf("%v", val)
|
|
|
+ formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
|
|
|
+ replaceCount++
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if dk == 7 {
|
|
|
+ dKey := edbInfoIdBytes[dk]
|
|
|
+ if _, ok := formulaMap[dKey]; ok { //公式中存在
|
|
|
+ if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
|
|
|
+ dvStr := fmt.Sprintf("%v", val)
|
|
|
+ formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
|
|
|
+ replaceCount++
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if dk == 8 {
|
|
|
+ dKey := edbInfoIdBytes[dk]
|
|
|
+ if _, ok := formulaMap[dKey]; ok { //公式中存在
|
|
|
+ if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
|
|
|
+ dvStr := fmt.Sprintf("%v", val)
|
|
|
+ formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
|
|
|
+ replaceCount++
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for k, v := range funMap {
|
|
|
+ formulaStr = strings.Replace(formulaStr, v, k, -1)
|
|
|
+ }
|
|
|
+ if replaceCount == len(formulaMap) {
|
|
|
+ return formulaStr
|
|
|
+ } else {
|
|
|
+ return ""
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func RefreshAllCalculateLjzzy(edbInfoId, source int, fromEdbInfo *edbInfoModel.EdbInfo, edbCode, startDate, endDate string) (err error) {
|
|
|
+ tx := global.MYSQL["data"].Begin()
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ } else {
|
|
|
+ tx.Commit()
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ edbInfoIdStr := strconv.Itoa(edbInfoId)
|
|
|
+ fmt.Println(edbInfoIdStr)
|
|
|
+ //计算数据
|
|
|
+ var condition string
|
|
|
+ var pars []interface{}
|
|
|
+ condition += " AND edb_info_id=? "
|
|
|
+ pars = append(pars, fromEdbInfo.EdbInfoId)
|
|
|
+
|
|
|
+ if startDate != "" {
|
|
|
+ condition += " AND data_time>=? "
|
|
|
+ pars = append(pars, startDate)
|
|
|
+ }
|
|
|
+ if endDate != "" {
|
|
|
+ condition += " AND data_time<=? "
|
|
|
+ pars = append(pars, endDate)
|
|
|
+ }
|
|
|
+
|
|
|
+ dataList, err := edbDataModel.GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 1)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ yearMap := make(map[int]map[int]*edbDataModel.EdbInfoSearchData)
|
|
|
+ dataLen := len(dataList)
|
|
|
+ for i := 0; i < dataLen; i++ {
|
|
|
+ item := dataList[i]
|
|
|
+ //日其中获取年
|
|
|
+ itemDate, err := time.Parse(utils.FormatDate, item.DataTime)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ year := itemDate.Year()
|
|
|
+ month := int(itemDate.Month())
|
|
|
+ if monthMap, yok := yearMap[year]; yok {
|
|
|
+ monthMap[month] = item
|
|
|
+ yearMap[year] = monthMap
|
|
|
+ } else {
|
|
|
+ monthMap = make(map[int]*edbDataModel.EdbInfoSearchData)
|
|
|
+ monthMap[month] = item
|
|
|
+ yearMap[year] = monthMap
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ addSql := ` INSERT INTO edb_data_calculate_ljzzy(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
|
|
|
+ var isAdd bool
|
|
|
+ //获取指标所有数据
|
|
|
+ existDataList := make([]*edbDataModel.EdbDataBase, 0)
|
|
|
+ dataTableName := edbDataModel.GetEdbDataTableName(source)
|
|
|
+ sql := `SELECT * FROM %s WHERE edb_info_id=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = global.MYSQL["data"].Raw(sql, edbInfoId).Scan(&existDataList).Error
|
|
|
+ //_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ dataMap := make(map[string]string)
|
|
|
+ for _, v := range existDataList {
|
|
|
+ dataMap[v.DataTime] = v.Value
|
|
|
+ }
|
|
|
+ existDataMap := make(map[string]string)
|
|
|
+
|
|
|
+ for yk, yv := range yearMap {
|
|
|
+ _, oneMonthOk := yv[1]
|
|
|
+ _, twoMonthOk := yv[2]
|
|
|
+ if !oneMonthOk && !twoMonthOk {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ for i := 1; i <= 12; i++ {
|
|
|
+ //fmt.Println(yk, i, yv[i])
|
|
|
+ dataCurrentItem := yv[i]
|
|
|
+ var date string
|
|
|
+ var val float64
|
|
|
+ if i == 1 || i == 2 {
|
|
|
+ if _, mok := yv[1]; mok { //1月有值
|
|
|
+ if i == 1 {
|
|
|
+ date = dataCurrentItem.DataTime
|
|
|
+ val, _ = decimal.NewFromFloat(dataCurrentItem.Value).Float64() //a.Div(b).Float64()
|
|
|
+ }
|
|
|
+ if i == 2 {
|
|
|
+ dataOneItem := yv[1]
|
|
|
+ if dataCurrentItem != nil && dataOneItem != nil {
|
|
|
+ date = dataCurrentItem.DataTime
|
|
|
+ twoMonth := decimal.NewFromFloat(dataCurrentItem.Value)
|
|
|
+ oneMonth := decimal.NewFromFloat(dataOneItem.Value)
|
|
|
+ val, _ = twoMonth.Sub(oneMonth).Float64()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else { //1月无值
|
|
|
+ dataTwoItem := yv[2]
|
|
|
+ if i == 1 {
|
|
|
+ date = strconv.Itoa(yk) + "-01-31"
|
|
|
+ a := decimal.NewFromFloat(dataTwoItem.Value)
|
|
|
+ b := decimal.NewFromFloat(2.0)
|
|
|
+ val, _ = a.Div(b).Float64()
|
|
|
+ }
|
|
|
+ if i == 2 {
|
|
|
+ date = dataCurrentItem.DataTime
|
|
|
+ a := decimal.NewFromFloat(dataTwoItem.Value)
|
|
|
+ b := decimal.NewFromFloat(2.0)
|
|
|
+ val, _ = a.Div(b).Float64()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ dataPreItem := yv[i-1]
|
|
|
+ if dataCurrentItem != nil && dataPreItem != nil {
|
|
|
+ date = dataCurrentItem.DataTime
|
|
|
+ //val = dataCurrentItem.Value - dataPreItem.Value
|
|
|
+ a := decimal.NewFromFloat(dataCurrentItem.Value)
|
|
|
+ b := decimal.NewFromFloat(dataPreItem.Value)
|
|
|
+ val, _ = a.Sub(b).Float64()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if date != "" {
|
|
|
+ saveValue := utils.SubFloatToString(val, 4)
|
|
|
+ //判断数据是否存在
|
|
|
+ if existVal, ok := dataMap[date]; !ok {
|
|
|
+ dataTime, _ := time.Parse(utils.FormatDate, date)
|
|
|
+ timestamp := dataTime.UnixNano() / 1e6
|
|
|
+ timeStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ if _, existOk := existDataMap[date]; !existOk {
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, date, timeStr, saveValue)
|
|
|
+ isAdd = true
|
|
|
+ }
|
|
|
+ existDataMap[date] = date
|
|
|
+ } else {
|
|
|
+ if existVal != saveValue {
|
|
|
+ sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = tx.Exec(sql, saveValue, edbInfoId, date).Error
|
|
|
+ //_, err = o.Raw(sql, saveValue, edbInfoId, date).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if isAdd {
|
|
|
+ addSql = strings.TrimRight(addSql, ",")
|
|
|
+ err = tx.Exec(addSql).Error
|
|
|
+ //_, err = o.Raw(addSql).Exec()
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("RefreshAllCalculateLjzzy add Err", err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func RefreshAllCalculateTbz(edbInfoId, source int, fromEdbInfo *edbInfoModel.EdbInfo, edbCode, startDate, endDate string) (err error) {
|
|
|
+ tx := global.MYSQL["data"].Begin()
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ } else {
|
|
|
+ tx.Commit()
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ edbInfoIdStr := strconv.Itoa(edbInfoId)
|
|
|
+
|
|
|
+ //计算数据
|
|
|
+ var condition string
|
|
|
+ var pars []interface{}
|
|
|
+ condition += " AND edb_info_id=? "
|
|
|
+ pars = append(pars, fromEdbInfo.EdbInfoId)
|
|
|
+
|
|
|
+ if startDate != "" {
|
|
|
+ condition += " AND data_time>=? "
|
|
|
+ pars = append(pars, startDate)
|
|
|
+ }
|
|
|
+ if endDate != "" {
|
|
|
+ condition += " AND data_time<=? "
|
|
|
+ pars = append(pars, endDate)
|
|
|
+ }
|
|
|
+ fmt.Println("GetEdbDataListAll--start")
|
|
|
+ dataList, err := edbDataModel.GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ fmt.Println("GetEdbDataListAll--end")
|
|
|
+ var dateArr []string
|
|
|
+ dataMap := make(map[string]*edbDataModel.EdbInfoSearchData)
|
|
|
+ for _, v := range dataList {
|
|
|
+ dateArr = append(dateArr, v.DataTime)
|
|
|
+ dataMap[v.DataTime] = v
|
|
|
+ }
|
|
|
+ fmt.Println("source:", source)
|
|
|
+ //获取指标所有数据
|
|
|
+ existDataList := make([]*edbDataModel.EdbDataBase, 0)
|
|
|
+ dataTableName := edbDataModel.GetEdbDataTableName(source)
|
|
|
+ fmt.Println("dataTableName:", dataTableName)
|
|
|
+ sql := `SELECT * FROM %s WHERE edb_info_id=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = global.MYSQL["data"].Raw(sql, edbInfoId).Scan(&existDataList).Error
|
|
|
+ //_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ existDataMap := make(map[string]string)
|
|
|
+ for _, v := range existDataList {
|
|
|
+ existDataMap[v.DataTime] = v.Value
|
|
|
+ }
|
|
|
+ //fmt.Println("existDataMap:", existDataMap)
|
|
|
+ addSql := ` INSERT INTO edb_data_calculate_tbz(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
|
|
|
+ var isAdd bool
|
|
|
+ existAddDataMap := make(map[string]string)
|
|
|
+ for _, av := range dateArr {
|
|
|
+ currentItem := dataMap[av]
|
|
|
+ if currentItem != nil {
|
|
|
+ //当前日期
|
|
|
+ currentDate, err := time.Parse(utils.FormatDate, av)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ //上一年的日期
|
|
|
+ preDate := currentDate.AddDate(-1, 0, 0)
|
|
|
+ preDateStr := preDate.Format(utils.FormatDate)
|
|
|
+ if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
|
|
|
+ //dataTime, _ := time.Parse(utils.FormatDate, date)
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ val := TbzDiv(currentItem.Value, findItem.Value)
|
|
|
+ if existVal, ok := existDataMap[av]; !ok {
|
|
|
+ if _, existOk := existAddDataMap[av]; !existOk {
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
|
|
|
+ isAdd = true
|
|
|
+ }
|
|
|
+ existAddDataMap[av] = av
|
|
|
+ } else {
|
|
|
+ if existVal != val {
|
|
|
+ sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = tx.Exec(sql, val, edbInfoId, av).Error
|
|
|
+ //_, err = o.Raw(sql, val, edbInfoId, av).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ continue
|
|
|
+ } else {
|
|
|
+ if fromEdbInfo.Frequency == "月度" { //向上和向下,各找一个月
|
|
|
+ for i := 0; i <= 35; i++ {
|
|
|
+ nextDateDay := preDate.AddDate(0, 0, i)
|
|
|
+ nextDateDayStr := nextDateDay.Format(utils.FormatDate)
|
|
|
+ if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ val := TbzDiv(currentItem.Value, findItem.Value)
|
|
|
+
|
|
|
+ if existVal, ok := existDataMap[av]; !ok {
|
|
|
+ if _, existOk := existAddDataMap[av]; !existOk {
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
|
|
|
+ isAdd = true
|
|
|
+ }
|
|
|
+ existAddDataMap[av] = av
|
|
|
+ } else {
|
|
|
+ if existVal != val {
|
|
|
+ sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = tx.Exec(sql, val, edbInfoId, av).Error
|
|
|
+ //_, err = o.Raw(sql, val, edbInfoId, av).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break
|
|
|
+ } else {
|
|
|
+ preDateDay := preDate.AddDate(0, 0, -i)
|
|
|
+ preDateDayStr := preDateDay.Format(utils.FormatDate)
|
|
|
+ if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ val := TbzDiv(currentItem.Value, findItem.Value)
|
|
|
+
|
|
|
+ if existVal, ok := existDataMap[av]; !ok {
|
|
|
+ if _, existOk := existAddDataMap[av]; !existOk {
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
|
|
|
+ isAdd = true
|
|
|
+ }
|
|
|
+ existAddDataMap[av] = av
|
|
|
+ } else {
|
|
|
+ if existVal != val {
|
|
|
+ sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = tx.Exec(sql, val, edbInfoId, av).Error
|
|
|
+ //_, err = o.Raw(sql, val, edbInfoId, av).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {
|
|
|
+ if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ val := TbzDiv(currentItem.Value, findItem.Value)
|
|
|
+
|
|
|
+ if existVal, ok := existDataMap[av]; !ok {
|
|
|
+ if _, existOk := existAddDataMap[av]; !existOk {
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
|
|
|
+ isAdd = true
|
|
|
+ }
|
|
|
+ existAddDataMap[av] = av
|
|
|
+ } else {
|
|
|
+ if existVal != val {
|
|
|
+ sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = tx.Exec(sql, val, edbInfoId, av).Error
|
|
|
+ //_, err = o.Raw(sql, val, edbInfoId, av).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ nextDateDay := preDate.AddDate(0, 0, 1)
|
|
|
+ nextDateDayStr := nextDateDay.Format(utils.FormatDate)
|
|
|
+
|
|
|
+ preDateDay := preDate.AddDate(0, 0, -1)
|
|
|
+ preDateDayStr := preDateDay.Format(utils.FormatDate)
|
|
|
+
|
|
|
+ for i := 0; i < 35; i++ {
|
|
|
+ if i >= 1 {
|
|
|
+ nextDateDay = nextDateDay.AddDate(0, 0, i)
|
|
|
+ nextDateDayStr = nextDateDay.Format(utils.FormatDate)
|
|
|
+ }
|
|
|
+ if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ val := TbzDiv(currentItem.Value, findItem.Value)
|
|
|
+
|
|
|
+ if existVal, ok := existDataMap[av]; !ok {
|
|
|
+ if _, existOk := existAddDataMap[av]; !existOk {
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
|
|
|
+ isAdd = true
|
|
|
+ }
|
|
|
+ existAddDataMap[av] = av
|
|
|
+ } else {
|
|
|
+ if existVal != val {
|
|
|
+ sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = tx.Exec(sql, val, edbInfoId, av).Error
|
|
|
+ //_, err = o.Raw(sql, val, edbInfoId, av).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break
|
|
|
+ } else {
|
|
|
+ if i >= 1 {
|
|
|
+ preDateDay = preDate.AddDate(0, 0, -i)
|
|
|
+ preDateDayStr = nextDateDay.Format(utils.FormatDate)
|
|
|
+ }
|
|
|
+ if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ val := TbzDiv(currentItem.Value, findItem.Value)
|
|
|
+
|
|
|
+ if existVal, ok := existDataMap[av]; !ok {
|
|
|
+ if _, existOk := existAddDataMap[av]; !existOk {
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
|
|
|
+ isAdd = true
|
|
|
+ }
|
|
|
+ existAddDataMap[av] = av
|
|
|
+ } else {
|
|
|
+ if existVal != val {
|
|
|
+ sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = tx.Exec(sql, val, edbInfoId, av).Error
|
|
|
+ //_, err = o.Raw(sql, val, edbInfoId, av).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if isAdd {
|
|
|
+ addSql = strings.TrimRight(addSql, ",")
|
|
|
+ err = tx.Exec(addSql).Error
|
|
|
+ //_, err = o.Raw(addSql).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func TbzDiv(a, b float64) string {
|
|
|
+ var valStr string
|
|
|
+ if b != 0 {
|
|
|
+ af := decimal.NewFromFloat(float64(a))
|
|
|
+ bf := decimal.NewFromFloat(float64(b))
|
|
|
+ val, _ := af.Div(bf).Float64()
|
|
|
+ val = val - 1
|
|
|
+ valStr = utils.SubFloatToString(val, 4)
|
|
|
+ } else {
|
|
|
+ valStr = "0"
|
|
|
+ }
|
|
|
+ return valStr
|
|
|
+}
|
|
|
+
|
|
|
+//刷新全部同差值数据
|
|
|
+func RefreshAllCalculateTcz(edbInfoId, source int, fromEdbInfo *edbInfoModel.EdbInfo, edbCode, startDate, endDate string) (err error) {
|
|
|
+ tx := global.MYSQL["data"].Begin()
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ } else {
|
|
|
+ tx.Commit()
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ edbInfoIdStr := strconv.Itoa(edbInfoId)
|
|
|
+
|
|
|
+ //计算数据
|
|
|
+ var condition string
|
|
|
+ var pars []interface{}
|
|
|
+ condition += " AND edb_info_id=? "
|
|
|
+ pars = append(pars, fromEdbInfo.EdbInfoId)
|
|
|
+
|
|
|
+ if startDate != "" {
|
|
|
+ condition += " AND data_time>=? "
|
|
|
+ pars = append(pars, startDate)
|
|
|
+ }
|
|
|
+ if endDate != "" {
|
|
|
+ condition += " AND data_time<=? "
|
|
|
+ pars = append(pars, endDate)
|
|
|
+ }
|
|
|
+
|
|
|
+ dataList, err := edbDataModel.GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ var dateArr []string
|
|
|
+ dataMap := make(map[string]*edbDataModel.EdbInfoSearchData)
|
|
|
+ for _, v := range dataList {
|
|
|
+ dateArr = append(dateArr, v.DataTime)
|
|
|
+ dataMap[v.DataTime] = v
|
|
|
+ }
|
|
|
+ //获取指标所有数据
|
|
|
+ existDataList := make([]*edbDataModel.EdbDataBase, 0)
|
|
|
+ dataTableName := edbDataModel.GetEdbDataTableName(source)
|
|
|
+ sql := `SELECT * FROM %s WHERE edb_info_id=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = global.MYSQL["data"].Raw(sql, edbInfoId).Scan(&existDataList).Error
|
|
|
+ //_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ existDataMap := make(map[string]string)
|
|
|
+ for _, v := range existDataList {
|
|
|
+ existDataMap[v.DataTime] = v.Value
|
|
|
+ }
|
|
|
+
|
|
|
+ addSql := ` INSERT INTO edb_data_calculate_tcz(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
|
|
|
+ var isAdd bool
|
|
|
+ existAddDataMap := make(map[string]string)
|
|
|
+ for _, av := range dateArr {
|
|
|
+ currentItem := dataMap[av]
|
|
|
+ if currentItem != nil {
|
|
|
+ //当前日期
|
|
|
+ currentDate, err := time.Parse(utils.FormatDate, av)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ //上一年的日期
|
|
|
+ preDate := currentDate.AddDate(-1, 0, 0)
|
|
|
+ preDateStr := preDate.Format(utils.FormatDate)
|
|
|
+ if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
|
|
|
+ //dataTime, _ := time.Parse(utils.FormatDate, date)
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ val := TczSub(currentItem.Value, findItem.Value)
|
|
|
+
|
|
|
+ if existVal, ok := existDataMap[av]; !ok {
|
|
|
+ if _, existOk := existAddDataMap[av]; !existOk {
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
|
|
|
+ isAdd = true
|
|
|
+ }
|
|
|
+ existAddDataMap[av] = av
|
|
|
+ } else {
|
|
|
+ if existVal != val {
|
|
|
+ sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = tx.Exec(sql, val, edbInfoId, av).Error
|
|
|
+ //_, err = o.Raw(sql, val, edbInfoId, av).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //utils.FileLog.Info("同期找到:" + av + ";" + preDateStr)
|
|
|
+ continue
|
|
|
+ } else {
|
|
|
+ if fromEdbInfo.Frequency == "月度" { //向上和向下,各找一个月
|
|
|
+ for i := 0; i <= 35; i++ {
|
|
|
+ nextDateDay := preDate.AddDate(0, 0, 1)
|
|
|
+ nextDateDayStr := nextDateDay.Format(utils.FormatDate)
|
|
|
+ if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ val := TczSub(currentItem.Value, findItem.Value)
|
|
|
+
|
|
|
+ if existVal, ok := existDataMap[av]; !ok {
|
|
|
+ if _, existOk := existAddDataMap[av]; !existOk {
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
|
|
|
+ isAdd = true
|
|
|
+ }
|
|
|
+ existAddDataMap[av] = av
|
|
|
+ } else {
|
|
|
+ if existVal != val {
|
|
|
+ sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = tx.Exec(sql, val, edbInfoId, av).Error
|
|
|
+ //_, err = o.Raw(sql, val, edbInfoId, av).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break
|
|
|
+ } else {
|
|
|
+ preDateDay := preDate.AddDate(0, 0, -1)
|
|
|
+ preDateDayStr := preDateDay.Format(utils.FormatDate)
|
|
|
+ if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ val := TczSub(currentItem.Value, findItem.Value)
|
|
|
+
|
|
|
+ if existVal, ok := existDataMap[av]; !ok {
|
|
|
+ if _, existOk := existAddDataMap[av]; !existOk {
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
|
|
|
+ isAdd = true
|
|
|
+ }
|
|
|
+ existAddDataMap[av] = av
|
|
|
+ } else {
|
|
|
+ if existVal != val {
|
|
|
+ sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = tx.Exec(sql, val, edbInfoId, av).Error
|
|
|
+ //_, err = o.Raw(sql, val, edbInfoId, av).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {
|
|
|
+ if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ val := TczSub(currentItem.Value, findItem.Value)
|
|
|
+
|
|
|
+ if existVal, ok := existDataMap[av]; !ok {
|
|
|
+ if _, existOk := existAddDataMap[av]; !existOk {
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
|
|
|
+ isAdd = true
|
|
|
+ }
|
|
|
+ existAddDataMap[av] = av
|
|
|
+ } else {
|
|
|
+ if existVal != val {
|
|
|
+ sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = tx.Exec(sql, val, edbInfoId, av).Error
|
|
|
+ //_, err = o.Raw(sql, val, edbInfoId, av).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ for i := 0; i < 35; i++ {
|
|
|
+ nextDateDay := preDate.AddDate(0, 0, 1)
|
|
|
+ nextDateDayStr := nextDateDay.Format(utils.FormatDate)
|
|
|
+ if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ val := TczSub(currentItem.Value, findItem.Value)
|
|
|
+
|
|
|
+ if existVal, ok := existDataMap[av]; !ok {
|
|
|
+ if _, existOk := existAddDataMap[av]; !existOk {
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
|
|
|
+ isAdd = true
|
|
|
+ }
|
|
|
+ existAddDataMap[av] = av
|
|
|
+ } else {
|
|
|
+ if existVal != val {
|
|
|
+ sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = tx.Exec(sql, val, edbInfoId, av).Error
|
|
|
+ //_, err = o.Raw(sql, val, edbInfoId, av).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break
|
|
|
+ } else {
|
|
|
+ preDateDay := preDate.AddDate(0, 0, -1)
|
|
|
+ preDateDayStr := preDateDay.Format(utils.FormatDate)
|
|
|
+ if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ val := TczSub(currentItem.Value, findItem.Value)
|
|
|
+
|
|
|
+ if existVal, ok := existDataMap[av]; !ok {
|
|
|
+ if _, existOk := existAddDataMap[av]; !existOk {
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
|
|
|
+ isAdd = true
|
|
|
+ }
|
|
|
+ existAddDataMap[av] = av
|
|
|
+ } else {
|
|
|
+ if existVal != val {
|
|
|
+ sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = tx.Exec(sql, val, edbInfoId, av).Error
|
|
|
+ //_, err = o.Raw(sql, val, edbInfoId, av).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if isAdd {
|
|
|
+ addSql = strings.TrimRight(addSql, ",")
|
|
|
+ err = tx.Exec(addSql).Error
|
|
|
+ //_, err = o.Raw(addSql).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func TczSub(a, b float64) string {
|
|
|
+ af := decimal.NewFromFloat(float64(a))
|
|
|
+ fmt.Println(af)
|
|
|
+ bf := decimal.NewFromFloat(float64(b))
|
|
|
+ val, _ := af.Sub(bf).Float64()
|
|
|
+ valStr := utils.SubFloatToString(val, 4)
|
|
|
+ return valStr
|
|
|
+}
|
|
|
+
|
|
|
+//刷新全部N数值移动平均计算
|
|
|
+func RefreshAllCalculateNszydpjjs(edbInfoId, source, formulaInt int, fromEdbInfo *edbInfoModel.EdbInfo, edbCode, startDate string) (err error) {
|
|
|
+ tx := global.MYSQL["data"].Begin()
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("RefreshCalculateNszydpjjs Err:" + err.Error())
|
|
|
+ //utils.FileLog.Info("RefreshCalculateNszydpjjs Err:" + err.Error())
|
|
|
+ tx.Rollback()
|
|
|
+ } else {
|
|
|
+ tx.Commit()
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ edbInfoIdStr := strconv.Itoa(edbInfoId)
|
|
|
+ fmt.Println(edbInfoIdStr)
|
|
|
+ //计算数据
|
|
|
+ var condition string
|
|
|
+ var pars []interface{}
|
|
|
+ condition += " AND edb_info_id=? "
|
|
|
+ pars = append(pars, edbInfoId)
|
|
|
+
|
|
|
+ existDataList, err := edbDataModel.GetEdbDataListAll(condition, pars, source, 0)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("existDataList GetEdbDataListAll Err:" + err.Error())
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ existDataMap := make(map[string]*edbDataModel.EdbInfoSearchData)
|
|
|
+ for _, v := range existDataList {
|
|
|
+ existDataMap[v.DataTime] = v
|
|
|
+ }
|
|
|
+
|
|
|
+ //计算来源数据
|
|
|
+ var fromCondition string
|
|
|
+ var fromPars []interface{}
|
|
|
+ fromCondition += " AND edb_info_id=? "
|
|
|
+ fromPars = append(fromPars, fromEdbInfo.EdbInfoId)
|
|
|
+ fromCondition += " AND data_time>=? "
|
|
|
+ fromPars = append(fromPars, startDate)
|
|
|
+
|
|
|
+ fmt.Println("fromPars:", fromPars)
|
|
|
+ fromDataList, err := edbDataModel.GetEdbDataListAll(fromCondition, fromPars, fromEdbInfo.Source, 0)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("from GetEdbDataListAll Err:" + err.Error())
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ var fromDateArr []string
|
|
|
+ fromDataMap := make(map[string]*edbDataModel.EdbInfoSearchData)
|
|
|
+ for _, v := range fromDataList {
|
|
|
+ fromDateArr = append(fromDateArr, v.DataTime)
|
|
|
+ fromDataMap[v.DataTime] = v
|
|
|
+ }
|
|
|
+
|
|
|
+ addSql := ` INSERT INTO edb_data_calculate_nszydpjjs(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
|
|
|
+ var isAdd bool
|
|
|
+ dataTableName := edbDataModel.GetEdbDataTableName(source)
|
|
|
+ arrLen := len(fromDateArr)
|
|
|
+ existAddDataMap := make(map[string]string)
|
|
|
+ for ak, av := range fromDateArr {
|
|
|
+ //处理第一个值
|
|
|
+ var valArr []float64
|
|
|
+ if findItem, ok := fromDataMap[av]; ok {
|
|
|
+ valArr = append(valArr, findItem.Value)
|
|
|
+ } else {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ if ak+1 != arrLen {
|
|
|
+ //处理除第一个值之外的N-1个值
|
|
|
+ for i := 1; i < formulaInt; i++ {
|
|
|
+ arrIndex := ak + i
|
|
|
+ if arrIndex >= arrLen {
|
|
|
+ break
|
|
|
+ }
|
|
|
+ arrVal := fromDateArr[arrIndex]
|
|
|
+ if findItem, ok := fromDataMap[arrVal]; ok {
|
|
|
+ valArr = append(valArr, findItem.Value)
|
|
|
+ } else {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ valArrLen := len(valArr)
|
|
|
+ //var totalVal float64
|
|
|
+ totalVal := decimal.NewFromFloat(0.00)
|
|
|
+ for _, v := range valArr {
|
|
|
+ newDecimal := decimal.NewFromFloat(v)
|
|
|
+ totalVal = totalVal.Add(newDecimal)
|
|
|
+ }
|
|
|
+ af := totalVal //decimal.NewFromFloat(totalVal)
|
|
|
+ bf := decimal.NewFromFloat(float64(valArrLen))
|
|
|
+ val, _ := af.Div(bf).Float64()
|
|
|
+ valStr := utils.SubFloatToString(val, 4)
|
|
|
+
|
|
|
+ if existVal, existOk := existDataMap[av]; !existOk {
|
|
|
+ currentDate, err := time.Parse(utils.FormatDate, av)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ if _, existOk := existAddDataMap[av]; !existOk {
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, valStr)
|
|
|
+ isAdd = true
|
|
|
+ }
|
|
|
+ existAddDataMap[av] = av
|
|
|
+ } else {
|
|
|
+ saveValue := utils.SubFloatToString(existVal.Value, 30)
|
|
|
+ if saveValue != valStr {
|
|
|
+ sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = tx.Exec(sql, val, edbInfoId, av).Error
|
|
|
+ //_, err = o.Raw(sql, val, edbInfoId, av).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if isAdd {
|
|
|
+ addSql = strings.TrimRight(addSql, ",")
|
|
|
+ //utils.FileLog.Info("addSql:" + addSql)
|
|
|
+ //_, err = o.Raw(addSql).Exec()
|
|
|
+ err = tx.Exec(addSql).Error
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+//刷新所有环比值数据
|
|
|
+func RefreshAllCalculateHbz(edbInfoId, source int, fromEdbInfo *edbInfoModel.EdbInfo, edbCode, startDate, endDate string, formulaInt int) (err error) {
|
|
|
+ tx := global.MYSQL["data"].Begin()
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ } else {
|
|
|
+ tx.Commit()
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ edbInfoIdStr := strconv.Itoa(edbInfoId)
|
|
|
+
|
|
|
+ //计算数据
|
|
|
+ var condition string
|
|
|
+ var pars []interface{}
|
|
|
+ condition += " AND edb_info_id=? "
|
|
|
+ pars = append(pars, fromEdbInfo.EdbInfoId)
|
|
|
+
|
|
|
+ if startDate != "" {
|
|
|
+ condition += " AND data_time>=? "
|
|
|
+ pars = append(pars, startDate)
|
|
|
+ }
|
|
|
+ if endDate != "" {
|
|
|
+ condition += " AND data_time<=? "
|
|
|
+ pars = append(pars, endDate)
|
|
|
+ }
|
|
|
+
|
|
|
+ dataList, err := edbDataModel.GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ var dateArr []string
|
|
|
+ dataMap := make(map[string]*edbDataModel.EdbInfoSearchData)
|
|
|
+ for _, v := range dataList {
|
|
|
+ dateArr = append(dateArr, v.DataTime)
|
|
|
+ dataMap[v.DataTime] = v
|
|
|
+ }
|
|
|
+ fmt.Println("source:", source)
|
|
|
+ //获取指标所有数据
|
|
|
+ existDataList := make([]*edbDataModel.EdbDataBase, 0)
|
|
|
+ dataTableName := edbDataModel.GetEdbDataTableName(source)
|
|
|
+ fmt.Println("dataTableName:", dataTableName)
|
|
|
+ sql := `SELECT * FROM %s WHERE edb_info_id=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = global.MYSQL["data"].Raw(sql, edbInfoId).Scan(&existDataList).Error
|
|
|
+ //_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ existDataMap := make(map[string]string)
|
|
|
+ for _, v := range existDataList {
|
|
|
+ existDataMap[v.DataTime] = v.Value
|
|
|
+ }
|
|
|
+ addSql := ` INSERT INTO edb_data_calculate_hbz(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
|
|
|
+ var isAdd bool
|
|
|
+ existMap := make(map[string]string)
|
|
|
+ dataLen := len(dataList)
|
|
|
+ fmt.Println("dataLen:", dataLen)
|
|
|
+ for i := 0; i < dataLen; i++ {
|
|
|
+ j := i + formulaInt
|
|
|
+ if j < dataLen {
|
|
|
+ //当期
|
|
|
+ currentItem := dataList[i]
|
|
|
+ preItem := dataList[j]
|
|
|
+ if currentItem != nil && preItem != nil {
|
|
|
+ existKey := edbCode + currentItem.DataTime
|
|
|
+
|
|
|
+ if _, ok := existMap[existKey]; !ok {
|
|
|
+ currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ val := HbzDiv(currentItem.Value, preItem.Value)
|
|
|
+ if val != "" {
|
|
|
+ if existVal, findOk := existDataMap[currentItem.DataTime]; !findOk {
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, val)
|
|
|
+ isAdd = true
|
|
|
+ } else {
|
|
|
+ if existVal != val {
|
|
|
+ sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = tx.Exec(sql, val, edbInfoId, currentItem.DataTime).Error
|
|
|
+ //_, err = o.Raw(sql, val, edbInfoId, currentItem.DataTime).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ existMap[existKey] = currentItem.DataTime
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if isAdd {
|
|
|
+ addSql = strings.TrimRight(addSql, ",")
|
|
|
+ err = tx.Exec(addSql).Error
|
|
|
+ //_, err = o.Raw(addSql).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+//环比值,current:当期,pre:上期 公式: (当期-上期)/上期
|
|
|
+func HbzDiv(current, pre float64) string {
|
|
|
+ if pre == 0 {
|
|
|
+ return ""
|
|
|
+ }
|
|
|
+ currentVal := decimal.NewFromFloat(float64(current))
|
|
|
+ preVal := decimal.NewFromFloat(float64(pre))
|
|
|
+ val, _ := currentVal.Sub(preVal).Div(preVal).Float64()
|
|
|
+ valStr := utils.SubFloatToString(val, 4)
|
|
|
+ return valStr
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+//刷新所有环差值数据
|
|
|
+func RefreshAllCalculateHcz(edbInfoId, source int, fromEdbInfo *edbInfoModel.EdbInfo, edbCode, startDate, endDate string, formulaInt int) (err error) {
|
|
|
+ tx := global.MYSQL["data"].Begin()
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ } else {
|
|
|
+ tx.Commit()
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ edbInfoIdStr := strconv.Itoa(edbInfoId)
|
|
|
+
|
|
|
+ //计算数据
|
|
|
+ var condition string
|
|
|
+ var pars []interface{}
|
|
|
+ condition += " AND edb_info_id=? "
|
|
|
+ pars = append(pars, fromEdbInfo.EdbInfoId)
|
|
|
+
|
|
|
+ if startDate != "" {
|
|
|
+ condition += " AND data_time>=? "
|
|
|
+ pars = append(pars, startDate)
|
|
|
+ }
|
|
|
+ if endDate != "" {
|
|
|
+ condition += " AND data_time<=? "
|
|
|
+ pars = append(pars, endDate)
|
|
|
+ }
|
|
|
+
|
|
|
+ dataList, err := edbDataModel.GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ var dateArr []string
|
|
|
+ dataMap := make(map[string]*edbDataModel.EdbInfoSearchData)
|
|
|
+ for _, v := range dataList {
|
|
|
+ dateArr = append(dateArr, v.DataTime)
|
|
|
+ dataMap[v.DataTime] = v
|
|
|
+ }
|
|
|
+ fmt.Println("source:", source)
|
|
|
+ //获取指标所有数据
|
|
|
+ existDataList := make([]*edbDataModel.EdbDataBase, 0)
|
|
|
+ dataTableName := edbDataModel.GetEdbDataTableName(source)
|
|
|
+ fmt.Println("dataTableName:", dataTableName)
|
|
|
+ sql := `SELECT * FROM %s WHERE edb_info_id=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = global.MYSQL["data"].Raw(sql, edbInfoId).Scan(&existDataList).Error
|
|
|
+ //_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ existDataMap := make(map[string]string)
|
|
|
+ for _, v := range existDataList {
|
|
|
+ existDataMap[v.DataTime] = v.Value
|
|
|
+ }
|
|
|
+ //fmt.Println("existDataMap:", existDataMap)
|
|
|
+ addSql := ` INSERT INTO edb_data_calculate_hcz(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
|
|
|
+ var isAdd bool
|
|
|
+ existMap := make(map[string]string)
|
|
|
+ dataLen := len(dataList)
|
|
|
+ fmt.Println("dataLen:", dataLen)
|
|
|
+ for i := 0; i < dataLen; i++ {
|
|
|
+ j := i + formulaInt
|
|
|
+ if j < dataLen {
|
|
|
+ //当期
|
|
|
+ currentItem := dataList[i]
|
|
|
+ preItem := dataList[j]
|
|
|
+ if currentItem != nil && preItem != nil {
|
|
|
+ existKey := edbCode + currentItem.DataTime
|
|
|
+ if _, ok := existMap[existKey]; !ok {
|
|
|
+ currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ val := HczDiv(currentItem.Value, preItem.Value)
|
|
|
+ if val != "" {
|
|
|
+ if existVal, findOk := existDataMap[currentItem.DataTime]; !findOk {
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, val)
|
|
|
+ isAdd = true
|
|
|
+ } else {
|
|
|
+ if existVal != val {
|
|
|
+ sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = tx.Exec(sql, val, edbInfoId, currentItem.DataTime).Error
|
|
|
+ //_, err = o.Raw(sql, val, edbInfoId, currentItem.DataTime).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ existMap[existKey] = currentItem.DataTime
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if isAdd {
|
|
|
+ addSql = strings.TrimRight(addSql, ",")
|
|
|
+ err = tx.Exec(addSql).Error
|
|
|
+ //_, err = o.Raw(addSql).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+//环差值,current:当期,pre:上期 公式:当期-上期
|
|
|
+func HczDiv(current, pre float64) string {
|
|
|
+ if pre == 0 {
|
|
|
+ return ""
|
|
|
+ }
|
|
|
+ currentVal := decimal.NewFromFloat(current)
|
|
|
+ preVal := decimal.NewFromFloat(pre)
|
|
|
+ val, _ := currentVal.Sub(preVal).Float64()
|
|
|
+ valStr := utils.SubFloatToString(val, 4)
|
|
|
+ return valStr
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+//刷新所有变频数据
|
|
|
+func RefreshAllCalculateBp(edbInfoId, source int, fromEdbInfo *edbInfoModel.EdbInfo, edbCode, startDate, endDate string) (err error) {
|
|
|
+ tx := global.MYSQL["data"].Begin()
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ } else {
|
|
|
+ tx.Commit()
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ edbInfoIdStr := strconv.Itoa(edbInfoId)
|
|
|
+ //计算数据
|
|
|
+
|
|
|
+ //计算数据
|
|
|
+ var condition string
|
|
|
+ var pars []interface{}
|
|
|
+ condition += " AND edb_info_id=? "
|
|
|
+ pars = append(pars, fromEdbInfo.EdbInfoId)
|
|
|
+
|
|
|
+ if startDate != "" {
|
|
|
+ condition += " AND data_time>=? "
|
|
|
+ pars = append(pars, startDate)
|
|
|
+ }
|
|
|
+ if endDate != "" {
|
|
|
+ condition += " AND data_time<=? "
|
|
|
+ pars = append(pars, endDate)
|
|
|
+ }
|
|
|
+
|
|
|
+ dataList, err := edbDataModel.GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ var dateArr []string
|
|
|
+ dataMap := make(map[string]*edbDataModel.EdbInfoSearchData)
|
|
|
+ for _, v := range dataList {
|
|
|
+ dateArr = append(dateArr, v.DataTime)
|
|
|
+ dataMap[v.DataTime] = v
|
|
|
+ }
|
|
|
+ fmt.Println("source:", source)
|
|
|
+ //获取指标所有数据
|
|
|
+ existDataList := make([]*edbDataModel.EdbDataBase, 0)
|
|
|
+ dataTableName := edbDataModel.GetEdbDataTableName(source)
|
|
|
+ fmt.Println("dataTableName:", dataTableName)
|
|
|
+ sql := `SELECT * FROM %s WHERE edb_info_id=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = tx.Raw(sql, edbInfoId).Scan(&existDataList).Error
|
|
|
+ //_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ existDataMap := make(map[string]string)
|
|
|
+ for _, v := range existDataList {
|
|
|
+ existDataMap[v.DataTime] = v.Value
|
|
|
+ }
|
|
|
+ //fmt.Println("existDataMap:", existDataMap)
|
|
|
+ addSql := ` INSERT INTO edb_data_calculate_bp(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
|
|
|
+ var isAdd bool
|
|
|
+
|
|
|
+ existMap := make(map[string]string)
|
|
|
+ dataLen := len(dataList)
|
|
|
+ for i := 0; i < dataLen; i++ {
|
|
|
+ //当期
|
|
|
+ currentItem := dataList[i]
|
|
|
+ currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
|
|
|
+ var day int
|
|
|
+ var preItem *edbDataModel.EdbInfoSearchData
|
|
|
+ var preDate time.Time
|
|
|
+ if i == 0 {
|
|
|
+ day = int(time.Now().Sub(currentDate).Hours() / float64(24))
|
|
|
+ preDate = time.Now()
|
|
|
+ } else {
|
|
|
+ j := i + 1
|
|
|
+ if j < dataLen {
|
|
|
+ preItem = dataList[j]
|
|
|
+ preDate, _ = time.Parse(utils.FormatDate, preItem.DataTime)
|
|
|
+ day = int(currentDate.Sub(preDate).Hours() / float64(24))
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for k := 0; k <= day; k++ {
|
|
|
+ needDay := preDate.AddDate(0, 0, -k)
|
|
|
+ needDayStr := needDay.Format(utils.FormatDate)
|
|
|
+ existKey := edbCode + needDayStr
|
|
|
+ if _, ok := existMap[existKey]; !ok {
|
|
|
+ timestamp := needDay.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ valStr := decimal.NewFromFloat(currentItem.Value).String()
|
|
|
+ if existVal, ok := existDataMap[needDayStr]; !ok {
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, needDayStr, timestampStr, valStr)
|
|
|
+ } else {
|
|
|
+ if existVal != valStr {
|
|
|
+ sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = tx.Exec(sql, valStr, edbInfoId, needDay).Error
|
|
|
+ //_, err = o.Raw(sql, valStr, edbInfoId, needDay).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ existMap[existKey] = needDayStr
|
|
|
+ }
|
|
|
+ existKey := edbCode + currentItem.DataTime
|
|
|
+ if _, ok := existMap[existKey]; !ok {
|
|
|
+ currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ valStr := decimal.NewFromFloat(currentItem.Value).String()
|
|
|
+ if existVal, ok := existDataMap[currentItem.DataTime]; !ok {
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, valStr)
|
|
|
+ } else {
|
|
|
+ if existVal != valStr {
|
|
|
+ sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ err = tx.Exec(sql, valStr, edbInfoId, currentItem.DataTime).Error
|
|
|
+ //_, err = o.Raw(sql, valStr, edbInfoId, currentItem.DataTime).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ existMap[existKey] = currentItem.DataTime
|
|
|
+ }
|
|
|
+
|
|
|
+ if isAdd {
|
|
|
+ addSql = strings.TrimRight(addSql, ",")
|
|
|
+ err = tx.Exec(addSql).Error
|
|
|
+ //_, err = o.Raw(addSql).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+// RefreshAllCalculateZjpj 刷新所有 直接拼接 数据
|
|
|
+func RefreshAllCalculateZjpj(edbInfo *edbInfoModel.EdbInfo) (err error) {
|
|
|
+ tx := global.MYSQL["data"].Begin()
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ } else {
|
|
|
+ tx.Commit()
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ //查询当前指标现有的数据
|
|
|
+ var condition string
|
|
|
+ var pars []interface{}
|
|
|
+ condition += " AND edb_info_id=? "
|
|
|
+ pars = append(pars, edbInfo.EdbInfoId)
|
|
|
+
|
|
|
+ dataList, err := edbDataModel.GetAllEdbDataCalculateZjpjByEdbInfoId(edbInfo.EdbInfoId)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ var dateArr []string
|
|
|
+ dataMap := make(map[string]*edbDataModel.EdbDataCalculateZjpj)
|
|
|
+ removeDataTimeMap := make(map[string]int) //需要移除的日期数据
|
|
|
+ for _, v := range dataList {
|
|
|
+ dateArr = append(dateArr, v.DataTime)
|
|
|
+ dataMap[v.DataTime] = v
|
|
|
+ removeDataTimeMap[v.DataTime] = 1
|
|
|
+ }
|
|
|
+
|
|
|
+ //查询关联指标信息
|
|
|
+ var existCondition string
|
|
|
+ var existPars []interface{}
|
|
|
+ existCondition += " AND edb_info_id=? "
|
|
|
+ existPars = append(existPars, edbInfo.EdbInfoId)
|
|
|
+ existList, err := edbDataModel.GetEdbInfoCalculateListByCondition(existCondition, existPars)
|
|
|
+ if err != nil {
|
|
|
+ err = errors.New("判断指标是否改变失败,Err:" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ var existItemA, existItemB *edbDataModel.EdbInfoCalculateMapping
|
|
|
+ for _, existItem := range existList {
|
|
|
+ if existItem.FromTag == "A" {
|
|
|
+ existItemA = existItem
|
|
|
+ } else if existItem.FromTag == "B" {
|
|
|
+ existItemB = existItem
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ addDataList := make([]*edbDataModel.EdbDataCalculateZjpj, 0)
|
|
|
+ //第一个指标
|
|
|
+ {
|
|
|
+ var condition string
|
|
|
+ var pars []interface{}
|
|
|
+
|
|
|
+ condition += " AND data_time < ? AND edb_info_id=? "
|
|
|
+ pars = append(pars, edbInfo.CalculateFormula, existItemA.FromEdbInfoId)
|
|
|
+
|
|
|
+ //第一个指标的数据列表
|
|
|
+ firstDataList, tmpErr := edbDataModel.GetEdbDataListAll(condition, pars, existItemA.FromSource, 0)
|
|
|
+ if tmpErr != nil {
|
|
|
+ return tmpErr
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, v := range firstDataList {
|
|
|
+ //校验待删除日期数据里面是否存在该元素,如果存在的话,那么移除该元素
|
|
|
+ if _, ok := removeDataTimeMap[v.DataTime]; ok {
|
|
|
+ delete(removeDataTimeMap, v.DataTime)
|
|
|
+ }
|
|
|
+ //时间戳
|
|
|
+ if edbData, ok := dataMap[v.DataTime]; ok {
|
|
|
+ if edbData.Value != v.Value {
|
|
|
+ //更新指标数据
|
|
|
+ edbData.Value = v.Value
|
|
|
+ tempErr := tx.Model(edbDataModel.EdbDataCalculateZjpj{}).Where("edb_data_id = ?", edbData.EdbDataId).Updates(edbDataModel.EdbDataCalculateZjpj{Value: v.Value}).Error
|
|
|
+ if tempErr != nil {
|
|
|
+ fmt.Println("tmpErr:", tmpErr)
|
|
|
+ }
|
|
|
+ //o.Update(edbData, "Value")
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ //时间戳
|
|
|
+ currentDate, _ := time.Parse(utils.FormatDate, v.DataTime)
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+
|
|
|
+ edbDataZjpj := &edbDataModel.EdbDataCalculateZjpj{
|
|
|
+ EdbInfoId: edbInfo.EdbInfoId,
|
|
|
+ EdbCode: edbInfo.EdbCode,
|
|
|
+ DataTime: v.DataTime,
|
|
|
+ Value: v.Value,
|
|
|
+ Status: 1,
|
|
|
+ CreateTime: time.Now(),
|
|
|
+ ModifyTime: time.Now(),
|
|
|
+ DataTimestamp: timestamp,
|
|
|
+ }
|
|
|
+ addDataList = append(addDataList, edbDataZjpj)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //第二个指标
|
|
|
+ {
|
|
|
+ condition = ``
|
|
|
+ pars = make([]interface{}, 0)
|
|
|
+
|
|
|
+ condition += " AND data_time >= ? AND edb_info_id = ? "
|
|
|
+ pars = append(pars, edbInfo.CalculateFormula, existItemB.FromEdbInfoId)
|
|
|
+
|
|
|
+ //第二个指标的数据列表
|
|
|
+ secondDataList, tmpErr := edbDataModel.GetEdbDataListAll(condition, pars, existItemB.FromSource, 0)
|
|
|
+ if tmpErr != nil {
|
|
|
+ return tmpErr
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, v := range secondDataList {
|
|
|
+ //校验待删除日期数据里面是否存在该元素,如果存在的话,那么移除该元素
|
|
|
+ if _, ok := removeDataTimeMap[v.DataTime]; ok {
|
|
|
+ delete(removeDataTimeMap, v.DataTime)
|
|
|
+ }
|
|
|
+
|
|
|
+ if edbData, ok := dataMap[v.DataTime]; ok {
|
|
|
+ if edbData.Value != v.Value {
|
|
|
+ //更新指标数据
|
|
|
+ edbData.Value = v.Value
|
|
|
+ edbData.ModifyTime = time.Now()
|
|
|
+ tempErr := tx.Model(edbDataModel.EdbDataCalculateZjpj{}).Where("edb_data_id = ?", edbData.EdbDataId).Updates(edbDataModel.EdbDataCalculateZjpj{Value: v.Value, ModifyTime: time.Now()}).Error
|
|
|
+ if tempErr != nil {
|
|
|
+ fmt.Println("tmpErr:", tmpErr)
|
|
|
+ }
|
|
|
+ //_, tmpErr := o.Update(edbData, "Value", "ModifyTime")
|
|
|
+ //if tmpErr != nil {
|
|
|
+ // fmt.Println("tmpErr:", tmpErr)
|
|
|
+ //}
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ //时间戳
|
|
|
+ currentDate, _ := time.Parse(utils.FormatDate, v.DataTime)
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+
|
|
|
+ edbDataZjpj := &edbDataModel.EdbDataCalculateZjpj{
|
|
|
+ EdbInfoId: edbInfo.EdbInfoId,
|
|
|
+ EdbCode: edbInfo.EdbCode,
|
|
|
+ DataTime: v.DataTime,
|
|
|
+ Value: v.Value,
|
|
|
+ Status: 1,
|
|
|
+ CreateTime: time.Now(),
|
|
|
+ ModifyTime: time.Now(),
|
|
|
+ DataTimestamp: timestamp,
|
|
|
+ }
|
|
|
+ addDataList = append(addDataList, edbDataZjpj)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //删除已经不存在的累计同比拼接指标数据(由于同比值当日的数据删除了)
|
|
|
+ {
|
|
|
+ removeDateList := make([]string, 0)
|
|
|
+ for dateTime := range removeDataTimeMap {
|
|
|
+ removeDateList = append(removeDateList, dateTime)
|
|
|
+ }
|
|
|
+ if len(removeDateList) > 0 {
|
|
|
+ removeDateStr := strings.Join(removeDateList, `","`)
|
|
|
+ removeDateStr = `"` + removeDateStr + `"`
|
|
|
+ //如果拼接指标变更了,那么需要删除所有的指标数据
|
|
|
+ tableName := edbDataModel.GetEdbDataTableName(edbInfo.Source)
|
|
|
+ sql := fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time in (%s) `, tableName, removeDateStr)
|
|
|
+
|
|
|
+ err = tx.Exec(sql, edbInfo.EdbInfoId).Error
|
|
|
+ //_, err = o.Raw(sql, edbInfo.EdbInfoId).Exec()
|
|
|
+ if err != nil {
|
|
|
+ err = errors.New("删除不存在的直接拼接指标数据失败,Err:" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //数据入库
|
|
|
+ tmpAddDataList := make([]*edbDataModel.EdbDataCalculateZjpj, 0)
|
|
|
+ for _, v := range addDataList {
|
|
|
+ tmpAddDataList = append(tmpAddDataList, v)
|
|
|
+
|
|
|
+ if len(tmpAddDataList) >= 200 {
|
|
|
+ tmpErr := tx.Create(tmpAddDataList).Error
|
|
|
+ //_, tmpErr := o.InsertMulti(len(tmpAddDataList), tmpAddDataList)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
+ }
|
|
|
+ //重新初始化需要加入的数据切片
|
|
|
+ tmpAddDataList = make([]*edbDataModel.EdbDataCalculateZjpj, 0)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //最后如果还有需要新增的数据,那么就统一入库
|
|
|
+ if len(tmpAddDataList) > 0 {
|
|
|
+ tmpErr := tx.Create(tmpAddDataList).Error
|
|
|
+ //_, tmpErr := o.InsertMulti(len(tmpAddDataList), tmpAddDataList)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// RefreshAllCalculateLjztbpj 刷新所有 累计值同比拼接 数据
|
|
|
+func RefreshAllCalculateLjztbpj(edbInfo *edbInfoModel.EdbInfo) (err error) {
|
|
|
+ tx := global.MYSQL["data"].Begin()
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ tx.Rollback()
|
|
|
+ } else {
|
|
|
+ tx.Commit()
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ //查询当前指标现有的数据
|
|
|
+ var condition string
|
|
|
+ var pars []interface{}
|
|
|
+ condition += " AND edb_info_id=? "
|
|
|
+ pars = append(pars, edbInfo.EdbInfoId)
|
|
|
+
|
|
|
+ //所有的数据
|
|
|
+ dataList, err := edbDataModel.GetAllEdbDataCalculateLjztbpjByEdbInfoId(edbInfo.EdbInfoId)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ //待拼接指标map
|
|
|
+ pjDataMap := make(map[string]float64) //需要入库的数据
|
|
|
+ nowEdbDataMap := make(map[string]float64) //当前指标的数据(已经在库里了,不需要重新)
|
|
|
+ //拼接指标的日期切片数据
|
|
|
+ pjEdbDataTimeList := make([]string, 0)
|
|
|
+
|
|
|
+ dataMap := make(map[string]*edbDataModel.EdbDataCalculateLjztbpj)
|
|
|
+ for _, v := range dataList {
|
|
|
+ pjEdbDataTimeList = append(pjEdbDataTimeList, v.DataTime)
|
|
|
+ dataMap[v.DataTime] = v
|
|
|
+ nowEdbDataMap[v.DataTime] = v.Value
|
|
|
+ }
|
|
|
+
|
|
|
+ //查询关联指标信息
|
|
|
+ var existCondition string
|
|
|
+ var existPars []interface{}
|
|
|
+ existCondition += " AND edb_info_id=? "
|
|
|
+ existPars = append(existPars, edbInfo.EdbInfoId)
|
|
|
+ existList, err := edbDataModel.GetEdbInfoCalculateListByCondition(existCondition, existPars)
|
|
|
+ if err != nil {
|
|
|
+ err = errors.New("判断指标是否改变失败,Err:" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ var existItemA, existItemB *edbDataModel.EdbInfoCalculateMapping
|
|
|
+ for _, existItem := range existList {
|
|
|
+ if existItem.FromTag == "A" {
|
|
|
+ existItemA = existItem
|
|
|
+ } else if existItem.FromTag == "B" {
|
|
|
+ existItemB = existItem
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 原数据开始计算日期
|
|
|
+ startCalculationDate, _ := time.ParseInLocation(utils.FormatDate, edbInfo.CalculateFormula, time.Local)
|
|
|
+
|
|
|
+ //待拼接指标
|
|
|
+ {
|
|
|
+ var condition string
|
|
|
+ var pars []interface{}
|
|
|
+
|
|
|
+ condition += " AND data_time <= ? AND edb_info_id=? "
|
|
|
+ pars = append(pars, startCalculationDate, existItemA.FromEdbInfoId)
|
|
|
+
|
|
|
+ //第一个指标的数据列表
|
|
|
+ firstDataList, tmpErr := edbDataModel.GetEdbDataListAll(condition, pars, existItemA.FromSource, 0)
|
|
|
+ if tmpErr != nil {
|
|
|
+ return tmpErr
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, v := range firstDataList {
|
|
|
+ //时间戳
|
|
|
+ if edbData, ok := dataMap[v.DataTime]; ok {
|
|
|
+ if edbData.Value != v.Value {
|
|
|
+ //更新指标数据
|
|
|
+ edbData.Value = v.Value
|
|
|
+ //tempErr := tx.Model()
|
|
|
+ //o.Update(edbData, "Value")
|
|
|
+ tempErr := tx.Model(edbDataModel.EdbDataCalculateLjztbpj{}).Where("edb_data_id = ?", edbData.EdbDataId).Updates(edbDataModel.EdbDataCalculateLjztbpj{Value: v.Value}).Error
|
|
|
+ if tempErr != nil {
|
|
|
+ fmt.Println("tmpErr:", tmpErr)
|
|
|
+ }
|
|
|
+
|
|
|
+ //将新的数据存入已入库指标map里面,以便后续计算
|
|
|
+ nowEdbDataMap[edbData.DataTime] = v.Value
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //同比值指标map
|
|
|
+ tbzEdbDataMap := make(map[string]float64)
|
|
|
+
|
|
|
+ //同比值日期切片列表
|
|
|
+ tbzEdbDataTimeList := make([]string, 0)
|
|
|
+
|
|
|
+ //同比值指标
|
|
|
+ {
|
|
|
+ var condition string
|
|
|
+ var pars []interface{}
|
|
|
+
|
|
|
+ condition += " AND data_time > ? AND edb_info_id = ? "
|
|
|
+ pars = append(pars, startCalculationDate, existItemB.FromEdbInfoId)
|
|
|
+
|
|
|
+ //第二个指标的数据列表
|
|
|
+ secondDataList, tmpErr := edbDataModel.GetEdbDataListAll(condition, pars, existItemB.FromSource, 0)
|
|
|
+ if tmpErr != nil {
|
|
|
+ return tmpErr
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, v := range secondDataList {
|
|
|
+ tbzEdbDataMap[v.DataTime] = v.Value
|
|
|
+ tbzEdbDataTimeList = append(tbzEdbDataTimeList, v.DataTime)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ sort.Strings(tbzEdbDataTimeList)
|
|
|
+
|
|
|
+ // 遍历现有的数据,判断拼接指标中是否存在该日期数据,如果拼接指标无此数据,那么需要删除该日期数据(日期的判断:需要在开始计算日期之后)
|
|
|
+ removeDateList := make([]string, 0)
|
|
|
+ for nowEdbDate := range nowEdbDataMap {
|
|
|
+ nowEdbDateTime, _ := time.ParseInLocation(utils.FormatDate, nowEdbDate, time.Local)
|
|
|
+ //校验日期 需要 大于 拼接前日期
|
|
|
+ if startCalculationDate.Before(nowEdbDateTime) {
|
|
|
+ if _, ok := tbzEdbDataMap[nowEdbDate]; !ok {
|
|
|
+ // 同比指标中,不存在该日期数据,那么需要移除 现有数据 中该日期的数据
|
|
|
+ removeDateList = append(removeDateList, nowEdbDate)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //待修改的指标数据map(index:日期,value:值)
|
|
|
+ updateEdbDataMap := make(map[string]float64)
|
|
|
+ for _, v := range tbzEdbDataTimeList {
|
|
|
+ tbzDataTime, _ := time.ParseInLocation(utils.FormatDate, v, time.Local)
|
|
|
+
|
|
|
+ //获取拼接指标上一年同一天的数据
|
|
|
+ var pjDataTime time.Time
|
|
|
+ if tbzDataTime.Month() == 2 {
|
|
|
+ pjDataTime = tbzDataTime.AddDate(0, -11, 0)
|
|
|
+ pjDataTime = time.Date(pjDataTime.Year(), pjDataTime.Month(), 1, 0, 0, 0, 0, time.Now().Location()).AddDate(0, 0, -1)
|
|
|
+ } else {
|
|
|
+ pjDataTime = tbzDataTime.AddDate(-1, 0, 0)
|
|
|
+ }
|
|
|
+
|
|
|
+ //校验现有数据中,是否存在该日期的数据,如果存在的话,那么就要去校验 最新计算数据 与 现有数据 是否一致
|
|
|
+ if nowEdbDataValue, isHas := nowEdbDataMap[v]; isHas {
|
|
|
+ //获取去年今日的数据,获取到后,然后是去修改该日期的数据
|
|
|
+ if lastYearEdbDataValue, ok := nowEdbDataMap[pjDataTime.Format(utils.FormatDate)]; ok {
|
|
|
+
|
|
|
+ if v == "2021-08-31" {
|
|
|
+ fmt.Println("进来了")
|
|
|
+ }
|
|
|
+ tbzDataValue := tbzEdbDataMap[v] //同比值
|
|
|
+ currValue := lastYearEdbDataValue * (1 + tbzDataValue/100)
|
|
|
+ currValue, _ = decimal.NewFromFloat(currValue).Truncate(4).Float64() //保留4位小数
|
|
|
+ //如果计算出来的值与库里面的值不匹配,那么就去修改该值
|
|
|
+ if nowEdbDataValue != currValue {
|
|
|
+ //将计算后的数据存入待拼接指标map里面,以便后续计算
|
|
|
+ updateEdbDataMap[v] = currValue
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ //因为 现有数据中 不存在该日期数据,那么需要做新增数据处理
|
|
|
+
|
|
|
+ //如果去年今日存在该数据,那么就去计算当前的数据
|
|
|
+ if pjDataValue, ok := nowEdbDataMap[pjDataTime.Format(utils.FormatDate)]; ok {
|
|
|
+ tbzDataValue := tbzEdbDataMap[v] //同比值
|
|
|
+ currValue := pjDataValue * (1 + tbzDataValue/100)
|
|
|
+
|
|
|
+ currValue, _ = decimal.NewFromFloat(currValue).Truncate(4).Float64()
|
|
|
+ //将计算后的数据存入已入库指标map里面,以便后续计算
|
|
|
+ nowEdbDataMap[v] = currValue
|
|
|
+
|
|
|
+ //将计算后的数据存入待拼接指标map里面,以便后续入库
|
|
|
+ pjDataMap[v] = currValue
|
|
|
+ pjEdbDataTimeList = append(pjEdbDataTimeList, v)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //新增的数据入库
|
|
|
+ {
|
|
|
+ addDataList := make([]*edbDataModel.EdbDataCalculateLjztbpj, 0)
|
|
|
+ for dataTime, dataValue := range pjDataMap {
|
|
|
+ //时间戳
|
|
|
+ currentDate, _ := time.Parse(utils.FormatDate, dataTime)
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+
|
|
|
+ edbDataLjztbpj := &edbDataModel.EdbDataCalculateLjztbpj{
|
|
|
+ EdbInfoId: edbInfo.EdbInfoId,
|
|
|
+ EdbCode: edbInfo.EdbCode,
|
|
|
+ DataTime: dataTime,
|
|
|
+ Value: dataValue,
|
|
|
+ Status: 1,
|
|
|
+ CreateTime: time.Now(),
|
|
|
+ ModifyTime: time.Now(),
|
|
|
+ DataTimestamp: timestamp,
|
|
|
+ }
|
|
|
+ addDataList = append(addDataList, edbDataLjztbpj)
|
|
|
+ }
|
|
|
+
|
|
|
+ tmpAddDataList := make([]*edbDataModel.EdbDataCalculateLjztbpj, 0)
|
|
|
+ for _, v := range addDataList {
|
|
|
+ tmpAddDataList = append(tmpAddDataList, v)
|
|
|
+
|
|
|
+ if len(tmpAddDataList) >= 200 {
|
|
|
+ tmpErr := tx.Create(tmpAddDataList).Error
|
|
|
+ //_, tmpErr := o.InsertMulti(len(tmpAddDataList), tmpAddDataList)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
+ }
|
|
|
+ //重新初始化需要加入的数据切片
|
|
|
+ tmpAddDataList = make([]*edbDataModel.EdbDataCalculateLjztbpj, 0)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //最后如果还有需要新增的数据,那么就统一入库
|
|
|
+ if len(tmpAddDataList) > 0 {
|
|
|
+ tmpErr := tx.Create(tmpAddDataList).Error
|
|
|
+ //_, tmpErr := o.InsertMulti(len(tmpAddDataList), tmpAddDataList)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //删除已经不存在的累计同比拼接指标数据(由于同比值当日的数据删除了)
|
|
|
+ {
|
|
|
+ if len(removeDateList) > 0 {
|
|
|
+ removeDateStr := strings.Join(removeDateList, `","`)
|
|
|
+ removeDateStr = `"` + removeDateStr + `"`
|
|
|
+ //如果拼接指标变更了,那么需要删除所有的指标数据
|
|
|
+ tableName := edbDataModel.GetEdbDataTableName(edbInfo.Source)
|
|
|
+ sql := fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time in (%s) `, tableName, removeDateStr)
|
|
|
+
|
|
|
+ err = tx.Exec(sql, edbInfo.EdbInfoId).Error
|
|
|
+ //_, err = o.Raw(sql, edbInfo.EdbInfoId).Exec()
|
|
|
+ if err != nil {
|
|
|
+ err = errors.New("删除不存在的累计值同比拼接指标数据失败,Err:" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //修改现有的数据中对应的值
|
|
|
+ {
|
|
|
+ tableName := edbDataModel.GetEdbDataTableName(edbInfo.Source)
|
|
|
+ for edbDate, edbDataValue := range updateEdbDataMap {
|
|
|
+ sql := fmt.Sprintf(` UPDATE %s set value = ?,modify_time=now() WHERE edb_info_id = ? and data_time = ? `, tableName)
|
|
|
+
|
|
|
+ err = tx.Exec(sql, edbDataValue, edbInfo.EdbInfoId, edbDate).Error
|
|
|
+ //_, err = o.Raw(sql, edbDataValue, edbInfo.EdbInfoId, edbDate).Exec()
|
|
|
+ if err != nil {
|
|
|
+ err = errors.New("更新现有的累计值同比拼接指标数据失败,Err:" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|