edb_data_calculate_bp.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652
  1. package models
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/beego/beego/v2/client/orm"
  6. "github.com/shopspring/decimal"
  7. "hongze/hongze_edb_lib/utils"
  8. "strconv"
  9. "strings"
  10. "time"
  11. )
  12. // AddCalculateBp 变频
  13. func AddCalculateBp(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbInfo, edbCode, uniqueCode string, sysUserId int, sysUserRealName string) (edbInfoId int, err error) {
  14. o := orm.NewOrm()
  15. to, err := o.Begin()
  16. if err != nil {
  17. return
  18. }
  19. defer func() {
  20. if err != nil {
  21. fmt.Println("AddCalculateBp,Err:" + err.Error())
  22. _ = to.Rollback()
  23. } else {
  24. _ = to.Commit()
  25. }
  26. }()
  27. if req.EdbInfoId <= 0 {
  28. edbInfo := new(EdbInfo)
  29. edbInfo.Source = utils.DATA_SOURCE_CALCULATE_BP
  30. edbInfo.SourceName = "变频"
  31. edbInfo.EdbCode = edbCode
  32. edbInfo.EdbName = req.EdbName
  33. edbInfo.EdbNameSource = req.EdbName
  34. edbInfo.Frequency = req.Frequency
  35. edbInfo.Unit = req.Unit
  36. edbInfo.ClassifyId = req.ClassifyId
  37. edbInfo.SysUserId = sysUserId
  38. edbInfo.SysUserRealName = sysUserRealName
  39. edbInfo.CreateTime = time.Now()
  40. edbInfo.ModifyTime = time.Now()
  41. edbInfo.UniqueCode = uniqueCode
  42. edbInfo.CalculateFormula = req.Formula
  43. edbInfo.EdbType = 2
  44. newEdbInfoId, tmpErr := to.Insert(edbInfo)
  45. if tmpErr != nil {
  46. return edbInfoId, tmpErr
  47. }
  48. edbInfoId = int(newEdbInfoId)
  49. //关联关系
  50. {
  51. calculateMappingItem := new(EdbInfoCalculateMapping)
  52. calculateMappingItem.CreateTime = time.Now()
  53. calculateMappingItem.ModifyTime = time.Now()
  54. calculateMappingItem.Sort = 1
  55. calculateMappingItem.EdbCode = edbCode
  56. calculateMappingItem.EdbInfoId = edbInfoId
  57. calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
  58. calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
  59. calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
  60. calculateMappingItem.FromSource = fromEdbInfo.Source
  61. calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
  62. calculateMappingItem.FromTag = ""
  63. calculateMappingItem.Source = edbInfo.Source
  64. calculateMappingItem.SourceName = edbInfo.SourceName
  65. _, err = to.Insert(calculateMappingItem)
  66. if err != nil {
  67. return
  68. }
  69. }
  70. } else {
  71. edbInfoId = req.EdbInfoId
  72. dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_BP)
  73. fmt.Println("dataTableName:" + dataTableName)
  74. deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
  75. deleteSql = fmt.Sprintf(deleteSql, dataTableName)
  76. _, err = to.Raw(deleteSql, req.EdbInfoId).Exec()
  77. if err != nil {
  78. return
  79. }
  80. }
  81. edbInfoIdStr := strconv.Itoa(edbInfoId)
  82. fmt.Println("edbInfoIdStr:" + edbInfoIdStr)
  83. //计算数据
  84. var condition string
  85. var pars []interface{}
  86. condition += " AND edb_info_id=? "
  87. if req.EdbInfoId <= 0 {
  88. pars = append(pars, req.FromEdbInfoId)
  89. } else {
  90. pars = append(pars, fromEdbInfo.EdbInfoId)
  91. }
  92. dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
  93. if err != nil {
  94. return edbInfoId, err
  95. }
  96. addSql := ` INSERT INTO edb_data_calculate_bp(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  97. var isAdd bool
  98. existMap := make(map[string]string)
  99. dataLen := len(dataList)
  100. fmt.Println("dataLen:", dataLen)
  101. for i := 0; i < dataLen; i++ {
  102. //当期
  103. currentItem := dataList[i]
  104. currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
  105. var day int
  106. var preItem *EdbInfoSearchData
  107. var preDate time.Time
  108. if i == 0 {
  109. day = int(time.Now().Sub(currentDate).Hours() / float64(24))
  110. preDate = time.Now()
  111. } else {
  112. j := i - 1
  113. if j < dataLen {
  114. preItem = dataList[j]
  115. preDate, _ = time.Parse(utils.FormatDate, preItem.DataTime)
  116. day = int(preDate.Sub(currentDate).Hours() / float64(24))
  117. utils.FileLog.Info("preItem.DataTime:" + preItem.DataTime + ";currentItem.DataTime" + currentItem.DataTime)
  118. }
  119. }
  120. for k := 0; k <= day; k++ {
  121. needDay := preDate.AddDate(0, 0, -k)
  122. needDayStr := needDay.Format(utils.FormatDate)
  123. existKey := edbCode + needDayStr
  124. if _, ok := existMap[existKey]; !ok {
  125. timestamp := needDay.UnixNano() / 1e6
  126. timestampStr := fmt.Sprintf("%d", timestamp)
  127. valStr := decimal.NewFromFloat(currentItem.Value).String()
  128. addSql += GetAddSql(edbInfoIdStr, edbCode, needDayStr, timestampStr, valStr)
  129. isAdd = true
  130. }
  131. existMap[existKey] = needDayStr
  132. }
  133. existKey := edbCode + currentItem.DataTime
  134. if _, ok := existMap[existKey]; !ok {
  135. currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
  136. timestamp := currentDate.UnixNano() / 1e6
  137. timestampStr := fmt.Sprintf("%d", timestamp)
  138. valStr := decimal.NewFromFloat(currentItem.Value).String()
  139. addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, valStr)
  140. isAdd = true
  141. }
  142. existMap[existKey] = currentItem.DataTime
  143. }
  144. if isAdd {
  145. addSql = strings.TrimRight(addSql, ",")
  146. _, err = to.Raw(addSql).Exec()
  147. if err != nil {
  148. return edbInfoId, err
  149. }
  150. }
  151. return
  152. }
  153. // EditCalculateBp 修改变频数据
  154. func EditCalculateBp(req *EdbInfoCalculateBatchEditReq, fromEdbInfo *EdbInfo, edbCode string) (edbInfoId int, err error) {
  155. edbInfoId = req.EdbInfoId
  156. o := orm.NewOrm()
  157. to, err := o.Begin()
  158. if err != nil {
  159. return
  160. }
  161. defer func() {
  162. if err != nil {
  163. fmt.Println("EditCalculateBp,Err:" + err.Error())
  164. _ = to.Rollback()
  165. } else {
  166. _ = to.Commit()
  167. }
  168. }()
  169. //修改指标信息
  170. sql := ` UPDATE edb_info
  171. SET
  172. edb_name =?,
  173. edb_name_source=?,
  174. frequency = ?,
  175. unit = ?,
  176. classify_id = ?,
  177. modify_time = NOW()
  178. WHERE edb_info_id = ? `
  179. _, err = o.Raw(sql, req.EdbName, req.EdbName, req.Frequency, req.Unit, req.ClassifyId, edbInfoId).Exec()
  180. if err != nil {
  181. return
  182. }
  183. var existCondition string
  184. var existPars []interface{}
  185. existCondition += " AND edb_info_id=? "
  186. existPars = append(existPars, edbInfoId)
  187. existCondition += " AND from_edb_info_id=? "
  188. existPars = append(existPars, req.FromEdbInfoId)
  189. //判断计算指标是否被更换
  190. count, err := GetEdbInfoCalculateCountByCondition(existCondition, existPars)
  191. if err != nil {
  192. err = errors.New("判断指标是否改变失败,Err:" + err.Error())
  193. return
  194. }
  195. if count <= 0 {
  196. //删除指标关联计算指标
  197. //sql := ` DELETE FROM edb_info_calculate_bp WHERE edb_info_id = ? `
  198. //_, err = o.Raw(sql, edbInfoId).Exec()
  199. //if err != nil {
  200. // return
  201. //}
  202. //calculateItem := new(EdbInfoCalculateHbz)
  203. //calculateItem.CreateTime = time.Now()
  204. //calculateItem.ModifyTime = time.Now()
  205. //calculateItem.Sort = 1
  206. //calculateItem.EdbCode = edbCode
  207. //calculateItem.EdbInfoId = edbInfoId
  208. //calculateItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
  209. //calculateItem.FromEdbCode = fromEdbInfo.EdbCode
  210. //calculateItem.FromEdbName = fromEdbInfo.EdbName
  211. //calculateItem.FromSource = fromEdbInfo.Source
  212. //calculateItem.FromSourceName = fromEdbInfo.SourceName
  213. //
  214. //_, err = o.Insert(calculateItem)
  215. //if err != nil {
  216. // return
  217. //}
  218. //删除,计算指标关联的,基础指标的关联关系
  219. sql = ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? `
  220. _, err = o.Raw(sql, edbInfoId).Exec()
  221. if err != nil {
  222. err = errors.New("删除计算指标关联关系失败,Err:" + err.Error())
  223. return
  224. }
  225. //清空原有数据
  226. sql = ` DELETE FROM edb_data_calculate_bp WHERE edb_info_id = ? `
  227. _, err = o.Raw(sql, edbInfoId).Exec()
  228. if err != nil {
  229. return edbInfoId, err
  230. }
  231. //关联关系
  232. {
  233. calculateMappingItem := new(EdbInfoCalculateMapping)
  234. calculateMappingItem.CreateTime = time.Now()
  235. calculateMappingItem.ModifyTime = time.Now()
  236. calculateMappingItem.Sort = 1
  237. calculateMappingItem.EdbCode = edbCode
  238. calculateMappingItem.EdbInfoId = edbInfoId
  239. calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
  240. calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
  241. calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
  242. calculateMappingItem.FromSource = fromEdbInfo.Source
  243. calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
  244. calculateMappingItem.FromTag = ""
  245. calculateMappingItem.Source = utils.DATA_SOURCE_CALCULATE_BP
  246. calculateMappingItem.SourceName = "变频"
  247. _, err = o.Insert(calculateMappingItem)
  248. if err != nil {
  249. return
  250. }
  251. }
  252. edbInfoIdStr := strconv.Itoa(edbInfoId)
  253. fmt.Println("edbInfoIdStr:" + edbInfoIdStr)
  254. //计算数据
  255. var condition string
  256. var pars []interface{}
  257. condition += " AND edb_info_id=? "
  258. pars = append(pars, req.FromEdbInfoId)
  259. fmt.Println("EdbInfoId:", req.FromEdbInfoId)
  260. dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
  261. if err != nil {
  262. return edbInfoId, err
  263. }
  264. addSql := ` INSERT INTO edb_data_calculate_bp(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  265. var isAdd bool
  266. existMap := make(map[string]string)
  267. dataLen := len(dataList)
  268. for i := 0; i < dataLen; i++ {
  269. //当期
  270. currentItem := dataList[i]
  271. currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
  272. var day int
  273. var preItem *EdbInfoSearchData
  274. var preDate time.Time
  275. if i == 0 {
  276. day = int(time.Now().Sub(currentDate).Hours() / float64(24))
  277. preDate = time.Now()
  278. } else {
  279. j := i + 1
  280. if j < dataLen {
  281. preItem = dataList[j]
  282. preDate, _ = time.Parse(utils.FormatDate, preItem.DataTime)
  283. day = int(currentDate.Sub(preDate).Hours() / float64(24))
  284. }
  285. }
  286. for k := 0; k <= day; k++ {
  287. needDay := preDate.AddDate(0, 0, -k)
  288. needDayStr := needDay.Format(utils.FormatDate)
  289. existKey := edbCode + needDayStr
  290. if _, ok := existMap[existKey]; !ok {
  291. timestamp := needDay.UnixNano() / 1e6
  292. timestampStr := fmt.Sprintf("%d", timestamp)
  293. valStr := decimal.NewFromFloat(currentItem.Value).String()
  294. addSql += GetAddSql(edbInfoIdStr, edbCode, needDayStr, timestampStr, valStr)
  295. }
  296. existMap[existKey] = needDayStr
  297. }
  298. existKey := edbCode + currentItem.DataTime
  299. if _, ok := existMap[existKey]; !ok {
  300. currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
  301. timestamp := currentDate.UnixNano() / 1e6
  302. timestampStr := fmt.Sprintf("%d", timestamp)
  303. valStr := decimal.NewFromFloat(currentItem.Value).String()
  304. addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, valStr)
  305. }
  306. existMap[existKey] = currentItem.DataTime
  307. }
  308. if isAdd {
  309. addSql = strings.TrimRight(addSql, ",")
  310. _, err = o.Raw(addSql).Exec()
  311. if err != nil {
  312. return edbInfoId, err
  313. }
  314. }
  315. }
  316. return
  317. }
  318. // RefreshAllCalculateBpBak 刷新所有变频数据
  319. func RefreshAllCalculateBpBak(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string) (err error) {
  320. o := orm.NewOrm()
  321. to, err := o.Begin()
  322. if err != nil {
  323. return
  324. }
  325. defer func() {
  326. if err != nil {
  327. fmt.Println("RefreshAllCalculateBp,Err:" + err.Error())
  328. _ = to.Rollback()
  329. } else {
  330. _ = to.Commit()
  331. }
  332. }()
  333. if err != nil {
  334. return
  335. }
  336. edbInfoIdStr := strconv.Itoa(edbInfoId)
  337. //计算数据
  338. //计算数据
  339. var condition string
  340. var pars []interface{}
  341. condition += " AND edb_info_id=? "
  342. pars = append(pars, fromEdbInfo.EdbInfoId)
  343. if startDate != "" {
  344. condition += " AND data_time>=? "
  345. pars = append(pars, startDate)
  346. }
  347. if endDate != "" {
  348. condition += " AND data_time<=? "
  349. pars = append(pars, endDate)
  350. }
  351. dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
  352. if err != nil {
  353. return err
  354. }
  355. var dateArr []string
  356. dataMap := make(map[string]*EdbInfoSearchData)
  357. for _, v := range dataList {
  358. dateArr = append(dateArr, v.DataTime)
  359. dataMap[v.DataTime] = v
  360. }
  361. fmt.Println("source:", source)
  362. //获取指标所有数据
  363. existDataList := make([]*EdbData, 0)
  364. dataTableName := GetEdbDataTableName(source)
  365. fmt.Println("dataTableName:", dataTableName)
  366. sql := `SELECT * FROM %s WHERE edb_info_id=? `
  367. sql = fmt.Sprintf(sql, dataTableName)
  368. _, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
  369. if err != nil {
  370. return err
  371. }
  372. existDataMap := make(map[string]string)
  373. for _, v := range existDataList {
  374. existDataMap[v.DataTime] = v.Value
  375. }
  376. fmt.Println("existDataMap:", existDataMap)
  377. addSql := ` INSERT INTO edb_data_calculate_bp(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  378. var isAdd bool
  379. existMap := make(map[string]string)
  380. dataLen := len(dataList)
  381. for i := 0; i < dataLen; i++ {
  382. //当期
  383. currentItem := dataList[i]
  384. currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
  385. var day int
  386. var preItem *EdbInfoSearchData
  387. var preDate time.Time
  388. if i == 0 {
  389. day = int(time.Now().Sub(currentDate).Hours() / float64(24))
  390. preDate = time.Now()
  391. } else {
  392. j := i + 1
  393. if j < dataLen {
  394. preItem = dataList[j]
  395. preDate, _ = time.Parse(utils.FormatDate, preItem.DataTime)
  396. day = int(currentDate.Sub(preDate).Hours() / float64(24))
  397. }
  398. }
  399. for k := 0; k <= day; k++ {
  400. needDay := preDate.AddDate(0, 0, -k)
  401. needDayStr := needDay.Format(utils.FormatDate)
  402. existKey := edbCode + needDayStr
  403. if _, ok := existMap[existKey]; !ok {
  404. timestamp := needDay.UnixNano() / 1e6
  405. timestampStr := fmt.Sprintf("%d", timestamp)
  406. valStr := decimal.NewFromFloat(currentItem.Value).String()
  407. if existVal, ok := existDataMap[needDayStr]; !ok {
  408. addSql += GetAddSql(edbInfoIdStr, edbCode, needDayStr, timestampStr, valStr)
  409. } else {
  410. if existVal != valStr {
  411. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  412. sql = fmt.Sprintf(sql, dataTableName)
  413. _, err = o.Raw(sql, valStr, edbInfoId, needDay).Exec()
  414. if err != nil {
  415. return err
  416. }
  417. }
  418. }
  419. }
  420. existMap[existKey] = needDayStr
  421. }
  422. existKey := edbCode + currentItem.DataTime
  423. if _, ok := existMap[existKey]; !ok {
  424. currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
  425. timestamp := currentDate.UnixNano() / 1e6
  426. timestampStr := fmt.Sprintf("%d", timestamp)
  427. valStr := decimal.NewFromFloat(currentItem.Value).String()
  428. if existVal, ok := existDataMap[currentItem.DataTime]; !ok {
  429. addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, valStr)
  430. } else {
  431. if existVal != valStr {
  432. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  433. sql = fmt.Sprintf(sql, dataTableName)
  434. _, err = o.Raw(sql, valStr, edbInfoId, currentItem.DataTime).Exec()
  435. if err != nil {
  436. return err
  437. }
  438. }
  439. }
  440. }
  441. existMap[existKey] = currentItem.DataTime
  442. }
  443. if isAdd {
  444. addSql = strings.TrimRight(addSql, ",")
  445. _, err = o.Raw(addSql).Exec()
  446. if err != nil {
  447. return err
  448. }
  449. }
  450. return
  451. }
  452. func RefreshAllCalculateBp(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string) (err error) {
  453. o := orm.NewOrm()
  454. to, err := o.Begin()
  455. if err != nil {
  456. return
  457. }
  458. defer func() {
  459. if err != nil {
  460. fmt.Println("RefreshAllCalculateBp,Err:" + err.Error())
  461. _ = to.Rollback()
  462. } else {
  463. _ = to.Commit()
  464. }
  465. }()
  466. if err != nil {
  467. return
  468. }
  469. edbInfoIdStr := strconv.Itoa(edbInfoId)
  470. //计算数据
  471. //计算数据
  472. var condition string
  473. var pars []interface{}
  474. condition += " AND edb_info_id=? "
  475. pars = append(pars, fromEdbInfo.EdbInfoId)
  476. //if startDate != "" {
  477. // condition += " AND data_time>=? "
  478. // pars = append(pars, startDate)
  479. //}
  480. //if endDate != "" {
  481. // condition += " AND data_time<=? "
  482. // pars = append(pars, endDate)
  483. //}
  484. //获取来源指标的数据
  485. dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 1)
  486. if err != nil {
  487. return err
  488. }
  489. var dateArr []string
  490. dataMap := make(map[string]*EdbInfoSearchData)
  491. fromDataMap := make(map[string]float64)
  492. //来源指指标数据
  493. for _, v := range dataList {
  494. dateArr = append(dateArr, v.DataTime)
  495. dataMap[v.DataTime] = v
  496. fromDataMap[v.DataTime] = v.Value
  497. }
  498. fmt.Println("source:", source)
  499. //获取变频指标所有数据
  500. existDataList, err := GetAllEdbDataList(edbInfoId, source)
  501. if err != nil {
  502. return
  503. }
  504. //计算指标的map
  505. existDataMap := make(map[string]*EdbData, 0)
  506. addSql := ` INSERT INTO edb_data_calculate_bp(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  507. var isAdd bool
  508. var lastValue float64 //最后数据的值(float64)
  509. var lastValueStr string //最后数据的值(string)
  510. //待删除的日期
  511. removeDateList := make([]string, 0)
  512. if len(existDataList) > 0 {
  513. //第一个已经入库的日期
  514. firstExistDataTimeStr := existDataList[0].DataTime //计算指标数据第一条的日期字符串
  515. if len(dateArr) > 0 {
  516. firstFromDataTimeStr := dateArr[0] //来源数据第一条的日期字符串
  517. firstExistDataTime, _ := time.Parse(utils.FormatDate, firstExistDataTimeStr) //计算指标数据第一条的日期(time类型)
  518. firstFromDataTime, _ := time.Parse(utils.FormatDate, firstFromDataTimeStr) //来源数据第一条的日期(time类型)
  519. nowDateStr := time.Now().Format(utils.FormatDate) //当天日期字符串
  520. nowDate, _ := time.ParseInLocation(utils.FormatDate, nowDateStr, firstFromDataTime.Location()) //当天日期(time类型)
  521. lastValue = fromDataMap[firstFromDataTimeStr]
  522. lastValueStr = decimal.NewFromFloat(lastValue).String()
  523. //第一步: 判断来源指标的开始时间与计算指标的开始时间是否相等,相等的话,那么就不需要对两个时间之间的数据做处理
  524. if firstExistDataTimeStr != firstFromDataTimeStr {
  525. if firstExistDataTime.Before(firstFromDataTime) { //如果计算指标第一条数据的开始时间 早于 来源指标的第一条开始时间,那么需要对两个时间之间的计算指标数据做 删除处理
  526. for _, v := range existDataList {
  527. if v.DataTime == firstFromDataTimeStr {
  528. if tmpLastValue, ok := fromDataMap[firstFromDataTimeStr]; ok { //来源指标当天的数据
  529. lastValue = tmpLastValue
  530. lastValueStr = decimal.NewFromFloat(lastValue).String()
  531. }
  532. break
  533. }
  534. removeDateList = append(removeDateList, v.DataTime)
  535. }
  536. } else {
  537. for _, v := range dateArr { //如果计算指标第一条数据的开始时间 晚于 来源指标的第一条开始时间,那么需要对两个时间之间的计算指标数据做 新增处理
  538. if v == firstExistDataTimeStr {
  539. if tmpLastValue, ok := fromDataMap[v]; ok { //来源指标当天的数据
  540. lastValue = tmpLastValue
  541. lastValueStr = decimal.NewFromFloat(lastValue).String()
  542. }
  543. break
  544. }
  545. currentDate, _ := time.Parse(utils.FormatDate, v)
  546. timestamp := currentDate.UnixNano() / 1e6
  547. timestampStr := fmt.Sprintf("%d", timestamp)
  548. addSql += GetAddSql(edbInfoIdStr, edbCode, v, timestampStr, lastValueStr)
  549. isAdd = true
  550. }
  551. }
  552. }
  553. //第二步 剩余数据每天修改
  554. day := int(nowDate.Sub(firstExistDataTime).Hours() / float64(24))
  555. //第二步: 已经入库的数据处理
  556. for _, v := range existDataList {
  557. existDataMap[v.DataTime] = v
  558. }
  559. for k := day; k >= 0; k-- {
  560. needDay := nowDate.AddDate(0, 0, -k)
  561. needDayStr := needDay.Format(utils.FormatDate)
  562. tmpExistData, ok := existDataMap[needDayStr]
  563. if ok {
  564. if tmpLastValue, ok := fromDataMap[tmpExistData.DataTime]; ok { //来源指标当天的数据
  565. lastValue = tmpLastValue
  566. lastValueStr = decimal.NewFromFloat(lastValue).String()
  567. }
  568. //如果对应的值不匹配
  569. if tmpExistData.Value != lastValueStr {
  570. err = ModifyEdbDataById(source, tmpExistData.EdbDataId, lastValueStr)
  571. if err != nil {
  572. return err
  573. }
  574. }
  575. } else {
  576. timestamp := needDay.UnixNano() / 1e6
  577. timestampStr := fmt.Sprintf("%d", timestamp)
  578. addSql += GetAddSql(edbInfoIdStr, edbCode, needDayStr, timestampStr, lastValueStr)
  579. isAdd = true
  580. }
  581. }
  582. } else {
  583. //如果没有来源指标数据,那么已经入库的计算指标数据需要全部删除
  584. tableName := GetEdbDataTableName(source)
  585. sql := fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ?`, tableName)
  586. _, err = o.Raw(sql, edbInfoId).Exec()
  587. if err != nil {
  588. err = fmt.Errorf("删除所有的变频指标数据失败,Err:" + err.Error())
  589. return
  590. }
  591. //for _, v := range existDataList {
  592. // removeDateList = append(removeDateList, v.DataTime)
  593. //}
  594. }
  595. }
  596. // 删除不需要的指标数据
  597. if len(removeDateList) > 0 {
  598. removeDateStr := strings.Join(removeDateList, `","`)
  599. removeDateStr = `"` + removeDateStr + `"`
  600. //如果拼接指标变更了,那么需要删除所有的指标数据
  601. tableName := GetEdbDataTableName(source)
  602. sql := fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time in (%s) `, tableName, removeDateStr)
  603. _, err = o.Raw(sql, edbInfoId).Exec()
  604. if err != nil {
  605. err = fmt.Errorf("删除不存在的变频指标数据失败,Err:" + err.Error())
  606. return
  607. }
  608. }
  609. if isAdd {
  610. addSql = strings.TrimRight(addSql, ",")
  611. _, err = o.Raw(addSql).Exec()
  612. }
  613. return
  614. }