edb_info_calculate_zjpj.go 20 KB

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