edb_data.go 104 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676
  1. package chart
  2. import (
  3. "crypto/md5"
  4. "encoding/hex"
  5. "encoding/json"
  6. "errors"
  7. "fmt"
  8. "github.com/shopspring/decimal"
  9. "github.com/yidane/formula"
  10. "hongze/hongze_yb/global"
  11. edbDataModel "hongze/hongze_yb/models/tables/edb_data"
  12. edbInfoModel "hongze/hongze_yb/models/tables/edb_info"
  13. "hongze/hongze_yb/utils"
  14. "io/ioutil"
  15. "net/http"
  16. "net/url"
  17. "reflect"
  18. "sort"
  19. "strconv"
  20. "strings"
  21. "time"
  22. )
  23. type EdbDataFromThs struct {
  24. DataVol int64 `json:"dataVol"`
  25. Errmsg string `json:"errmsg"`
  26. Errorcode int64 `json:"errorcode"`
  27. Perf interface{} `json:"perf"`
  28. Tables []struct {
  29. ID []string `json:"id"`
  30. Time []string `json:"time"`
  31. Value []float64 `json:"value"`
  32. } `json:"tables"`
  33. }
  34. func RefreshEdbDataByThs(edbInfoId int, edbCode, startDate, endDate string) (err error) {
  35. HzServerDataUrl := ""
  36. if global.CONFIG.Serve.RunMode == "release" {
  37. HzServerDataUrl = "http://172.19.173.231:7000/"
  38. } else {
  39. HzServerDataUrl = "http://139.196.136.213:7000/"
  40. }
  41. thsUrl := HzServerDataUrl + `edbInfo/ths?EdbCode=%s&StartDate=%s&EndDate=%s`
  42. thsUrl = fmt.Sprintf(thsUrl, edbCode, startDate, endDate)
  43. //utils.FileLog.Info("thsUrl:%s", thsUrl)
  44. reqRes, err := http.Get(thsUrl)
  45. if err != nil {
  46. return
  47. }
  48. defer reqRes.Body.Close()
  49. body, err := ioutil.ReadAll(reqRes.Body)
  50. if err != nil {
  51. return
  52. }
  53. fmt.Println("GetEdbDataByThs body:")
  54. fmt.Println(string(body))
  55. item := new(EdbDataFromThs)
  56. err = json.Unmarshal(body, &item)
  57. if err != nil {
  58. return
  59. }
  60. if item.Errorcode != 0 {
  61. err = errors.New(string(body))
  62. return
  63. }
  64. if len(item.Tables) > 0 {
  65. table := item.Tables[0]
  66. dataLen := len(table.Time)
  67. addSql := ` INSERT INTO edb_data_ths(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  68. nowStr := time.Now().Format(utils.FormatDateTime)
  69. var isAdd bool
  70. for i := 0; i < dataLen; i++ {
  71. eDate := table.Time[i]
  72. sValue := table.Value[i]
  73. count, err := edbDataModel.GetEdbDataThsByCodeAndDate(edbCode, eDate)
  74. if err != nil && err != utils.ErrNoRow {
  75. return err
  76. }
  77. if count <= 0 {
  78. dataTime, err := time.Parse(utils.FormatDate, eDate)
  79. if err != nil {
  80. }
  81. timestamp := dataTime.UnixNano() / 1e6
  82. timeStr := fmt.Sprintf("%d", timestamp)
  83. addSql += "("
  84. addSql += strconv.Itoa(edbInfoId) + "," + "'" + edbCode + "'" + "," + "'" + eDate + "'" + "," + utils.SubFloatToString(sValue, 30) + "," + "'" + nowStr + "'" +
  85. "," + "'" + nowStr + "'"
  86. addSql += "," + "'" + timeStr + "'"
  87. addSql += "),"
  88. isAdd = true
  89. } else {
  90. err = edbDataModel.ModifyEdbDataThs(int64(edbInfoId), eDate, sValue)
  91. if err != nil {
  92. return err
  93. }
  94. }
  95. }
  96. if isAdd {
  97. addSql = strings.TrimRight(addSql, ",")
  98. err = edbDataModel.AddEdbDataThsBySql(addSql)
  99. if err != nil {
  100. fmt.Println("AddEdbDataThs Err", err.Error())
  101. return
  102. }
  103. }
  104. }
  105. return
  106. }
  107. type EdbDataFromWind struct {
  108. Close map[string]float64 `json:"CLOSE"`
  109. Dt map[string]int64 `json:"DT"`
  110. ErrMsg string
  111. }
  112. func RefreshEdbDataByWind(edbInfoId int, edbCode, startDate, endDate string) (err error) {
  113. defer func() {
  114. if err != nil {
  115. fmt.Println("GetEdbDataByWind Err:" + err.Error())
  116. }
  117. }()
  118. fmt.Println("startDate,endDate:",startDate,endDate)
  119. thsUrl := utils.Hz_Data_Url + `edbInfo/wind?EdbCode=%s&StartDate=%s&EndDate=%s`
  120. thsUrl = fmt.Sprintf(thsUrl, edbCode, startDate, endDate)
  121. //utils.FileLog.Info("thsUrl:%s", thsUrl)
  122. reqRes, err := http.Get(thsUrl)
  123. if err != nil {
  124. return
  125. }
  126. defer reqRes.Body.Close()
  127. body, err := ioutil.ReadAll(reqRes.Body)
  128. if err != nil {
  129. return
  130. }
  131. fmt.Println("GetEdbDataByThs body:")
  132. fmt.Println(string(body))
  133. //utils.FileLog.Info("wind result:"+string(body))
  134. item := new(EdbDataFromWind)
  135. err = json.Unmarshal(body, &item)
  136. if err != nil {
  137. return
  138. }
  139. addSql := ` INSERT INTO edb_data_wind(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  140. nowStr := time.Now().Format(utils.FormatDateTime)
  141. var isAdd bool
  142. for k, v := range item.Dt {
  143. timeStr := fmt.Sprintf("%d", v)
  144. v = v / 1000
  145. t := time.Unix(v, 0)
  146. dateTime := t.Format(utils.FormatDate)
  147. val := item.Close[k]
  148. count, err := edbDataModel.GetEdbDataWindByCodeAndDate(edbCode, dateTime)
  149. if err != nil && err != utils.ErrNoRow {
  150. return err
  151. }
  152. if count <= 0 {
  153. isAdd = true
  154. fmt.Println(dateTime)
  155. addSql += "("
  156. addSql += strconv.Itoa(edbInfoId) + "," + "'" + edbCode + "'" + "," + "'" + dateTime + "'" + "," + utils.SubFloatToString(val, 30) + "," + "'" + nowStr + "'" +
  157. "," + "'" + nowStr + "'"
  158. addSql += "," + "'" + timeStr + "'"
  159. addSql += "),"
  160. } else {
  161. err = edbDataModel.ModifyEdbDataWind(int64(edbInfoId), dateTime, val)
  162. if err != nil {
  163. return err
  164. }
  165. }
  166. }
  167. if isAdd {
  168. addSql = strings.TrimRight(addSql, ",")
  169. err = edbDataModel.AddEdbDataWindBySql(addSql)
  170. if err != nil {
  171. fmt.Println("AddEdbDataWind Err", err.Error())
  172. return
  173. }
  174. }
  175. return
  176. }
  177. type EdbDataFromPb struct {
  178. Date map[string]int64 `json:"date"`
  179. Ticker map[string]string `json:"ticker"`
  180. Field map[string]string `json:"field"`
  181. Value map[string]float64 `json:"value"`
  182. }
  183. func RefreshEdbDataByPb(edbInfoId int, edbCode, startDate, endDate string) (err error) {
  184. refreshEdbCode := edbCode
  185. edbCode = url.QueryEscape(edbCode)
  186. bpUrl := utils.Hz_Data_PB_Url + `edbInfo/pb?EdbCode=%s&StartDate=%s&EndDate=%s`
  187. bpUrl = fmt.Sprintf(bpUrl, edbCode, startDate, endDate)
  188. //utils.FileLog.Info("bpUrl+" + bpUrl)
  189. reqRes, err := http.Get(bpUrl)
  190. if err != nil {
  191. return
  192. }
  193. defer reqRes.Body.Close()
  194. body, err := ioutil.ReadAll(reqRes.Body)
  195. if err != nil {
  196. return
  197. }
  198. fmt.Println("RefreshEdbDataByPb body:")
  199. fmt.Println(string(body))
  200. //utils.FileLog.Info("RefreshEdbDataByPb:" + string(body))
  201. item := new(EdbDataFromPb)
  202. err = json.Unmarshal(body, &item)
  203. if err != nil {
  204. return
  205. }
  206. if len(item.Date) > 0 {
  207. dateMap := item.Date
  208. pbList := make([]*edbDataModel.EdbDataPb, 0)
  209. for k, v := range dateMap {
  210. timestamp := v
  211. v = v / 1000
  212. t := time.Unix(v, 0)
  213. dateTime := t.Format(utils.FormatDate)
  214. val := item.Value[k]
  215. field := item.Field[k]
  216. ticker := item.Ticker[k]
  217. if field == "PX_LAST" {
  218. //判断数据是否已经存在
  219. count, err := edbDataModel.GetEdbDataPbByCodeAndDate(refreshEdbCode, dateTime)
  220. if err != nil && err != utils.ErrNoRow {
  221. return err
  222. }
  223. fmt.Println("field:", field)
  224. if count <= 0 {
  225. item := new(edbDataModel.EdbDataPb)
  226. item.EdbCode, _ = url.QueryUnescape(edbCode)
  227. item.EdbInfoId = edbInfoId
  228. item.CreateTime = time.Now()
  229. item.ModifyTime = time.Now()
  230. item.DataTime = dateTime
  231. item.Value = val
  232. item.Status = 1
  233. item.Field = field
  234. item.Ticker = ticker
  235. item.DataTimestamp = timestamp
  236. pbList = append(pbList, item)
  237. } else {
  238. err = edbDataModel.ModifyEdbDataPb(edbInfoId, dateTime, val)
  239. if err != nil {
  240. return err
  241. }
  242. }
  243. }
  244. }
  245. if len(pbList) > 0 {
  246. err = edbDataModel.AddEdbDataPb(pbList)
  247. if err != nil {
  248. fmt.Println("AddEdbDataPb Err", err.Error())
  249. return
  250. }
  251. }
  252. }
  253. return
  254. }
  255. //刷新手工指标数据
  256. func RefreshAllEdbDataByManual(edbInfoId, source int, edbCode string) (err error) {
  257. tx := global.MYSQL["data"].Begin()
  258. defer func() {
  259. if err != nil {
  260. tx.Rollback()
  261. } else {
  262. tx.Commit()
  263. }
  264. }()
  265. if err != nil {
  266. return
  267. }
  268. edbInfoIdStr := strconv.Itoa(edbInfoId)
  269. //计算数据
  270. var condition string
  271. var pars []interface{}
  272. if edbCode != "" {
  273. condition += " AND TRADE_CODE=? "
  274. pars = append(pars, edbCode)
  275. }
  276. manualDataList, err := edbDataModel.GetEdbdataManualByTradeCode(condition, pars)
  277. //获取指标所有数据
  278. existDataList := make([]*edbDataModel.EdbDataBase, 0)
  279. dataTableName := edbDataModel.GetEdbDataTableName(source)
  280. sql := `SELECT * FROM %s WHERE edb_info_id=? `
  281. sql = fmt.Sprintf(sql, dataTableName)
  282. err = global.MYSQL["data"].Raw(sql, edbInfoId).Scan(&existDataList).Error
  283. //_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
  284. if err != nil {
  285. return err
  286. }
  287. existDataMap := make(map[string]*edbDataModel.EdbDataBase)
  288. for _, v := range existDataList {
  289. existDataMap[v.DataTime] = v
  290. }
  291. addSql := ` INSERT INTO edb_data_manual(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  292. var isAdd bool
  293. manualMap := make(map[string]*edbDataModel.ManualEdbdata)
  294. for _, v := range manualDataList {
  295. item := v
  296. if findItem, ok := existDataMap[v.Dt]; !ok {
  297. eDate := item.Dt
  298. sValue := item.Close
  299. dataTime, err := time.Parse(utils.FormatDate, eDate)
  300. if err != nil {
  301. return err
  302. }
  303. timestamp := dataTime.UnixNano() / 1e6
  304. timeStr := fmt.Sprintf("%d", timestamp)
  305. addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
  306. isAdd = true
  307. } else {
  308. if findItem.Value != item.Close {
  309. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  310. sql = fmt.Sprintf(sql, dataTableName)
  311. err = tx.Exec(sql, item.Close, edbInfoId, item.Dt).Error
  312. //err = global.MYSQL["data"].Exec(sql, item.Close, edbInfoId, item.Dt).Error
  313. //_, err = o.Raw(sql, item.Close, edbInfoId, item.Dt).Exec()
  314. if err != nil {
  315. return err
  316. }
  317. }
  318. }
  319. manualMap[v.Dt] = v
  320. }
  321. for _, v := range existDataList {
  322. if _, ok := manualMap[v.DataTime]; !ok {
  323. go func() {
  324. sql := ` DELETE FROM %s WHERE edb_data_id=? `
  325. tableName := edbDataModel.GetEdbDataTableName(utils.DATA_SOURCE_MANUAL)
  326. sql = fmt.Sprintf(sql, tableName)
  327. err = tx.Exec(sql, v.EdbInfoId).Error
  328. //err = global.MYSQL["data"].Exec(sql, edbDataId).Error
  329. }()
  330. //go DeleteEdbDataByIdAndSource(v.EdbDataId, utils.DATA_SOURCE_MANUAL)
  331. }
  332. }
  333. if isAdd {
  334. addSql = strings.TrimRight(addSql, ",")
  335. err = tx.Exec(addSql).Error
  336. //_, err = o.Raw(addSql).Exec()
  337. if err != nil {
  338. fmt.Println("RefreshAllEdbDataByManual add Err", err.Error())
  339. return
  340. }
  341. }
  342. return
  343. }
  344. func DeleteEdbDataByIdAndSource(edbDataId, source int) (err error) {
  345. sql := ` DELETE FROM %s WHERE edb_data_id=? `
  346. tableName := edbDataModel.GetEdbDataTableName(source)
  347. sql = fmt.Sprintf(sql, tableName)
  348. err = global.MYSQL["data"].Exec(sql, edbDataId).Error
  349. return
  350. }
  351. func GetAddSql(edbInfoId, edbCode, dataTime, timestampStr string, value string) (addSql string) {
  352. nowStr := time.Now().Format(utils.FormatDateTime)
  353. addSql += "("
  354. addSql += edbInfoId + "," + "'" + edbCode + "'" + "," + "'" + dataTime + "'" + "," + value + "," + "'" + nowStr + "'" +
  355. "," + "'" + nowStr + "'"
  356. addSql += "," + "'" + timestampStr + "'"
  357. addSql += "),"
  358. return
  359. }
  360. //刷新隆众指标数据
  361. func RefreshEdbDataByLz(edbInfoId int, edbCode, startDate, endDate string) (err error) {
  362. tx := global.MYSQL["data"].Begin()
  363. defer func() {
  364. if err != nil {
  365. tx.Rollback()
  366. } else {
  367. tx.Commit()
  368. }
  369. }()
  370. if err != nil {
  371. return
  372. }
  373. edbInfoIdStr := strconv.Itoa(edbInfoId)
  374. //计算数据
  375. var condition string
  376. var pars []interface{}
  377. if edbCode != "" {
  378. condition += " AND b.lz_code=? "
  379. pars = append(pars, edbCode)
  380. }
  381. if startDate != "" {
  382. condition += " AND a.data_time>=? "
  383. pars = append(pars, startDate)
  384. }
  385. if endDate != "" {
  386. condition += " AND a.data_time<=? "
  387. pars = append(pars, endDate)
  388. }
  389. lzDataList, err := edbDataModel.GetLzSurveyDataByTradeCode(condition, pars)
  390. addSql := ` INSERT INTO edb_data_lz(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  391. var isAdd bool
  392. for _, v := range lzDataList {
  393. item := v
  394. count, err := edbDataModel.GetEdbDataLzByCodeAndDate(edbCode, v.DataTime)
  395. if err != nil && err != utils.ErrNoRow {
  396. return err
  397. }
  398. if count <= 0 {
  399. nowStr := time.Now().Format(utils.FormatDateTime)
  400. eDate := item.DataTime
  401. sValue := item.InputValue
  402. dataTime, err := time.Parse(utils.FormatDate, eDate)
  403. if err != nil {
  404. return err
  405. }
  406. timestamp := dataTime.UnixNano() / 1e6
  407. timeStr := fmt.Sprintf("%d", timestamp)
  408. addSql += "("
  409. addSql += edbInfoIdStr + "," + "'" + edbCode + "'" + "," + "'" + eDate + "'" + "," + sValue + "," + "'" + nowStr + "'" +
  410. "," + "'" + nowStr + "'" + "," + "'" + timeStr + "'"
  411. addSql += "),"
  412. isAdd = true
  413. } else {
  414. //edbInfoId int64, dataTime, value string
  415. //o := orm.NewOrm()
  416. //o.Using("data")
  417. sql := ` UPDATE edb_data_lz SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  418. err = tx.Exec(sql, v.InputValue, int64(edbInfoId), v.DataTime).Error
  419. //_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
  420. //err = ModifyEdbDataLz(int64(edbInfoId), v.DataTime, v.InputValue)
  421. if err != nil {
  422. return err
  423. }
  424. }
  425. }
  426. if isAdd {
  427. addSql = strings.TrimRight(addSql, ",")
  428. err = tx.Exec(addSql).Error
  429. //_, err = o.Raw(addSql).Exec()
  430. if err != nil {
  431. return err
  432. }
  433. }
  434. return
  435. }
  436. //全部刷新有色数据
  437. func RefreshAllEdbDataByYs(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
  438. tx := global.MYSQL["data"].Begin()
  439. defer func() {
  440. if err != nil {
  441. tx.Rollback()
  442. } else {
  443. tx.Commit()
  444. }
  445. }()
  446. if err != nil {
  447. return
  448. }
  449. edbInfoIdStr := strconv.Itoa(edbInfoId)
  450. //获取数据
  451. err = SyncSmmIndexDataBase(edbCode, startDate, endDate)
  452. if err != nil {
  453. err = errors.New("SyncSmmIndexDataBase Err:" + err.Error())
  454. return err
  455. }
  456. //获取已存在指标所有数据
  457. existDataList := make([]*edbDataModel.EdbDataBase, 0)
  458. dataTableName := edbDataModel.GetEdbDataTableName(source)
  459. sql := `SELECT * FROM %s WHERE edb_info_id=? `
  460. sql = fmt.Sprintf(sql, dataTableName)
  461. err = global.MYSQL["data"].Raw(sql, edbInfoId).Scan(&existDataList).Error
  462. //_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
  463. if err != nil {
  464. return err
  465. }
  466. existDataMap := make(map[string]string)
  467. for _, v := range existDataList {
  468. existDataMap[v.DataTime] = v.Value
  469. }
  470. smmDateList := make([]*edbDataModel.BaseFromSmmDataSimple, 0)
  471. smmSql := ` SELECT * FROM base_from_smm_data WHERE index_code=? AND data_time>=? `
  472. err = global.MYSQL["data"].Raw(smmSql, edbCode, startDate).Scan(&existDataList).Error
  473. //_, err = o.Raw(smmSql, edbCode, startDate).QueryRows(&smmDateList)
  474. if err != nil {
  475. return err
  476. }
  477. addSql := ` INSERT INTO edb_data_ys(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  478. var isAdd bool
  479. for _, sv := range smmDateList {
  480. if existVal, ok := existDataMap[sv.DataTime]; !ok {
  481. dataTime, err := time.Parse(utils.FormatDate, sv.DataTime)
  482. if err != nil {
  483. return err
  484. }
  485. timestamp := dataTime.UnixNano() / 1e6
  486. timeStr := fmt.Sprintf("%d", timestamp)
  487. addSql += GetAddSql(edbInfoIdStr, edbCode, sv.DataTime, timeStr, sv.Value)
  488. isAdd = true
  489. } else {
  490. if existVal != sv.Value {
  491. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  492. sql = fmt.Sprintf(sql, dataTableName)
  493. err = tx.Exec(sql, sv.Value, edbInfoId, sv.DataTime).Error
  494. //_, err = o.Raw(sql, sv.Value, edbInfoId, sv.DataTime).Exec()
  495. if err != nil {
  496. return err
  497. }
  498. }
  499. }
  500. }
  501. if isAdd {
  502. addSql = strings.TrimRight(addSql, ",")
  503. err = tx.Exec(addSql).Error
  504. //_, err = o.Raw(addSql).Exec()
  505. if err != nil {
  506. return err
  507. }
  508. }
  509. return
  510. }
  511. const (
  512. dataUrl = "https://dataapi.smm.cn/GetData/" //data url (中文)
  513. //dataUrl = "https://dataapi.smm.cn/GetDataEn/" //data url (english edition)
  514. authUrl = "https://platform.smm.cn/usercenter/auth" // auth url (for all)
  515. )
  516. type TokenResp struct {
  517. Code int `json:"Code"`
  518. Msg string `json:"Msg"`
  519. Data TokenData `json:"Data"`
  520. }
  521. type TokenData struct {
  522. Token string `json:"Token"`
  523. }
  524. //获取token
  525. func getToken(userName string, password string) (string, error) {
  526. encryptAuth := md5.New()
  527. encryptAuth.Write([]byte(password)) //encrypt password with md5
  528. newPassword := hex.EncodeToString(encryptAuth.Sum(nil))
  529. resp, err := http.PostForm(authUrl, url.Values{"user_name": {userName}, "password": {newPassword}})
  530. if err != nil {
  531. return "", err
  532. }
  533. defer resp.Body.Close()
  534. body, err := ioutil.ReadAll(resp.Body)
  535. if err != nil {
  536. fmt.Println("reponse error", err)
  537. return "", err
  538. }
  539. var bodyJsonContent TokenResp
  540. if err = json.Unmarshal([]byte(body), &bodyJsonContent); err != nil {
  541. fmt.Println(err, "unmarsal failure")
  542. return "", err
  543. }
  544. var token string
  545. if bodyJsonContent.Code == 0 {
  546. token = bodyJsonContent.Data.Token
  547. }
  548. //print(token)
  549. return token, nil
  550. }
  551. func SyncSmmIndexDataBase(edbCode, startDate, endDate string) (err error) {
  552. //utils.FileLog.Info("start:" + time.Now().Format(utils.FormatDateTime))
  553. var smmCode string
  554. if strings.Contains(edbCode, "#") {
  555. smmCode = strings.Split(edbCode, "#")[0]
  556. } else {
  557. smmCode = edbCode
  558. }
  559. token, err := getToken("pqian@hzinsights.com", "hz123456")
  560. if err != nil {
  561. fmt.Println(err)
  562. return
  563. }
  564. baseSmmItem, err := edbDataModel.GetBaseFromSmmBySmmCode(smmCode)
  565. if err != nil {
  566. fmt.Println(err)
  567. return
  568. }
  569. if baseSmmItem == nil {
  570. err = errors.New("GetBaseFromSmmBySmmCode Err:" + err.Error())
  571. return
  572. }
  573. smmIndexAll, err := edbDataModel.GetBaseFromSmmIndexBySmmCode(smmCode)
  574. if err != nil {
  575. fmt.Println("GetBaseFromSmmIndex Err:" + err.Error())
  576. return
  577. }
  578. existIndexMap := make(map[string]*edbDataModel.BaseFromSmmIndex)
  579. for _, item := range smmIndexAll {
  580. existIndexMap[item.IndexCode] = item
  581. }
  582. ysItem, err := getApiData(token, edbCode, startDate, endDate)
  583. if err != nil {
  584. fmt.Println(err)
  585. return
  586. }
  587. if ysItem != nil && ysItem.Code == 200 {
  588. frequency := ysItem.Data.Frequency
  589. indexMap := make(map[string]int)
  590. smmIndexIdMap := make(map[int]int)
  591. indexCodeMap := make(map[int]string)
  592. indexKey := 0
  593. var isDateIndex int
  594. for fk, fv := range ysItem.Data.Field {
  595. if fv.IsDate == "1" {
  596. isDateIndex = fk
  597. } else {
  598. if !strings.Contains(fv.Name, "产品名称") &&
  599. !strings.Contains(fv.Name, "单位") &&
  600. !strings.Contains(fv.Name, "时间") &&
  601. !strings.Contains(fv.Name, "备注") {
  602. indexMap[fv.DBColName] = fk
  603. indexKey += 1
  604. indexCode := smmCode + "#" + strconv.Itoa(indexKey)
  605. if findItem, ok := existIndexMap[indexCode]; !ok {
  606. ssmIndex := new(edbDataModel.BaseFromSmmIndex)
  607. ssmIndex.Interface = smmCode
  608. ssmIndex.Name = baseSmmItem.Name
  609. ssmIndex.IndexCode = indexCode
  610. ssmIndex.IndexName = baseSmmItem.Name + "_" + fv.Name
  611. ssmIndex.Type1 = baseSmmItem.Type1
  612. ssmIndex.Type2 = baseSmmItem.Type2
  613. ssmIndex.Type3 = baseSmmItem.Type3
  614. ssmIndex.Frequency = frequency
  615. ssmIndex.Unit = fv.Unit
  616. ssmIndex.ApiStartTime = baseSmmItem.ApiStartTime
  617. ssmIndex.ApiUpdateTime = baseSmmItem.ApiUpdateTime
  618. ssmIndex.StartTime = baseSmmItem.StartTime
  619. ssmIndex.FinishTime = baseSmmItem.FinishTime
  620. ssmIndex.CreateTime = time.Now()
  621. ssmIndex.ModifyTime = time.Now()
  622. lastIndexId, err := edbDataModel.AddBaseFromSmmIndex(ssmIndex)
  623. if err != nil {
  624. err = errors.New("AddBaseFromSmmIndex Err:" + err.Error())
  625. return err
  626. }
  627. smmIndexIdMap[fk] = int(lastIndexId)
  628. indexCodeMap[fk] = indexCode
  629. } else {
  630. smmIndexIdMap[fk] = findItem.BaseFromSmmIndexId
  631. indexCodeMap[fk] = findItem.IndexCode
  632. }
  633. }
  634. }
  635. }
  636. existDataMap := make(map[string]*edbDataModel.BaseFromSmmData)
  637. for _, mv := range indexCodeMap {
  638. indexCode := mv
  639. dataAllList, err := edbDataModel.GetBaseFromSmmDataAllByIndexCode(indexCode)
  640. if err != nil {
  641. err = errors.New("GetBaseFromSmmData Err:" + err.Error())
  642. return err
  643. }
  644. for _, item := range dataAllList {
  645. key := item.IndexCode + item.DataTime
  646. existDataMap[key] = item
  647. }
  648. }
  649. addExistDataMap := make(map[string]string)
  650. for _, dv := range ysItem.Data.Content {
  651. var dataTime string
  652. dataTime = dv[isDateIndex]
  653. if strings.Contains(dataTime, "Q1") {
  654. dataTime = strings.Replace(dataTime, "Q1", "-01", -1)
  655. dataTime += "-31"
  656. }
  657. if strings.Contains(dataTime, "Q2") {
  658. dataTime = strings.Replace(dataTime, "Q2", "-06", -1)
  659. dataTime += "-30"
  660. }
  661. if strings.Contains(dataTime, "Q3") {
  662. dataTime = strings.Replace(dataTime, "Q3", "-09", -1)
  663. dataTime += "-30"
  664. }
  665. if strings.Contains(dataTime, "Q4") {
  666. dataTime = strings.Replace(dataTime, "Q4", "-12", -1)
  667. dataTime += "-31"
  668. }
  669. if strings.Contains(dataTime, "H1") {
  670. dataTime = strings.Replace(dataTime, "H1", "-06", -1)
  671. dataTime += "-30"
  672. }
  673. if strings.Contains(dataTime, "H2") {
  674. dataTime = strings.Replace(dataTime, "H2", "-12", -1)
  675. dataTime += "-31"
  676. }
  677. if frequency == "月" {
  678. monthDate, err := time.Parse("2006-01", dataTime)
  679. if err != nil {
  680. fmt.Println("time.Parse:" + err.Error())
  681. }
  682. lastTime := monthDate.AddDate(0, 1, -1)
  683. lastYear, lastMonth, lastDay := lastTime.Date()
  684. var lastDate string
  685. if int(lastMonth) < 10 {
  686. lastDate = strconv.Itoa(lastYear) + "-" + "0" + strconv.Itoa(int(lastMonth)) + "-" + strconv.Itoa(lastDay)
  687. } else {
  688. lastDate = strconv.Itoa(lastYear) + "-" + strconv.Itoa(int(lastMonth)) + "-" + strconv.Itoa(lastDay)
  689. }
  690. dataTime = lastDate
  691. } else if frequency == "年" {
  692. dataTime = dataTime + "-12-31"
  693. }
  694. saveDataTime, err := time.Parse(utils.FormatDate, dataTime)
  695. if err != nil {
  696. err = errors.New("time.Parse Err:" + err.Error())
  697. return err
  698. }
  699. timestamp := saveDataTime.UnixNano() / 1e6
  700. //循环指标
  701. for _, v := range indexMap {
  702. indexCode := indexCodeMap[v]
  703. smmIndexId := smmIndexIdMap[v]
  704. dataVal := dv[v]
  705. if indexCode != "" {
  706. key := indexCode + dataTime
  707. val := strings.Replace(dataVal, ",", "", -1)
  708. if findData, dataOk := existDataMap[key]; !dataOk {
  709. if _, addOK := addExistDataMap[key]; !addOK {
  710. if val != "" && val != "-" {
  711. dataItem := new(edbDataModel.BaseFromSmmData)
  712. dataItem.BaseFromSmmIndexId = smmIndexId
  713. dataItem.IndexCode = indexCode
  714. dataItem.DataTime = dataTime
  715. dataItem.Value = val
  716. dataItem.CreateTime = time.Now()
  717. dataItem.ModifyTime = time.Now()
  718. dataItem.DataTimestamp = timestamp
  719. _, err = edbDataModel.AddBaseFromSmmData(dataItem)
  720. if err != nil && !strings.Contains(err.Error(), "idx_index_code_date") {
  721. fmt.Println("AddBaseFromSmmData Err:" + err.Error())
  722. err = errors.New("AddBaseFromSmmData Err:" + err.Error())
  723. return err
  724. }
  725. }
  726. }
  727. } else {
  728. if findData != nil && findData.Value != val { //修改
  729. if _, addOK := addExistDataMap[key]; !addOK {
  730. if val != "" && val != "-" {
  731. err = edbDataModel.ModifyBaseFromSmmData(findData.SmmDataId, val)
  732. if err != nil {
  733. err = errors.New("ModifyBaseFromSmmData Err:" + err.Error())
  734. return err
  735. }
  736. }
  737. }
  738. }
  739. }
  740. addExistDataMap[key] = key
  741. }
  742. }
  743. }
  744. //修改数据开始,结束日期
  745. {
  746. indexList, err := edbDataModel.GetBaseFromSmmIndexBySmmCode(smmCode)
  747. if err != nil {
  748. fmt.Println("GetBaseFromSmmIndexBySmmCode Err:" + err.Error())
  749. }
  750. for _, sv := range indexList {
  751. minDate, maxDate, err := edbDataModel.GetBaseFromSmmMaxOrMinDate(sv.IndexCode)
  752. if err != nil {
  753. fmt.Println("GetEdbDataSmmMaxOrMinDate Err:" + err.Error())
  754. } else {
  755. err = edbDataModel.ModifyBaseFromSmmMinDateAndMaxDate(sv.BaseFromSmmIndexId, minDate, maxDate)
  756. if err != nil {
  757. fmt.Println("ModifyBaseFromSmmMinDateAndMaxDate Err:" + err.Error())
  758. }
  759. }
  760. }
  761. }
  762. }
  763. return
  764. }
  765. /*
  766. * request data
  767. * sdatetime,edatetime ==>format:yyyy-mm-dd,
  768. * apiName ==> data.metal.com(for english)/data.smm.cn (for chinese)
  769. */
  770. func getApiData(token string, apiName string, sdatetime string, edatetime string) (item *edbDataModel.YsResult, err error) {
  771. reqUrl := dataUrl + apiName
  772. resp, err := http.PostForm(reqUrl, url.Values{"token": {token}, "sdatetime": {sdatetime}, "edatetime": {edatetime}})
  773. if err != nil {
  774. return nil, err
  775. }
  776. defer resp.Body.Close()
  777. body, err := ioutil.ReadAll(resp.Body)
  778. if err != nil {
  779. fmt.Println("response error")
  780. return nil, err
  781. }
  782. //utils.FileLog.Info("ys result:" + string(body))
  783. dataJsonContent := new(edbDataModel.YsResult)
  784. if err = json.Unmarshal([]byte(body), &dataJsonContent); err != nil {
  785. fmt.Println(err, "data unmarshal failure")
  786. return nil, err
  787. }
  788. if dataJsonContent.Code == 200 && len(dataJsonContent.Data.Content) > 0 {
  789. return dataJsonContent, nil
  790. } else {
  791. err = errors.New("code:" + strconv.Itoa(int(dataJsonContent.Code)) + "msg:" + dataJsonContent.Msg)
  792. }
  793. return nil, nil
  794. }
  795. func RefreshEdbDataByGl(edbInfoId int, edbCode, startDate, endDate string) (err error) {
  796. tx := global.MYSQL["data"].Begin()
  797. defer func() {
  798. if err != nil {
  799. tx.Rollback()
  800. } else {
  801. tx.Commit()
  802. }
  803. }()
  804. if err != nil {
  805. return
  806. }
  807. edbInfoIdStr := strconv.Itoa(edbInfoId)
  808. //计算数据
  809. var condition string
  810. var pars []interface{}
  811. if edbCode != "" {
  812. condition += " AND INDEX_CODE=? "
  813. pars = append(pars, edbCode)
  814. }
  815. if startDate != "" {
  816. condition += " AND DATA_DATE>=? "
  817. pars = append(pars, startDate)
  818. }
  819. if endDate != "" {
  820. condition += " AND DATA_DATE<=? "
  821. pars = append(pars, endDate)
  822. }
  823. glDataList, err := edbDataModel.GetGlDataByTradeCode(condition, pars)
  824. addSql := ` INSERT INTO edb_data_gl(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  825. var isAdd bool
  826. existMap := make(map[string]string)
  827. for _, v := range glDataList {
  828. item := v
  829. if _, ok := existMap[v.DataTime]; !ok {
  830. count, err := edbDataModel.GetEdbDataGlByCodeAndDate(edbCode, v.DataTime)
  831. if err != nil && err != utils.ErrNoRow {
  832. return err
  833. }
  834. if count <= 0 {
  835. eDate := item.DataTime
  836. sValue := item.InputValue
  837. if sValue != "" {
  838. dataTime, err := time.Parse(utils.FormatDate, eDate)
  839. if err != nil {
  840. return err
  841. }
  842. timestamp := dataTime.UnixNano() / 1e6
  843. timeStr := fmt.Sprintf("%d", timestamp)
  844. addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
  845. isAdd = true
  846. }
  847. } else {
  848. updateSql := ` UPDATE edb_data_gl SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  849. //err = global.MYSQL["data"].Exec(sql, value, edbInfoId, dataTime).Error
  850. err = tx.Exec(updateSql, v.InputValue, edbInfoId, v.DataTime).Error
  851. //err = edbDataModel.ModifyEdbDataGl(int64(edbInfoId), v.DataTime, v.InputValue)
  852. if err != nil {
  853. return err
  854. }
  855. }
  856. }
  857. existMap[v.DataTime] = v.InputValue
  858. }
  859. if isAdd {
  860. addSql = strings.TrimRight(addSql, ",")
  861. err = tx.Exec(addSql).Error
  862. //_, err = o.Raw(addSql).Exec()
  863. if err != nil {
  864. return err
  865. }
  866. }
  867. return
  868. }
  869. // RefreshEdbDataByZz 刷新路透社数据
  870. func RefreshAllEdbDataByLt(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
  871. // 获取路透社数据
  872. ltDataList, err := QueryEdbDataByLt(edbCode, startDate, endDate)
  873. if err != nil {
  874. return
  875. }
  876. tx := global.MYSQL["data"].Begin()
  877. defer func() {
  878. if err != nil {
  879. tx.Rollback()
  880. } else {
  881. tx.Commit()
  882. }
  883. }()
  884. //获取指标所有数据
  885. dataList := make([]*edbDataModel.EdbDataBase, 0)
  886. dataTableName := edbDataModel.GetEdbDataTableName(source)
  887. sql := `SELECT * FROM %s WHERE edb_info_id=? `
  888. sql = fmt.Sprintf(sql, dataTableName)
  889. err = global.MYSQL["data"].Raw(sql, dataTableName).Scan(&dataList).Error
  890. //_, err = o.Raw(sql, edbInfoId).QueryRows(&dataList)
  891. if err != nil {
  892. return err
  893. }
  894. dataMap := make(map[string]string)
  895. for _, v := range dataList {
  896. dataMap[v.DataTime] = v.Value
  897. }
  898. edbInfoIdStr := strconv.Itoa(edbInfoId)
  899. addSql := ` INSERT INTO edb_data_lt(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  900. var isAdd bool
  901. for timestampInt, edbValue := range ltDataList {
  902. dataTime := time.Unix(timestampInt/1000, 0)
  903. //校验数据类型对不对
  904. valType := reflect.TypeOf(edbValue)
  905. if valType == nil {
  906. continue
  907. }
  908. if valType.String() != "float64" {
  909. continue
  910. }
  911. sValue := edbValue.(float64)
  912. eDate := dataTime.Format(utils.FormatDate)
  913. if err != nil {
  914. return err
  915. }
  916. saveValue := utils.SubFloatToString(sValue, 30)
  917. if existVal, ok := dataMap[eDate]; !ok {
  918. timestamp := dataTime.UnixNano() / 1e6
  919. timeStr := fmt.Sprintf("%d", timestamp)
  920. addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, saveValue)
  921. isAdd = true
  922. } else {
  923. if existVal != saveValue {
  924. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  925. sql = fmt.Sprintf(sql, dataTableName)
  926. err = tx.Exec(sql, sValue, edbInfoId, eDate).Error
  927. //_, err = o.Raw(sql, sValue, edbInfoId, eDate).Exec()
  928. if err != nil {
  929. return err
  930. }
  931. }
  932. }
  933. }
  934. if isAdd {
  935. addSql = strings.TrimRight(addSql, ",")
  936. err = tx.Exec(addSql).Error
  937. //_, err = o.Raw(addSql).Exec()
  938. if err != nil {
  939. fmt.Println("RefreshAllEdbDataByLt add Err", err.Error())
  940. return
  941. }
  942. }
  943. return
  944. }
  945. // QueryEdbDataByLt 获取路透社数据
  946. func QueryEdbDataByLt(edbCode, startDate, endDate string) (dataList map[int64]interface{}, err error) {
  947. dataList = make(map[int64]interface{})
  948. ltUrl := utils.Hz_Data_LT_Url + `edbInfo/ek?EdbCode=%s&StartDate=%s&EndDate=%s`
  949. ltUrl = fmt.Sprintf(ltUrl, edbCode, startDate, endDate)
  950. //utils.FileLogData.Info("ltUrl:%s", ltUrl)
  951. //body, err := http.Get(ltUrl)
  952. reqRes, err := http.Get(ltUrl)
  953. if err != nil {
  954. return
  955. }
  956. defer reqRes.Body.Close()
  957. body, err := ioutil.ReadAll(reqRes.Body)
  958. if err != nil {
  959. return
  960. }
  961. //utils.FileLogData.Info("lt result:%s", string(body))
  962. //if err != nil {
  963. // return
  964. //}
  965. //fmt.Println(string(body))
  966. item := new(edbDataModel.EdbDataFromLt)
  967. err = json.Unmarshal(body, &item)
  968. if err != nil {
  969. return
  970. }
  971. dataList = item.Close
  972. return
  973. }
  974. // RefreshEdbDataByZz 刷新郑商所指标数据
  975. func RefreshEdbDataByZz(edbInfoId int, edbCode, startDate, endDate string) (err error) {
  976. tx := global.MYSQL["data"].Begin()
  977. defer func() {
  978. if err != nil {
  979. tx.Rollback()
  980. } else {
  981. tx.Commit()
  982. }
  983. }()
  984. if err != nil {
  985. return
  986. }
  987. var suffix string
  988. if strings.Contains(edbCode, "deal") {
  989. suffix = "deal"
  990. } else if strings.Contains(edbCode, "buy") {
  991. suffix = "buy"
  992. } else if strings.Contains(edbCode, "sold") {
  993. suffix = "sold"
  994. }
  995. edbInfoIdStr := strconv.Itoa(edbInfoId)
  996. //计算数据
  997. var condition string
  998. var pars []interface{}
  999. if edbCode != "" {
  1000. if suffix == "deal" {
  1001. condition += " AND deal_code=? "
  1002. } else if suffix == "buy" {
  1003. condition += " AND buy_code=? "
  1004. } else {
  1005. condition += " AND sold_code=? "
  1006. }
  1007. pars = append(pars, edbCode)
  1008. }
  1009. if startDate != "" {
  1010. condition += " AND data_time>=? "
  1011. pars = append(pars, startDate)
  1012. }
  1013. if endDate != "" {
  1014. condition += " AND data_time<=? "
  1015. pars = append(pars, endDate)
  1016. }
  1017. glDataList, err := edbDataModel.GetZzDataByTradeCode(condition, pars)
  1018. addSql := ` INSERT INTO edb_data_zz(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  1019. var isAdd bool
  1020. existMap := make(map[string]string)
  1021. for _, v := range glDataList {
  1022. var value string
  1023. if suffix == "deal" {
  1024. value = v.DealValue
  1025. } else if suffix == "buy" {
  1026. value = v.BuyValue
  1027. } else {
  1028. value = v.SoldValue
  1029. }
  1030. item := v
  1031. itemValue := value
  1032. if _, ok := existMap[v.DataTime]; !ok {
  1033. count, err := edbDataModel.GetEdbDataZzByCodeAndDate(edbCode, v.DataTime)
  1034. if err != nil && err != utils.ErrNoRow {
  1035. return err
  1036. }
  1037. if count <= 0 {
  1038. eDate := item.DataTime
  1039. sValue := itemValue
  1040. if sValue != "" {
  1041. dataTime, err := time.Parse(utils.FormatDate, eDate)
  1042. if err != nil {
  1043. return err
  1044. }
  1045. timestamp := dataTime.UnixNano() / 1e6
  1046. timeStr := fmt.Sprintf("%d", timestamp)
  1047. addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
  1048. isAdd = true
  1049. }
  1050. } else {
  1051. updateSql := ` UPDATE edb_data_zz SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  1052. err = tx.Exec(updateSql, value, edbInfoId, v.DataTime).Error
  1053. if err != nil {
  1054. return err
  1055. }
  1056. }
  1057. }
  1058. existMap[v.DataTime] = value
  1059. }
  1060. if isAdd {
  1061. addSql = strings.TrimRight(addSql, ",")
  1062. err = tx.Exec(addSql).Error
  1063. //_, err = o.Raw(addSql).Exec()
  1064. if err != nil {
  1065. return err
  1066. }
  1067. }
  1068. return
  1069. }
  1070. func RefreshEdbDataByDl(edbInfoId int, edbCode, startDate, endDate string) (err error) {
  1071. tx := global.MYSQL["data"].Begin()
  1072. defer func() {
  1073. if err != nil {
  1074. tx.Rollback()
  1075. } else {
  1076. tx.Commit()
  1077. }
  1078. }()
  1079. if err != nil {
  1080. return
  1081. }
  1082. var suffix string
  1083. if strings.Contains(edbCode, "deal") {
  1084. suffix = "deal"
  1085. } else if strings.Contains(edbCode, "buy") {
  1086. suffix = "buy"
  1087. } else if strings.Contains(edbCode, "sold") {
  1088. suffix = "sold"
  1089. }
  1090. edbInfoIdStr := strconv.Itoa(edbInfoId)
  1091. //计算数据
  1092. var condition string
  1093. var pars []interface{}
  1094. if edbCode != "" {
  1095. if suffix == "deal" {
  1096. condition += " AND deal_code=? "
  1097. } else if suffix == "buy" {
  1098. condition += " AND buy_code=? "
  1099. } else {
  1100. condition += " AND sold_code=? "
  1101. }
  1102. pars = append(pars, edbCode)
  1103. }
  1104. if startDate != "" {
  1105. condition += " AND data_time>=? "
  1106. pars = append(pars, startDate)
  1107. }
  1108. if endDate != "" {
  1109. condition += " AND data_time<=? "
  1110. pars = append(pars, endDate)
  1111. }
  1112. glDataList, err := edbDataModel.GetDlDataByTradeCode(condition, pars)
  1113. addSql := ` INSERT INTO edb_data_dl(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  1114. var isAdd bool
  1115. existMap := make(map[string]string)
  1116. for _, v := range glDataList {
  1117. var value string
  1118. if suffix == "deal" {
  1119. value = v.DealValue
  1120. } else if suffix == "buy" {
  1121. value = v.BuyValue
  1122. } else {
  1123. value = v.SoldValue
  1124. }
  1125. item := v
  1126. itemValue := value
  1127. if _, ok := existMap[v.DataTime]; !ok {
  1128. count, err := edbDataModel.GetEdbDataDlByCodeAndDate(edbCode, v.DataTime)
  1129. if err != nil && err != utils.ErrNoRow {
  1130. return err
  1131. }
  1132. if count <= 0 {
  1133. eDate := item.DataTime
  1134. sValue := itemValue
  1135. if sValue != "" {
  1136. dataTime, err := time.Parse(utils.FormatDate, eDate)
  1137. if err != nil {
  1138. return err
  1139. }
  1140. timestamp := dataTime.UnixNano() / 1e6
  1141. timeStr := fmt.Sprintf("%d", timestamp)
  1142. addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
  1143. isAdd = true
  1144. }
  1145. } else {
  1146. updataSql := ` UPDATE edb_data_dl SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  1147. err = tx.Exec(updataSql, value, edbInfoId, v.DataTime).Error
  1148. if err != nil {
  1149. return err
  1150. }
  1151. }
  1152. }
  1153. existMap[v.DataTime] = value
  1154. }
  1155. if isAdd {
  1156. addSql = strings.TrimRight(addSql, ",")
  1157. err = tx.Exec(addSql).Error
  1158. if err != nil {
  1159. return err
  1160. }
  1161. }
  1162. return
  1163. }
  1164. // RefreshEdbDataBySh 刷新上期所指标数据
  1165. func RefreshEdbDataBySh(edbInfoId int, edbCode, startDate, endDate string) (err error) {
  1166. tx := global.MYSQL["data"].Begin()
  1167. defer func() {
  1168. if err != nil {
  1169. tx.Rollback()
  1170. } else {
  1171. tx.Commit()
  1172. }
  1173. }()
  1174. if err != nil {
  1175. return
  1176. }
  1177. var suffix string
  1178. if strings.Contains(edbCode, "deal") {
  1179. suffix = "deal"
  1180. } else if strings.Contains(edbCode, "buy") {
  1181. suffix = "buy"
  1182. } else if strings.Contains(edbCode, "sold") {
  1183. suffix = "sold"
  1184. }
  1185. edbInfoIdStr := strconv.Itoa(edbInfoId)
  1186. //计算数据
  1187. var condition string
  1188. var pars []interface{}
  1189. if edbCode != "" {
  1190. if suffix == "deal" {
  1191. condition += " AND deal_code=? "
  1192. } else if suffix == "buy" {
  1193. condition += " AND buy_code=? "
  1194. } else {
  1195. condition += " AND sold_code=? "
  1196. }
  1197. pars = append(pars, edbCode)
  1198. }
  1199. if startDate != "" {
  1200. condition += " AND data_time>=? "
  1201. pars = append(pars, startDate)
  1202. }
  1203. if endDate != "" {
  1204. condition += " AND data_time<=? "
  1205. pars = append(pars, endDate)
  1206. }
  1207. glDataList, err := edbDataModel.GetShDataByTradeCode(condition, pars)
  1208. addSql := ` INSERT INTO edb_data_sh(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  1209. var isAdd bool
  1210. existMap := make(map[string]string)
  1211. for _, v := range glDataList {
  1212. var value string
  1213. if suffix == "deal" {
  1214. value = v.DealValue
  1215. } else if suffix == "buy" {
  1216. value = v.BuyValue
  1217. } else {
  1218. value = v.SoldValue
  1219. }
  1220. item := v
  1221. itemValue := value
  1222. if _, ok := existMap[v.DataTime]; !ok {
  1223. count, err := edbDataModel.GetEdbDataShByCodeAndDate(edbCode, v.DataTime)
  1224. if err != nil && err != utils.ErrNoRow {
  1225. return err
  1226. }
  1227. if count <= 0 {
  1228. eDate := item.DataTime
  1229. sValue := itemValue
  1230. if sValue != "" {
  1231. dataTime, err := time.Parse(utils.FormatDate, eDate)
  1232. if err != nil {
  1233. return err
  1234. }
  1235. timestamp := dataTime.UnixNano() / 1e6
  1236. timeStr := fmt.Sprintf("%d", timestamp)
  1237. addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
  1238. isAdd = true
  1239. }
  1240. } else {
  1241. updataSql := ` UPDATE edb_data_sh SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  1242. err = tx.Exec(updataSql, value, edbInfoId, v.DataTime).Error
  1243. if err != nil {
  1244. return err
  1245. }
  1246. }
  1247. }
  1248. existMap[v.DataTime] = value
  1249. }
  1250. if isAdd {
  1251. addSql = strings.TrimRight(addSql, ",")
  1252. err = tx.Exec(addSql).Error
  1253. //_, err = o.Raw(addSql).Exec()
  1254. if err != nil {
  1255. return err
  1256. }
  1257. }
  1258. return
  1259. }
  1260. // RefreshEdbDataByCffex 刷新中金所指标数据
  1261. func RefreshEdbDataByCffex(edbInfoId int, edbCode, startDate, endDate string) (err error) {
  1262. tx := global.MYSQL["data"].Begin()
  1263. defer func() {
  1264. if err != nil {
  1265. tx.Rollback()
  1266. } else {
  1267. tx.Commit()
  1268. }
  1269. }()
  1270. if err != nil {
  1271. return
  1272. }
  1273. var suffix string
  1274. if strings.Contains(edbCode, "deal") {
  1275. suffix = "deal"
  1276. } else if strings.Contains(edbCode, "buy") {
  1277. suffix = "buy"
  1278. } else if strings.Contains(edbCode, "sold") {
  1279. suffix = "sold"
  1280. }
  1281. edbInfoIdStr := strconv.Itoa(edbInfoId)
  1282. //计算数据
  1283. var condition string
  1284. var pars []interface{}
  1285. if edbCode != "" {
  1286. if suffix == "deal" {
  1287. condition += " AND deal_code=? "
  1288. } else if suffix == "buy" {
  1289. condition += " AND buy_code=? "
  1290. } else {
  1291. condition += " AND sold_code=? "
  1292. }
  1293. pars = append(pars, edbCode)
  1294. }
  1295. if startDate != "" {
  1296. condition += " AND data_time>=? "
  1297. pars = append(pars, startDate)
  1298. }
  1299. if endDate != "" {
  1300. condition += " AND data_time<=? "
  1301. pars = append(pars, endDate)
  1302. }
  1303. glDataList, err := edbDataModel.GetCffexDataByTradeCode(condition, pars)
  1304. addSql := ` INSERT INTO edb_data_cffex(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  1305. var isAdd bool
  1306. existMap := make(map[string]string)
  1307. for _, v := range glDataList {
  1308. var value string
  1309. if suffix == "deal" {
  1310. value = v.DealValue
  1311. } else if suffix == "buy" {
  1312. value = v.BuyValue
  1313. } else {
  1314. value = v.SoldValue
  1315. }
  1316. item := v
  1317. itemValue := value
  1318. if _, ok := existMap[v.DataTime]; !ok {
  1319. count, err := edbDataModel.GetEdbDataCffexByCodeAndDate(edbCode, v.DataTime)
  1320. if err != nil && err != utils.ErrNoRow {
  1321. return err
  1322. }
  1323. if count <= 0 {
  1324. eDate := item.DataTime
  1325. sValue := itemValue
  1326. if sValue != "" {
  1327. dataTime, err := time.Parse(utils.FormatDate, eDate)
  1328. if err != nil {
  1329. return err
  1330. }
  1331. timestamp := dataTime.UnixNano() / 1e6
  1332. timeStr := fmt.Sprintf("%d", timestamp)
  1333. addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
  1334. isAdd = true
  1335. }
  1336. } else {
  1337. updateSql := ` UPDATE edb_data_cffex SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  1338. err = tx.Exec(updateSql, value, edbInfoId, v.DataTime).Error
  1339. if err != nil {
  1340. return err
  1341. }
  1342. }
  1343. }
  1344. existMap[v.DataTime] = value
  1345. }
  1346. if isAdd {
  1347. addSql = strings.TrimRight(addSql, ",")
  1348. err = tx.Exec(addSql).Error
  1349. //_, err = o.Raw(addSql).Exec()
  1350. if err != nil {
  1351. return err
  1352. }
  1353. }
  1354. return
  1355. }
  1356. // RefreshEdbDataByShfe 刷新上期能源指标数据
  1357. func RefreshEdbDataByShfe(edbInfoId int, edbCode, startDate, endDate string) (err error) {
  1358. tx := global.MYSQL["data"].Begin()
  1359. defer func() {
  1360. if err != nil {
  1361. tx.Rollback()
  1362. } else {
  1363. tx.Commit()
  1364. }
  1365. }()
  1366. if err != nil {
  1367. return
  1368. }
  1369. var suffix string
  1370. if strings.Contains(edbCode, "deal") {
  1371. suffix = "deal"
  1372. } else if strings.Contains(edbCode, "buy") {
  1373. suffix = "buy"
  1374. } else if strings.Contains(edbCode, "sold") {
  1375. suffix = "sold"
  1376. }
  1377. edbInfoIdStr := strconv.Itoa(edbInfoId)
  1378. //计算数据
  1379. var condition string
  1380. var pars []interface{}
  1381. if edbCode != "" {
  1382. if suffix == "deal" {
  1383. condition += " AND deal_code=? "
  1384. } else if suffix == "buy" {
  1385. condition += " AND buy_code=? "
  1386. } else {
  1387. condition += " AND sold_code=? "
  1388. }
  1389. pars = append(pars, edbCode)
  1390. }
  1391. if startDate != "" {
  1392. condition += " AND data_time>=? "
  1393. pars = append(pars, startDate)
  1394. }
  1395. if endDate != "" {
  1396. condition += " AND data_time<=? "
  1397. pars = append(pars, endDate)
  1398. }
  1399. glDataList, err := edbDataModel.GetShfeDataByTradeCode(condition, pars)
  1400. addSql := ` INSERT INTO edb_data_ine(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  1401. var isAdd bool
  1402. existMap := make(map[string]string)
  1403. for _, v := range glDataList {
  1404. var value string
  1405. if suffix == "deal" {
  1406. value = v.DealValue
  1407. } else if suffix == "buy" {
  1408. value = v.BuyValue
  1409. } else {
  1410. value = v.SoldValue
  1411. }
  1412. item := v
  1413. itemValue := value
  1414. if _, ok := existMap[v.DataTime]; !ok {
  1415. count, err := edbDataModel.GetEdbDataShfeByCodeAndDate(edbCode, v.DataTime)
  1416. if err != nil && err != utils.ErrNoRow {
  1417. return err
  1418. }
  1419. if count <= 0 {
  1420. eDate := item.DataTime
  1421. sValue := itemValue
  1422. if sValue != "" {
  1423. dataTime, err := time.Parse(utils.FormatDate, eDate)
  1424. if err != nil {
  1425. return err
  1426. }
  1427. timestamp := dataTime.UnixNano() / 1e6
  1428. timeStr := fmt.Sprintf("%d", timestamp)
  1429. addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
  1430. isAdd = true
  1431. }
  1432. } else {
  1433. updateSql := ` UPDATE edb_data_ine SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  1434. err = tx.Exec(updateSql, value, edbInfoId, v.DataTime).Error
  1435. if err != nil {
  1436. return err
  1437. }
  1438. }
  1439. }
  1440. existMap[v.DataTime] = value
  1441. }
  1442. if isAdd {
  1443. addSql = strings.TrimRight(addSql, ",")
  1444. err = tx.Exec(addSql).Error
  1445. if err != nil {
  1446. return err
  1447. }
  1448. }
  1449. return
  1450. }
  1451. // RefreshEdbDataByGie 刷新欧洲天然气指标数据
  1452. func RefreshEdbDataByGie(edbInfoId int, edbCode, startDate, endDate string) (err error) {
  1453. tx := global.MYSQL["data"].Begin()
  1454. defer func() {
  1455. if err != nil {
  1456. tx.Rollback()
  1457. } else {
  1458. tx.Commit()
  1459. }
  1460. }()
  1461. if err != nil {
  1462. fmt.Println("refresh err:", err)
  1463. return
  1464. }
  1465. var suffix string
  1466. l := len(edbCode)
  1467. if strings.Contains(edbCode[l-2:], "GS") {
  1468. suffix = "GS"
  1469. } else if strings.Contains(edbCode[l-1:], "F") {
  1470. suffix = "F"
  1471. } else if strings.Contains(edbCode[l-1:], "T") {
  1472. suffix = "T"
  1473. } else if strings.Contains(edbCode[l-2:], "In") {
  1474. suffix = "In"
  1475. } else if strings.Contains(edbCode[l-3:], "Out") {
  1476. suffix = "Out"
  1477. } else if strings.Contains(edbCode[l-3:], "WGV") {
  1478. suffix = "WGV"
  1479. } else if strings.Contains(edbCode[l-2:], "IC") {
  1480. suffix = "IC"
  1481. } else if strings.Contains(edbCode[l-2:], "WC") {
  1482. suffix = "WC"
  1483. } else {
  1484. suffix = ""
  1485. }
  1486. edbInfoIdStr := strconv.Itoa(edbInfoId)
  1487. //计算数据
  1488. var condition string
  1489. var pars []interface{}
  1490. if edbCode != "" {
  1491. condition += " AND eic_code=? "
  1492. pars = append(pars, edbCode[:l-len(suffix)])
  1493. }
  1494. if startDate != "" {
  1495. condition += " AND gas_day_started_on>=? "
  1496. pars = append(pars, startDate)
  1497. }
  1498. if endDate != "" {
  1499. condition += " AND gas_day_started_on<=? "
  1500. pars = append(pars, endDate)
  1501. }
  1502. eicDataList, err := edbDataModel.GetGieDataByTradeCode(condition, pars)
  1503. fmt.Println("eicDataList", len(eicDataList))
  1504. addSql := ` INSERT INTO edb_data_gie(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  1505. var isAdd bool
  1506. existMap := make(map[string]string)
  1507. for _, v := range eicDataList {
  1508. var value string
  1509. if suffix == "GS" {
  1510. value = v.GasInStorage
  1511. } else if suffix == "F" {
  1512. value = v.Full
  1513. } else if suffix == "T" {
  1514. value = v.Trend
  1515. } else if suffix == "In" {
  1516. value = v.Injection
  1517. } else if suffix == "Out" {
  1518. value = v.Withdrawal
  1519. } else if suffix == "WGV" {
  1520. value = v.WorkingGasVolume
  1521. } else if suffix == "IC" {
  1522. value = v.InjectionCapacity
  1523. } else if suffix == "WC" {
  1524. value = v.WithdrawalCapacity
  1525. }
  1526. item := v
  1527. itemValue := value
  1528. if _, ok := existMap[v.GasDayStartedOn]; !ok {
  1529. count, err := edbDataModel.GetEdbDataGieByCodeAndDate(edbCode, v.GasDayStartedOn)
  1530. if err != nil && err != utils.ErrNoRow {
  1531. return err
  1532. }
  1533. if count <= 0 {
  1534. eDate := item.GasDayStartedOn
  1535. sValue := itemValue
  1536. if sValue != "" {
  1537. dataTime, err := time.Parse(utils.FormatDate, eDate)
  1538. if err != nil {
  1539. return err
  1540. }
  1541. timestamp := dataTime.UnixNano() / 1e6
  1542. timeStr := fmt.Sprintf("%d", timestamp)
  1543. addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
  1544. isAdd = true
  1545. }
  1546. } else {
  1547. updateSql := ` UPDATE edb_data_gie SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  1548. err = tx.Exec(updateSql, value, edbInfoId, v.GasDayStartedOn).Error
  1549. if err != nil {
  1550. return err
  1551. }
  1552. }
  1553. }
  1554. existMap[v.GasDayStartedOn] = value
  1555. }
  1556. if isAdd {
  1557. addSql = strings.TrimRight(addSql, ",")
  1558. err = tx.Exec(addSql).Error
  1559. if err != nil {
  1560. return err
  1561. }
  1562. }
  1563. return
  1564. }
  1565. //刷新全部数据
  1566. func RefreshAllCalculate(edbInfoIdArr []*edbInfoModel.EdbInfo, edbInfoId, source int, edbCode, formulaStr, startDate, endDate string, edbInfoIdBytes []string) (err error) {
  1567. tx := global.MYSQL["data"].Begin()
  1568. defer func() {
  1569. if err != nil {
  1570. tx.Rollback()
  1571. } else {
  1572. tx.Commit()
  1573. }
  1574. }()
  1575. fmt.Println(startDate, endDate)
  1576. saveDataMap := make(map[string]map[int]float64)
  1577. for _, v := range edbInfoIdArr {
  1578. var condition string
  1579. var pars []interface{}
  1580. condition += " AND edb_info_id=? "
  1581. pars = append(pars, v.EdbInfoId)
  1582. if startDate != "" {
  1583. condition += " AND data_time>=? "
  1584. pars = append(pars, startDate)
  1585. }
  1586. if endDate != "" {
  1587. condition += " AND data_time<=? "
  1588. pars = append(pars, endDate)
  1589. }
  1590. fmt.Println("v.Source:", v.Source)
  1591. dataList, err := edbDataModel.GetEdbDataListAll(condition, pars, v.Source, 1)
  1592. if err != nil {
  1593. return err
  1594. }
  1595. dataMap := make(map[string]float64)
  1596. for _, dv := range dataList {
  1597. if val, ok := saveDataMap[dv.DataTime]; ok {
  1598. if _, ok := val[v.EdbInfoId]; !ok {
  1599. val[v.EdbInfoId] = dv.Value
  1600. }
  1601. } else {
  1602. temp := make(map[int]float64)
  1603. temp[v.EdbInfoId] = dv.Value
  1604. saveDataMap[dv.DataTime] = temp
  1605. }
  1606. }
  1607. item := new(edbDataModel.CalculateItems)
  1608. item.EdbInfoId = v.EdbInfoId
  1609. item.DataMap = dataMap
  1610. }
  1611. formulaMap := CheckFormula(formulaStr)
  1612. addSql := ` INSERT INTO edb_data_calculate(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  1613. var isAdd bool
  1614. //获取指标所有数据
  1615. dataList := make([]*edbDataModel.EdbDataBase, 0)
  1616. dataTableName := edbDataModel.GetEdbDataTableName(source)
  1617. sql := `SELECT * FROM %s WHERE edb_info_id=? `
  1618. sql = fmt.Sprintf(sql, dataTableName)
  1619. err = global.MYSQL["data"].Raw(sql, edbInfoId).Scan(&dataList).Error
  1620. //_, err = o.Raw(sql, edbInfoId).QueryRows(&dataList)
  1621. if err != nil {
  1622. return err
  1623. }
  1624. dataMap := make(map[string]string)
  1625. for _, v := range dataList {
  1626. dataMap[v.DataTime] = v.Value
  1627. }
  1628. edbInfoIdStr := strconv.Itoa(edbInfoId)
  1629. existDataMap := make(map[string]string)
  1630. for sk, sv := range saveDataMap {
  1631. fmt.Println(sk, sv)
  1632. formulaStr = strings.ToUpper(formulaStr)
  1633. formulaFormStr := ReplaceFormula(edbInfoIdArr, sv, formulaMap, formulaStr, edbInfoIdBytes)
  1634. if formulaFormStr != "" {
  1635. //utils.FileLog.Info("formulaFormStr:%s", formulaFormStr)
  1636. expression := formula.NewExpression(formulaFormStr)
  1637. calResult, err := expression.Evaluate()
  1638. if err != nil {
  1639. err = errors.New("计算失败:Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
  1640. fmt.Println(err)
  1641. return err
  1642. }
  1643. calVal, err := calResult.Float64()
  1644. if err != nil {
  1645. err = errors.New("计算失败:获取计算值失败 Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
  1646. fmt.Println(err)
  1647. return err
  1648. }
  1649. saveValue := utils.SubFloatToString(calVal, 4)
  1650. if existVal, ok := dataMap[sk]; !ok {
  1651. dataTime, _ := time.Parse(utils.FormatDate, sk)
  1652. timestamp := dataTime.UnixNano() / 1e6
  1653. timeStr := fmt.Sprintf("%d", timestamp)
  1654. if _, existOk := existDataMap[sk]; !existOk {
  1655. addSql += GetAddSql(edbInfoIdStr, edbCode, sk, timeStr, saveValue)
  1656. isAdd = true
  1657. }
  1658. existDataMap[sk] = sk
  1659. } else {
  1660. if existVal != saveValue {
  1661. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  1662. sql = fmt.Sprintf(sql, dataTableName)
  1663. err = tx.Exec(sql, saveValue, edbInfoId, sk).Error
  1664. //_, err = o.Raw(sql, saveValue, edbInfoId, sk).Exec()
  1665. if err != nil {
  1666. return err
  1667. }
  1668. }
  1669. }
  1670. }
  1671. }
  1672. if isAdd {
  1673. addSql = strings.TrimRight(addSql, ",")
  1674. err = tx.Exec(addSql).Error
  1675. //_, err = o.Raw(addSql).Exec()
  1676. if err != nil {
  1677. fmt.Println("RefreshAllCalculate add Err", err.Error())
  1678. return
  1679. }
  1680. }
  1681. return
  1682. }
  1683. func CheckFormula(formula string) map[string]string {
  1684. mathFormula := []string{"MAX", "MIN", "ABS", "ACOS", "ASIN", "CEIL", "MOD", "POW", "ROUND", "SIGN", "SIN", "TAN", "LOG10", "LOG2", "LOG"}
  1685. str := strings.ToUpper(formula)
  1686. for _, v := range mathFormula {
  1687. str = strings.Replace(str, v, "", -1)
  1688. }
  1689. str = strings.Replace(str, "(", "", -1)
  1690. str = strings.Replace(str, ")", "", -1)
  1691. byteMap := make(map[string]string)
  1692. for i := 0; i < len(str); i++ {
  1693. byteInt := str[i]
  1694. if byteInt >= 65 && byteInt <= 90 {
  1695. byteStr := string(byteInt)
  1696. if _, ok := byteMap[byteStr]; !ok {
  1697. byteMap[byteStr] = byteStr
  1698. }
  1699. }
  1700. }
  1701. return byteMap
  1702. }
  1703. func GetFormulaMap() map[string]string {
  1704. funMap := make(map[string]string)
  1705. funMap["MAX"] = "[@@]"
  1706. funMap["MIN"] = "[@!]"
  1707. funMap["ABS"] = "[@#]"
  1708. funMap["CEIL"] = "[@$]"
  1709. funMap["COS"] = "[@%]"
  1710. funMap["FLOOR"] = "[@^]"
  1711. funMap["MOD"] = "[@&]"
  1712. funMap["POW"] = "[@*]"
  1713. funMap["ROUND"] = "[@(]"
  1714. return funMap
  1715. }
  1716. func ReplaceFormula(edbInfoIdArr []*edbInfoModel.EdbInfo, valArr map[int]float64, formulaMap map[string]string, formulaStr string, edbInfoIdBytes []string) string {
  1717. funMap := GetFormulaMap()
  1718. for k, v := range funMap {
  1719. formulaStr = strings.Replace(formulaStr, k, v, -1)
  1720. }
  1721. replaceCount := 0
  1722. for dk, dv := range edbInfoIdArr {
  1723. if dk == 0 {
  1724. dKey := edbInfoIdBytes[dk]
  1725. if _, ok := formulaMap[dKey]; ok { //公式中存在
  1726. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  1727. dvStr := fmt.Sprintf("%v", val)
  1728. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  1729. replaceCount++
  1730. }
  1731. }
  1732. }
  1733. if dk == 1 {
  1734. dKey := edbInfoIdBytes[dk]
  1735. if _, ok := formulaMap[dKey]; ok { //公式中存在
  1736. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  1737. dvStr := fmt.Sprintf("%v", val)
  1738. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  1739. replaceCount++
  1740. }
  1741. }
  1742. }
  1743. if dk == 2 {
  1744. dKey := edbInfoIdBytes[dk]
  1745. if _, ok := formulaMap[dKey]; ok { //公式中存在
  1746. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  1747. dvStr := fmt.Sprintf("%v", val)
  1748. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  1749. replaceCount++
  1750. }
  1751. }
  1752. }
  1753. if dk == 3 {
  1754. dKey := edbInfoIdBytes[dk]
  1755. if _, ok := formulaMap[dKey]; ok { //公式中存在
  1756. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  1757. dvStr := fmt.Sprintf("%v", val)
  1758. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  1759. replaceCount++
  1760. }
  1761. }
  1762. }
  1763. if dk == 4 {
  1764. dKey := edbInfoIdBytes[dk]
  1765. if _, ok := formulaMap[dKey]; ok { //公式中存在
  1766. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  1767. dvStr := fmt.Sprintf("%v", val)
  1768. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  1769. replaceCount++
  1770. }
  1771. }
  1772. }
  1773. if dk == 5 {
  1774. dKey := edbInfoIdBytes[dk]
  1775. if _, ok := formulaMap[dKey]; ok { //公式中存在
  1776. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  1777. dvStr := fmt.Sprintf("%v", val)
  1778. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  1779. replaceCount++
  1780. }
  1781. }
  1782. }
  1783. if dk == 6 {
  1784. dKey := edbInfoIdBytes[dk]
  1785. if _, ok := formulaMap[dKey]; ok { //公式中存在
  1786. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  1787. dvStr := fmt.Sprintf("%v", val)
  1788. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  1789. replaceCount++
  1790. }
  1791. }
  1792. }
  1793. if dk == 7 {
  1794. dKey := edbInfoIdBytes[dk]
  1795. if _, ok := formulaMap[dKey]; ok { //公式中存在
  1796. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  1797. dvStr := fmt.Sprintf("%v", val)
  1798. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  1799. replaceCount++
  1800. }
  1801. }
  1802. }
  1803. if dk == 8 {
  1804. dKey := edbInfoIdBytes[dk]
  1805. if _, ok := formulaMap[dKey]; ok { //公式中存在
  1806. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  1807. dvStr := fmt.Sprintf("%v", val)
  1808. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  1809. replaceCount++
  1810. }
  1811. }
  1812. }
  1813. }
  1814. for k, v := range funMap {
  1815. formulaStr = strings.Replace(formulaStr, v, k, -1)
  1816. }
  1817. if replaceCount == len(formulaMap) {
  1818. return formulaStr
  1819. } else {
  1820. return ""
  1821. }
  1822. }
  1823. func RefreshAllCalculateLjzzy(edbInfoId, source int, fromEdbInfo *edbInfoModel.EdbInfo, edbCode, startDate, endDate string) (err error) {
  1824. tx := global.MYSQL["data"].Begin()
  1825. defer func() {
  1826. if err != nil {
  1827. tx.Rollback()
  1828. } else {
  1829. tx.Commit()
  1830. }
  1831. }()
  1832. if err != nil {
  1833. return
  1834. }
  1835. edbInfoIdStr := strconv.Itoa(edbInfoId)
  1836. fmt.Println(edbInfoIdStr)
  1837. //计算数据
  1838. var condition string
  1839. var pars []interface{}
  1840. condition += " AND edb_info_id=? "
  1841. pars = append(pars, fromEdbInfo.EdbInfoId)
  1842. if startDate != "" {
  1843. condition += " AND data_time>=? "
  1844. pars = append(pars, startDate)
  1845. }
  1846. if endDate != "" {
  1847. condition += " AND data_time<=? "
  1848. pars = append(pars, endDate)
  1849. }
  1850. dataList, err := edbDataModel.GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 1)
  1851. if err != nil {
  1852. return err
  1853. }
  1854. yearMap := make(map[int]map[int]*edbDataModel.EdbInfoSearchData)
  1855. dataLen := len(dataList)
  1856. for i := 0; i < dataLen; i++ {
  1857. item := dataList[i]
  1858. //日其中获取年
  1859. itemDate, err := time.Parse(utils.FormatDate, item.DataTime)
  1860. if err != nil {
  1861. return err
  1862. }
  1863. year := itemDate.Year()
  1864. month := int(itemDate.Month())
  1865. if monthMap, yok := yearMap[year]; yok {
  1866. monthMap[month] = item
  1867. yearMap[year] = monthMap
  1868. } else {
  1869. monthMap = make(map[int]*edbDataModel.EdbInfoSearchData)
  1870. monthMap[month] = item
  1871. yearMap[year] = monthMap
  1872. }
  1873. }
  1874. addSql := ` INSERT INTO edb_data_calculate_ljzzy(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  1875. var isAdd bool
  1876. //获取指标所有数据
  1877. existDataList := make([]*edbDataModel.EdbDataBase, 0)
  1878. dataTableName := edbDataModel.GetEdbDataTableName(source)
  1879. sql := `SELECT * FROM %s WHERE edb_info_id=? `
  1880. sql = fmt.Sprintf(sql, dataTableName)
  1881. err = global.MYSQL["data"].Raw(sql, edbInfoId).Scan(&existDataList).Error
  1882. //_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
  1883. if err != nil {
  1884. return err
  1885. }
  1886. dataMap := make(map[string]string)
  1887. for _, v := range existDataList {
  1888. dataMap[v.DataTime] = v.Value
  1889. }
  1890. existDataMap := make(map[string]string)
  1891. for yk, yv := range yearMap {
  1892. _, oneMonthOk := yv[1]
  1893. _, twoMonthOk := yv[2]
  1894. if !oneMonthOk && !twoMonthOk {
  1895. continue
  1896. }
  1897. for i := 1; i <= 12; i++ {
  1898. //fmt.Println(yk, i, yv[i])
  1899. dataCurrentItem := yv[i]
  1900. var date string
  1901. var val float64
  1902. if i == 1 || i == 2 {
  1903. if _, mok := yv[1]; mok { //1月有值
  1904. if i == 1 {
  1905. date = dataCurrentItem.DataTime
  1906. val, _ = decimal.NewFromFloat(dataCurrentItem.Value).Float64() //a.Div(b).Float64()
  1907. }
  1908. if i == 2 {
  1909. dataOneItem := yv[1]
  1910. if dataCurrentItem != nil && dataOneItem != nil {
  1911. date = dataCurrentItem.DataTime
  1912. twoMonth := decimal.NewFromFloat(dataCurrentItem.Value)
  1913. oneMonth := decimal.NewFromFloat(dataOneItem.Value)
  1914. val, _ = twoMonth.Sub(oneMonth).Float64()
  1915. }
  1916. }
  1917. } else { //1月无值
  1918. dataTwoItem := yv[2]
  1919. if i == 1 {
  1920. date = strconv.Itoa(yk) + "-01-31"
  1921. a := decimal.NewFromFloat(dataTwoItem.Value)
  1922. b := decimal.NewFromFloat(2.0)
  1923. val, _ = a.Div(b).Float64()
  1924. }
  1925. if i == 2 {
  1926. date = dataCurrentItem.DataTime
  1927. a := decimal.NewFromFloat(dataTwoItem.Value)
  1928. b := decimal.NewFromFloat(2.0)
  1929. val, _ = a.Div(b).Float64()
  1930. }
  1931. }
  1932. } else {
  1933. dataPreItem := yv[i-1]
  1934. if dataCurrentItem != nil && dataPreItem != nil {
  1935. date = dataCurrentItem.DataTime
  1936. //val = dataCurrentItem.Value - dataPreItem.Value
  1937. a := decimal.NewFromFloat(dataCurrentItem.Value)
  1938. b := decimal.NewFromFloat(dataPreItem.Value)
  1939. val, _ = a.Sub(b).Float64()
  1940. }
  1941. }
  1942. if date != "" {
  1943. saveValue := utils.SubFloatToString(val, 4)
  1944. //判断数据是否存在
  1945. if existVal, ok := dataMap[date]; !ok {
  1946. dataTime, _ := time.Parse(utils.FormatDate, date)
  1947. timestamp := dataTime.UnixNano() / 1e6
  1948. timeStr := fmt.Sprintf("%d", timestamp)
  1949. if _, existOk := existDataMap[date]; !existOk {
  1950. addSql += GetAddSql(edbInfoIdStr, edbCode, date, timeStr, saveValue)
  1951. isAdd = true
  1952. }
  1953. existDataMap[date] = date
  1954. } else {
  1955. if existVal != saveValue {
  1956. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  1957. sql = fmt.Sprintf(sql, dataTableName)
  1958. err = tx.Exec(sql, saveValue, edbInfoId, date).Error
  1959. //_, err = o.Raw(sql, saveValue, edbInfoId, date).Exec()
  1960. if err != nil {
  1961. return err
  1962. }
  1963. }
  1964. }
  1965. }
  1966. }
  1967. }
  1968. if isAdd {
  1969. addSql = strings.TrimRight(addSql, ",")
  1970. err = tx.Exec(addSql).Error
  1971. //_, err = o.Raw(addSql).Exec()
  1972. if err != nil {
  1973. fmt.Println("RefreshAllCalculateLjzzy add Err", err.Error())
  1974. return
  1975. }
  1976. }
  1977. return
  1978. }
  1979. func RefreshAllCalculateTbz(edbInfoId, source int, fromEdbInfo *edbInfoModel.EdbInfo, edbCode, startDate, endDate string) (err error) {
  1980. tx := global.MYSQL["data"].Begin()
  1981. defer func() {
  1982. if err != nil {
  1983. tx.Rollback()
  1984. } else {
  1985. tx.Commit()
  1986. }
  1987. }()
  1988. if err != nil {
  1989. return
  1990. }
  1991. edbInfoIdStr := strconv.Itoa(edbInfoId)
  1992. //计算数据
  1993. var condition string
  1994. var pars []interface{}
  1995. condition += " AND edb_info_id=? "
  1996. pars = append(pars, fromEdbInfo.EdbInfoId)
  1997. if startDate != "" {
  1998. condition += " AND data_time>=? "
  1999. pars = append(pars, startDate)
  2000. }
  2001. if endDate != "" {
  2002. condition += " AND data_time<=? "
  2003. pars = append(pars, endDate)
  2004. }
  2005. fmt.Println("GetEdbDataListAll--start")
  2006. dataList, err := edbDataModel.GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
  2007. if err != nil {
  2008. return err
  2009. }
  2010. fmt.Println("GetEdbDataListAll--end")
  2011. var dateArr []string
  2012. dataMap := make(map[string]*edbDataModel.EdbInfoSearchData)
  2013. for _, v := range dataList {
  2014. dateArr = append(dateArr, v.DataTime)
  2015. dataMap[v.DataTime] = v
  2016. }
  2017. fmt.Println("source:", source)
  2018. //获取指标所有数据
  2019. existDataList := make([]*edbDataModel.EdbDataBase, 0)
  2020. dataTableName := edbDataModel.GetEdbDataTableName(source)
  2021. fmt.Println("dataTableName:", dataTableName)
  2022. sql := `SELECT * FROM %s WHERE edb_info_id=? `
  2023. sql = fmt.Sprintf(sql, dataTableName)
  2024. err = global.MYSQL["data"].Raw(sql, edbInfoId).Scan(&existDataList).Error
  2025. //_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
  2026. if err != nil {
  2027. return err
  2028. }
  2029. existDataMap := make(map[string]string)
  2030. for _, v := range existDataList {
  2031. existDataMap[v.DataTime] = v.Value
  2032. }
  2033. //fmt.Println("existDataMap:", existDataMap)
  2034. addSql := ` INSERT INTO edb_data_calculate_tbz(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  2035. var isAdd bool
  2036. existAddDataMap := make(map[string]string)
  2037. for _, av := range dateArr {
  2038. currentItem := dataMap[av]
  2039. if currentItem != nil {
  2040. //当前日期
  2041. currentDate, err := time.Parse(utils.FormatDate, av)
  2042. if err != nil {
  2043. return err
  2044. }
  2045. //上一年的日期
  2046. preDate := currentDate.AddDate(-1, 0, 0)
  2047. preDateStr := preDate.Format(utils.FormatDate)
  2048. if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
  2049. //dataTime, _ := time.Parse(utils.FormatDate, date)
  2050. timestamp := currentDate.UnixNano() / 1e6
  2051. timestampStr := fmt.Sprintf("%d", timestamp)
  2052. val := TbzDiv(currentItem.Value, findItem.Value)
  2053. if existVal, ok := existDataMap[av]; !ok {
  2054. if _, existOk := existAddDataMap[av]; !existOk {
  2055. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  2056. isAdd = true
  2057. }
  2058. existAddDataMap[av] = av
  2059. } else {
  2060. if existVal != val {
  2061. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  2062. sql = fmt.Sprintf(sql, dataTableName)
  2063. err = tx.Exec(sql, val, edbInfoId, av).Error
  2064. //_, err = o.Raw(sql, val, edbInfoId, av).Exec()
  2065. if err != nil {
  2066. return err
  2067. }
  2068. }
  2069. }
  2070. continue
  2071. } else {
  2072. if fromEdbInfo.Frequency == "月度" { //向上和向下,各找一个月
  2073. for i := 0; i <= 35; i++ {
  2074. nextDateDay := preDate.AddDate(0, 0, i)
  2075. nextDateDayStr := nextDateDay.Format(utils.FormatDate)
  2076. if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
  2077. timestamp := currentDate.UnixNano() / 1e6
  2078. timestampStr := fmt.Sprintf("%d", timestamp)
  2079. val := TbzDiv(currentItem.Value, findItem.Value)
  2080. if existVal, ok := existDataMap[av]; !ok {
  2081. if _, existOk := existAddDataMap[av]; !existOk {
  2082. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  2083. isAdd = true
  2084. }
  2085. existAddDataMap[av] = av
  2086. } else {
  2087. if existVal != val {
  2088. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  2089. sql = fmt.Sprintf(sql, dataTableName)
  2090. err = tx.Exec(sql, val, edbInfoId, av).Error
  2091. //_, err = o.Raw(sql, val, edbInfoId, av).Exec()
  2092. if err != nil {
  2093. return err
  2094. }
  2095. }
  2096. }
  2097. break
  2098. } else {
  2099. preDateDay := preDate.AddDate(0, 0, -i)
  2100. preDateDayStr := preDateDay.Format(utils.FormatDate)
  2101. if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
  2102. timestamp := currentDate.UnixNano() / 1e6
  2103. timestampStr := fmt.Sprintf("%d", timestamp)
  2104. val := TbzDiv(currentItem.Value, findItem.Value)
  2105. if existVal, ok := existDataMap[av]; !ok {
  2106. if _, existOk := existAddDataMap[av]; !existOk {
  2107. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  2108. isAdd = true
  2109. }
  2110. existAddDataMap[av] = av
  2111. } else {
  2112. if existVal != val {
  2113. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  2114. sql = fmt.Sprintf(sql, dataTableName)
  2115. err = tx.Exec(sql, val, edbInfoId, av).Error
  2116. //_, err = o.Raw(sql, val, edbInfoId, av).Exec()
  2117. if err != nil {
  2118. return err
  2119. }
  2120. }
  2121. }
  2122. break
  2123. }
  2124. }
  2125. }
  2126. } else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {
  2127. if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
  2128. timestamp := currentDate.UnixNano() / 1e6
  2129. timestampStr := fmt.Sprintf("%d", timestamp)
  2130. val := TbzDiv(currentItem.Value, findItem.Value)
  2131. if existVal, ok := existDataMap[av]; !ok {
  2132. if _, existOk := existAddDataMap[av]; !existOk {
  2133. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  2134. isAdd = true
  2135. }
  2136. existAddDataMap[av] = av
  2137. } else {
  2138. if existVal != val {
  2139. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  2140. sql = fmt.Sprintf(sql, dataTableName)
  2141. err = tx.Exec(sql, val, edbInfoId, av).Error
  2142. //_, err = o.Raw(sql, val, edbInfoId, av).Exec()
  2143. if err != nil {
  2144. return err
  2145. }
  2146. }
  2147. }
  2148. break
  2149. }
  2150. } else {
  2151. nextDateDay := preDate.AddDate(0, 0, 1)
  2152. nextDateDayStr := nextDateDay.Format(utils.FormatDate)
  2153. preDateDay := preDate.AddDate(0, 0, -1)
  2154. preDateDayStr := preDateDay.Format(utils.FormatDate)
  2155. for i := 0; i < 35; i++ {
  2156. if i >= 1 {
  2157. nextDateDay = nextDateDay.AddDate(0, 0, i)
  2158. nextDateDayStr = nextDateDay.Format(utils.FormatDate)
  2159. }
  2160. if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
  2161. timestamp := currentDate.UnixNano() / 1e6
  2162. timestampStr := fmt.Sprintf("%d", timestamp)
  2163. val := TbzDiv(currentItem.Value, findItem.Value)
  2164. if existVal, ok := existDataMap[av]; !ok {
  2165. if _, existOk := existAddDataMap[av]; !existOk {
  2166. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  2167. isAdd = true
  2168. }
  2169. existAddDataMap[av] = av
  2170. } else {
  2171. if existVal != val {
  2172. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  2173. sql = fmt.Sprintf(sql, dataTableName)
  2174. err = tx.Exec(sql, val, edbInfoId, av).Error
  2175. //_, err = o.Raw(sql, val, edbInfoId, av).Exec()
  2176. if err != nil {
  2177. return err
  2178. }
  2179. }
  2180. }
  2181. break
  2182. } else {
  2183. if i >= 1 {
  2184. preDateDay = preDate.AddDate(0, 0, -i)
  2185. preDateDayStr = nextDateDay.Format(utils.FormatDate)
  2186. }
  2187. if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
  2188. timestamp := currentDate.UnixNano() / 1e6
  2189. timestampStr := fmt.Sprintf("%d", timestamp)
  2190. val := TbzDiv(currentItem.Value, findItem.Value)
  2191. if existVal, ok := existDataMap[av]; !ok {
  2192. if _, existOk := existAddDataMap[av]; !existOk {
  2193. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  2194. isAdd = true
  2195. }
  2196. existAddDataMap[av] = av
  2197. } else {
  2198. if existVal != val {
  2199. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  2200. sql = fmt.Sprintf(sql, dataTableName)
  2201. err = tx.Exec(sql, val, edbInfoId, av).Error
  2202. //_, err = o.Raw(sql, val, edbInfoId, av).Exec()
  2203. if err != nil {
  2204. return err
  2205. }
  2206. }
  2207. }
  2208. break
  2209. }
  2210. }
  2211. }
  2212. }
  2213. }
  2214. }
  2215. }
  2216. if isAdd {
  2217. addSql = strings.TrimRight(addSql, ",")
  2218. err = tx.Exec(addSql).Error
  2219. //_, err = o.Raw(addSql).Exec()
  2220. if err != nil {
  2221. return err
  2222. }
  2223. }
  2224. return
  2225. }
  2226. func TbzDiv(a, b float64) string {
  2227. var valStr string
  2228. if b != 0 {
  2229. af := decimal.NewFromFloat(float64(a))
  2230. bf := decimal.NewFromFloat(float64(b))
  2231. val, _ := af.Div(bf).Float64()
  2232. val = val - 1
  2233. valStr = utils.SubFloatToString(val, 4)
  2234. } else {
  2235. valStr = "0"
  2236. }
  2237. return valStr
  2238. }
  2239. //刷新全部同差值数据
  2240. func RefreshAllCalculateTcz(edbInfoId, source int, fromEdbInfo *edbInfoModel.EdbInfo, edbCode, startDate, endDate string) (err error) {
  2241. tx := global.MYSQL["data"].Begin()
  2242. defer func() {
  2243. if err != nil {
  2244. tx.Rollback()
  2245. } else {
  2246. tx.Commit()
  2247. }
  2248. }()
  2249. if err != nil {
  2250. return
  2251. }
  2252. edbInfoIdStr := strconv.Itoa(edbInfoId)
  2253. //计算数据
  2254. var condition string
  2255. var pars []interface{}
  2256. condition += " AND edb_info_id=? "
  2257. pars = append(pars, fromEdbInfo.EdbInfoId)
  2258. if startDate != "" {
  2259. condition += " AND data_time>=? "
  2260. pars = append(pars, startDate)
  2261. }
  2262. if endDate != "" {
  2263. condition += " AND data_time<=? "
  2264. pars = append(pars, endDate)
  2265. }
  2266. dataList, err := edbDataModel.GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
  2267. if err != nil {
  2268. return err
  2269. }
  2270. var dateArr []string
  2271. dataMap := make(map[string]*edbDataModel.EdbInfoSearchData)
  2272. for _, v := range dataList {
  2273. dateArr = append(dateArr, v.DataTime)
  2274. dataMap[v.DataTime] = v
  2275. }
  2276. //获取指标所有数据
  2277. existDataList := make([]*edbDataModel.EdbDataBase, 0)
  2278. dataTableName := edbDataModel.GetEdbDataTableName(source)
  2279. sql := `SELECT * FROM %s WHERE edb_info_id=? `
  2280. sql = fmt.Sprintf(sql, dataTableName)
  2281. err = global.MYSQL["data"].Raw(sql, edbInfoId).Scan(&existDataList).Error
  2282. //_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
  2283. if err != nil {
  2284. return err
  2285. }
  2286. existDataMap := make(map[string]string)
  2287. for _, v := range existDataList {
  2288. existDataMap[v.DataTime] = v.Value
  2289. }
  2290. addSql := ` INSERT INTO edb_data_calculate_tcz(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  2291. var isAdd bool
  2292. existAddDataMap := make(map[string]string)
  2293. for _, av := range dateArr {
  2294. currentItem := dataMap[av]
  2295. if currentItem != nil {
  2296. //当前日期
  2297. currentDate, err := time.Parse(utils.FormatDate, av)
  2298. if err != nil {
  2299. return err
  2300. }
  2301. //上一年的日期
  2302. preDate := currentDate.AddDate(-1, 0, 0)
  2303. preDateStr := preDate.Format(utils.FormatDate)
  2304. if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
  2305. //dataTime, _ := time.Parse(utils.FormatDate, date)
  2306. timestamp := currentDate.UnixNano() / 1e6
  2307. timestampStr := fmt.Sprintf("%d", timestamp)
  2308. val := TczSub(currentItem.Value, findItem.Value)
  2309. if existVal, ok := existDataMap[av]; !ok {
  2310. if _, existOk := existAddDataMap[av]; !existOk {
  2311. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  2312. isAdd = true
  2313. }
  2314. existAddDataMap[av] = av
  2315. } else {
  2316. if existVal != val {
  2317. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  2318. sql = fmt.Sprintf(sql, dataTableName)
  2319. err = tx.Exec(sql, val, edbInfoId, av).Error
  2320. //_, err = o.Raw(sql, val, edbInfoId, av).Exec()
  2321. if err != nil {
  2322. return err
  2323. }
  2324. }
  2325. }
  2326. //utils.FileLog.Info("同期找到:" + av + ";" + preDateStr)
  2327. continue
  2328. } else {
  2329. if fromEdbInfo.Frequency == "月度" { //向上和向下,各找一个月
  2330. for i := 0; i <= 35; i++ {
  2331. nextDateDay := preDate.AddDate(0, 0, 1)
  2332. nextDateDayStr := nextDateDay.Format(utils.FormatDate)
  2333. if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
  2334. timestamp := currentDate.UnixNano() / 1e6
  2335. timestampStr := fmt.Sprintf("%d", timestamp)
  2336. val := TczSub(currentItem.Value, findItem.Value)
  2337. if existVal, ok := existDataMap[av]; !ok {
  2338. if _, existOk := existAddDataMap[av]; !existOk {
  2339. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  2340. isAdd = true
  2341. }
  2342. existAddDataMap[av] = av
  2343. } else {
  2344. if existVal != val {
  2345. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  2346. sql = fmt.Sprintf(sql, dataTableName)
  2347. err = tx.Exec(sql, val, edbInfoId, av).Error
  2348. //_, err = o.Raw(sql, val, edbInfoId, av).Exec()
  2349. if err != nil {
  2350. return err
  2351. }
  2352. }
  2353. }
  2354. break
  2355. } else {
  2356. preDateDay := preDate.AddDate(0, 0, -1)
  2357. preDateDayStr := preDateDay.Format(utils.FormatDate)
  2358. if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
  2359. timestamp := currentDate.UnixNano() / 1e6
  2360. timestampStr := fmt.Sprintf("%d", timestamp)
  2361. val := TczSub(currentItem.Value, findItem.Value)
  2362. if existVal, ok := existDataMap[av]; !ok {
  2363. if _, existOk := existAddDataMap[av]; !existOk {
  2364. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  2365. isAdd = true
  2366. }
  2367. existAddDataMap[av] = av
  2368. } else {
  2369. if existVal != val {
  2370. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  2371. sql = fmt.Sprintf(sql, dataTableName)
  2372. err = tx.Exec(sql, val, edbInfoId, av).Error
  2373. //_, err = o.Raw(sql, val, edbInfoId, av).Exec()
  2374. if err != nil {
  2375. return err
  2376. }
  2377. }
  2378. }
  2379. break
  2380. }
  2381. }
  2382. }
  2383. } else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {
  2384. if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
  2385. timestamp := currentDate.UnixNano() / 1e6
  2386. timestampStr := fmt.Sprintf("%d", timestamp)
  2387. val := TczSub(currentItem.Value, findItem.Value)
  2388. if existVal, ok := existDataMap[av]; !ok {
  2389. if _, existOk := existAddDataMap[av]; !existOk {
  2390. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  2391. isAdd = true
  2392. }
  2393. existAddDataMap[av] = av
  2394. } else {
  2395. if existVal != val {
  2396. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  2397. sql = fmt.Sprintf(sql, dataTableName)
  2398. err = tx.Exec(sql, val, edbInfoId, av).Error
  2399. //_, err = o.Raw(sql, val, edbInfoId, av).Exec()
  2400. if err != nil {
  2401. return err
  2402. }
  2403. }
  2404. }
  2405. break
  2406. }
  2407. } else {
  2408. for i := 0; i < 35; i++ {
  2409. nextDateDay := preDate.AddDate(0, 0, 1)
  2410. nextDateDayStr := nextDateDay.Format(utils.FormatDate)
  2411. if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
  2412. timestamp := currentDate.UnixNano() / 1e6
  2413. timestampStr := fmt.Sprintf("%d", timestamp)
  2414. val := TczSub(currentItem.Value, findItem.Value)
  2415. if existVal, ok := existDataMap[av]; !ok {
  2416. if _, existOk := existAddDataMap[av]; !existOk {
  2417. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  2418. isAdd = true
  2419. }
  2420. existAddDataMap[av] = av
  2421. } else {
  2422. if existVal != val {
  2423. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  2424. sql = fmt.Sprintf(sql, dataTableName)
  2425. err = tx.Exec(sql, val, edbInfoId, av).Error
  2426. //_, err = o.Raw(sql, val, edbInfoId, av).Exec()
  2427. if err != nil {
  2428. return err
  2429. }
  2430. }
  2431. }
  2432. break
  2433. } else {
  2434. preDateDay := preDate.AddDate(0, 0, -1)
  2435. preDateDayStr := preDateDay.Format(utils.FormatDate)
  2436. if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
  2437. timestamp := currentDate.UnixNano() / 1e6
  2438. timestampStr := fmt.Sprintf("%d", timestamp)
  2439. val := TczSub(currentItem.Value, findItem.Value)
  2440. if existVal, ok := existDataMap[av]; !ok {
  2441. if _, existOk := existAddDataMap[av]; !existOk {
  2442. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  2443. isAdd = true
  2444. }
  2445. existAddDataMap[av] = av
  2446. } else {
  2447. if existVal != val {
  2448. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  2449. sql = fmt.Sprintf(sql, dataTableName)
  2450. err = tx.Exec(sql, val, edbInfoId, av).Error
  2451. //_, err = o.Raw(sql, val, edbInfoId, av).Exec()
  2452. if err != nil {
  2453. return err
  2454. }
  2455. }
  2456. }
  2457. break
  2458. }
  2459. }
  2460. }
  2461. }
  2462. }
  2463. }
  2464. }
  2465. if isAdd {
  2466. addSql = strings.TrimRight(addSql, ",")
  2467. err = tx.Exec(addSql).Error
  2468. //_, err = o.Raw(addSql).Exec()
  2469. if err != nil {
  2470. return err
  2471. }
  2472. }
  2473. return
  2474. }
  2475. func TczSub(a, b float64) string {
  2476. af := decimal.NewFromFloat(float64(a))
  2477. fmt.Println(af)
  2478. bf := decimal.NewFromFloat(float64(b))
  2479. val, _ := af.Sub(bf).Float64()
  2480. valStr := utils.SubFloatToString(val, 4)
  2481. return valStr
  2482. }
  2483. //刷新全部N数值移动平均计算
  2484. func RefreshAllCalculateNszydpjjs(edbInfoId, source, formulaInt int, fromEdbInfo *edbInfoModel.EdbInfo, edbCode, startDate string) (err error) {
  2485. tx := global.MYSQL["data"].Begin()
  2486. defer func() {
  2487. if err != nil {
  2488. fmt.Println("RefreshCalculateNszydpjjs Err:" + err.Error())
  2489. //utils.FileLog.Info("RefreshCalculateNszydpjjs Err:" + err.Error())
  2490. tx.Rollback()
  2491. } else {
  2492. tx.Commit()
  2493. }
  2494. }()
  2495. if err != nil {
  2496. return
  2497. }
  2498. edbInfoIdStr := strconv.Itoa(edbInfoId)
  2499. fmt.Println(edbInfoIdStr)
  2500. //计算数据
  2501. var condition string
  2502. var pars []interface{}
  2503. condition += " AND edb_info_id=? "
  2504. pars = append(pars, edbInfoId)
  2505. existDataList, err := edbDataModel.GetEdbDataListAll(condition, pars, source, 0)
  2506. if err != nil {
  2507. fmt.Println("existDataList GetEdbDataListAll Err:" + err.Error())
  2508. return err
  2509. }
  2510. existDataMap := make(map[string]*edbDataModel.EdbInfoSearchData)
  2511. for _, v := range existDataList {
  2512. existDataMap[v.DataTime] = v
  2513. }
  2514. //计算来源数据
  2515. var fromCondition string
  2516. var fromPars []interface{}
  2517. fromCondition += " AND edb_info_id=? "
  2518. fromPars = append(fromPars, fromEdbInfo.EdbInfoId)
  2519. fromCondition += " AND data_time>=? "
  2520. fromPars = append(fromPars, startDate)
  2521. fmt.Println("fromPars:", fromPars)
  2522. fromDataList, err := edbDataModel.GetEdbDataListAll(fromCondition, fromPars, fromEdbInfo.Source, 0)
  2523. if err != nil {
  2524. fmt.Println("from GetEdbDataListAll Err:" + err.Error())
  2525. return err
  2526. }
  2527. var fromDateArr []string
  2528. fromDataMap := make(map[string]*edbDataModel.EdbInfoSearchData)
  2529. for _, v := range fromDataList {
  2530. fromDateArr = append(fromDateArr, v.DataTime)
  2531. fromDataMap[v.DataTime] = v
  2532. }
  2533. addSql := ` INSERT INTO edb_data_calculate_nszydpjjs(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  2534. var isAdd bool
  2535. dataTableName := edbDataModel.GetEdbDataTableName(source)
  2536. arrLen := len(fromDateArr)
  2537. existAddDataMap := make(map[string]string)
  2538. for ak, av := range fromDateArr {
  2539. //处理第一个值
  2540. var valArr []float64
  2541. if findItem, ok := fromDataMap[av]; ok {
  2542. valArr = append(valArr, findItem.Value)
  2543. } else {
  2544. continue
  2545. }
  2546. if ak+1 != arrLen {
  2547. //处理除第一个值之外的N-1个值
  2548. for i := 1; i < formulaInt; i++ {
  2549. arrIndex := ak + i
  2550. if arrIndex >= arrLen {
  2551. break
  2552. }
  2553. arrVal := fromDateArr[arrIndex]
  2554. if findItem, ok := fromDataMap[arrVal]; ok {
  2555. valArr = append(valArr, findItem.Value)
  2556. } else {
  2557. continue
  2558. }
  2559. }
  2560. }
  2561. valArrLen := len(valArr)
  2562. //var totalVal float64
  2563. totalVal := decimal.NewFromFloat(0.00)
  2564. for _, v := range valArr {
  2565. newDecimal := decimal.NewFromFloat(v)
  2566. totalVal = totalVal.Add(newDecimal)
  2567. }
  2568. af := totalVal //decimal.NewFromFloat(totalVal)
  2569. bf := decimal.NewFromFloat(float64(valArrLen))
  2570. val, _ := af.Div(bf).Float64()
  2571. valStr := utils.SubFloatToString(val, 4)
  2572. if existVal, existOk := existDataMap[av]; !existOk {
  2573. currentDate, err := time.Parse(utils.FormatDate, av)
  2574. if err != nil {
  2575. return err
  2576. }
  2577. timestamp := currentDate.UnixNano() / 1e6
  2578. timestampStr := fmt.Sprintf("%d", timestamp)
  2579. if _, existOk := existAddDataMap[av]; !existOk {
  2580. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, valStr)
  2581. isAdd = true
  2582. }
  2583. existAddDataMap[av] = av
  2584. } else {
  2585. saveValue := utils.SubFloatToString(existVal.Value, 30)
  2586. if saveValue != valStr {
  2587. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  2588. sql = fmt.Sprintf(sql, dataTableName)
  2589. err = tx.Exec(sql, val, edbInfoId, av).Error
  2590. //_, err = o.Raw(sql, val, edbInfoId, av).Exec()
  2591. if err != nil {
  2592. return err
  2593. }
  2594. }
  2595. }
  2596. }
  2597. if isAdd {
  2598. addSql = strings.TrimRight(addSql, ",")
  2599. //utils.FileLog.Info("addSql:" + addSql)
  2600. //_, err = o.Raw(addSql).Exec()
  2601. err = tx.Exec(addSql).Error
  2602. if err != nil {
  2603. return err
  2604. }
  2605. }
  2606. return
  2607. }
  2608. //刷新所有环比值数据
  2609. func RefreshAllCalculateHbz(edbInfoId, source int, fromEdbInfo *edbInfoModel.EdbInfo, edbCode, startDate, endDate string, formulaInt int) (err error) {
  2610. tx := global.MYSQL["data"].Begin()
  2611. defer func() {
  2612. if err != nil {
  2613. tx.Rollback()
  2614. } else {
  2615. tx.Commit()
  2616. }
  2617. }()
  2618. if err != nil {
  2619. return
  2620. }
  2621. edbInfoIdStr := strconv.Itoa(edbInfoId)
  2622. //计算数据
  2623. var condition string
  2624. var pars []interface{}
  2625. condition += " AND edb_info_id=? "
  2626. pars = append(pars, fromEdbInfo.EdbInfoId)
  2627. if startDate != "" {
  2628. condition += " AND data_time>=? "
  2629. pars = append(pars, startDate)
  2630. }
  2631. if endDate != "" {
  2632. condition += " AND data_time<=? "
  2633. pars = append(pars, endDate)
  2634. }
  2635. dataList, err := edbDataModel.GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
  2636. if err != nil {
  2637. return err
  2638. }
  2639. var dateArr []string
  2640. dataMap := make(map[string]*edbDataModel.EdbInfoSearchData)
  2641. for _, v := range dataList {
  2642. dateArr = append(dateArr, v.DataTime)
  2643. dataMap[v.DataTime] = v
  2644. }
  2645. fmt.Println("source:", source)
  2646. //获取指标所有数据
  2647. existDataList := make([]*edbDataModel.EdbDataBase, 0)
  2648. dataTableName := edbDataModel.GetEdbDataTableName(source)
  2649. fmt.Println("dataTableName:", dataTableName)
  2650. sql := `SELECT * FROM %s WHERE edb_info_id=? `
  2651. sql = fmt.Sprintf(sql, dataTableName)
  2652. err = global.MYSQL["data"].Raw(sql, edbInfoId).Scan(&existDataList).Error
  2653. //_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
  2654. if err != nil {
  2655. return err
  2656. }
  2657. existDataMap := make(map[string]string)
  2658. for _, v := range existDataList {
  2659. existDataMap[v.DataTime] = v.Value
  2660. }
  2661. addSql := ` INSERT INTO edb_data_calculate_hbz(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  2662. var isAdd bool
  2663. existMap := make(map[string]string)
  2664. dataLen := len(dataList)
  2665. fmt.Println("dataLen:", dataLen)
  2666. for i := 0; i < dataLen; i++ {
  2667. j := i + formulaInt
  2668. if j < dataLen {
  2669. //当期
  2670. currentItem := dataList[i]
  2671. preItem := dataList[j]
  2672. if currentItem != nil && preItem != nil {
  2673. existKey := edbCode + currentItem.DataTime
  2674. if _, ok := existMap[existKey]; !ok {
  2675. currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
  2676. timestamp := currentDate.UnixNano() / 1e6
  2677. timestampStr := fmt.Sprintf("%d", timestamp)
  2678. val := HbzDiv(currentItem.Value, preItem.Value)
  2679. if val != "" {
  2680. if existVal, findOk := existDataMap[currentItem.DataTime]; !findOk {
  2681. addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, val)
  2682. isAdd = true
  2683. } else {
  2684. if existVal != val {
  2685. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  2686. sql = fmt.Sprintf(sql, dataTableName)
  2687. err = tx.Exec(sql, val, edbInfoId, currentItem.DataTime).Error
  2688. //_, err = o.Raw(sql, val, edbInfoId, currentItem.DataTime).Exec()
  2689. if err != nil {
  2690. return err
  2691. }
  2692. }
  2693. }
  2694. }
  2695. }
  2696. existMap[existKey] = currentItem.DataTime
  2697. }
  2698. }
  2699. }
  2700. if isAdd {
  2701. addSql = strings.TrimRight(addSql, ",")
  2702. err = tx.Exec(addSql).Error
  2703. //_, err = o.Raw(addSql).Exec()
  2704. if err != nil {
  2705. return err
  2706. }
  2707. }
  2708. return
  2709. }
  2710. //环比值,current:当期,pre:上期 公式: (当期-上期)/上期
  2711. func HbzDiv(current, pre float64) string {
  2712. if pre == 0 {
  2713. return ""
  2714. }
  2715. currentVal := decimal.NewFromFloat(float64(current))
  2716. preVal := decimal.NewFromFloat(float64(pre))
  2717. val, _ := currentVal.Sub(preVal).Div(preVal).Float64()
  2718. valStr := utils.SubFloatToString(val, 4)
  2719. return valStr
  2720. }
  2721. //刷新所有环差值数据
  2722. func RefreshAllCalculateHcz(edbInfoId, source int, fromEdbInfo *edbInfoModel.EdbInfo, edbCode, startDate, endDate string, formulaInt int) (err error) {
  2723. tx := global.MYSQL["data"].Begin()
  2724. defer func() {
  2725. if err != nil {
  2726. tx.Rollback()
  2727. } else {
  2728. tx.Commit()
  2729. }
  2730. }()
  2731. if err != nil {
  2732. return
  2733. }
  2734. edbInfoIdStr := strconv.Itoa(edbInfoId)
  2735. //计算数据
  2736. var condition string
  2737. var pars []interface{}
  2738. condition += " AND edb_info_id=? "
  2739. pars = append(pars, fromEdbInfo.EdbInfoId)
  2740. if startDate != "" {
  2741. condition += " AND data_time>=? "
  2742. pars = append(pars, startDate)
  2743. }
  2744. if endDate != "" {
  2745. condition += " AND data_time<=? "
  2746. pars = append(pars, endDate)
  2747. }
  2748. dataList, err := edbDataModel.GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
  2749. if err != nil {
  2750. return err
  2751. }
  2752. var dateArr []string
  2753. dataMap := make(map[string]*edbDataModel.EdbInfoSearchData)
  2754. for _, v := range dataList {
  2755. dateArr = append(dateArr, v.DataTime)
  2756. dataMap[v.DataTime] = v
  2757. }
  2758. fmt.Println("source:", source)
  2759. //获取指标所有数据
  2760. existDataList := make([]*edbDataModel.EdbDataBase, 0)
  2761. dataTableName := edbDataModel.GetEdbDataTableName(source)
  2762. fmt.Println("dataTableName:", dataTableName)
  2763. sql := `SELECT * FROM %s WHERE edb_info_id=? `
  2764. sql = fmt.Sprintf(sql, dataTableName)
  2765. err = global.MYSQL["data"].Raw(sql, edbInfoId).Scan(&existDataList).Error
  2766. //_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
  2767. if err != nil {
  2768. return err
  2769. }
  2770. existDataMap := make(map[string]string)
  2771. for _, v := range existDataList {
  2772. existDataMap[v.DataTime] = v.Value
  2773. }
  2774. //fmt.Println("existDataMap:", existDataMap)
  2775. addSql := ` INSERT INTO edb_data_calculate_hcz(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  2776. var isAdd bool
  2777. existMap := make(map[string]string)
  2778. dataLen := len(dataList)
  2779. fmt.Println("dataLen:", dataLen)
  2780. for i := 0; i < dataLen; i++ {
  2781. j := i + formulaInt
  2782. if j < dataLen {
  2783. //当期
  2784. currentItem := dataList[i]
  2785. preItem := dataList[j]
  2786. if currentItem != nil && preItem != nil {
  2787. existKey := edbCode + currentItem.DataTime
  2788. if _, ok := existMap[existKey]; !ok {
  2789. currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
  2790. timestamp := currentDate.UnixNano() / 1e6
  2791. timestampStr := fmt.Sprintf("%d", timestamp)
  2792. val := HczDiv(currentItem.Value, preItem.Value)
  2793. if val != "" {
  2794. if existVal, findOk := existDataMap[currentItem.DataTime]; !findOk {
  2795. addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, val)
  2796. isAdd = true
  2797. } else {
  2798. if existVal != val {
  2799. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  2800. sql = fmt.Sprintf(sql, dataTableName)
  2801. err = tx.Exec(sql, val, edbInfoId, currentItem.DataTime).Error
  2802. //_, err = o.Raw(sql, val, edbInfoId, currentItem.DataTime).Exec()
  2803. if err != nil {
  2804. return err
  2805. }
  2806. }
  2807. }
  2808. }
  2809. }
  2810. existMap[existKey] = currentItem.DataTime
  2811. }
  2812. }
  2813. }
  2814. if isAdd {
  2815. addSql = strings.TrimRight(addSql, ",")
  2816. err = tx.Exec(addSql).Error
  2817. //_, err = o.Raw(addSql).Exec()
  2818. if err != nil {
  2819. return err
  2820. }
  2821. }
  2822. return
  2823. }
  2824. //环差值,current:当期,pre:上期 公式:当期-上期
  2825. func HczDiv(current, pre float64) string {
  2826. if pre == 0 {
  2827. return ""
  2828. }
  2829. currentVal := decimal.NewFromFloat(current)
  2830. preVal := decimal.NewFromFloat(pre)
  2831. val, _ := currentVal.Sub(preVal).Float64()
  2832. valStr := utils.SubFloatToString(val, 4)
  2833. return valStr
  2834. }
  2835. //刷新所有变频数据
  2836. func RefreshAllCalculateBp(edbInfoId, source int, fromEdbInfo *edbInfoModel.EdbInfo, edbCode, startDate, endDate string) (err error) {
  2837. tx := global.MYSQL["data"].Begin()
  2838. defer func() {
  2839. if err != nil {
  2840. tx.Rollback()
  2841. } else {
  2842. tx.Commit()
  2843. }
  2844. }()
  2845. if err != nil {
  2846. return
  2847. }
  2848. edbInfoIdStr := strconv.Itoa(edbInfoId)
  2849. //计算数据
  2850. //计算数据
  2851. var condition string
  2852. var pars []interface{}
  2853. condition += " AND edb_info_id=? "
  2854. pars = append(pars, fromEdbInfo.EdbInfoId)
  2855. if startDate != "" {
  2856. condition += " AND data_time>=? "
  2857. pars = append(pars, startDate)
  2858. }
  2859. if endDate != "" {
  2860. condition += " AND data_time<=? "
  2861. pars = append(pars, endDate)
  2862. }
  2863. dataList, err := edbDataModel.GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
  2864. if err != nil {
  2865. return err
  2866. }
  2867. var dateArr []string
  2868. dataMap := make(map[string]*edbDataModel.EdbInfoSearchData)
  2869. for _, v := range dataList {
  2870. dateArr = append(dateArr, v.DataTime)
  2871. dataMap[v.DataTime] = v
  2872. }
  2873. fmt.Println("source:", source)
  2874. //获取指标所有数据
  2875. existDataList := make([]*edbDataModel.EdbDataBase, 0)
  2876. dataTableName := edbDataModel.GetEdbDataTableName(source)
  2877. fmt.Println("dataTableName:", dataTableName)
  2878. sql := `SELECT * FROM %s WHERE edb_info_id=? `
  2879. sql = fmt.Sprintf(sql, dataTableName)
  2880. err = tx.Raw(sql, edbInfoId).Scan(&existDataList).Error
  2881. //_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
  2882. if err != nil {
  2883. return err
  2884. }
  2885. existDataMap := make(map[string]string)
  2886. for _, v := range existDataList {
  2887. existDataMap[v.DataTime] = v.Value
  2888. }
  2889. //fmt.Println("existDataMap:", existDataMap)
  2890. addSql := ` INSERT INTO edb_data_calculate_bp(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  2891. var isAdd bool
  2892. existMap := make(map[string]string)
  2893. dataLen := len(dataList)
  2894. for i := 0; i < dataLen; i++ {
  2895. //当期
  2896. currentItem := dataList[i]
  2897. currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
  2898. var day int
  2899. var preItem *edbDataModel.EdbInfoSearchData
  2900. var preDate time.Time
  2901. if i == 0 {
  2902. day = int(time.Now().Sub(currentDate).Hours() / float64(24))
  2903. preDate = time.Now()
  2904. } else {
  2905. j := i + 1
  2906. if j < dataLen {
  2907. preItem = dataList[j]
  2908. preDate, _ = time.Parse(utils.FormatDate, preItem.DataTime)
  2909. day = int(currentDate.Sub(preDate).Hours() / float64(24))
  2910. }
  2911. }
  2912. for k := 0; k <= day; k++ {
  2913. needDay := preDate.AddDate(0, 0, -k)
  2914. needDayStr := needDay.Format(utils.FormatDate)
  2915. existKey := edbCode + needDayStr
  2916. if _, ok := existMap[existKey]; !ok {
  2917. timestamp := needDay.UnixNano() / 1e6
  2918. timestampStr := fmt.Sprintf("%d", timestamp)
  2919. valStr := decimal.NewFromFloat(currentItem.Value).String()
  2920. if existVal, ok := existDataMap[needDayStr]; !ok {
  2921. addSql += GetAddSql(edbInfoIdStr, edbCode, needDayStr, timestampStr, valStr)
  2922. } else {
  2923. if existVal != valStr {
  2924. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  2925. sql = fmt.Sprintf(sql, dataTableName)
  2926. err = tx.Exec(sql, valStr, edbInfoId, needDay).Error
  2927. //_, err = o.Raw(sql, valStr, edbInfoId, needDay).Exec()
  2928. if err != nil {
  2929. return err
  2930. }
  2931. }
  2932. }
  2933. }
  2934. existMap[existKey] = needDayStr
  2935. }
  2936. existKey := edbCode + currentItem.DataTime
  2937. if _, ok := existMap[existKey]; !ok {
  2938. currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
  2939. timestamp := currentDate.UnixNano() / 1e6
  2940. timestampStr := fmt.Sprintf("%d", timestamp)
  2941. valStr := decimal.NewFromFloat(currentItem.Value).String()
  2942. if existVal, ok := existDataMap[currentItem.DataTime]; !ok {
  2943. addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, valStr)
  2944. } else {
  2945. if existVal != valStr {
  2946. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  2947. sql = fmt.Sprintf(sql, dataTableName)
  2948. err = tx.Exec(sql, valStr, edbInfoId, currentItem.DataTime).Error
  2949. //_, err = o.Raw(sql, valStr, edbInfoId, currentItem.DataTime).Exec()
  2950. if err != nil {
  2951. return err
  2952. }
  2953. }
  2954. }
  2955. }
  2956. existMap[existKey] = currentItem.DataTime
  2957. }
  2958. if isAdd {
  2959. addSql = strings.TrimRight(addSql, ",")
  2960. err = tx.Exec(addSql).Error
  2961. //_, err = o.Raw(addSql).Exec()
  2962. if err != nil {
  2963. return err
  2964. }
  2965. }
  2966. return
  2967. }
  2968. // RefreshAllCalculateZjpj 刷新所有 直接拼接 数据
  2969. func RefreshAllCalculateZjpj(edbInfo *edbInfoModel.EdbInfo) (err error) {
  2970. tx := global.MYSQL["data"].Begin()
  2971. defer func() {
  2972. if err != nil {
  2973. tx.Rollback()
  2974. } else {
  2975. tx.Commit()
  2976. }
  2977. }()
  2978. //查询当前指标现有的数据
  2979. var condition string
  2980. var pars []interface{}
  2981. condition += " AND edb_info_id=? "
  2982. pars = append(pars, edbInfo.EdbInfoId)
  2983. dataList, err := edbDataModel.GetAllEdbDataCalculateZjpjByEdbInfoId(edbInfo.EdbInfoId)
  2984. if err != nil {
  2985. return err
  2986. }
  2987. var dateArr []string
  2988. dataMap := make(map[string]*edbDataModel.EdbDataCalculateZjpj)
  2989. removeDataTimeMap := make(map[string]int) //需要移除的日期数据
  2990. for _, v := range dataList {
  2991. dateArr = append(dateArr, v.DataTime)
  2992. dataMap[v.DataTime] = v
  2993. removeDataTimeMap[v.DataTime] = 1
  2994. }
  2995. //查询关联指标信息
  2996. var existCondition string
  2997. var existPars []interface{}
  2998. existCondition += " AND edb_info_id=? "
  2999. existPars = append(existPars, edbInfo.EdbInfoId)
  3000. existList, err := edbDataModel.GetEdbInfoCalculateListByCondition(existCondition, existPars)
  3001. if err != nil {
  3002. err = errors.New("判断指标是否改变失败,Err:" + err.Error())
  3003. return
  3004. }
  3005. var existItemA, existItemB *edbDataModel.EdbInfoCalculateMapping
  3006. for _, existItem := range existList {
  3007. if existItem.FromTag == "A" {
  3008. existItemA = existItem
  3009. } else if existItem.FromTag == "B" {
  3010. existItemB = existItem
  3011. }
  3012. }
  3013. addDataList := make([]*edbDataModel.EdbDataCalculateZjpj, 0)
  3014. //第一个指标
  3015. {
  3016. var condition string
  3017. var pars []interface{}
  3018. condition += " AND data_time < ? AND edb_info_id=? "
  3019. pars = append(pars, edbInfo.CalculateFormula, existItemA.FromEdbInfoId)
  3020. //第一个指标的数据列表
  3021. firstDataList, tmpErr := edbDataModel.GetEdbDataListAll(condition, pars, existItemA.FromSource, 0)
  3022. if tmpErr != nil {
  3023. return tmpErr
  3024. }
  3025. for _, v := range firstDataList {
  3026. //校验待删除日期数据里面是否存在该元素,如果存在的话,那么移除该元素
  3027. if _, ok := removeDataTimeMap[v.DataTime]; ok {
  3028. delete(removeDataTimeMap, v.DataTime)
  3029. }
  3030. //时间戳
  3031. if edbData, ok := dataMap[v.DataTime]; ok {
  3032. if edbData.Value != v.Value {
  3033. //更新指标数据
  3034. edbData.Value = v.Value
  3035. tempErr := tx.Model(edbDataModel.EdbDataCalculateZjpj{}).Where("edb_data_id = ?", edbData.EdbDataId).Updates(edbDataModel.EdbDataCalculateZjpj{Value: v.Value}).Error
  3036. if tempErr != nil {
  3037. fmt.Println("tmpErr:", tmpErr)
  3038. }
  3039. //o.Update(edbData, "Value")
  3040. }
  3041. } else {
  3042. //时间戳
  3043. currentDate, _ := time.Parse(utils.FormatDate, v.DataTime)
  3044. timestamp := currentDate.UnixNano() / 1e6
  3045. edbDataZjpj := &edbDataModel.EdbDataCalculateZjpj{
  3046. EdbInfoId: edbInfo.EdbInfoId,
  3047. EdbCode: edbInfo.EdbCode,
  3048. DataTime: v.DataTime,
  3049. Value: v.Value,
  3050. Status: 1,
  3051. CreateTime: time.Now(),
  3052. ModifyTime: time.Now(),
  3053. DataTimestamp: timestamp,
  3054. }
  3055. addDataList = append(addDataList, edbDataZjpj)
  3056. }
  3057. }
  3058. }
  3059. //第二个指标
  3060. {
  3061. condition = ``
  3062. pars = make([]interface{}, 0)
  3063. condition += " AND data_time >= ? AND edb_info_id = ? "
  3064. pars = append(pars, edbInfo.CalculateFormula, existItemB.FromEdbInfoId)
  3065. //第二个指标的数据列表
  3066. secondDataList, tmpErr := edbDataModel.GetEdbDataListAll(condition, pars, existItemB.FromSource, 0)
  3067. if tmpErr != nil {
  3068. return tmpErr
  3069. }
  3070. for _, v := range secondDataList {
  3071. //校验待删除日期数据里面是否存在该元素,如果存在的话,那么移除该元素
  3072. if _, ok := removeDataTimeMap[v.DataTime]; ok {
  3073. delete(removeDataTimeMap, v.DataTime)
  3074. }
  3075. if edbData, ok := dataMap[v.DataTime]; ok {
  3076. if edbData.Value != v.Value {
  3077. //更新指标数据
  3078. edbData.Value = v.Value
  3079. edbData.ModifyTime = time.Now()
  3080. tempErr := tx.Model(edbDataModel.EdbDataCalculateZjpj{}).Where("edb_data_id = ?", edbData.EdbDataId).Updates(edbDataModel.EdbDataCalculateZjpj{Value: v.Value, ModifyTime: time.Now()}).Error
  3081. if tempErr != nil {
  3082. fmt.Println("tmpErr:", tmpErr)
  3083. }
  3084. //_, tmpErr := o.Update(edbData, "Value", "ModifyTime")
  3085. //if tmpErr != nil {
  3086. // fmt.Println("tmpErr:", tmpErr)
  3087. //}
  3088. }
  3089. } else {
  3090. //时间戳
  3091. currentDate, _ := time.Parse(utils.FormatDate, v.DataTime)
  3092. timestamp := currentDate.UnixNano() / 1e6
  3093. edbDataZjpj := &edbDataModel.EdbDataCalculateZjpj{
  3094. EdbInfoId: edbInfo.EdbInfoId,
  3095. EdbCode: edbInfo.EdbCode,
  3096. DataTime: v.DataTime,
  3097. Value: v.Value,
  3098. Status: 1,
  3099. CreateTime: time.Now(),
  3100. ModifyTime: time.Now(),
  3101. DataTimestamp: timestamp,
  3102. }
  3103. addDataList = append(addDataList, edbDataZjpj)
  3104. }
  3105. }
  3106. }
  3107. //删除已经不存在的累计同比拼接指标数据(由于同比值当日的数据删除了)
  3108. {
  3109. removeDateList := make([]string, 0)
  3110. for dateTime := range removeDataTimeMap {
  3111. removeDateList = append(removeDateList, dateTime)
  3112. }
  3113. if len(removeDateList) > 0 {
  3114. removeDateStr := strings.Join(removeDateList, `","`)
  3115. removeDateStr = `"` + removeDateStr + `"`
  3116. //如果拼接指标变更了,那么需要删除所有的指标数据
  3117. tableName := edbDataModel.GetEdbDataTableName(edbInfo.Source)
  3118. sql := fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time in (%s) `, tableName, removeDateStr)
  3119. err = tx.Exec(sql, edbInfo.EdbInfoId).Error
  3120. //_, err = o.Raw(sql, edbInfo.EdbInfoId).Exec()
  3121. if err != nil {
  3122. err = errors.New("删除不存在的直接拼接指标数据失败,Err:" + err.Error())
  3123. return
  3124. }
  3125. }
  3126. }
  3127. //数据入库
  3128. tmpAddDataList := make([]*edbDataModel.EdbDataCalculateZjpj, 0)
  3129. for _, v := range addDataList {
  3130. tmpAddDataList = append(tmpAddDataList, v)
  3131. if len(tmpAddDataList) >= 200 {
  3132. tmpErr := tx.Create(tmpAddDataList).Error
  3133. //_, tmpErr := o.InsertMulti(len(tmpAddDataList), tmpAddDataList)
  3134. if tmpErr != nil {
  3135. err = tmpErr
  3136. return
  3137. }
  3138. //重新初始化需要加入的数据切片
  3139. tmpAddDataList = make([]*edbDataModel.EdbDataCalculateZjpj, 0)
  3140. }
  3141. }
  3142. //最后如果还有需要新增的数据,那么就统一入库
  3143. if len(tmpAddDataList) > 0 {
  3144. tmpErr := tx.Create(tmpAddDataList).Error
  3145. //_, tmpErr := o.InsertMulti(len(tmpAddDataList), tmpAddDataList)
  3146. if tmpErr != nil {
  3147. err = tmpErr
  3148. return
  3149. }
  3150. }
  3151. return
  3152. }
  3153. // RefreshAllCalculateLjztbpj 刷新所有 累计值同比拼接 数据
  3154. func RefreshAllCalculateLjztbpj(edbInfo *edbInfoModel.EdbInfo) (err error) {
  3155. tx := global.MYSQL["data"].Begin()
  3156. defer func() {
  3157. if err != nil {
  3158. tx.Rollback()
  3159. } else {
  3160. tx.Commit()
  3161. }
  3162. }()
  3163. //查询当前指标现有的数据
  3164. var condition string
  3165. var pars []interface{}
  3166. condition += " AND edb_info_id=? "
  3167. pars = append(pars, edbInfo.EdbInfoId)
  3168. //所有的数据
  3169. dataList, err := edbDataModel.GetAllEdbDataCalculateLjztbpjByEdbInfoId(edbInfo.EdbInfoId)
  3170. if err != nil {
  3171. return err
  3172. }
  3173. //待拼接指标map
  3174. pjDataMap := make(map[string]float64) //需要入库的数据
  3175. nowEdbDataMap := make(map[string]float64) //当前指标的数据(已经在库里了,不需要重新)
  3176. //拼接指标的日期切片数据
  3177. pjEdbDataTimeList := make([]string, 0)
  3178. dataMap := make(map[string]*edbDataModel.EdbDataCalculateLjztbpj)
  3179. for _, v := range dataList {
  3180. pjEdbDataTimeList = append(pjEdbDataTimeList, v.DataTime)
  3181. dataMap[v.DataTime] = v
  3182. nowEdbDataMap[v.DataTime] = v.Value
  3183. }
  3184. //查询关联指标信息
  3185. var existCondition string
  3186. var existPars []interface{}
  3187. existCondition += " AND edb_info_id=? "
  3188. existPars = append(existPars, edbInfo.EdbInfoId)
  3189. existList, err := edbDataModel.GetEdbInfoCalculateListByCondition(existCondition, existPars)
  3190. if err != nil {
  3191. err = errors.New("判断指标是否改变失败,Err:" + err.Error())
  3192. return
  3193. }
  3194. var existItemA, existItemB *edbDataModel.EdbInfoCalculateMapping
  3195. for _, existItem := range existList {
  3196. if existItem.FromTag == "A" {
  3197. existItemA = existItem
  3198. } else if existItem.FromTag == "B" {
  3199. existItemB = existItem
  3200. }
  3201. }
  3202. // 原数据开始计算日期
  3203. startCalculationDate, _ := time.ParseInLocation(utils.FormatDate, edbInfo.CalculateFormula, time.Local)
  3204. //待拼接指标
  3205. {
  3206. var condition string
  3207. var pars []interface{}
  3208. condition += " AND data_time <= ? AND edb_info_id=? "
  3209. pars = append(pars, startCalculationDate, existItemA.FromEdbInfoId)
  3210. //第一个指标的数据列表
  3211. firstDataList, tmpErr := edbDataModel.GetEdbDataListAll(condition, pars, existItemA.FromSource, 0)
  3212. if tmpErr != nil {
  3213. return tmpErr
  3214. }
  3215. for _, v := range firstDataList {
  3216. //时间戳
  3217. if edbData, ok := dataMap[v.DataTime]; ok {
  3218. if edbData.Value != v.Value {
  3219. //更新指标数据
  3220. edbData.Value = v.Value
  3221. //tempErr := tx.Model()
  3222. //o.Update(edbData, "Value")
  3223. tempErr := tx.Model(edbDataModel.EdbDataCalculateLjztbpj{}).Where("edb_data_id = ?", edbData.EdbDataId).Updates(edbDataModel.EdbDataCalculateLjztbpj{Value: v.Value}).Error
  3224. if tempErr != nil {
  3225. fmt.Println("tmpErr:", tmpErr)
  3226. }
  3227. //将新的数据存入已入库指标map里面,以便后续计算
  3228. nowEdbDataMap[edbData.DataTime] = v.Value
  3229. }
  3230. }
  3231. }
  3232. }
  3233. //同比值指标map
  3234. tbzEdbDataMap := make(map[string]float64)
  3235. //同比值日期切片列表
  3236. tbzEdbDataTimeList := make([]string, 0)
  3237. //同比值指标
  3238. {
  3239. var condition string
  3240. var pars []interface{}
  3241. condition += " AND data_time > ? AND edb_info_id = ? "
  3242. pars = append(pars, startCalculationDate, existItemB.FromEdbInfoId)
  3243. //第二个指标的数据列表
  3244. secondDataList, tmpErr := edbDataModel.GetEdbDataListAll(condition, pars, existItemB.FromSource, 0)
  3245. if tmpErr != nil {
  3246. return tmpErr
  3247. }
  3248. for _, v := range secondDataList {
  3249. tbzEdbDataMap[v.DataTime] = v.Value
  3250. tbzEdbDataTimeList = append(tbzEdbDataTimeList, v.DataTime)
  3251. }
  3252. }
  3253. sort.Strings(tbzEdbDataTimeList)
  3254. // 遍历现有的数据,判断拼接指标中是否存在该日期数据,如果拼接指标无此数据,那么需要删除该日期数据(日期的判断:需要在开始计算日期之后)
  3255. removeDateList := make([]string, 0)
  3256. for nowEdbDate := range nowEdbDataMap {
  3257. nowEdbDateTime, _ := time.ParseInLocation(utils.FormatDate, nowEdbDate, time.Local)
  3258. //校验日期 需要 大于 拼接前日期
  3259. if startCalculationDate.Before(nowEdbDateTime) {
  3260. if _, ok := tbzEdbDataMap[nowEdbDate]; !ok {
  3261. // 同比指标中,不存在该日期数据,那么需要移除 现有数据 中该日期的数据
  3262. removeDateList = append(removeDateList, nowEdbDate)
  3263. }
  3264. }
  3265. }
  3266. //待修改的指标数据map(index:日期,value:值)
  3267. updateEdbDataMap := make(map[string]float64)
  3268. for _, v := range tbzEdbDataTimeList {
  3269. tbzDataTime, _ := time.ParseInLocation(utils.FormatDate, v, time.Local)
  3270. //获取拼接指标上一年同一天的数据
  3271. var pjDataTime time.Time
  3272. if tbzDataTime.Month() == 2 {
  3273. pjDataTime = tbzDataTime.AddDate(0, -11, 0)
  3274. pjDataTime = time.Date(pjDataTime.Year(), pjDataTime.Month(), 1, 0, 0, 0, 0, time.Now().Location()).AddDate(0, 0, -1)
  3275. } else {
  3276. pjDataTime = tbzDataTime.AddDate(-1, 0, 0)
  3277. }
  3278. //校验现有数据中,是否存在该日期的数据,如果存在的话,那么就要去校验 最新计算数据 与 现有数据 是否一致
  3279. if nowEdbDataValue, isHas := nowEdbDataMap[v]; isHas {
  3280. //获取去年今日的数据,获取到后,然后是去修改该日期的数据
  3281. if lastYearEdbDataValue, ok := nowEdbDataMap[pjDataTime.Format(utils.FormatDate)]; ok {
  3282. if v == "2021-08-31" {
  3283. fmt.Println("进来了")
  3284. }
  3285. tbzDataValue := tbzEdbDataMap[v] //同比值
  3286. currValue := lastYearEdbDataValue * (1 + tbzDataValue/100)
  3287. currValue, _ = decimal.NewFromFloat(currValue).Truncate(4).Float64() //保留4位小数
  3288. //如果计算出来的值与库里面的值不匹配,那么就去修改该值
  3289. if nowEdbDataValue != currValue {
  3290. //将计算后的数据存入待拼接指标map里面,以便后续计算
  3291. updateEdbDataMap[v] = currValue
  3292. }
  3293. }
  3294. } else {
  3295. //因为 现有数据中 不存在该日期数据,那么需要做新增数据处理
  3296. //如果去年今日存在该数据,那么就去计算当前的数据
  3297. if pjDataValue, ok := nowEdbDataMap[pjDataTime.Format(utils.FormatDate)]; ok {
  3298. tbzDataValue := tbzEdbDataMap[v] //同比值
  3299. currValue := pjDataValue * (1 + tbzDataValue/100)
  3300. currValue, _ = decimal.NewFromFloat(currValue).Truncate(4).Float64()
  3301. //将计算后的数据存入已入库指标map里面,以便后续计算
  3302. nowEdbDataMap[v] = currValue
  3303. //将计算后的数据存入待拼接指标map里面,以便后续入库
  3304. pjDataMap[v] = currValue
  3305. pjEdbDataTimeList = append(pjEdbDataTimeList, v)
  3306. }
  3307. }
  3308. }
  3309. //新增的数据入库
  3310. {
  3311. addDataList := make([]*edbDataModel.EdbDataCalculateLjztbpj, 0)
  3312. for dataTime, dataValue := range pjDataMap {
  3313. //时间戳
  3314. currentDate, _ := time.Parse(utils.FormatDate, dataTime)
  3315. timestamp := currentDate.UnixNano() / 1e6
  3316. edbDataLjztbpj := &edbDataModel.EdbDataCalculateLjztbpj{
  3317. EdbInfoId: edbInfo.EdbInfoId,
  3318. EdbCode: edbInfo.EdbCode,
  3319. DataTime: dataTime,
  3320. Value: dataValue,
  3321. Status: 1,
  3322. CreateTime: time.Now(),
  3323. ModifyTime: time.Now(),
  3324. DataTimestamp: timestamp,
  3325. }
  3326. addDataList = append(addDataList, edbDataLjztbpj)
  3327. }
  3328. tmpAddDataList := make([]*edbDataModel.EdbDataCalculateLjztbpj, 0)
  3329. for _, v := range addDataList {
  3330. tmpAddDataList = append(tmpAddDataList, v)
  3331. if len(tmpAddDataList) >= 200 {
  3332. tmpErr := tx.Create(tmpAddDataList).Error
  3333. //_, tmpErr := o.InsertMulti(len(tmpAddDataList), tmpAddDataList)
  3334. if tmpErr != nil {
  3335. err = tmpErr
  3336. return
  3337. }
  3338. //重新初始化需要加入的数据切片
  3339. tmpAddDataList = make([]*edbDataModel.EdbDataCalculateLjztbpj, 0)
  3340. }
  3341. }
  3342. //最后如果还有需要新增的数据,那么就统一入库
  3343. if len(tmpAddDataList) > 0 {
  3344. tmpErr := tx.Create(tmpAddDataList).Error
  3345. //_, tmpErr := o.InsertMulti(len(tmpAddDataList), tmpAddDataList)
  3346. if tmpErr != nil {
  3347. err = tmpErr
  3348. return
  3349. }
  3350. }
  3351. }
  3352. //删除已经不存在的累计同比拼接指标数据(由于同比值当日的数据删除了)
  3353. {
  3354. if len(removeDateList) > 0 {
  3355. removeDateStr := strings.Join(removeDateList, `","`)
  3356. removeDateStr = `"` + removeDateStr + `"`
  3357. //如果拼接指标变更了,那么需要删除所有的指标数据
  3358. tableName := edbDataModel.GetEdbDataTableName(edbInfo.Source)
  3359. sql := fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time in (%s) `, tableName, removeDateStr)
  3360. err = tx.Exec(sql, edbInfo.EdbInfoId).Error
  3361. //_, err = o.Raw(sql, edbInfo.EdbInfoId).Exec()
  3362. if err != nil {
  3363. err = errors.New("删除不存在的累计值同比拼接指标数据失败,Err:" + err.Error())
  3364. return
  3365. }
  3366. }
  3367. }
  3368. //修改现有的数据中对应的值
  3369. {
  3370. tableName := edbDataModel.GetEdbDataTableName(edbInfo.Source)
  3371. for edbDate, edbDataValue := range updateEdbDataMap {
  3372. sql := fmt.Sprintf(` UPDATE %s set value = ?,modify_time=now() WHERE edb_info_id = ? and data_time = ? `, tableName)
  3373. err = tx.Exec(sql, edbDataValue, edbInfo.EdbInfoId, edbDate).Error
  3374. //_, err = o.Raw(sql, edbDataValue, edbInfo.EdbInfoId, edbDate).Exec()
  3375. if err != nil {
  3376. err = errors.New("更新现有的累计值同比拼接指标数据失败,Err:" + err.Error())
  3377. return
  3378. }
  3379. }
  3380. }
  3381. return
  3382. }