edb_data_calculate_zjpj.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632
  1. package models
  2. import (
  3. "fmt"
  4. "github.com/beego/beego/v2/client/orm"
  5. "hongze/hongze_edb_lib/utils"
  6. "strings"
  7. "time"
  8. )
  9. // EdbDataCalculateZjpj 直接拼接数据结构体
  10. type EdbDataCalculateZjpj struct {
  11. EdbDataId int `orm:"column(edb_data_id);pk"`
  12. EdbInfoId int
  13. EdbCode string
  14. DataTime string
  15. Value float64
  16. Status int
  17. CreateTime time.Time
  18. ModifyTime time.Time
  19. DataTimestamp int64
  20. }
  21. // AddCalculateZjpj 新增直接拼接数据
  22. func AddCalculateZjpj(req *EdbInfoCalculateBatchSaveReq, firstEdbInfo, secondEdbInfo *EdbInfo, edbCode, uniqueCode string, sysUserId int, sysUserRealName string) (edbInfo *EdbInfo, err error) {
  23. o := orm.NewOrm()
  24. to, err := o.Begin()
  25. if err != nil {
  26. return
  27. }
  28. defer func() {
  29. if err != nil {
  30. fmt.Println("AddCalculateZjpj,Err:" + err.Error())
  31. _ = to.Rollback()
  32. } else {
  33. _ = to.Commit()
  34. }
  35. }()
  36. if req.EdbInfoId <= 0 {
  37. edbInfo = &EdbInfo{
  38. SourceName: "直接拼接",
  39. Source: utils.DATA_SOURCE_CALCULATE_ZJPJ,
  40. EdbCode: edbCode,
  41. EdbName: req.EdbName,
  42. EdbNameSource: req.EdbName,
  43. Frequency: req.Frequency,
  44. Unit: req.Unit,
  45. StartDate: firstEdbInfo.StartDate,
  46. EndDate: firstEdbInfo.EndDate,
  47. ClassifyId: req.ClassifyId,
  48. SysUserId: sysUserId,
  49. SysUserRealName: sysUserRealName,
  50. UniqueCode: uniqueCode,
  51. CreateTime: time.Now(),
  52. ModifyTime: time.Now(),
  53. CalculateFormula: req.Formula,
  54. EdbType: 2,
  55. }
  56. newEdbInfoId, tmpErr := to.Insert(edbInfo)
  57. if tmpErr != nil {
  58. err = tmpErr
  59. return
  60. }
  61. edbInfo.EdbInfoId = int(newEdbInfoId)
  62. } else {
  63. edbInfo, err = GetEdbInfoById(req.EdbInfoId)
  64. if err != nil {
  65. return
  66. }
  67. //查询
  68. tmpEdbInfo, tmpErr := GetEdbInfoById(edbInfo.EdbInfoId)
  69. if tmpErr != nil {
  70. err = tmpErr
  71. return
  72. }
  73. tmpEdbInfo.EdbName = req.EdbName
  74. tmpEdbInfo.ClassifyId = req.ClassifyId
  75. tmpEdbInfo.Frequency = req.Frequency
  76. tmpEdbInfo.Unit = req.Unit
  77. tmpEdbInfo.CalculateFormula = req.Formula
  78. edbInfo = tmpEdbInfo
  79. //删除指标数据
  80. dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_ZJPJ)
  81. fmt.Println("dataTableName:" + dataTableName)
  82. deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
  83. deleteSql = fmt.Sprintf(deleteSql, dataTableName)
  84. _, err = to.Raw(deleteSql, req.EdbInfoId).Exec()
  85. if err != nil {
  86. return
  87. }
  88. //删除指标关系
  89. sql := ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id=? `
  90. _, err = to.Raw(sql, edbInfo.EdbInfoId).Exec()
  91. }
  92. //关联关系
  93. var existItemA, existItemB *EdbInfoCalculateMapping
  94. //第一个指标
  95. {
  96. existItemA = &EdbInfoCalculateMapping{
  97. EdbInfoCalculateMappingId: 0,
  98. EdbInfoId: edbInfo.EdbInfoId,
  99. Source: edbInfo.Source,
  100. SourceName: edbInfo.SourceName,
  101. EdbCode: edbInfo.EdbCode,
  102. FromEdbInfoId: firstEdbInfo.EdbInfoId,
  103. FromEdbCode: firstEdbInfo.EdbCode,
  104. FromEdbName: firstEdbInfo.EdbName,
  105. FromSource: firstEdbInfo.Source,
  106. FromSourceName: firstEdbInfo.SourceName,
  107. FromTag: "A",
  108. Sort: 1,
  109. CreateTime: time.Now(),
  110. ModifyTime: time.Now(),
  111. }
  112. insertId, tmpErr := to.Insert(existItemA)
  113. if tmpErr != nil {
  114. err = tmpErr
  115. return
  116. }
  117. existItemA.EdbInfoCalculateMappingId = int(insertId)
  118. }
  119. //第二个指标
  120. {
  121. existItemB = &EdbInfoCalculateMapping{
  122. EdbInfoCalculateMappingId: 0,
  123. EdbInfoId: edbInfo.EdbInfoId,
  124. Source: edbInfo.Source,
  125. SourceName: edbInfo.SourceName,
  126. EdbCode: edbInfo.EdbCode,
  127. FromEdbInfoId: secondEdbInfo.EdbInfoId,
  128. FromEdbCode: secondEdbInfo.EdbCode,
  129. FromEdbName: secondEdbInfo.EdbName,
  130. FromSource: secondEdbInfo.Source,
  131. FromSourceName: secondEdbInfo.SourceName,
  132. FromTag: "B",
  133. Sort: 1,
  134. CreateTime: time.Now(),
  135. ModifyTime: time.Now(),
  136. }
  137. insertId, tmpErr := to.Insert(existItemB)
  138. if tmpErr != nil {
  139. err = tmpErr
  140. return
  141. }
  142. existItemB.EdbInfoCalculateMappingId = int(insertId)
  143. }
  144. //拼接数据
  145. err = refreshAllCalculateZjpj(to, edbInfo, existItemA, existItemB)
  146. return
  147. }
  148. // EditCalculateZjpj 编辑直接拼接数据
  149. func EditCalculateZjpj(req *EdbInfoCalculateBatchEditReq, nowEdbInfo, firstEdbInfo, secondEdbInfo *EdbInfo) (edbInfoId int, err error) {
  150. edbInfoId = req.EdbInfoId
  151. o := orm.NewOrm()
  152. to, err := o.Begin()
  153. if err != nil {
  154. return
  155. }
  156. defer func() {
  157. if err != nil {
  158. fmt.Println("EditCalculateZjpj,Err:" + err.Error())
  159. _ = to.Rollback()
  160. } else {
  161. _ = to.Commit()
  162. }
  163. }()
  164. //修改指标信息
  165. sql := ` UPDATE edb_info SET
  166. edb_name =?,
  167. edb_name_source=?,
  168. frequency = ?,
  169. unit = ?,
  170. classify_id = ?,
  171. calculate_formula=?,
  172. modify_time = NOW()
  173. WHERE edb_info_id = ? `
  174. _, err = o.Raw(sql, req.EdbName, req.EdbName, req.Frequency, req.Unit, req.ClassifyId, req.Formula, edbInfoId).Exec()
  175. if err != nil {
  176. return
  177. }
  178. var existCondition string
  179. var existPars []interface{}
  180. existCondition += " AND edb_info_id=? "
  181. existPars = append(existPars, edbInfoId)
  182. //查询出所有的关联指标
  183. existList, err := GetEdbInfoCalculateListByCondition(existCondition, existPars)
  184. if err != nil {
  185. err = fmt.Errorf("判断指标是否改变失败,Err:" + err.Error())
  186. return
  187. }
  188. var existItemA, existItemB *EdbInfoCalculateMapping
  189. for _, existItem := range existList {
  190. if existItem.FromTag == "A" {
  191. existItemA = existItem
  192. } else if existItem.FromTag == "B" {
  193. existItemB = existItem
  194. }
  195. }
  196. addDataList := make([]*EdbDataCalculateZjpj, 0)
  197. firstDataList := make([]*EdbInfoSearchData, 0)
  198. secondDataList := make([]*EdbInfoSearchData, 0)
  199. //如果 之前的拼接日期 与 现在的拼接日期 不一致的话,需要做以下处理
  200. nowFormulaDate, _ := time.ParseInLocation(utils.FormatDate, nowEdbInfo.CalculateFormula, time.Local)
  201. reqFormulaDate, _ := time.ParseInLocation(utils.FormatDate, req.Formula, time.Local)
  202. //如果前后选择的日期不一致,那么需要删除一部分数据
  203. if nowEdbInfo.CalculateFormula != req.Formula {
  204. var startDate, endDate time.Time
  205. //如果当前选择的日期 小于 之前选择的日期
  206. if reqFormulaDate.Before(nowFormulaDate) {
  207. startDate = reqFormulaDate
  208. endDate = nowFormulaDate
  209. } else { //如果当前选择的日期 大于 之前选择的日期
  210. startDate = nowFormulaDate
  211. endDate = reqFormulaDate
  212. }
  213. //删除 之前日期 与 当前日期 之间的指标数据
  214. sql = ` DELETE FROM edb_data_calculate_zjpj WHERE edb_info_id = ? and data_time >= ? and data_time < ?`
  215. _, err = o.Raw(sql, edbInfoId, startDate, endDate).Exec()
  216. if err != nil {
  217. err = fmt.Errorf("删除 之前日期 与 当前日期 之间的指标数据失败,Err:" + err.Error())
  218. return
  219. }
  220. }
  221. //第一个指标数据
  222. {
  223. var condition string
  224. var pars []interface{}
  225. if existItemA.FromEdbInfoId != firstEdbInfo.EdbInfoId {
  226. //删除之前的A指标关联关系
  227. sql = ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? and from_edb_info_id = ?`
  228. _, err = o.Raw(sql, edbInfoId, existItemA.FromEdbInfoId).Exec()
  229. if err != nil {
  230. err = fmt.Errorf("删除拼接日期之前的指标关联关系失败,Err:" + err.Error())
  231. return
  232. }
  233. //删除之前所有的A指标数据
  234. sql = ` DELETE FROM edb_data_calculate_zjpj WHERE edb_info_id = ? and data_time < ?`
  235. _, err = o.Raw(sql, edbInfoId, req.Formula).Exec()
  236. if err != nil {
  237. err = fmt.Errorf("删除拼接日期之前的数据失败,Err:" + err.Error())
  238. return
  239. }
  240. //获取第一个指标的数据列表
  241. condition += " AND data_time < ? AND edb_info_id=? "
  242. pars = append(pars, req.Formula, firstEdbInfo.EdbInfoId)
  243. tmpFirstDataList, tmpErr := GetEdbDataListAll(condition, pars, firstEdbInfo.Source, 0)
  244. if tmpErr != nil {
  245. return edbInfoId, tmpErr
  246. }
  247. firstDataList = tmpFirstDataList
  248. //添加新的指标关系
  249. {
  250. calculateMappingItem := new(EdbInfoCalculateMapping)
  251. calculateMappingItem.CreateTime = time.Now()
  252. calculateMappingItem.ModifyTime = time.Now()
  253. calculateMappingItem.Sort = 1
  254. calculateMappingItem.EdbCode = nowEdbInfo.EdbCode
  255. calculateMappingItem.EdbInfoId = edbInfoId
  256. calculateMappingItem.FromEdbInfoId = firstEdbInfo.EdbInfoId
  257. calculateMappingItem.FromEdbCode = firstEdbInfo.EdbCode
  258. calculateMappingItem.FromEdbName = firstEdbInfo.EdbName
  259. calculateMappingItem.FromSource = firstEdbInfo.Source
  260. calculateMappingItem.FromSourceName = firstEdbInfo.SourceName
  261. calculateMappingItem.FromTag = "A"
  262. calculateMappingItem.Source = nowEdbInfo.Source
  263. calculateMappingItem.SourceName = nowEdbInfo.SourceName
  264. _, err = o.Insert(calculateMappingItem)
  265. if err != nil {
  266. return
  267. }
  268. }
  269. } else {
  270. if req.Formula != nowEdbInfo.CalculateFormula {
  271. //获取第一个指标的数据列表
  272. condition += " AND data_time >= ? AND data_time < ? AND edb_info_id=? "
  273. pars = append(pars, nowFormulaDate, reqFormulaDate, firstEdbInfo.EdbInfoId)
  274. tmpFirstDataList, tmpErr := GetEdbDataListAll(condition, pars, firstEdbInfo.Source, 0)
  275. if tmpErr != nil {
  276. return edbInfoId, tmpErr
  277. }
  278. firstDataList = tmpFirstDataList
  279. }
  280. }
  281. //待插入数据
  282. for _, v := range firstDataList {
  283. //时间戳
  284. currentDate, _ := time.Parse(utils.FormatDate, v.DataTime)
  285. timestamp := currentDate.UnixNano() / 1e6
  286. edbDataZjpj := &EdbDataCalculateZjpj{
  287. EdbInfoId: edbInfoId,
  288. EdbCode: nowEdbInfo.EdbCode,
  289. DataTime: v.DataTime,
  290. Value: v.Value,
  291. Status: 1,
  292. CreateTime: time.Now(),
  293. ModifyTime: time.Now(),
  294. DataTimestamp: timestamp,
  295. }
  296. addDataList = append(addDataList, edbDataZjpj)
  297. }
  298. }
  299. //第二个指标数据
  300. {
  301. var condition string
  302. var pars []interface{}
  303. if existItemB.FromEdbInfoId != secondEdbInfo.EdbInfoId {
  304. //删除之前的B指标关联关系
  305. sql = ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? and from_edb_info_id = ?`
  306. _, err = o.Raw(sql, edbInfoId, existItemB.FromEdbInfoId).Exec()
  307. if err != nil {
  308. err = fmt.Errorf("删除拼接日期之后的指标关联关系失败,Err:" + err.Error())
  309. return
  310. }
  311. //删除历史拼接日期之前所有的B指标数据
  312. sql = ` DELETE FROM edb_data_calculate_zjpj WHERE edb_info_id = ? and data_time >= ?`
  313. _, err = o.Raw(sql, edbInfoId, nowEdbInfo.CalculateFormula).Exec()
  314. if err != nil {
  315. err = fmt.Errorf("删除历史拼接日期之后的数据失败,Err:" + err.Error())
  316. return
  317. }
  318. //第二个指标的数据列表
  319. condition = " AND data_time >= ? AND edb_info_id=? "
  320. pars = append(pars, reqFormulaDate, secondEdbInfo.EdbInfoId)
  321. tmpSecondDataList, tmpErr := GetEdbDataListAll(condition, pars, secondEdbInfo.Source, 0)
  322. if tmpErr != nil {
  323. return edbInfoId, tmpErr
  324. }
  325. secondDataList = tmpSecondDataList
  326. //添加新的指标关系
  327. {
  328. calculateMappingItem := new(EdbInfoCalculateMapping)
  329. calculateMappingItem.CreateTime = time.Now()
  330. calculateMappingItem.ModifyTime = time.Now()
  331. calculateMappingItem.Sort = 1
  332. calculateMappingItem.EdbCode = nowEdbInfo.EdbCode
  333. calculateMappingItem.EdbInfoId = edbInfoId
  334. calculateMappingItem.FromEdbInfoId = secondEdbInfo.EdbInfoId
  335. calculateMappingItem.FromEdbCode = secondEdbInfo.EdbCode
  336. calculateMappingItem.FromEdbName = secondEdbInfo.EdbName
  337. calculateMappingItem.FromSource = secondEdbInfo.Source
  338. calculateMappingItem.FromSourceName = secondEdbInfo.SourceName
  339. calculateMappingItem.FromTag = "B"
  340. calculateMappingItem.Source = nowEdbInfo.Source
  341. calculateMappingItem.SourceName = nowEdbInfo.SourceName
  342. _, err = o.Insert(calculateMappingItem)
  343. if err != nil {
  344. return
  345. }
  346. }
  347. } else {
  348. if req.Formula != nowEdbInfo.CalculateFormula {
  349. //获取第二个指标的数据列表
  350. condition += " AND data_time >= ? AND data_time < ? AND edb_info_id=? "
  351. pars = append(pars, reqFormulaDate, nowFormulaDate, secondEdbInfo.EdbInfoId)
  352. tmpSecondDataList, tmpErr := GetEdbDataListAll(condition, pars, secondEdbInfo.Source, 0)
  353. if tmpErr != nil {
  354. return edbInfoId, tmpErr
  355. }
  356. secondDataList = tmpSecondDataList
  357. }
  358. }
  359. //待插入数据
  360. for _, v := range secondDataList {
  361. //时间戳
  362. currentDate, _ := time.Parse(utils.FormatDate, v.DataTime)
  363. timestamp := currentDate.UnixNano() / 1e6
  364. edbDataZjpj := &EdbDataCalculateZjpj{
  365. EdbInfoId: edbInfoId,
  366. EdbCode: nowEdbInfo.EdbCode,
  367. DataTime: v.DataTime,
  368. Value: v.Value,
  369. Status: 1,
  370. CreateTime: time.Now(),
  371. ModifyTime: time.Now(),
  372. DataTimestamp: timestamp,
  373. }
  374. addDataList = append(addDataList, edbDataZjpj)
  375. }
  376. }
  377. //数据入库
  378. tmpAddDataList := make([]*EdbDataCalculateZjpj, 0)
  379. for _, v := range addDataList {
  380. tmpAddDataList = append(tmpAddDataList, v)
  381. if len(tmpAddDataList) >= 200 {
  382. _, tmpErr := o.InsertMulti(len(tmpAddDataList), tmpAddDataList)
  383. if tmpErr != nil {
  384. err = tmpErr
  385. return
  386. }
  387. //重新初始化需要加入的数据切片
  388. tmpAddDataList = make([]*EdbDataCalculateZjpj, 0)
  389. }
  390. }
  391. //最后如果还有需要新增的数据,那么就统一入库
  392. if len(tmpAddDataList) > 0 {
  393. _, tmpErr := o.InsertMulti(len(tmpAddDataList), tmpAddDataList)
  394. if tmpErr != nil {
  395. err = tmpErr
  396. return
  397. }
  398. }
  399. return
  400. }
  401. // GetAllEdbDataCalculateZjpjByEdbInfoId 根据指标id获取全部的数据
  402. func GetAllEdbDataCalculateZjpjByEdbInfoId(edbInfoId int) (items []*EdbDataCalculateZjpj, err error) {
  403. o := orm.NewOrm()
  404. sql := ` SELECT * FROM edb_data_calculate_zjpj WHERE edb_info_id=? ORDER BY data_time DESC `
  405. _, err = o.Raw(sql, edbInfoId).QueryRows(&items)
  406. return
  407. }
  408. // RefreshAllCalculateZjpj 刷新所有 直接拼接 数据
  409. func RefreshAllCalculateZjpj(edbInfo *EdbInfo) (err error) {
  410. o := orm.NewOrm()
  411. to, err := o.Begin()
  412. defer func() {
  413. if err != nil {
  414. fmt.Println("RefreshAllCalculateZjpj,Err:" + err.Error())
  415. _ = to.Rollback()
  416. } else {
  417. _ = to.Commit()
  418. }
  419. }()
  420. //查询关联指标信息
  421. var existCondition string
  422. var existPars []interface{}
  423. existCondition += " AND edb_info_id=? "
  424. existPars = append(existPars, edbInfo.EdbInfoId)
  425. existList, err := GetEdbInfoCalculateListByCondition(existCondition, existPars)
  426. if err != nil {
  427. err = fmt.Errorf("判断指标是否改变失败,Err:" + err.Error())
  428. return
  429. }
  430. var existItemA, existItemB *EdbInfoCalculateMapping
  431. for _, existItem := range existList {
  432. if existItem.FromTag == "A" {
  433. existItemA = existItem
  434. } else if existItem.FromTag == "B" {
  435. existItemB = existItem
  436. }
  437. }
  438. // 刷新数据
  439. err = refreshAllCalculateZjpj(to, edbInfo, existItemA, existItemB)
  440. return
  441. }
  442. // refreshAllCalculateZjpj 刷新所有 直接拼接 数据
  443. func refreshAllCalculateZjpj(to orm.TxOrmer, edbInfo *EdbInfo, existItemA, existItemB *EdbInfoCalculateMapping) (err error) {
  444. //查询当前指标现有的数据
  445. var condition string
  446. var pars []interface{}
  447. condition += " AND edb_info_id=? "
  448. pars = append(pars, edbInfo.EdbInfoId)
  449. dataList, err := GetAllEdbDataCalculateZjpjByEdbInfoId(edbInfo.EdbInfoId)
  450. if err != nil {
  451. return err
  452. }
  453. var dateArr []string
  454. dataMap := make(map[string]*EdbDataCalculateZjpj)
  455. removeDataTimeMap := make(map[string]int) //需要移除的日期数据
  456. for _, v := range dataList {
  457. dateArr = append(dateArr, v.DataTime)
  458. dataMap[v.DataTime] = v
  459. removeDataTimeMap[v.DataTime] = 1
  460. }
  461. addDataList := make([]*EdbDataCalculateZjpj, 0)
  462. //第一个指标
  463. {
  464. var condition string
  465. var pars []interface{}
  466. condition += " AND data_time < ? AND edb_info_id=? "
  467. pars = append(pars, edbInfo.CalculateFormula, existItemA.FromEdbInfoId)
  468. //第一个指标的数据列表
  469. firstDataList, tmpErr := GetEdbDataListAll(condition, pars, existItemA.FromSource, 0)
  470. if tmpErr != nil {
  471. return tmpErr
  472. }
  473. for _, v := range firstDataList {
  474. //校验待删除日期数据里面是否存在该元素,如果存在的话,那么移除该元素
  475. if _, ok := removeDataTimeMap[v.DataTime]; ok {
  476. delete(removeDataTimeMap, v.DataTime)
  477. }
  478. //时间戳
  479. if edbData, ok := dataMap[v.DataTime]; ok {
  480. if edbData.Value != v.Value {
  481. //更新指标数据
  482. edbData.Value = v.Value
  483. _, _ = to.Update(edbData, "Value")
  484. }
  485. } else {
  486. //时间戳
  487. currentDate, _ := time.Parse(utils.FormatDate, v.DataTime)
  488. timestamp := currentDate.UnixNano() / 1e6
  489. edbDataZjpj := &EdbDataCalculateZjpj{
  490. EdbInfoId: edbInfo.EdbInfoId,
  491. EdbCode: edbInfo.EdbCode,
  492. DataTime: v.DataTime,
  493. Value: v.Value,
  494. Status: 1,
  495. CreateTime: time.Now(),
  496. ModifyTime: time.Now(),
  497. DataTimestamp: timestamp,
  498. }
  499. addDataList = append(addDataList, edbDataZjpj)
  500. }
  501. }
  502. }
  503. //第二个指标
  504. {
  505. condition = ``
  506. pars = make([]interface{}, 0)
  507. condition += " AND data_time >= ? AND edb_info_id = ? "
  508. pars = append(pars, edbInfo.CalculateFormula, existItemB.FromEdbInfoId)
  509. //第二个指标的数据列表
  510. secondDataList, tmpErr := GetEdbDataListAll(condition, pars, existItemB.FromSource, 0)
  511. if tmpErr != nil {
  512. return tmpErr
  513. }
  514. for _, v := range secondDataList {
  515. //校验待删除日期数据里面是否存在该元素,如果存在的话,那么移除该元素
  516. if _, ok := removeDataTimeMap[v.DataTime]; ok {
  517. delete(removeDataTimeMap, v.DataTime)
  518. }
  519. if edbData, ok := dataMap[v.DataTime]; ok {
  520. if edbData.Value != v.Value {
  521. //更新指标数据
  522. edbData.Value = v.Value
  523. edbData.ModifyTime = time.Now()
  524. _, tmpErr := to.Update(edbData, "Value", "ModifyTime")
  525. if tmpErr != nil {
  526. fmt.Println("tmpErr:", tmpErr)
  527. }
  528. }
  529. } else {
  530. //时间戳
  531. currentDate, _ := time.Parse(utils.FormatDate, v.DataTime)
  532. timestamp := currentDate.UnixNano() / 1e6
  533. edbDataZjpj := &EdbDataCalculateZjpj{
  534. EdbInfoId: edbInfo.EdbInfoId,
  535. EdbCode: edbInfo.EdbCode,
  536. DataTime: v.DataTime,
  537. Value: v.Value,
  538. Status: 1,
  539. CreateTime: time.Now(),
  540. ModifyTime: time.Now(),
  541. DataTimestamp: timestamp,
  542. }
  543. addDataList = append(addDataList, edbDataZjpj)
  544. }
  545. }
  546. }
  547. //删除已经不存在的累计同比拼接指标数据(由于同比值当日的数据删除了)
  548. {
  549. removeDateList := make([]string, 0)
  550. for dateTime := range removeDataTimeMap {
  551. removeDateList = append(removeDateList, dateTime)
  552. }
  553. if len(removeDateList) > 0 {
  554. removeDateStr := strings.Join(removeDateList, `","`)
  555. removeDateStr = `"` + removeDateStr + `"`
  556. //如果拼接指标变更了,那么需要删除所有的指标数据
  557. tableName := GetEdbDataTableName(edbInfo.Source)
  558. sql := fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time in (%s) `, tableName, removeDateStr)
  559. _, err = to.Raw(sql, edbInfo.EdbInfoId).Exec()
  560. if err != nil {
  561. err = fmt.Errorf("删除不存在的直接拼接指标数据失败,Err:" + err.Error())
  562. return
  563. }
  564. }
  565. }
  566. //数据入库
  567. if len(addDataList) > 0 {
  568. _, tmpErr := to.InsertMulti(len(addDataList), addDataList)
  569. if tmpErr != nil {
  570. err = tmpErr
  571. return
  572. }
  573. }
  574. return
  575. }