edb_data_calculate_ljz.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670
  1. package models
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta_gn/eta_index_lib/global"
  6. "eta_gn/eta_index_lib/utils"
  7. "fmt"
  8. "github.com/shopspring/decimal"
  9. "gorm.io/gorm"
  10. "reflect"
  11. "strconv"
  12. "strings"
  13. "time"
  14. )
  15. type Ljz struct {
  16. }
  17. func (obj Ljz) Add(params AddCalculateBatchParams) (edbInfo *EdbInfo, err error, errMsg string) {
  18. req := params.Req
  19. fromEdbInfo := params.FromEdbInfo
  20. edbCode := params.EdbCode
  21. frequencyInt := utils.CheckFrequency(fromEdbInfo.Frequency, req.Frequency)
  22. if frequencyInt < 0 {
  23. errMsg = "频度异常,不允许低频转为高频"
  24. err = errors.New(errMsg)
  25. return
  26. }
  27. if frequencyInt == 0 {
  28. errMsg = "频度异常,不允许同频计算累计值"
  29. err = errors.New(errMsg)
  30. return
  31. }
  32. to := global.DEFAULT_DmSQL.Begin()
  33. defer func() {
  34. if err != nil {
  35. to.Rollback()
  36. } else {
  37. to.Commit()
  38. }
  39. }()
  40. edbInfo = &EdbInfo{
  41. SourceName: obj.GetSourceName(),
  42. Source: obj.GetSource(),
  43. EdbCode: edbCode,
  44. EdbName: req.EdbName,
  45. EdbNameSource: req.EdbName,
  46. Frequency: req.Frequency,
  47. Unit: req.Unit,
  48. StartDate: "",
  49. EndDate: "",
  50. ClassifyId: req.ClassifyId,
  51. SysUserId: params.SysUserId,
  52. SysUserRealName: params.SysUserRealName,
  53. UniqueCode: params.UniqueCode,
  54. CreateTime: time.Now(),
  55. ModifyTime: time.Now(),
  56. MinValue: 0,
  57. MaxValue: 0,
  58. CalculateFormula: req.Formula,
  59. EdbType: obj.GetEdbType(),
  60. Sort: GetAddEdbMaxSortByClassifyId(req.ClassifyId, utils.EDB_INFO_TYPE),
  61. MoveType: 0,
  62. MoveFrequency: "",
  63. NoUpdate: 0,
  64. ServerUrl: "",
  65. EdbInfoType: 0,
  66. EdbNameEn: req.EdbName,
  67. UnitEn: req.Unit,
  68. LatestDate: "",
  69. LatestValue: 0,
  70. ChartImage: "",
  71. Calendar: "",
  72. Extra: req.Extra,
  73. }
  74. tmpErr := to.Create(edbInfo).Error
  75. if tmpErr != nil {
  76. err = tmpErr
  77. return
  78. }
  79. {
  80. calculateMappingItem := new(EdbInfoCalculateMapping)
  81. calculateMappingItem.CreateTime = time.Now()
  82. calculateMappingItem.ModifyTime = time.Now()
  83. calculateMappingItem.Sort = 1
  84. calculateMappingItem.EdbCode = edbCode
  85. calculateMappingItem.EdbInfoId = edbInfo.EdbInfoId
  86. calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
  87. calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
  88. calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
  89. calculateMappingItem.FromSource = fromEdbInfo.Source
  90. calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
  91. calculateMappingItem.FromTag = ""
  92. calculateMappingItem.Source = edbInfo.Source
  93. calculateMappingItem.SourceName = edbInfo.SourceName
  94. calculateMappingItem.FromSubSource = fromEdbInfo.SubSource
  95. err = to.Create(calculateMappingItem).Error
  96. if err != nil {
  97. return
  98. }
  99. }
  100. err = obj.refresh(to, edbInfo.EdbInfoId, edbInfo.Source, edbInfo.SubSource, edbInfo, fromEdbInfo, edbInfo.EdbCode, "", edbInfo.Extra)
  101. return
  102. }
  103. func (obj Ljz) Edit(params EditCalculateBatchParams) (err error, errMsg string) {
  104. req := params.Req
  105. edbInfo := params.EdbInfo
  106. fromEdbInfo := params.FromEdbInfo
  107. frequencyInt := utils.CheckFrequency(fromEdbInfo.Frequency, req.Frequency)
  108. if frequencyInt < 0 {
  109. errMsg = "频度异常,不允许低频转为高频"
  110. err = errors.New(errMsg)
  111. return
  112. }
  113. if frequencyInt == 0 {
  114. errMsg = "频度异常,不允许同频计算累计值"
  115. err = errors.New(errMsg)
  116. return
  117. }
  118. to := global.DEFAULT_DmSQL.Begin()
  119. defer func() {
  120. if err != nil {
  121. to.Rollback()
  122. } else {
  123. to.Commit()
  124. }
  125. }()
  126. tableName := GetEdbDataTableName(edbInfo.Source, edbInfo.SubSource)
  127. var isRecalculate bool
  128. if edbInfo.Frequency != req.Frequency || edbInfo.Extra != req.Extra {
  129. isRecalculate = true
  130. }
  131. edbInfo.EdbName = req.EdbName
  132. edbInfo.EdbNameSource = req.EdbName
  133. edbInfo.Frequency = req.Frequency
  134. edbInfo.Unit = req.Unit
  135. edbInfo.ClassifyId = req.ClassifyId
  136. edbInfo.Extra = req.Extra
  137. edbInfo.EdbNameEn = req.EdbNameEn
  138. edbInfo.UnitEn = req.UnitEn
  139. edbInfo.ModifyTime = time.Now()
  140. err = to.Model(edbInfo).Select([]string{"EdbName", "EdbNameSource", "Frequency", "Unit", "ClassifyId", "ModifyTime", "Extra", "EdbNameEn", "UnitEn"}).Updates(edbInfo).Error
  141. if err != nil {
  142. return
  143. }
  144. var existCondition string
  145. var existPars []interface{}
  146. existCondition += " AND edb_info_id=? AND from_edb_info_id=? "
  147. existPars = append(existPars, edbInfo.EdbInfoId, req.FromEdbInfoId)
  148. count, err := GetEdbInfoCalculateCountByCondition(existCondition, existPars)
  149. if err != nil {
  150. err = errors.New("判断指标是否改变失败,Err:" + err.Error())
  151. return
  152. }
  153. if count > 0 { // 指标未被替换,无需删除关联数据
  154. if isRecalculate {
  155. err = obj.refresh(to, edbInfo.EdbInfoId, edbInfo.Source, edbInfo.SubSource, edbInfo, fromEdbInfo, edbInfo.EdbCode, "", req.Extra)
  156. }
  157. return
  158. }
  159. sql := ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? `
  160. err = to.Raw(sql, edbInfo.EdbInfoId).Error
  161. if err != nil {
  162. return
  163. }
  164. sql = ` DELETE FROM ` + tableName + ` WHERE edb_info_id = ? `
  165. err = to.Raw(sql, edbInfo.EdbInfoId).Error
  166. if err != nil {
  167. return
  168. }
  169. {
  170. calculateMappingItem := &EdbInfoCalculateMapping{
  171. EdbInfoCalculateMappingId: 0,
  172. EdbInfoId: edbInfo.EdbInfoId,
  173. Source: obj.GetSource(),
  174. SourceName: obj.GetSourceName(),
  175. EdbCode: edbInfo.EdbCode,
  176. FromEdbInfoId: fromEdbInfo.EdbInfoId,
  177. FromEdbCode: fromEdbInfo.EdbCode,
  178. FromEdbName: fromEdbInfo.EdbName,
  179. FromSource: fromEdbInfo.Source,
  180. FromSourceName: fromEdbInfo.SourceName,
  181. FromTag: "",
  182. Sort: 1,
  183. CreateTime: time.Now(),
  184. ModifyTime: time.Now(),
  185. FromSubSource: fromEdbInfo.SubSource,
  186. }
  187. err = to.Create(calculateMappingItem).Error
  188. if err != nil {
  189. return
  190. }
  191. }
  192. err = obj.refresh(to, edbInfo.EdbInfoId, edbInfo.Source, edbInfo.SubSource, edbInfo, fromEdbInfo, edbInfo.EdbCode, "", edbInfo.Extra)
  193. return
  194. }
  195. func (obj Ljz) Refresh(params RefreshParams) (err error, errMsg string) {
  196. calculateMapping, err := GetEdbInfoCalculateMappingDetail(params.EdbInfo.EdbInfoId)
  197. if err != nil {
  198. errMsg = "GetEdbInfoCalculateLjzDetail Err:" + err.Error()
  199. return
  200. }
  201. fromEdbInfo, err := GetEdbInfoById(calculateMapping.FromEdbInfoId)
  202. if err != nil {
  203. errMsg = "GetEdbInfoById Err:" + err.Error()
  204. return
  205. }
  206. to := global.DEFAULT_DmSQL.Begin()
  207. defer func() {
  208. if err != nil {
  209. to.Rollback()
  210. } else {
  211. to.Commit()
  212. }
  213. }()
  214. err = obj.refresh(to, params.EdbInfo.EdbInfoId, params.EdbInfo.Source, params.EdbInfo.SubSource, params.EdbInfo, fromEdbInfo, params.EdbInfo.EdbCode, params.StartDate, params.EdbInfo.Extra)
  215. return
  216. }
  217. func (obj Ljz) GetSource() int {
  218. return utils.DATA_SOURCE_CALCULATE_LJZ
  219. }
  220. func (obj Ljz) GetSourceName() string {
  221. return utils.DATA_SOURCE_NAME_CALCULATE_LJZ
  222. }
  223. func (obj Ljz) GetEdbType() int {
  224. return utils.CALCULATE_EDB_TYPE
  225. }
  226. func (obj Ljz) refresh(to *gorm.DB, edbInfoId, source, subSource int, edbInfo, fromEdbInfo *EdbInfo, edbCode, startDate string, extra string) (err error) {
  227. dataTableName := GetEdbDataTableName(source, subSource)
  228. edbInfoIdStr := strconv.Itoa(edbInfoId)
  229. var isWeekData bool // 是否周度数据,如果是周度数据的话,是需要变频的,最后结果还需要除以7
  230. if fromEdbInfo.Frequency == `周度` {
  231. isWeekData = true
  232. }
  233. dataList, err := GetEdbDataListAllByTo(to, fromEdbInfo.Source, fromEdbInfo.SubSource, FindEdbDataListAllCond{
  234. EdbInfoId: fromEdbInfo.EdbInfoId,
  235. }, 1)
  236. if err != nil {
  237. return err
  238. }
  239. fromEdbDataMap := make(map[string]float64)
  240. if isWeekData {
  241. dataList, err = HandleDataByLinearRegression(dataList, fromEdbDataMap)
  242. if err != nil {
  243. return
  244. }
  245. }
  246. var lastValType int
  247. if extra != "" {
  248. var lastValConfig CalculateLjzEdbExtra
  249. err = json.Unmarshal([]byte(extra), &lastValConfig)
  250. if err != nil {
  251. err = fmt.Errorf("refreshAllCalculate,extra解析失败,Err:%s", err.Error())
  252. return
  253. }
  254. lastValType = lastValConfig.LastValType
  255. }
  256. dateList := make([]time.Time, 0)
  257. valueMap := make(map[time.Time]float64)
  258. switch edbInfo.Frequency {
  259. case "年度":
  260. yearMap := make(map[int]float64)
  261. yearList := make([]int, 0)
  262. var lastNewDate time.Time
  263. for _, item := range dataList {
  264. itemDate, tmpErr := time.ParseInLocation(utils.FormatDate, item.DataTime, time.Local)
  265. if tmpErr != nil {
  266. err = tmpErr
  267. return
  268. }
  269. year := itemDate.Year()
  270. yearVal, ok := yearMap[year]
  271. if ok {
  272. yearMap[year] = item.Value + yearVal
  273. } else {
  274. yearList = append(yearList, year)
  275. yearMap[year] = item.Value
  276. }
  277. }
  278. for _, v := range yearList {
  279. currTime := time.Date(v, 12, 31, 0, 0, 0, 0, time.Local)
  280. dateList = append(dateList, currTime)
  281. valueMap[currTime] = yearMap[v]
  282. lastNewDate = currTime
  283. }
  284. if lastValType == 1 {
  285. lastItem := dataList[len(dataList)-1]
  286. initVal := valueMap[lastNewDate]
  287. itemDate, tmpErr := time.ParseInLocation(utils.FormatDate, lastItem.DataTime, time.Local)
  288. if tmpErr != nil {
  289. err = tmpErr
  290. return
  291. }
  292. startDateT := time.Date(itemDate.Year(), 1, 1, 0, 0, 0, 0, time.Local)
  293. allDays := int(lastNewDate.Sub(startDateT).Hours() / 24)
  294. days := int(itemDate.Sub(startDateT).Hours() / 24)
  295. daysT := decimal.NewFromInt(int64(days))
  296. initValAndMonthT := decimal.NewFromFloat(initVal * float64(allDays))
  297. val, _ := initValAndMonthT.Div(daysT).Round(4).Float64()
  298. fmt.Printf("最新值 计算公式:%d*%f/(%d) = %f\n", allDays, initVal, days, val)
  299. valueMap[lastNewDate] = val
  300. }
  301. case "半年度":
  302. yearMonthMap := make(map[string]float64)
  303. yearMonthList := make([]string, 0)
  304. var lastNewDate time.Time
  305. for _, item := range dataList {
  306. itemDate, tmpErr := time.ParseInLocation(utils.FormatDate, item.DataTime, time.Local)
  307. if tmpErr != nil {
  308. err = tmpErr
  309. return
  310. }
  311. year := itemDate.Year()
  312. var tmpK string
  313. if itemDate.Month() <= 6 {
  314. tmpK = fmt.Sprint(year, "06")
  315. } else {
  316. tmpK = fmt.Sprint(year, "12")
  317. }
  318. yearVal, ok := yearMonthMap[tmpK]
  319. if ok {
  320. yearMonthMap[tmpK] = item.Value + yearVal
  321. } else {
  322. yearMonthList = append(yearMonthList, tmpK)
  323. yearMonthMap[tmpK] = item.Value
  324. }
  325. }
  326. for _, v := range yearMonthList {
  327. currTime, tmpErr := time.ParseInLocation(utils.FormatYearMonthUnSpace, v, time.Local)
  328. if tmpErr != nil {
  329. err = tmpErr
  330. return
  331. }
  332. currTime = currTime.AddDate(0, 1, -1)
  333. dateList = append(dateList, currTime)
  334. valueMap[currTime] = yearMonthMap[v]
  335. lastNewDate = currTime
  336. }
  337. if lastValType == 1 {
  338. lastItem := dataList[len(dataList)-1]
  339. initVal := valueMap[lastNewDate]
  340. itemDate, tmpErr := time.ParseInLocation(utils.FormatDate, lastItem.DataTime, time.Local)
  341. if tmpErr != nil {
  342. err = tmpErr
  343. return
  344. }
  345. startDateT := lastNewDate.AddDate(0, -6, 0)
  346. allDays := int(lastNewDate.Sub(startDateT).Hours() / 24)
  347. days := int(itemDate.Sub(startDateT).Hours() / 24)
  348. daysT := decimal.NewFromInt(int64(days))
  349. initValAndMonthT := decimal.NewFromFloat(initVal * float64(allDays))
  350. val, _ := initValAndMonthT.Div(daysT).Round(4).Float64()
  351. fmt.Printf("最新值 计算公式:%d*%f/(%d) = %f\n", allDays, initVal, days, val)
  352. valueMap[lastNewDate] = val
  353. }
  354. case "季度":
  355. yearMonthMap := make(map[string]float64)
  356. yearMonthList := make([]string, 0)
  357. var lastNewDate time.Time
  358. for _, item := range dataList {
  359. itemDate, tmpErr := time.ParseInLocation(utils.FormatDate, item.DataTime, time.Local)
  360. if tmpErr != nil {
  361. err = tmpErr
  362. return
  363. }
  364. year := itemDate.Year()
  365. var tmpK string
  366. if itemDate.Month() <= 3 {
  367. tmpK = fmt.Sprint(year, "03")
  368. } else if itemDate.Month() <= 6 {
  369. tmpK = fmt.Sprint(year, "06")
  370. } else if itemDate.Month() <= 9 {
  371. tmpK = fmt.Sprint(year, "09")
  372. } else {
  373. tmpK = fmt.Sprint(year, "12")
  374. }
  375. yearVal, ok := yearMonthMap[tmpK]
  376. if ok {
  377. yearMonthMap[tmpK] = item.Value + yearVal
  378. } else {
  379. yearMonthList = append(yearMonthList, tmpK)
  380. yearMonthMap[tmpK] = item.Value
  381. }
  382. }
  383. for _, v := range yearMonthList {
  384. currTime, tmpErr := time.ParseInLocation(utils.FormatYearMonthUnSpace, v, time.Local)
  385. if tmpErr != nil {
  386. err = tmpErr
  387. return
  388. }
  389. currTime = currTime.AddDate(0, 1, -1)
  390. dateList = append(dateList, currTime)
  391. valueMap[currTime] = yearMonthMap[v]
  392. lastNewDate = currTime
  393. }
  394. if lastValType == 1 {
  395. lastItem := dataList[len(dataList)-1]
  396. initVal := valueMap[lastNewDate]
  397. itemDate, tmpErr := time.ParseInLocation(utils.FormatDate, lastItem.DataTime, time.Local)
  398. if tmpErr != nil {
  399. err = tmpErr
  400. return
  401. }
  402. startDateT := lastNewDate.AddDate(0, -3, 0)
  403. allDays := int(lastNewDate.Sub(startDateT).Hours() / 24)
  404. days := int(itemDate.Sub(startDateT).Hours() / 24)
  405. daysT := decimal.NewFromInt(int64(days))
  406. initValAndMonthT := decimal.NewFromFloat(initVal * float64(allDays))
  407. val, _ := initValAndMonthT.Div(daysT).Round(4).Float64()
  408. fmt.Printf("最新值 计算公式:%d*%f/(%d) = %f\n", allDays, initVal, days, val)
  409. valueMap[lastNewDate] = val
  410. }
  411. case "月度":
  412. yearMonthMap := make(map[string]float64)
  413. yearMonthList := make([]string, 0)
  414. var lastNewDate time.Time
  415. for _, item := range dataList {
  416. itemDate, tmpErr := time.ParseInLocation(utils.FormatDate, item.DataTime, time.Local)
  417. if tmpErr != nil {
  418. err = tmpErr
  419. return
  420. }
  421. year := itemDate.Year()
  422. var tmpK string
  423. tmpK = fmt.Sprint(year*100 + int(itemDate.Month()))
  424. yearVal, ok := yearMonthMap[tmpK]
  425. if ok {
  426. yearMonthMap[tmpK] = item.Value + yearVal
  427. fmt.Printf("%s 累加值:%f = %.6f + %.6f\n", tmpK, yearMonthMap[tmpK], item.Value, yearVal)
  428. } else {
  429. yearMonthList = append(yearMonthList, tmpK)
  430. yearMonthMap[tmpK] = item.Value
  431. }
  432. }
  433. for _, v := range yearMonthList {
  434. currTime, tmpErr := time.ParseInLocation(utils.FormatYearMonthUnSpace, v, time.Local)
  435. if tmpErr != nil {
  436. err = tmpErr
  437. return
  438. }
  439. currTime = currTime.AddDate(0, 1, -1)
  440. dateList = append(dateList, currTime)
  441. valueMap[currTime] = yearMonthMap[v]
  442. lastNewDate = currTime
  443. }
  444. if lastValType == 1 {
  445. lastItem := dataList[len(dataList)-1]
  446. initVal := valueMap[lastNewDate]
  447. itemDate, tmpErr := time.ParseInLocation(utils.FormatDate, lastItem.DataTime, time.Local)
  448. if tmpErr != nil {
  449. err = tmpErr
  450. return
  451. }
  452. monthDays := lastNewDate.Day()
  453. days := itemDate.Day()
  454. daysT := decimal.NewFromInt(int64(days))
  455. initValAndMonthT := decimal.NewFromFloat(initVal * float64(monthDays))
  456. val, _ := initValAndMonthT.Div(daysT).Round(4).Float64()
  457. fmt.Printf("最新值 计算公式:%d*%f/(%d) = %f\n", monthDays, initVal, days, val)
  458. valueMap[lastNewDate] = val
  459. }
  460. case "旬度":
  461. tmpDateDataMap := make(map[time.Time]float64)
  462. tmpDateList := make([]time.Time, 0)
  463. for _, item := range dataList {
  464. itemDate, tmpErr := time.ParseInLocation(utils.FormatDate, item.DataTime, time.Local)
  465. if tmpErr != nil {
  466. err = tmpErr
  467. return
  468. }
  469. dayInt := itemDate.Year()*100 + int(itemDate.Month())
  470. var currTime time.Time
  471. if itemDate.Day() <= 10 {
  472. tmpK := fmt.Sprint(dayInt, "10")
  473. currTime, err = time.ParseInLocation(utils.FormatDateUnSpace, tmpK, time.Local)
  474. if err != nil {
  475. return
  476. }
  477. } else if itemDate.Day() <= 20 {
  478. tmpK := fmt.Sprint(dayInt, "20")
  479. currTime, err = time.ParseInLocation(utils.FormatDateUnSpace, tmpK, time.Local)
  480. if err != nil {
  481. return
  482. }
  483. } else {
  484. currTime, err = time.ParseInLocation(utils.FormatYearMonthUnSpace, fmt.Sprint(dayInt), time.Local)
  485. if err != nil {
  486. return
  487. }
  488. currTime = currTime.AddDate(0, 1, -1)
  489. }
  490. yearVal, ok := tmpDateDataMap[currTime]
  491. if ok {
  492. tmpDateDataMap[currTime] = item.Value + yearVal
  493. } else {
  494. tmpDateList = append(tmpDateList, currTime)
  495. tmpDateDataMap[currTime] = item.Value
  496. }
  497. }
  498. for _, currTime := range tmpDateList {
  499. dateList = append(dateList, currTime)
  500. valueMap[currTime] = tmpDateDataMap[currTime]
  501. }
  502. case "周度":
  503. tmpDateDataMap := make(map[time.Time]float64)
  504. tmpDateList := make([]time.Time, 0)
  505. for _, item := range dataList {
  506. itemDate, tmpErr := time.ParseInLocation(utils.FormatDate, item.DataTime, time.Local)
  507. if tmpErr != nil {
  508. err = tmpErr
  509. return
  510. }
  511. var currTime time.Time
  512. if itemDate.Weekday() == 0 {
  513. currTime = itemDate.AddDate(0, 0, 5)
  514. } else if itemDate.Weekday() == 6 {
  515. currTime = itemDate.AddDate(0, 0, 6)
  516. } else {
  517. currTime = itemDate.AddDate(0, 0, 5-int(itemDate.Weekday()))
  518. }
  519. yearVal, ok := tmpDateDataMap[currTime]
  520. if ok {
  521. tmpDateDataMap[currTime] = item.Value + yearVal
  522. } else {
  523. tmpDateList = append(tmpDateList, currTime)
  524. tmpDateDataMap[currTime] = item.Value
  525. }
  526. }
  527. for _, currTime := range tmpDateList {
  528. dateList = append(dateList, currTime)
  529. valueMap[currTime] = tmpDateDataMap[currTime]
  530. }
  531. }
  532. existDataList, err := GetAllEdbDataListByTo(to, edbInfoId, edbInfo.Source, edbInfo.SubSource)
  533. if err != nil {
  534. return err
  535. }
  536. existDataMap := make(map[string]string)
  537. removeDataTimeMap := make(map[string]int) //需要移除的日期数据
  538. for _, v := range existDataList {
  539. existDataMap[v.DataTime] = v.Value
  540. removeDataTimeMap[v.DataTime] = 1
  541. }
  542. needAddDateMap := make(map[time.Time]int)
  543. addSql := ` INSERT INTO ` + dataTableName + `(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  544. var isAdd bool
  545. for _, currTime := range dateList {
  546. currDateStr := currTime.Format(utils.FormatDate)
  547. existVal, ok := existDataMap[currDateStr]
  548. tmpVal, ok2 := valueMap[currTime]
  549. if !ok2 {
  550. err = errors.New("数据异常,date:" + currDateStr)
  551. return
  552. }
  553. var saveValue string
  554. if isWeekData { //周度指标转的话,最后结果要除以7
  555. saveValue = decimal.NewFromFloat(tmpVal).Div(decimal.NewFromInt(7)).Round(4).String()
  556. } else {
  557. saveValue = decimal.NewFromFloat(tmpVal).Round(4).String()
  558. }
  559. if ok {
  560. delete(removeDataTimeMap, currDateStr)
  561. if existVal != saveValue {
  562. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  563. sql = fmt.Sprintf(sql, dataTableName)
  564. err = to.Raw(sql, saveValue, edbInfoId, currDateStr).Error
  565. if err != nil {
  566. return
  567. }
  568. }
  569. continue
  570. }
  571. timestamp := currTime.UnixNano() / 1e6
  572. timeStr := fmt.Sprintf("%d", timestamp)
  573. if _, existOk := needAddDateMap[currTime]; !existOk {
  574. addSql += GetAddSql(edbInfoIdStr, edbCode, currDateStr, timeStr, saveValue)
  575. isAdd = true
  576. }
  577. needAddDateMap[currTime] = 1
  578. }
  579. {
  580. removeDateList := make([]string, 0)
  581. for dateTime := range removeDataTimeMap {
  582. removeDateList = append(removeDateList, dateTime)
  583. }
  584. removeNum := len(removeDateList)
  585. if removeNum > 0 {
  586. sql := fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time in (`+utils.GetOrmInReplace(removeNum)+`) `, dataTableName)
  587. err = to.Raw(sql, edbInfo.EdbInfoId, removeDateList).Error
  588. if err != nil {
  589. fmt.Println(reflect.TypeOf(obj).Name(), " add data ;delete Err", err.Error())
  590. err = fmt.Errorf("删除不存在的指标数据失败,Err:" + err.Error())
  591. return
  592. }
  593. }
  594. }
  595. if isAdd {
  596. addSql = strings.TrimRight(addSql, ",")
  597. err = to.Exec(addSql).Error
  598. if err != nil {
  599. fmt.Println(reflect.TypeOf(obj).Name(), " add data Err", err.Error())
  600. return
  601. }
  602. }
  603. return
  604. }