edb_data_calculate_zjpj.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  1. package models
  2. import (
  3. "eta_gn/eta_index_lib/global"
  4. "eta_gn/eta_index_lib/utils"
  5. "fmt"
  6. "gorm.io/gorm"
  7. "strings"
  8. "time"
  9. )
  10. // EdbDataCalculateZjpj 直接拼接数据结构体
  11. type EdbDataCalculateZjpj struct {
  12. EdbDataId int `gorm:"primaryKey;autoIncrement;column:edb_data_id"`
  13. EdbInfoId int `gorm:"column:edb_info_id" description:"指标ID"`
  14. EdbCode string `gorm:"column:edb_code" description:"指标编码"`
  15. DataTime string `gorm:"column:data_time" description:"数据日期"`
  16. Value float64 `gorm:"column:value" description:"数据值"`
  17. Status int `gorm:"column:status" description:"状态"`
  18. CreateTime time.Time `gorm:"column:status" description:"创建时间"`
  19. ModifyTime time.Time `gorm:"column:create_time" description:"修改时间"`
  20. DataTimestamp int64 `gorm:"column:modify_time" description:"数据日期时间戳"`
  21. }
  22. // AddCalculateZjpj 新增直接拼接数据
  23. func AddCalculateZjpj(req *EdbInfoCalculateBatchSaveReq, firstEdbInfo, secondEdbInfo *EdbInfo, edbCode, uniqueCode string, sysUserId int, sysUserRealName string) (edbInfo *EdbInfo, err error) {
  24. to := global.DEFAULT_DmSQL.Begin()
  25. defer func() {
  26. if err != nil {
  27. to.Rollback()
  28. } else {
  29. to.Commit()
  30. }
  31. }()
  32. if req.EdbInfoId <= 0 {
  33. edbInfo = &EdbInfo{
  34. SourceName: "直接拼接",
  35. Source: utils.DATA_SOURCE_CALCULATE_ZJPJ,
  36. EdbCode: edbCode,
  37. EdbName: req.EdbName,
  38. EdbNameSource: req.EdbName,
  39. Frequency: req.Frequency,
  40. Unit: req.Unit,
  41. StartDate: firstEdbInfo.StartDate,
  42. EndDate: firstEdbInfo.EndDate,
  43. ClassifyId: req.ClassifyId,
  44. SysUserId: sysUserId,
  45. SysUserRealName: sysUserRealName,
  46. UniqueCode: uniqueCode,
  47. CreateTime: time.Now(),
  48. ModifyTime: time.Now(),
  49. CalculateFormula: req.Formula,
  50. EdbNameEn: req.EdbName,
  51. UnitEn: req.Unit,
  52. EdbType: 2,
  53. Sort: GetAddEdbMaxSortByClassifyId(req.ClassifyId, utils.EDB_INFO_TYPE),
  54. }
  55. tmpErr := to.Create(edbInfo).Error
  56. if tmpErr != nil {
  57. err = tmpErr
  58. return
  59. }
  60. } else {
  61. edbInfo, err = GetEdbInfoById(req.EdbInfoId)
  62. if err != nil {
  63. return
  64. }
  65. //查询
  66. tmpEdbInfo, tmpErr := GetEdbInfoById(edbInfo.EdbInfoId)
  67. if tmpErr != nil {
  68. err = tmpErr
  69. return
  70. }
  71. tmpEdbInfo.EdbName = req.EdbName
  72. tmpEdbInfo.ClassifyId = req.ClassifyId
  73. tmpEdbInfo.Frequency = req.Frequency
  74. tmpEdbInfo.Unit = req.Unit
  75. tmpEdbInfo.CalculateFormula = req.Formula
  76. edbInfo = tmpEdbInfo
  77. //删除指标数据
  78. dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_ZJPJ, utils.DATA_SUB_SOURCE_EDB)
  79. fmt.Println("dataTableName:" + dataTableName)
  80. deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
  81. deleteSql = fmt.Sprintf(deleteSql, dataTableName)
  82. err = to.Exec(deleteSql, req.EdbInfoId).Error
  83. if err != nil {
  84. return
  85. }
  86. //删除指标关系
  87. sql := ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id=? `
  88. err = to.Exec(sql, edbInfo.EdbInfoId).Error
  89. }
  90. //关联关系
  91. var existItemA, existItemB *EdbInfoCalculateMapping
  92. //第一个指标
  93. {
  94. existItemA = &EdbInfoCalculateMapping{
  95. EdbInfoCalculateMappingId: 0,
  96. EdbInfoId: edbInfo.EdbInfoId,
  97. Source: edbInfo.Source,
  98. SourceName: edbInfo.SourceName,
  99. EdbCode: edbInfo.EdbCode,
  100. FromEdbInfoId: firstEdbInfo.EdbInfoId,
  101. FromEdbCode: firstEdbInfo.EdbCode,
  102. FromEdbName: firstEdbInfo.EdbName,
  103. FromSource: firstEdbInfo.Source,
  104. FromSourceName: firstEdbInfo.SourceName,
  105. FromTag: "A",
  106. Sort: 1,
  107. CreateTime: time.Now(),
  108. ModifyTime: time.Now(),
  109. FromSubSource: firstEdbInfo.SubSource,
  110. }
  111. tmpErr := to.Create(existItemA).Error
  112. if tmpErr != nil {
  113. err = tmpErr
  114. return
  115. }
  116. }
  117. //第二个指标
  118. {
  119. existItemB = &EdbInfoCalculateMapping{
  120. EdbInfoCalculateMappingId: 0,
  121. EdbInfoId: edbInfo.EdbInfoId,
  122. Source: edbInfo.Source,
  123. SourceName: edbInfo.SourceName,
  124. EdbCode: edbInfo.EdbCode,
  125. FromEdbInfoId: secondEdbInfo.EdbInfoId,
  126. FromEdbCode: secondEdbInfo.EdbCode,
  127. FromEdbName: secondEdbInfo.EdbName,
  128. FromSource: secondEdbInfo.Source,
  129. FromSourceName: secondEdbInfo.SourceName,
  130. FromTag: "B",
  131. Sort: 1,
  132. CreateTime: time.Now(),
  133. ModifyTime: time.Now(),
  134. FromSubSource: secondEdbInfo.SubSource,
  135. }
  136. tmpErr := to.Create(existItemB).Error
  137. if tmpErr != nil {
  138. err = tmpErr
  139. return
  140. }
  141. }
  142. //拼接数据
  143. err = refreshAllCalculateZjpj(to, edbInfo, existItemA, existItemB)
  144. return
  145. }
  146. // EditCalculateZjpj 编辑直接拼接数据
  147. func EditCalculateZjpj(req *EdbInfoCalculateBatchEditReq, edbInfo, firstEdbInfo, secondEdbInfo *EdbInfo) (err error) {
  148. to := global.DEFAULT_DmSQL.Begin()
  149. defer func() {
  150. if err != nil {
  151. to.Rollback()
  152. } else {
  153. to.Commit()
  154. }
  155. }()
  156. nowEdbInfo := *edbInfo // 现在的指标信息
  157. //修改指标信息
  158. edbInfo.EdbName = req.EdbName
  159. edbInfo.EdbNameSource = req.EdbName
  160. edbInfo.Frequency = req.Frequency
  161. edbInfo.Unit = req.Unit
  162. edbInfo.ClassifyId = req.ClassifyId
  163. edbInfo.CalculateFormula = req.Formula
  164. edbInfo.EdbNameEn = req.EdbNameEn
  165. edbInfo.UnitEn = req.UnitEn
  166. edbInfo.ModifyTime = time.Now()
  167. err = to.Model(edbInfo).Select([]string{"EdbName", "EdbNameSource", "Frequency", "Unit", "ClassifyId", "CalculateFormula", "ModifyTime", "EdbNameEn", "UnitEn"}).Updates(edbInfo).Error
  168. if err != nil {
  169. return
  170. }
  171. var existCondition string
  172. var existPars []interface{}
  173. existCondition += " AND edb_info_id=? "
  174. existPars = append(existPars, edbInfo.EdbInfoId)
  175. //查询出所有的关联指标
  176. existList, err := GetEdbInfoCalculateListByCondition(existCondition, existPars)
  177. if err != nil {
  178. err = fmt.Errorf("判断指标是否改变失败,Err:" + err.Error())
  179. return
  180. }
  181. var existItemA, existItemB *EdbInfoCalculateMapping
  182. for _, existItem := range existList {
  183. if existItem.FromTag == "A" {
  184. existItemA = existItem
  185. } else if existItem.FromTag == "B" {
  186. existItemB = existItem
  187. }
  188. }
  189. // 是否需要删除数据重新计算
  190. isNeedCalculateData := false
  191. // 如果截止日期变更,那么需要重新计算
  192. if req.Formula != nowEdbInfo.CalculateFormula {
  193. isNeedCalculateData = true
  194. }
  195. //第一个指标数据
  196. {
  197. // 如果指标变了,那么需要删除关系,并重新计算
  198. if existItemA.FromEdbInfoId != firstEdbInfo.EdbInfoId {
  199. //删除之前的A指标关联关系
  200. sql := ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? and from_edb_info_id = ?`
  201. err = to.Exec(sql, edbInfo.EdbInfoId, existItemA.FromEdbInfoId).Error
  202. if err != nil {
  203. err = fmt.Errorf("删除拼接日期之前的指标关联关系失败,Err:" + err.Error())
  204. return
  205. }
  206. //添加新的指标关系
  207. {
  208. existItemA = &EdbInfoCalculateMapping{
  209. EdbInfoCalculateMappingId: 0,
  210. EdbInfoId: edbInfo.EdbInfoId,
  211. Source: edbInfo.Source,
  212. SourceName: edbInfo.SourceName,
  213. EdbCode: edbInfo.EdbCode,
  214. FromEdbInfoId: firstEdbInfo.EdbInfoId,
  215. FromEdbCode: firstEdbInfo.EdbCode,
  216. FromEdbName: firstEdbInfo.EdbName,
  217. FromSource: firstEdbInfo.Source,
  218. FromSourceName: firstEdbInfo.SourceName,
  219. FromTag: "A",
  220. Sort: 1,
  221. CreateTime: time.Now(),
  222. ModifyTime: time.Now(),
  223. FromSubSource: firstEdbInfo.SubSource,
  224. }
  225. tmpErr := to.Create(existItemA).Error
  226. if tmpErr != nil {
  227. err = tmpErr
  228. return
  229. }
  230. isNeedCalculateData = true
  231. }
  232. }
  233. }
  234. //第二个指标数据
  235. {
  236. // 如果指标变了,那么需要删除关系,并重新计算
  237. if existItemB.FromEdbInfoId != secondEdbInfo.EdbInfoId {
  238. //删除之前的B指标关联关系
  239. sql := ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? and from_edb_info_id = ?`
  240. err = to.Exec(sql, edbInfo.EdbInfoId, existItemB.FromEdbInfoId).Error
  241. if err != nil {
  242. err = fmt.Errorf("删除拼接日期之后的指标关联关系失败,Err:" + err.Error())
  243. return
  244. }
  245. // 添加新的指标关联关系
  246. existItemB = &EdbInfoCalculateMapping{
  247. EdbInfoCalculateMappingId: 0,
  248. EdbInfoId: edbInfo.EdbInfoId,
  249. Source: edbInfo.Source,
  250. SourceName: edbInfo.SourceName,
  251. EdbCode: edbInfo.EdbCode,
  252. FromEdbInfoId: secondEdbInfo.EdbInfoId,
  253. FromEdbCode: secondEdbInfo.EdbCode,
  254. FromEdbName: secondEdbInfo.EdbName,
  255. FromSource: secondEdbInfo.Source,
  256. FromSourceName: secondEdbInfo.SourceName,
  257. FromTag: "B",
  258. Sort: 2,
  259. CreateTime: time.Now(),
  260. ModifyTime: time.Now(),
  261. FromSubSource: secondEdbInfo.SubSource,
  262. }
  263. tmpErr := to.Create(existItemB).Error
  264. if tmpErr != nil {
  265. err = tmpErr
  266. return
  267. }
  268. isNeedCalculateData = true
  269. }
  270. }
  271. // 如果需要重新计算,那么先删除所有的指标数据,然后再重新计算
  272. if isNeedCalculateData {
  273. // 删除之前所有的指标数据
  274. tableName := GetEdbDataTableName(edbInfo.Source, edbInfo.SubSource)
  275. sql := fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? `, tableName)
  276. err = to.Exec(sql, edbInfo.EdbInfoId).Error
  277. if err != nil {
  278. err = fmt.Errorf("删除历史数据失败,Err:" + err.Error())
  279. return
  280. }
  281. err = refreshAllCalculateZjpj(to, edbInfo, existItemA, existItemB)
  282. }
  283. return
  284. }
  285. // GetAllEdbDataCalculateZjpjByEdbInfoId 根据指标id获取全部的数据
  286. func GetAllEdbDataCalculateZjpjByEdbInfoId(edbInfoId int) (items []*EdbDataCalculateZjpj, err error) {
  287. sql := ` SELECT * FROM edb_data_calculate_zjpj WHERE edb_info_id=? ORDER BY data_time DESC `
  288. err = global.DEFAULT_DmSQL.Raw(sql, edbInfoId).Scan(&items).Error
  289. return
  290. }
  291. // RefreshAllCalculateZjpj 刷新所有 直接拼接 数据
  292. func RefreshAllCalculateZjpj(edbInfo *EdbInfo) (err error) {
  293. to := global.DEFAULT_DmSQL.Begin()
  294. defer func() {
  295. if err != nil {
  296. to.Rollback()
  297. } else {
  298. to.Commit()
  299. }
  300. }()
  301. //查询关联指标信息
  302. var existCondition string
  303. var existPars []interface{}
  304. existCondition += " AND edb_info_id=? "
  305. existPars = append(existPars, edbInfo.EdbInfoId)
  306. existList, err := GetEdbInfoCalculateListByCondition(existCondition, existPars)
  307. if err != nil {
  308. err = fmt.Errorf("判断指标是否改变失败,Err:" + err.Error())
  309. return
  310. }
  311. var existItemA, existItemB *EdbInfoCalculateMapping
  312. for _, existItem := range existList {
  313. if existItem.FromTag == "A" {
  314. existItemA = existItem
  315. } else if existItem.FromTag == "B" {
  316. existItemB = existItem
  317. }
  318. }
  319. // 刷新数据
  320. err = refreshAllCalculateZjpj(to, edbInfo, existItemA, existItemB)
  321. return
  322. }
  323. // refreshAllCalculateZjpj 刷新所有 直接拼接 数据
  324. func refreshAllCalculateZjpj(to *gorm.DB, edbInfo *EdbInfo, existItemA, existItemB *EdbInfoCalculateMapping) (err error) {
  325. //查询当前指标现有的数据
  326. var condition string
  327. var pars []interface{}
  328. condition += " AND edb_info_id=? "
  329. pars = append(pars, edbInfo.EdbInfoId)
  330. var dataList []*EdbDataCalculateZjpj
  331. sql := ` SELECT * FROM edb_data_calculate_zjpj WHERE edb_info_id=? ORDER BY data_time DESC `
  332. err = to.Raw(sql, edbInfo.EdbInfoId).Scan(&dataList).Error
  333. if err != nil {
  334. return err
  335. }
  336. var dateArr []string
  337. dataMap := make(map[string]*EdbDataCalculateZjpj)
  338. removeDataTimeMap := make(map[string]int) //需要移除的日期数据
  339. for _, v := range dataList {
  340. dateArr = append(dateArr, v.DataTime)
  341. dataMap[v.DataTime] = v
  342. removeDataTimeMap[v.DataTime] = 1
  343. }
  344. addDataList := make([]*EdbDataCalculateZjpj, 0)
  345. //第一个指标
  346. {
  347. //第一个指标的数据列表
  348. firstDataList, tmpErr := GetEdbDataListAllByTo(to, existItemA.FromSource, existItemA.FromSubSource, FindEdbDataListAllCond{
  349. EdbInfoId: existItemA.FromEdbInfoId,
  350. EndDataTime: edbInfo.CalculateFormula,
  351. EndDataTimeCond: "<",
  352. }, 0)
  353. if tmpErr != nil {
  354. return tmpErr
  355. }
  356. for _, v := range firstDataList {
  357. //校验待删除日期数据里面是否存在该元素,如果存在的话,那么移除该元素
  358. if _, ok := removeDataTimeMap[v.DataTime]; ok {
  359. delete(removeDataTimeMap, v.DataTime)
  360. }
  361. //时间戳
  362. if edbData, ok := dataMap[v.DataTime]; ok {
  363. if edbData.Value != v.Value {
  364. //更新指标数据
  365. edbData.Value = v.Value
  366. _ = to.Model(edbData).Select([]string{"Value"}).Updates(edbData).Error
  367. }
  368. } else {
  369. //时间戳
  370. currentDate, _ := time.ParseInLocation(utils.FormatDate, v.DataTime, time.Local)
  371. timestamp := currentDate.UnixNano() / 1e6
  372. edbDataZjpj := &EdbDataCalculateZjpj{
  373. EdbInfoId: edbInfo.EdbInfoId,
  374. EdbCode: edbInfo.EdbCode,
  375. DataTime: v.DataTime,
  376. Value: v.Value,
  377. Status: 1,
  378. CreateTime: time.Now(),
  379. ModifyTime: time.Now(),
  380. DataTimestamp: timestamp,
  381. }
  382. addDataList = append(addDataList, edbDataZjpj)
  383. }
  384. }
  385. }
  386. //第二个指标
  387. {
  388. //第二个指标的数据列表
  389. secondDataList, tmpErr := GetEdbDataListAllByTo(to, existItemB.FromSource, existItemB.FromSubSource, FindEdbDataListAllCond{
  390. EdbInfoId: existItemB.FromEdbInfoId,
  391. StartDataTime: edbInfo.CalculateFormula,
  392. StartDataTimeCond: ">=",
  393. }, 0)
  394. if tmpErr != nil {
  395. return tmpErr
  396. }
  397. for _, v := range secondDataList {
  398. //校验待删除日期数据里面是否存在该元素,如果存在的话,那么移除该元素
  399. if _, ok := removeDataTimeMap[v.DataTime]; ok {
  400. delete(removeDataTimeMap, v.DataTime)
  401. }
  402. if edbData, ok := dataMap[v.DataTime]; ok {
  403. if edbData.Value != v.Value {
  404. //更新指标数据
  405. edbData.Value = v.Value
  406. edbData.ModifyTime = time.Now()
  407. tmpErr := to.Model(edbData).Select([]string{"Value", "ModifyTime"}).Updates(edbData).Error
  408. if tmpErr != nil {
  409. fmt.Println("tmpErr:", tmpErr)
  410. }
  411. }
  412. } else {
  413. //时间戳
  414. currentDate, _ := time.ParseInLocation(utils.FormatDate, v.DataTime, time.Local)
  415. timestamp := currentDate.UnixNano() / 1e6
  416. edbDataZjpj := &EdbDataCalculateZjpj{
  417. EdbInfoId: edbInfo.EdbInfoId,
  418. EdbCode: edbInfo.EdbCode,
  419. DataTime: v.DataTime,
  420. Value: v.Value,
  421. Status: 1,
  422. CreateTime: time.Now(),
  423. ModifyTime: time.Now(),
  424. DataTimestamp: timestamp,
  425. }
  426. addDataList = append(addDataList, edbDataZjpj)
  427. }
  428. }
  429. }
  430. //删除已经不存在的累计同比拼接指标数据(由于同比值当日的数据删除了)
  431. {
  432. removeDateList := make([]string, 0)
  433. for dateTime := range removeDataTimeMap {
  434. removeDateList = append(removeDateList, dateTime)
  435. }
  436. if len(removeDateList) > 0 {
  437. removeDateStr := strings.Join(removeDateList, `","`)
  438. removeDateStr = `"` + removeDateStr + `"`
  439. //如果拼接指标变更了,那么需要删除所有的指标数据
  440. tableName := GetEdbDataTableName(edbInfo.Source, edbInfo.SubSource)
  441. sql := fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time in (%s) `, tableName, removeDateStr)
  442. err = to.Exec(sql, edbInfo.EdbInfoId).Error
  443. if err != nil {
  444. err = fmt.Errorf("删除不存在的直接拼接指标数据失败,Err:" + err.Error())
  445. return
  446. }
  447. }
  448. }
  449. //数据入库
  450. if len(addDataList) > 0 {
  451. tmpAddDataList := make([]*EdbDataCalculateZjpj, 0)
  452. i := 0
  453. for _, v := range addDataList {
  454. tmpAddDataList = append(tmpAddDataList, v)
  455. i++
  456. if i >= 500 {
  457. err = to.CreateInBatches(tmpAddDataList, 500).Error
  458. if err != nil {
  459. return
  460. }
  461. i = 0
  462. tmpAddDataList = make([]*EdbDataCalculateZjpj, 0)
  463. }
  464. }
  465. if len(tmpAddDataList) > 0 {
  466. err = to.CreateInBatches(tmpAddDataList, 500).Error
  467. if err != nil {
  468. return
  469. }
  470. }
  471. }
  472. return
  473. }