edb_data_calculate_zjpj.go 21 KB

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