edb_info_calculate_nszydpjjs.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612
  1. package data_manage
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/beego/beego/v2/client/orm"
  6. "github.com/shopspring/decimal"
  7. "hongze/hongze_chart_lib/utils"
  8. "strconv"
  9. "strings"
  10. "time"
  11. )
  12. type EdbInfoCalculateNszydpjjs struct {
  13. EdbInfoCalculateNszydpjjsId int `orm:"column(edb_info_calculate_nszydpjjs_id);pk"`
  14. EdbInfoId int `description:"指标id"`
  15. EdbCode string `description:"指标编码"`
  16. FromEdbInfoId int `description:"计算指标id"`
  17. FromEdbCode string `description:"计算指标编码"`
  18. FromEdbName string `description:"计算指标名称"`
  19. FromSource int `description:"计算指标来源"`
  20. FromSourceName string `description:"计算指标来源名称"`
  21. FromTag string `description:"来源指标标签"`
  22. Sort int `description:"计算指标名称排序"`
  23. CreateTime time.Time `description:"创建时间"`
  24. ModifyTime time.Time `description:"修改时间"`
  25. }
  26. //N数值移动平均计算
  27. func AddCalculateNszydpjjs(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbInfo, edbCode, uniqueCode string, sysUserId int, sysUserRealName string, formulaInt int) (edbInfoId int, err error) {
  28. o := orm.NewOrmUsingDB("data")
  29. o.Begin()
  30. defer func() {
  31. if err != nil {
  32. o.Rollback()
  33. } else {
  34. o.Commit()
  35. }
  36. }()
  37. if req.EdbInfoId <= 0 {
  38. edbInfo := new(EdbInfo)
  39. edbInfo.Source = utils.DATA_SOURCE_CALCULATE_NSZYDPJJS
  40. edbInfo.SourceName = "N数值移动平均计算"
  41. edbInfo.EdbCode = edbCode
  42. edbInfo.EdbName = req.EdbName
  43. edbInfo.EdbNameSource = req.EdbName
  44. edbInfo.Frequency = req.Frequency
  45. edbInfo.Unit = req.Unit
  46. edbInfo.ClassifyId = req.ClassifyId
  47. edbInfo.SysUserId = sysUserId
  48. edbInfo.SysUserRealName = sysUserRealName
  49. edbInfo.CreateTime = time.Now()
  50. edbInfo.ModifyTime = time.Now()
  51. edbInfo.UniqueCode = uniqueCode
  52. edbInfo.CalculateFormula = req.Formula
  53. edbInfo.EdbType = 2
  54. newEdbInfoId, err := o.Insert(edbInfo)
  55. if err != nil {
  56. return edbInfoId, err
  57. }
  58. edbInfoId = int(newEdbInfoId)
  59. //calculateItem := new(EdbInfoCalculateNszydpjjs)
  60. //calculateItem.CreateTime = time.Now()
  61. //calculateItem.ModifyTime = time.Now()
  62. //calculateItem.Sort = 1
  63. //calculateItem.EdbCode = edbCode
  64. //calculateItem.EdbInfoId = edbInfoId
  65. //calculateItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
  66. //calculateItem.FromEdbCode = fromEdbInfo.EdbCode
  67. //calculateItem.FromEdbName = fromEdbInfo.EdbName
  68. //calculateItem.FromSource = fromEdbInfo.Source
  69. //calculateItem.FromSourceName = fromEdbInfo.SourceName
  70. //
  71. //_, err = o.Insert(calculateItem)
  72. //if err != nil {
  73. // return edbInfoId, err
  74. //}
  75. //关联关系
  76. {
  77. calculateMappingItem := new(EdbInfoCalculateMapping)
  78. calculateMappingItem.CreateTime = time.Now()
  79. calculateMappingItem.ModifyTime = time.Now()
  80. calculateMappingItem.Sort = 1
  81. calculateMappingItem.EdbCode = edbCode
  82. calculateMappingItem.EdbInfoId = edbInfoId
  83. calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
  84. calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
  85. calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
  86. calculateMappingItem.FromSource = fromEdbInfo.Source
  87. calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
  88. calculateMappingItem.FromTag = ""
  89. calculateMappingItem.Source = edbInfo.Source
  90. calculateMappingItem.SourceName = edbInfo.SourceName
  91. go o.Insert(calculateMappingItem)
  92. }
  93. } else {
  94. edbInfoId = req.EdbInfoId
  95. dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_NSZYDPJJS)
  96. deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
  97. deleteSql = fmt.Sprintf(deleteSql, dataTableName)
  98. _, err = o.Raw(deleteSql, req.EdbInfoId).Exec()
  99. }
  100. edbInfoIdStr := strconv.Itoa(edbInfoId)
  101. //计算数据
  102. var condition string
  103. var pars []interface{}
  104. condition += " AND edb_info_id=? "
  105. if req.EdbInfoId <= 0 {
  106. pars = append(pars, req.FromEdbInfoId)
  107. } else {
  108. pars = append(pars, fromEdbInfo.EdbInfoId)
  109. }
  110. dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
  111. if err != nil {
  112. return edbInfoId, err
  113. }
  114. var dateArr []string
  115. dataMap := make(map[string]*EdbInfoSearchData)
  116. for _, v := range dataList {
  117. dateArr = append(dateArr, v.DataTime)
  118. dataMap[v.DataTime] = v
  119. }
  120. addSql := ` INSERT INTO edb_data_calculate_nszydpjjs(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  121. var isAdd bool
  122. arrLen := len(dateArr)
  123. for ak, av := range dateArr {
  124. //处理第一个值
  125. var valArr []float64
  126. if findItem, ok := dataMap[av]; ok {
  127. valArr = append(valArr, findItem.Value)
  128. } else {
  129. continue
  130. }
  131. if ak+1 != arrLen {
  132. //处理除第一个值之外的N-1个值
  133. for i := 1; i < formulaInt; i++ {
  134. arrIndex := ak + i
  135. if arrIndex >= arrLen {
  136. break
  137. }
  138. arrVal := dateArr[arrIndex]
  139. if findItem, ok := dataMap[arrVal]; ok {
  140. valArr = append(valArr, findItem.Value)
  141. } else {
  142. continue
  143. }
  144. }
  145. }
  146. valArrLen := len(valArr)
  147. totalVal := decimal.NewFromFloat(0.00)
  148. for _, v := range valArr {
  149. newDecimal := decimal.NewFromFloat(v)
  150. totalVal = totalVal.Add(newDecimal)
  151. }
  152. af := totalVal //decimal.NewFromFloat(totalVal)
  153. bf := decimal.NewFromFloat(float64(valArrLen))
  154. val, _ := af.Div(bf).Float64()
  155. currentDate, err := time.Parse(utils.FormatDate, av)
  156. if err != nil {
  157. return edbInfoId, err
  158. }
  159. timestamp := currentDate.UnixNano() / 1e6
  160. timestampStr := fmt.Sprintf("%d", timestamp)
  161. valStr := utils.SubFloatToString(val, 4)
  162. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, valStr)
  163. isAdd = true
  164. }
  165. if isAdd {
  166. addSql = strings.TrimRight(addSql, ",")
  167. _, err = o.Raw(addSql).Exec()
  168. if err != nil {
  169. return edbInfoId, err
  170. }
  171. }
  172. return
  173. }
  174. //修改N数值移动平均计算
  175. func EditCalculateNszydpjjs(req *EdbInfoCalculateBatchEditReq, fromEdbInfo *EdbInfo, edbCode string, formulaInt int, oldCalculateFormula string) (edbInfoId int, err error) {
  176. edbInfoId = req.EdbInfoId
  177. o := orm.NewOrmUsingDB("data")
  178. o.Begin()
  179. defer func() {
  180. if err != nil {
  181. o.Rollback()
  182. } else {
  183. o.Commit()
  184. }
  185. }()
  186. //修改指标信息
  187. sql := ` UPDATE edb_info
  188. SET
  189. edb_name =?,
  190. edb_name_source=?,
  191. frequency = ?,
  192. unit = ?,
  193. classify_id = ?,
  194. calculate_formula=?,
  195. modify_time = NOW()
  196. WHERE edb_info_id = ? `
  197. _, err = o.Raw(sql, req.EdbName, req.EdbName, req.Frequency, req.Unit, req.ClassifyId, req.Formula, edbInfoId).Exec()
  198. if err != nil {
  199. return
  200. }
  201. var existCondition string
  202. var existPars []interface{}
  203. existCondition += " AND edb_info_id=? "
  204. existPars = append(existPars, edbInfoId)
  205. existCondition += " AND from_edb_info_id=? "
  206. existPars = append(existPars, req.FromEdbInfoId)
  207. //判断计算指标是否被更换
  208. count, err := GetEdbInfoCalculateCountByCondition(req.Source, existCondition, existPars)
  209. if err != nil && err.Error() != utils.ErrNoRow() {
  210. err = errors.New("判断指标是否改变失败,Err:" + err.Error())
  211. return
  212. }
  213. if count <= 0 || oldCalculateFormula != req.Formula {
  214. //删除,计算指标关联的,基础指标的关联关系
  215. sql = ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? `
  216. _, err = o.Raw(sql, edbInfoId).Exec()
  217. if err != nil {
  218. return edbInfoId, err
  219. }
  220. //清空原有数据
  221. sql = ` DELETE FROM edb_data_calculate_nszydpjjs WHERE edb_info_id = ? `
  222. _, err = o.Raw(sql, edbInfoId).Exec()
  223. if err != nil {
  224. return edbInfoId, err
  225. }
  226. //关联关系
  227. {
  228. calculateMappingItem := new(EdbInfoCalculateMapping)
  229. calculateMappingItem.CreateTime = time.Now()
  230. calculateMappingItem.ModifyTime = time.Now()
  231. calculateMappingItem.Sort = 1
  232. calculateMappingItem.EdbCode = edbCode
  233. calculateMappingItem.EdbInfoId = edbInfoId
  234. calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
  235. calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
  236. calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
  237. calculateMappingItem.FromSource = fromEdbInfo.Source
  238. calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
  239. calculateMappingItem.FromTag = ""
  240. calculateMappingItem.Source = utils.DATA_SOURCE_CALCULATE_NSZYDPJJS
  241. calculateMappingItem.SourceName = "N数值移动平均计算"
  242. o.Insert(calculateMappingItem)
  243. }
  244. edbInfoIdStr := strconv.Itoa(edbInfoId)
  245. //计算数据
  246. var condition string
  247. var pars []interface{}
  248. condition += " AND edb_info_id=? "
  249. pars = append(pars, req.FromEdbInfoId)
  250. dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
  251. if err != nil {
  252. return edbInfoId, err
  253. }
  254. var dateArr []string
  255. dataMap := make(map[string]*EdbInfoSearchData)
  256. for _, v := range dataList {
  257. dateArr = append(dateArr, v.DataTime)
  258. dataMap[v.DataTime] = v
  259. }
  260. addSql := ` INSERT INTO edb_data_calculate_nszydpjjs(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  261. var isAdd bool
  262. arrLen := len(dateArr)
  263. for ak, av := range dateArr {
  264. //处理第一个值
  265. var valArr []float64
  266. if findItem, ok := dataMap[av]; ok {
  267. valArr = append(valArr, findItem.Value)
  268. } else {
  269. continue
  270. }
  271. if ak+1 != arrLen {
  272. //处理除第一个值之外的N-1个值
  273. for i := 1; i < formulaInt; i++ {
  274. arrIndex := ak + i
  275. if arrIndex >= arrLen {
  276. break
  277. }
  278. arrVal := dateArr[arrIndex]
  279. if findItem, ok := dataMap[arrVal]; ok {
  280. valArr = append(valArr, findItem.Value)
  281. } else {
  282. continue
  283. }
  284. }
  285. }
  286. valArrLen := len(valArr)
  287. totalVal := decimal.NewFromFloat(0.00)
  288. for _, v := range valArr {
  289. newDecimal := decimal.NewFromFloat(v)
  290. totalVal = totalVal.Add(newDecimal)
  291. }
  292. af := totalVal
  293. bf := decimal.NewFromFloat(float64(valArrLen))
  294. val, _ := af.Div(bf).Float64()
  295. currentDate, err := time.Parse(utils.FormatDate, av)
  296. if err != nil {
  297. return edbInfoId, err
  298. }
  299. timestamp := currentDate.UnixNano() / 1e6
  300. timestampStr := fmt.Sprintf("%d", timestamp)
  301. valStr := utils.SubFloatToString(val, 4)
  302. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, valStr)
  303. isAdd = true
  304. }
  305. if isAdd {
  306. addSql = strings.TrimRight(addSql, ",")
  307. _, err = o.Raw(addSql).Exec()
  308. if err != nil {
  309. return edbInfoId, err
  310. }
  311. }
  312. }
  313. return
  314. }
  315. //刷新N数值移动平均计算
  316. func RefreshCalculateNszydpjjs(edbInfoId, source, formulaInt int, fromEdbInfo *EdbInfo, edbCode string) (err error) {
  317. o := orm.NewOrmUsingDB("data")
  318. o.Begin()
  319. defer func() {
  320. if err != nil {
  321. fmt.Println("RefreshCalculateNszydpjjs Err:" + err.Error())
  322. utils.FileLog.Info("RefreshCalculateNszydpjjs Err:" + err.Error())
  323. o.Rollback()
  324. } else {
  325. o.Commit()
  326. }
  327. }()
  328. if err != nil {
  329. return
  330. }
  331. edbInfoIdStr := strconv.Itoa(edbInfoId)
  332. //计算数据
  333. var condition string
  334. var pars []interface{}
  335. condition += " AND edb_info_id=? "
  336. pars = append(pars, edbInfoId)
  337. existDataList, err := GetEdbDataListAll(condition, pars, source, 0)
  338. if err != nil {
  339. fmt.Println("existDataList GetEdbDataListAll Err:" + err.Error())
  340. return err
  341. }
  342. existDataMap := make(map[string]*EdbInfoSearchData)
  343. for _, v := range existDataList {
  344. existDataMap[v.DataTime] = v
  345. }
  346. startDate := time.Now().AddDate(-2, 0, 0).Format(utils.FormatDate)
  347. //计算来源数据
  348. var fromCondition string
  349. var fromPars []interface{}
  350. fromCondition += " AND edb_info_id=? "
  351. fromPars = append(fromPars, fromEdbInfo.EdbInfoId)
  352. fromCondition += " AND data_time>=? "
  353. fromPars = append(fromPars, startDate)
  354. fromDataList, err := GetEdbDataListAll(fromCondition, fromPars, fromEdbInfo.Source, 0)
  355. if err != nil {
  356. fmt.Println("from GetEdbDataListAll Err:" + err.Error())
  357. return err
  358. }
  359. var fromDateArr []string
  360. fromDataMap := make(map[string]*EdbInfoSearchData)
  361. for _, v := range fromDataList {
  362. fromDateArr = append(fromDateArr, v.DataTime)
  363. fromDataMap[v.DataTime] = v
  364. }
  365. addSql := ` INSERT INTO edb_data_calculate_nszydpjjs(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  366. var isAdd bool
  367. arrLen := len(fromDateArr)
  368. for ak, av := range fromDateArr {
  369. if _, existOk := existDataMap[av]; !existOk {
  370. //处理第一个值
  371. var valArr []float64
  372. if findItem, ok := fromDataMap[av]; ok {
  373. valArr = append(valArr, findItem.Value)
  374. } else {
  375. continue
  376. }
  377. if ak+1 != arrLen {
  378. //处理除第一个值之外的N-1个值
  379. for i := 1; i < formulaInt; i++ {
  380. arrIndex := ak + i
  381. if arrIndex >= arrLen {
  382. break
  383. }
  384. arrVal := fromDateArr[arrIndex]
  385. if findItem, ok := fromDataMap[arrVal]; ok {
  386. valArr = append(valArr, findItem.Value)
  387. } else {
  388. continue
  389. }
  390. }
  391. }
  392. valArrLen := len(valArr)
  393. //var totalVal float64
  394. totalVal := decimal.NewFromFloat(0.00)
  395. for _, v := range valArr {
  396. newDecimal := decimal.NewFromFloat(v)
  397. totalVal = totalVal.Add(newDecimal)
  398. }
  399. af := totalVal //decimal.NewFromFloat(totalVal)
  400. bf := decimal.NewFromFloat(float64(valArrLen))
  401. val, _ := af.Div(bf).Float64()
  402. currentDate, err := time.Parse(utils.FormatDate, av)
  403. if err != nil {
  404. return err
  405. }
  406. timestamp := currentDate.UnixNano() / 1e6
  407. timestampStr := fmt.Sprintf("%d", timestamp)
  408. valStr := utils.SubFloatToString(val, 4)
  409. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, valStr)
  410. isAdd = true
  411. }
  412. }
  413. if isAdd {
  414. addSql = strings.TrimRight(addSql, ",")
  415. utils.FileLog.Info("addSql:" + addSql)
  416. _, err = o.Raw(addSql).Exec()
  417. if err != nil {
  418. return err
  419. }
  420. }
  421. return
  422. }
  423. type EdbInfoCalculateNszydpjjsDetail struct {
  424. EdbInfoCalculateNszydpjjsId int `orm:"column(edb_info_calculate_nszydpjjs_id);pk"`
  425. EdbInfoId int `description:"指标id"`
  426. EdbCode string `description:"指标编码"`
  427. FromEdbInfoId int `description:"计算指标id"`
  428. FromEdbCode string `description:"计算指标编码"`
  429. FromEdbName string `description:"计算指标名称"`
  430. FromSource int `description:"计算指标来源"`
  431. FromSourceName string `description:"计算指标来源名称"`
  432. FromTag string `description:"来源指标标签"`
  433. Sort int `description:"计算指标名称排序"`
  434. CreateTime time.Time `description:"创建时间"`
  435. ModifyTime time.Time `description:"修改时间"`
  436. StartDate string `description:"开始日期"`
  437. EndDate string `description:"结束日期"`
  438. }
  439. func GetEdbInfoCalculateNszydpjjsDetail(edbInfoId int) (item *EdbInfoCalculateNszydpjjsDetail, err error) {
  440. o := orm.NewOrmUsingDB("data")
  441. sql := ` SELECT a.*,b.start_date,b.end_date FROM edb_info_calculate_mapping AS a
  442. INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
  443. WHERE a.edb_info_id=? `
  444. err = o.Raw(sql, edbInfoId).QueryRow(&item)
  445. return
  446. }
  447. //刷新全部N数值移动平均计算
  448. func RefreshAllCalculateNszydpjjs(edbInfoId, source, formulaInt int, fromEdbInfo *EdbInfo, edbCode, startDate string) (err error) {
  449. o := orm.NewOrmUsingDB("data")
  450. o.Begin()
  451. defer func() {
  452. if err != nil {
  453. fmt.Println("RefreshCalculateNszydpjjs Err:" + err.Error())
  454. utils.FileLog.Info("RefreshCalculateNszydpjjs Err:" + err.Error())
  455. o.Rollback()
  456. } else {
  457. o.Commit()
  458. }
  459. }()
  460. if err != nil {
  461. return
  462. }
  463. edbInfoIdStr := strconv.Itoa(edbInfoId)
  464. fmt.Println(edbInfoIdStr)
  465. //计算数据
  466. var condition string
  467. var pars []interface{}
  468. condition += " AND edb_info_id=? "
  469. pars = append(pars, edbInfoId)
  470. existDataList, err := GetEdbDataListAll(condition, pars, source, 0)
  471. if err != nil {
  472. fmt.Println("existDataList GetEdbDataListAll Err:" + err.Error())
  473. return err
  474. }
  475. existDataMap := make(map[string]*EdbInfoSearchData)
  476. for _, v := range existDataList {
  477. existDataMap[v.DataTime] = v
  478. }
  479. //计算来源数据
  480. var fromCondition string
  481. var fromPars []interface{}
  482. fromCondition += " AND edb_info_id=? "
  483. fromPars = append(fromPars, fromEdbInfo.EdbInfoId)
  484. fromCondition += " AND data_time>=? "
  485. fromPars = append(fromPars, startDate)
  486. fmt.Println("fromPars:", fromPars)
  487. fromDataList, err := GetEdbDataListAll(fromCondition, fromPars, fromEdbInfo.Source, 0)
  488. if err != nil {
  489. fmt.Println("from GetEdbDataListAll Err:" + err.Error())
  490. return err
  491. }
  492. var fromDateArr []string
  493. fromDataMap := make(map[string]*EdbInfoSearchData)
  494. for _, v := range fromDataList {
  495. fromDateArr = append(fromDateArr, v.DataTime)
  496. fromDataMap[v.DataTime] = v
  497. }
  498. addSql := ` INSERT INTO edb_data_calculate_nszydpjjs(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  499. var isAdd bool
  500. dataTableName := GetEdbDataTableName(source)
  501. arrLen := len(fromDateArr)
  502. existAddDataMap := make(map[string]string)
  503. for ak, av := range fromDateArr {
  504. //处理第一个值
  505. var valArr []float64
  506. if findItem, ok := fromDataMap[av]; ok {
  507. valArr = append(valArr, findItem.Value)
  508. } else {
  509. continue
  510. }
  511. if ak+1 != arrLen {
  512. //处理除第一个值之外的N-1个值
  513. for i := 1; i < formulaInt; i++ {
  514. arrIndex := ak + i
  515. if arrIndex >= arrLen {
  516. break
  517. }
  518. arrVal := fromDateArr[arrIndex]
  519. if findItem, ok := fromDataMap[arrVal]; ok {
  520. valArr = append(valArr, findItem.Value)
  521. } else {
  522. continue
  523. }
  524. }
  525. }
  526. valArrLen := len(valArr)
  527. //var totalVal float64
  528. totalVal := decimal.NewFromFloat(0.00)
  529. for _, v := range valArr {
  530. newDecimal := decimal.NewFromFloat(v)
  531. totalVal = totalVal.Add(newDecimal)
  532. }
  533. af := totalVal //decimal.NewFromFloat(totalVal)
  534. bf := decimal.NewFromFloat(float64(valArrLen))
  535. val, _ := af.Div(bf).Float64()
  536. valStr := utils.SubFloatToString(val, 4)
  537. if existVal, existOk := existDataMap[av]; !existOk {
  538. currentDate, err := time.Parse(utils.FormatDate, av)
  539. if err != nil {
  540. return err
  541. }
  542. timestamp := currentDate.UnixNano() / 1e6
  543. timestampStr := fmt.Sprintf("%d", timestamp)
  544. if _, existOk := existAddDataMap[av]; !existOk {
  545. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, valStr)
  546. isAdd = true
  547. }
  548. existAddDataMap[av] = av
  549. } else {
  550. saveValue := utils.SubFloatToString(existVal.Value, 30)
  551. if saveValue != valStr {
  552. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  553. sql = fmt.Sprintf(sql, dataTableName)
  554. _, err = o.Raw(sql, val, edbInfoId, av).Exec()
  555. if err != nil {
  556. return err
  557. }
  558. }
  559. }
  560. }
  561. if isAdd {
  562. addSql = strings.TrimRight(addSql, ",")
  563. utils.FileLog.Info("addSql:" + addSql)
  564. _, err = o.Raw(addSql).Exec()
  565. if err != nil {
  566. return err
  567. }
  568. }
  569. return
  570. }