fix.go 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. package controllers
  2. import (
  3. "eta_gn/eta_api/models/data_manage"
  4. "eta_gn/eta_api/services/data"
  5. "eta_gn/eta_api/utils"
  6. "fmt"
  7. "sort"
  8. "strconv"
  9. "strings"
  10. "time"
  11. )
  12. // init
  13. // @Description: 数据修复
  14. // @author: Roc
  15. // @datetime 2024-12-02 09:29:56
  16. func init() {
  17. // ### 1、先修复分类完整路径
  18. //initFixClassifyPath()
  19. // ### 2、再修复个人分类、删除不存在指标的分类
  20. // ### 2.1 数据加工
  21. //initFixSelfClassify(utils.EdbClassifyTypeCalculate)
  22. //
  23. //// ### 2.2 衍生指标
  24. //initFixSelfClassify(utils.EdbClassifyTypePredict)
  25. //
  26. //fmt.Println("修复完成")
  27. }
  28. // initFixClassifyPath
  29. // @Description: 修复分类完整路径
  30. // @author: Roc
  31. // @datetime 2024-11-26 15:40:57
  32. func initFixClassifyPath() {
  33. allList := make([]*data_manage.EdbClassifyItems, 0)
  34. allList, e := data_manage.GetEdbClassifyByClassifyTypes([]int{utils.EdbClassifyTypeBase, utils.EdbClassifyTypePredict, utils.EdbClassifyTypeCalculate}, 0)
  35. if e != nil {
  36. fmt.Println("获取分类失败", e)
  37. return
  38. }
  39. var sortList data_manage.EdbClassifyItemList
  40. allList = data.GetClassifyTreeRecursive(allList, 0)
  41. //根据sort值排序
  42. sortList = allList
  43. sort.Sort(sortList)
  44. for _, v := range sortList {
  45. updatePath(v, "", "")
  46. }
  47. fmt.Println("修复分类路径完成")
  48. }
  49. func updatePath(item *data_manage.EdbClassifyItems, classifyNamePath, classifyIdPath string) {
  50. if classifyNamePath == `` {
  51. classifyNamePath = item.ClassifyName
  52. classifyIdPath = fmt.Sprint(item.ClassifyId)
  53. } else {
  54. classifyNamePath = fmt.Sprint(classifyNamePath, "|", item.ClassifyName)
  55. classifyIdPath = fmt.Sprint(classifyIdPath, ",", item.ClassifyId)
  56. }
  57. err := data_manage.UpdateEdbClassify(item.ClassifyId, classifyNamePath, classifyIdPath)
  58. if err != nil {
  59. fmt.Println(item.ClassifyId, ";更新失败", err)
  60. }
  61. if item.Children != nil {
  62. for _, v := range item.Children {
  63. updatePath(v, classifyNamePath, classifyIdPath)
  64. }
  65. }
  66. }
  67. // initFixUserClassify
  68. // @Description: initFixUserClassify
  69. // @author: Roc
  70. // @datetime 2024-11-29 16:57:54
  71. func initFixSelfClassify(classifyType int) {
  72. // 指标数据明细
  73. condition := ` AND edb_info_type = 0 and edb_type = 2 `
  74. if classifyType == utils.EdbClassifyTypePredict {
  75. condition = ` AND edb_info_type = 1 `
  76. }
  77. pars := make([]interface{}, 0)
  78. edbList, err := data_manage.GetEdbInfoListByCond(condition, pars)
  79. if err != nil {
  80. fmt.Println("查找指标加工数据失败", err.Error())
  81. return
  82. }
  83. edbClassifyIdMap := make(map[int]bool)
  84. classifyIdList := make([]int, 0)
  85. edbUserMap := make(map[int]string)
  86. for _, v := range edbList {
  87. if _, ok := edbClassifyIdMap[v.ClassifyId]; !ok {
  88. classifyIdList = append(classifyIdList, v.ClassifyId)
  89. edbClassifyIdMap[v.ClassifyId] = true
  90. }
  91. edbUserMap[v.SysUserId] = v.SysUserRealName
  92. }
  93. // 获取所有数据加工的分类
  94. classifyList, err := data_manage.GetAllEdbClassifyByType(classifyType, 0)
  95. if err != nil {
  96. fmt.Println("获取数据加工分类失败", err.Error())
  97. return
  98. }
  99. hasClassifyIdStrList := make([]string, 0)
  100. for _, v := range classifyList {
  101. // 判断当前分类id是否加到指标中,如果加进去了,那么才处理
  102. _, ok := edbClassifyIdMap[v.ClassifyId]
  103. if !ok {
  104. continue
  105. }
  106. hasClassifyIdStrList = append(hasClassifyIdStrList, v.ClassifyIdPath)
  107. }
  108. classifyIdStrList := strings.Split(strings.Join(hasClassifyIdStrList, ","), ",")
  109. classifyIdMap := make(map[string]bool)
  110. for _, v := range classifyIdStrList {
  111. classifyIdMap[v] = true
  112. }
  113. newClassifyList := make([]*data_manage.EdbClassifyItems, 0)
  114. newClassifyMap := make(map[string]bool)
  115. for _, v := range classifyList {
  116. classifyIdStr := fmt.Sprint(v.ClassifyId)
  117. // 是否在关联指标的map里面,如果不在的话,那么就过滤
  118. _, ok := classifyIdMap[classifyIdStr]
  119. if !ok {
  120. continue
  121. }
  122. // 是否已经加到需要关联指标分类的map里面,如果已经在了,那么也过滤
  123. _, ok = newClassifyMap[classifyIdStr]
  124. if ok {
  125. continue
  126. }
  127. newClassifyMap[classifyIdStr] = true
  128. newClassifyList = append(newClassifyList, v)
  129. }
  130. rootList, err := data_manage.GetEdbClassifyByParentId(0, int8(classifyType), 0)
  131. nodeAll := make([]*data_manage.EdbClassifyItems, 0)
  132. for k := range rootList {
  133. rootNode := rootList[k]
  134. data.EdbClassifyItemsMakeTree(newClassifyList, rootNode)
  135. nodeAll = append(nodeAll, rootNode)
  136. }
  137. // 创建新的分类
  138. // [用户id][原分类id][新分类id]
  139. userClassifyIdMap := make(map[int]map[int]int)
  140. for userId, sysUserName := range edbUserMap {
  141. classifyRelationMap := make(map[int]int)
  142. for _, v := range nodeAll {
  143. createNewClassify(userId, 0, 0, 0, sysUserName, ``, ``, v, classifyRelationMap)
  144. }
  145. userClassifyIdMap[userId] = classifyRelationMap
  146. }
  147. // ##### 第二步,指标数据迁移
  148. // 指标数据迁移
  149. for _, v := range edbList {
  150. userClassifyMap, ok := userClassifyIdMap[v.SysUserId]
  151. if !ok {
  152. fmt.Println("找不到该用户所属的分类,userId:", v.SysUserId)
  153. continue
  154. }
  155. newClassifyId, ok := userClassifyMap[v.ClassifyId]
  156. if !ok {
  157. fmt.Println("找不到该用户所属的分类,classifyId:", v.ClassifyId)
  158. continue
  159. }
  160. // 开始迁移指标数据
  161. err = data_manage.UpdateClassifyIdByEdbInfoId(v.EdbInfoId, newClassifyId)
  162. if err != nil {
  163. fmt.Println("指标数据迁移失败", err.Error())
  164. }
  165. }
  166. // ##### 3、开始删除没有指标的分类
  167. deleteNullClassify(classifyType)
  168. return
  169. }
  170. func deleteNullClassify(classifyType int) {
  171. // 指标列表数据
  172. condition := ` AND edb_info_type = 0 and edb_type = 2 `
  173. if classifyType == utils.EdbClassifyTypePredict {
  174. condition = ` AND edb_info_type = 1 `
  175. }
  176. pars := make([]interface{}, 0)
  177. edbList, err := data_manage.GetEdbInfoListByCond(condition, pars)
  178. if err != nil {
  179. fmt.Println("查找指标加工数据失败", err.Error())
  180. return
  181. }
  182. edbClassifyIdMap := make(map[int]bool)
  183. classifyIdList := make([]int, 0)
  184. for _, v := range edbList {
  185. if _, ok := edbClassifyIdMap[v.ClassifyId]; !ok {
  186. classifyIdList = append(classifyIdList, v.ClassifyId)
  187. edbClassifyIdMap[v.ClassifyId] = true
  188. }
  189. }
  190. // 获取所有数据加工的分类
  191. classifyList, err := data_manage.GetAllEdbClassifyByType(classifyType, 0)
  192. if err != nil {
  193. fmt.Println("获取数据加工分类失败", err.Error())
  194. return
  195. }
  196. // 存在指标的分类
  197. hasEdbClassifyList := make([]*data_manage.EdbClassifyItems, 0)
  198. for _, v := range classifyList {
  199. if _, ok := edbClassifyIdMap[v.ClassifyId]; ok {
  200. hasEdbClassifyList = append(hasEdbClassifyList, v)
  201. }
  202. }
  203. // 待删除的分类id集合
  204. deleteClassifyIdMap := make(map[int]int)
  205. // 全部的分类id集合
  206. for _, v := range classifyList {
  207. deleteClassifyIdMap[v.ClassifyId] = v.ClassifyId
  208. }
  209. // 存在指标的的分类id集合
  210. hasClassifyIdStrList := make([]string, 0)
  211. for _, v := range hasEdbClassifyList {
  212. hasClassifyIdStrList = append(hasClassifyIdStrList, v.ClassifyIdPath)
  213. }
  214. classifyIdStrList := strings.Split(strings.Join(hasClassifyIdStrList, ","), ",")
  215. for _, v := range classifyIdStrList {
  216. classifyId, err := strconv.Atoi(v)
  217. if err != nil {
  218. fmt.Println("分类字符串转int失败,", err.Error())
  219. return
  220. }
  221. delete(deleteClassifyIdMap, classifyId)
  222. }
  223. // 删除空分类
  224. if len(deleteClassifyIdMap) > 0 {
  225. deleteClassifyIdList := make([]int, 0)
  226. for _, v := range deleteClassifyIdMap {
  227. deleteClassifyIdList = append(deleteClassifyIdList, v)
  228. }
  229. err = data_manage.DelEdbClassifyByIdList(deleteClassifyIdList)
  230. if err != nil {
  231. fmt.Println("删除空分类失败", err.Error())
  232. return
  233. }
  234. }
  235. }
  236. // createNewClassify
  237. // @Description: 创建分类
  238. // @author: Roc
  239. // @datetime 2024-11-29 17:57:47
  240. // @param userId int
  241. // @param parentId int
  242. // @param rootId int
  243. // @param level int
  244. // @param sysUserName string
  245. // @param parentClassifyNamePath string
  246. // @param parentClassifyIdPath string
  247. // @param node *data_manage.EdbClassifyItems
  248. // @param classifyRelationMap map[int]int
  249. func createNewClassify(userId, parentId, rootId, level int, sysUserName, parentClassifyNamePath, parentClassifyIdPath string, node *data_manage.EdbClassifyItems, classifyRelationMap map[int]int) {
  250. var classifyNamePath, classifyIdPath string
  251. if parentId > 0 {
  252. classifyNamePath = fmt.Sprint(parentClassifyNamePath, "|", node.ClassifyName)
  253. classifyIdPath = fmt.Sprint(parentClassifyIdPath, ",")
  254. } else {
  255. classifyNamePath = node.ClassifyName
  256. }
  257. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  258. classifyInfo := &data_manage.EdbClassify{
  259. //ClassifyId: 0,
  260. ClassifyType: node.ClassifyType,
  261. ClassifyName: node.ClassifyName,
  262. ClassifyNameEn: node.ClassifyNameEn,
  263. ParentId: parentId,
  264. RootId: rootId,
  265. HasData: 1,
  266. CreateTime: time.Now(),
  267. ModifyTime: time.Now(),
  268. SysUserId: userId,
  269. SysUserRealName: sysUserName,
  270. Level: level + 1,
  271. UniqueCode: utils.MD5(utils.DATA_PREFIX + "_" + timestamp),
  272. Sort: node.Sort,
  273. ClassifyNamePath: classifyNamePath,
  274. }
  275. err := data_manage.AddEdbClassify(classifyInfo)
  276. if err != nil {
  277. fmt.Println("创建分类失败:", err.Error())
  278. return
  279. }
  280. updateCols := []string{"ClassifyIdPath"}
  281. // 更改分类id完整路径path
  282. classifyInfo.ClassifyIdPath = fmt.Sprint(classifyIdPath, classifyInfo.ClassifyId)
  283. if rootId <= 0 {
  284. rootId = classifyInfo.ClassifyId
  285. classifyInfo.RootId = classifyInfo.ClassifyId
  286. updateCols = append(updateCols, "RootId")
  287. }
  288. _ = classifyInfo.Update(updateCols)
  289. classifyRelationMap[node.ClassifyId] = classifyInfo.ClassifyId
  290. level = classifyInfo.Level
  291. if node.Children == nil {
  292. return
  293. }
  294. if len(node.Children) <= 0 {
  295. return
  296. }
  297. for _, child := range node.Children {
  298. createNewClassify(userId, classifyInfo.ClassifyId, rootId, level, sysUserName, classifyNamePath, classifyInfo.ClassifyIdPath, child, classifyRelationMap)
  299. }
  300. return
  301. }
  302. // initEs
  303. // @Description: 修复ES中的指标和图表数据
  304. // @author: Roc
  305. // @datetime 2024-11-29 16:18:02
  306. func initEs() {
  307. // 更新ES中的指标数据
  308. data.AddOrEditAllEdbInfoToEs()
  309. // 更新es中的图表数据
  310. data.AddAllChartInfo()
  311. fmt.Println("全部es数据修复完成")
  312. }