edb_data_calculate_zjpj.go 14 KB

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