edb_data_calculate_zjpj.go 15 KB

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