edb_data_calculate_zjpj.go 16 KB

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