edb_info_replace.go 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. package services
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta/eta_api/models/data_manage"
  6. excelModel "eta/eta_api/models/data_manage/excel"
  7. "eta/eta_api/models/data_manage/excel/request"
  8. "eta/eta_api/services/alarm_msg"
  9. "eta/eta_api/services/sandbox"
  10. "eta/eta_api/utils"
  11. "fmt"
  12. "time"
  13. )
  14. // 全局的指标替换
  15. func DealReplaceEdbCache() {
  16. var err error
  17. for {
  18. utils.Rc.Brpop(utils.CACHE_KEY_REPLACE_EDB, func(b []byte) {
  19. defer func() {
  20. if err != nil {
  21. utils.FileLog.Info("DealReplaceEdbCache err:" + err.Error())
  22. go alarm_msg.SendAlarmMsg("替换表格中的指标失败提醒,errmsg:"+err.Error(), 3)
  23. }
  24. }()
  25. record := new(data_manage.ReplaceEdbInfoItem)
  26. if err = json.Unmarshal(b, &record); err != nil {
  27. fmt.Println("json unmarshal wrong!")
  28. return
  29. }
  30. oldEdbInfo := record.OldEdbInfo
  31. newEdbInfo := record.NewEdbInfo
  32. deleteCache := true
  33. setNxKey := fmt.Sprintf("EDB_INFO_REPLACE:%d-%d", oldEdbInfo.EdbInfoId, newEdbInfo.EdbInfoId)
  34. defer func() {
  35. if deleteCache {
  36. utils.Rc.Delete(setNxKey)
  37. }
  38. }()
  39. if !utils.Rc.SetNX(setNxKey, 1, 30*time.Minute) {
  40. deleteCache = false
  41. err = fmt.Errorf("替换表格中的指标失败旧指标:%d为新指标%d:正在处理中", oldEdbInfo.EdbInfoId, newEdbInfo.EdbInfoId)
  42. return
  43. }
  44. // 替换相关性图表配置
  45. _, err = data_manage.ReplaceMultipleGraphConfigChartEdb(oldEdbInfo, newEdbInfo)
  46. if err != nil {
  47. err = fmt.Errorf("替换相关性图表配置失败,errmsg:%s", err.Error())
  48. return
  49. }
  50. // 替换拟合方程指标
  51. _, err = data_manage.ReplaceEdbInfoInLineEquationMultipleGraphConfig(oldEdbInfo, newEdbInfo)
  52. if err != nil {
  53. err = fmt.Errorf("替换拟合方程指标失败,errmsg:%s", err.Error())
  54. return
  55. }
  56. // 替换表格中的指标
  57. err = ReplaceEdbInExcel(oldEdbInfo, newEdbInfo)
  58. if err != nil {
  59. err = fmt.Errorf("替换表格中的指标失败,errmsg:%s", err.Error())
  60. return
  61. }
  62. //替换逻辑图中的指标
  63. err = sandbox.ReplaceEdbInSandbox(oldEdbInfo.EdbInfoId, newEdbInfo.EdbInfoId)
  64. if err != nil {
  65. err = fmt.Errorf("替换逻辑图中的指标失败,errmsg:%s", err.Error())
  66. return
  67. }
  68. })
  69. }
  70. }
  71. // ReplaceEdbInExcel 替换表格中的指标
  72. func ReplaceEdbInExcel(oldEdbInfo, newEdbInfo *data_manage.EdbInfo) (err error) {
  73. defer func() {
  74. if err != nil {
  75. go alarm_msg.SendAlarmMsg("替换表格中的指标失败提醒,errmsg:"+err.Error(), 3)
  76. }
  77. }()
  78. //查询和指标相关的时间序列表格和混合表格
  79. mappingList, err := excelModel.GetExcelEdbMappingByEdbInfoIdAndSource(oldEdbInfo.EdbInfoId, []int{utils.TIME_TABLE, utils.MIXED_TABLE})
  80. if err != nil {
  81. err = fmt.Errorf("查询和指标相关的表格失败,错误:%s", err.Error())
  82. return
  83. }
  84. updateList := make([]*excelModel.ExcelInfo, 0)
  85. // 循环列表,根据表格类型单独处理
  86. for _, excelMapping := range mappingList {
  87. //查询和指标相关的混合表格
  88. excelInfo, tmpErr := excelModel.GetExcelInfoById(excelMapping.ExcelInfoId)
  89. if tmpErr != nil {
  90. err = fmt.Errorf("查询和指标相关的混合表格失败,错误:%s", tmpErr.Error())
  91. return
  92. }
  93. // 清除缓存
  94. key := utils.HZ_CHART_LIB_EXCEL_TABLE_DETAIL + ":" + excelInfo.UniqueCode
  95. if utils.Re == nil {
  96. _ = utils.Rc.Delete(key)
  97. }
  98. // 根据表格类型,调用不同的处理函数
  99. switch excelMapping.Source {
  100. case utils.TIME_TABLE: // 时间序列表格
  101. // 替换余额表格中的指标
  102. newExcelInfo, e := replaceEdbInTimeExcel(oldEdbInfo, newEdbInfo, excelInfo)
  103. if e != nil {
  104. err = fmt.Errorf("替换余额表格中的指标失败,错误:%s", e.Error())
  105. return
  106. }
  107. updateList = append(updateList, newExcelInfo)
  108. case utils.MIXED_TABLE, utils.BALANCE_TABLE:
  109. // 替换余额表格中的指标
  110. newExcelInfo, e := replaceEdbInBalanceExcel(oldEdbInfo, newEdbInfo, excelInfo)
  111. if e != nil {
  112. err = fmt.Errorf("替换余额表格中的指标失败,错误:%s", e.Error())
  113. return
  114. }
  115. updateList = append(updateList, newExcelInfo)
  116. default:
  117. // 其他表格类型的处理逻辑
  118. }
  119. }
  120. err = excelModel.ReplaceEdbInExcel(oldEdbInfo.EdbInfoId, newEdbInfo.EdbInfoId, updateList)
  121. if err != nil {
  122. err = fmt.Errorf("替换表格中的指标失败,错误:%s", err.Error())
  123. return
  124. }
  125. //todo 是否需要刷新表格中的指标数据
  126. return
  127. }
  128. func replaceEdbInBalanceExcel(oldEdbInfo, newEdbInfo *data_manage.EdbInfo, excelInfo *excelModel.ExcelInfo) (newExcelInfo *excelModel.ExcelInfo, err error) {
  129. newExcelInfo = excelInfo
  130. var mixedTableReq request.MixedTableReq
  131. err = json.Unmarshal([]byte(excelInfo.Content), &mixedTableReq)
  132. if err != nil {
  133. err = fmt.Errorf("表格json转结构体失败,Err:" + err.Error())
  134. return
  135. }
  136. // 处理data
  137. configList := mixedTableReq.Data
  138. for ck, rowList := range configList {
  139. for rk, cell := range rowList {
  140. switch cell.DataType {
  141. case request.EdbDT: // 指标信息
  142. if cell.EdbInfoId == oldEdbInfo.EdbInfoId {
  143. //更换成新指标ID
  144. configList[ck][rk].EdbInfoId = newEdbInfo.EdbInfoId
  145. }
  146. case request.InsertDataDT, request.PopInsertDataDT: // 插值、弹框插值
  147. if cell.EdbInfoId == oldEdbInfo.EdbInfoId {
  148. //更换成新指标ID
  149. configList[ck][rk].EdbInfoId = newEdbInfo.EdbInfoId
  150. }
  151. case request.InsertEdbCalculateDataDT: // 插入指标计算公式生成的值
  152. var config request.CalculateConf
  153. err = json.Unmarshal([]byte(cell.Value), &config)
  154. if err != nil {
  155. return
  156. }
  157. if cell.EdbInfoId == oldEdbInfo.EdbInfoId {
  158. //更换成新指标ID
  159. configList[ck][rk].EdbInfoId = newEdbInfo.EdbInfoId
  160. }
  161. if config.EdbInfoId == oldEdbInfo.EdbInfoId {
  162. config.EdbInfoId = newEdbInfo.EdbInfoId
  163. var configStr []byte
  164. configStr, err = json.Marshal(config)
  165. if err != nil {
  166. return
  167. }
  168. configList[ck][rk].Value = string(configStr)
  169. }
  170. case request.DateDT: // 日期类型
  171. // 指标日期类型的单元格需要额外将指标id取出来
  172. if cell.DataTimeType == request.EdbDateDT {
  173. var config request.EdbDateConf
  174. err = json.Unmarshal([]byte(cell.Value), &config)
  175. if err != nil {
  176. return
  177. }
  178. if config.EdbInfoId == oldEdbInfo.EdbInfoId {
  179. config.EdbInfoId = newEdbInfo.EdbInfoId
  180. var configStr []byte
  181. configStr, err = json.Marshal(config)
  182. if err != nil {
  183. return
  184. }
  185. configList[ck][rk].Value = string(configStr)
  186. }
  187. }
  188. }
  189. }
  190. }
  191. mixedTableReq.Data = configList
  192. var newContentByte []byte
  193. newContentByte, err = json.Marshal(mixedTableReq)
  194. if err != nil {
  195. return
  196. }
  197. // 生成的新内容替换原先的旧内容
  198. excelInfo.Content = string(newContentByte)
  199. newExcelInfo = excelInfo
  200. return
  201. }
  202. func replaceEdbInTimeExcel(oldEdbInfo, newEdbInfo *data_manage.EdbInfo, excelInfo *excelModel.ExcelInfo) (newExcelInfo *excelModel.ExcelInfo, err error) {
  203. newExcelInfo = excelInfo
  204. var tableDataConfig request.TimeTableDataConfig
  205. err = json.Unmarshal([]byte(excelInfo.Content), &tableDataConfig)
  206. if err != nil {
  207. err = errors.New("表格json转结构体失败,Err:" + err.Error())
  208. return
  209. }
  210. if len(tableDataConfig.EdbInfoIdList) <= 0 {
  211. return
  212. }
  213. // 实际期数没有的情况下,直接返回吧
  214. if tableDataConfig.Num <= 0 {
  215. return
  216. }
  217. // 先处理edbInfoList
  218. for k, id := range tableDataConfig.EdbInfoIdList {
  219. if id == oldEdbInfo.EdbInfoId {
  220. tableDataConfig.EdbInfoIdList[k] = newEdbInfo.EdbInfoId
  221. }
  222. }
  223. // 先处理tableEdbInfoList
  224. for k, tableEdbInfo := range tableDataConfig.TableEdbInfoList {
  225. if tableEdbInfo.EdbInfoId == oldEdbInfo.EdbInfoId {
  226. tableDataConfig.TableEdbInfoList[k].EdbInfoId = newEdbInfo.EdbInfoId
  227. }
  228. }
  229. var newContentByte []byte
  230. newContentByte, err = json.Marshal(tableDataConfig)
  231. if err != nil {
  232. return
  233. }
  234. // 生成的新内容替换原先的旧内容
  235. excelInfo.Content = string(newContentByte)
  236. newExcelInfo = excelInfo
  237. return
  238. }