1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676 |
- 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
- }
|