edb_info_calculate_zjpj.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. package data_manage
  2. import (
  3. "errors"
  4. "fmt"
  5. "hongze/hongze_task/utils"
  6. "rdluck_tools/orm"
  7. "strings"
  8. "time"
  9. )
  10. type EdbInfoCalculateZjpjDetail struct {
  11. EdbInfoCalculateBpId int `orm:"column(edb_info_calculate_bp_id);pk"`
  12. EdbInfoId int `description:"指标id"`
  13. EdbCode string `description:"指标编码"`
  14. FromEdbInfoId int `description:"计算指标id"`
  15. FromEdbCode string `description:"计算指标编码"`
  16. FromEdbName string `description:"计算指标名称"`
  17. FromSource int `description:"计算指标来源"`
  18. FromSourceName string `description:"计算指标来源名称"`
  19. FromTag string `description:"来源指标标签"`
  20. Sort int `description:"计算指标名称排序"`
  21. CreateTime time.Time `description:"创建时间"`
  22. ModifyTime time.Time `description:"修改时间"`
  23. StartDate string `description:"开始日期"`
  24. EndDate string `description:"结束日期"`
  25. }
  26. // RefreshAllCalculateZjpj 刷新所有 直接拼接 数据
  27. func RefreshAllCalculateZjpj(edbInfo *EdbInfoList) (err error) {
  28. o := orm.NewOrm()
  29. o.Using("data")
  30. o.Begin()
  31. defer func() {
  32. if err != nil {
  33. o.Rollback()
  34. } else {
  35. o.Commit()
  36. }
  37. }()
  38. //查询当前指标现有的数据
  39. var condition string
  40. var pars []interface{}
  41. condition += " AND edb_info_id=? "
  42. pars = append(pars, edbInfo.EdbInfoId)
  43. dataList, err := GetAllEdbDataCalculateZjpjByEdbInfoId(edbInfo.EdbInfoId)
  44. if err != nil {
  45. return err
  46. }
  47. var dateArr []string
  48. dataMap := make(map[string]*EdbDataCalculateZjpj)
  49. removeDataTimeMap := make(map[string]int) //需要移除的日期数据
  50. for _, v := range dataList {
  51. dateArr = append(dateArr, v.DataTime)
  52. dataMap[v.DataTime] = v
  53. removeDataTimeMap[v.DataTime] = 1
  54. }
  55. //查询关联指标信息
  56. var existCondition string
  57. var existPars []interface{}
  58. existCondition += " AND edb_info_id=? "
  59. existPars = append(existPars, edbInfo.EdbInfoId)
  60. existList, err := GetEdbInfoCalculateListByCondition(existCondition, existPars)
  61. if err != nil {
  62. err = errors.New("判断指标是否改变失败,Err:" + err.Error())
  63. return
  64. }
  65. var existItemA, existItemB *EdbInfoCalculateMapping
  66. for _, existItem := range existList {
  67. if existItem.FromTag == "A" {
  68. existItemA = existItem
  69. } else if existItem.FromTag == "B" {
  70. existItemB = existItem
  71. }
  72. }
  73. addDataList := make([]*EdbDataCalculateZjpj, 0)
  74. //第一个指标
  75. {
  76. var condition string
  77. var pars []interface{}
  78. condition += " AND data_time < ? AND edb_info_id=? "
  79. pars = append(pars, edbInfo.CalculateFormula, existItemA.FromEdbInfoId)
  80. //第一个指标的数据列表
  81. firstDataList, tmpErr := GetEdbDataListAll(condition, pars, existItemA.FromSource, 0)
  82. if tmpErr != nil {
  83. return tmpErr
  84. }
  85. for _, v := range firstDataList {
  86. //校验待删除日期数据里面是否存在该元素,如果存在的话,那么移除该元素
  87. if _, ok := removeDataTimeMap[v.DataTime]; ok {
  88. delete(removeDataTimeMap, v.DataTime)
  89. }
  90. //时间戳
  91. if edbData, ok := dataMap[v.DataTime]; ok {
  92. if edbData.Value != v.Value {
  93. //更新指标数据
  94. edbData.Value = v.Value
  95. o.Update(edbData, "Value")
  96. }
  97. } else {
  98. //时间戳
  99. currentDate, _ := time.Parse(utils.FormatDate, v.DataTime)
  100. timestamp := currentDate.UnixNano() / 1e6
  101. edbDataZjpj := &EdbDataCalculateZjpj{
  102. EdbInfoId: edbInfo.EdbInfoId,
  103. EdbCode: edbInfo.EdbCode,
  104. DataTime: v.DataTime,
  105. Value: v.Value,
  106. Status: 1,
  107. CreateTime: time.Now(),
  108. ModifyTime: time.Now(),
  109. DataTimestamp: timestamp,
  110. }
  111. addDataList = append(addDataList, edbDataZjpj)
  112. }
  113. }
  114. }
  115. //第二个指标
  116. {
  117. condition = ``
  118. pars = make([]interface{}, 0)
  119. condition += " AND data_time >= ? AND edb_info_id = ? "
  120. pars = append(pars, edbInfo.CalculateFormula, existItemB.FromEdbInfoId)
  121. //第二个指标的数据列表
  122. secondDataList, tmpErr := GetEdbDataListAll(condition, pars, existItemB.FromSource, 0)
  123. if tmpErr != nil {
  124. return tmpErr
  125. }
  126. for _, v := range secondDataList {
  127. //校验待删除日期数据里面是否存在该元素,如果存在的话,那么移除该元素
  128. if _, ok := removeDataTimeMap[v.DataTime]; ok {
  129. delete(removeDataTimeMap, v.DataTime)
  130. }
  131. if edbData, ok := dataMap[v.DataTime]; ok {
  132. if edbData.Value != v.Value {
  133. //更新指标数据
  134. edbData.Value = v.Value
  135. edbData.ModifyTime = time.Now()
  136. _, tmpErr := o.Update(edbData, "Value", "ModifyTime")
  137. if tmpErr != nil {
  138. fmt.Println("tmpErr:", tmpErr)
  139. }
  140. }
  141. } else {
  142. //时间戳
  143. currentDate, _ := time.Parse(utils.FormatDate, v.DataTime)
  144. timestamp := currentDate.UnixNano() / 1e6
  145. edbDataZjpj := &EdbDataCalculateZjpj{
  146. EdbInfoId: edbInfo.EdbInfoId,
  147. EdbCode: edbInfo.EdbCode,
  148. DataTime: v.DataTime,
  149. Value: v.Value,
  150. Status: 1,
  151. CreateTime: time.Now(),
  152. ModifyTime: time.Now(),
  153. DataTimestamp: timestamp,
  154. }
  155. addDataList = append(addDataList, edbDataZjpj)
  156. }
  157. }
  158. }
  159. //删除已经不存在的累计同比拼接指标数据(由于同比值当日的数据删除了)
  160. {
  161. removeDateList := make([]string, 0)
  162. for dateTime := range removeDataTimeMap {
  163. removeDateList = append(removeDateList, dateTime)
  164. }
  165. if len(removeDateList) > 0 {
  166. removeDateStr := strings.Join(removeDateList, `","`)
  167. removeDateStr = `"` + removeDateStr + `"`
  168. //如果拼接指标变更了,那么需要删除所有的指标数据
  169. tableName := GetEdbDataTableName(edbInfo.Source)
  170. sql := fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time in (%s) `, tableName, removeDateStr)
  171. _, err = o.Raw(sql, edbInfo.EdbInfoId).Exec()
  172. if err != nil {
  173. err = errors.New("删除不存在的直接拼接指标数据失败,Err:" + err.Error())
  174. return
  175. }
  176. }
  177. }
  178. //数据入库
  179. tmpAddDataList := make([]*EdbDataCalculateZjpj, 0)
  180. for _, v := range addDataList {
  181. tmpAddDataList = append(tmpAddDataList, v)
  182. if len(tmpAddDataList) >= 200 {
  183. _, tmpErr := o.InsertMulti(len(tmpAddDataList), tmpAddDataList)
  184. if tmpErr != nil {
  185. err = tmpErr
  186. return
  187. }
  188. //重新初始化需要加入的数据切片
  189. tmpAddDataList = make([]*EdbDataCalculateZjpj, 0)
  190. }
  191. }
  192. //最后如果还有需要新增的数据,那么就统一入库
  193. if len(tmpAddDataList) > 0 {
  194. _, tmpErr := o.InsertMulti(len(tmpAddDataList), tmpAddDataList)
  195. if tmpErr != nil {
  196. err = tmpErr
  197. return
  198. }
  199. }
  200. return
  201. }