fix.go 9.8 KB

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