data_manage_permission.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. package data_manage
  2. import (
  3. "eta/eta_api/utils"
  4. "fmt"
  5. "github.com/beego/beego/v2/client/orm"
  6. "strconv"
  7. "time"
  8. )
  9. // SetDataIsPermissionReq
  10. // @Description: 设置数据分类权限请求
  11. type SetDataIsPermissionReq struct {
  12. Source int `description:"来源id"`
  13. SubSource int `description:"子来源id"`
  14. ClassifyIdList []int `description:"指标/图表/表格分类唯一id列表,如果为空,说明要给这些指标移除权限管控"`
  15. }
  16. // SetIsPermissionEdbChartByEdbClassifyIdList
  17. // @Description: 设置指标分类是否涉密
  18. // @author: Roc
  19. // @datetime 2024-03-27 14:15:42
  20. // @param classifyIdList []int
  21. func SetIsPermissionEdbChartByEdbClassifyIdList(classifyIdList []int) (err error) {
  22. num := len(classifyIdList)
  23. if num <= 0 {
  24. return
  25. }
  26. o, err := orm.NewOrmUsingDB("data").Begin()
  27. if err != nil {
  28. return
  29. }
  30. defer func() {
  31. if err != nil {
  32. _ = o.Rollback()
  33. } else {
  34. _ = o.Commit()
  35. }
  36. }()
  37. //// 获取已经配置涉密的分类权限
  38. //edbClassifyList := make([]*EdbClassify, 0)
  39. //sql := `SELECT * FROM edb_classify WHERE is_join_permission = ? `
  40. //_, err = o.Raw(sql, 1).QueryRows(&edbClassifyList)
  41. //if err != nil {
  42. // return
  43. //}
  44. //edbClassifyMap := make(map[int]*EdbClassify)
  45. //for _, v := range edbClassifyList {
  46. // edbClassifyMap[v.ClassifyId] = v
  47. //}
  48. // 先将所有已经设置了涉密的分类设置为不涉密
  49. sql := `UPDATE edb_classify SET is_join_permission=?,modify_time=now() WHERE is_join_permission = 1 `
  50. _, err = o.Raw(sql, 0).Exec()
  51. if err != nil {
  52. return
  53. }
  54. if len(classifyIdList) > 0 {
  55. // 将对应的分类设置为涉密
  56. sql = `UPDATE edb_classify SET is_join_permission=?,modify_time=now() WHERE classify_id in (` + utils.GetOrmInReplace(num) + `) `
  57. _, err = o.Raw(sql, 1, classifyIdList).Exec()
  58. if err != nil {
  59. return
  60. }
  61. }
  62. // TODO 判断是否要记录移除的分类,用于发送通知给客户
  63. return
  64. }
  65. // SetEdbChartPermissionReq
  66. // @Description: 设置数据权限请求
  67. type SetEdbChartPermissionReq struct {
  68. Source int `description:"来源id"`
  69. SubSource int `description:"子来源id"`
  70. UserId int `description:"用户筛选"`
  71. DataIdList []string `description:"指标/图表/表格唯一id列表"`
  72. NoDataIdList []string `description:"指标/图表/表格唯一id列表"`
  73. UserList []int `description:"赋权用户id列表,如果为空,说明要给这些指标移除权限管控"`
  74. IsSelectAll bool `description:"是否选择所有指标"`
  75. ClassifyId string `description:"分类id,支持多选,用英文,隔开"`
  76. Keyword string `description:"关键字"`
  77. }
  78. // EdbInfoPermission
  79. // @Description: 指标权限表
  80. type EdbInfoPermission struct {
  81. PermissionId int64 `json:"permission_id" orm:"column(permission_id);pk"`
  82. EdbInfoId int32 `json:"edb_info_id"` // 指标id
  83. SysUserId int32 `json:"sys_user_id"` // 系统用户id
  84. ModifyTime time.Time `json:"modify_time"` // 变更时间
  85. CreateTime time.Time `json:"create_time"` // 关系建立时间
  86. }
  87. // EdbClassifyPermission
  88. // @Description: 指标分类权限表
  89. type EdbClassifyPermission struct {
  90. PermissionId int64 `json:"permission_id" orm:"column(permission_id);pk"`
  91. EdbClassifyId int32 `json:"edb_classify_id"` // 分类id
  92. SysUserId int32 `json:"sys_user_id"` // 系统用户id
  93. ModifyTime time.Time `json:"modify_time"` // 变更时间
  94. CreateTime time.Time `json:"create_time"` // 关系建立时间
  95. }
  96. // SetPermissionEdbChartByEdbIdList
  97. // @Description: 根据指标ID列表设置指标的用户权限
  98. // @author: Roc
  99. // @datetime 2024-03-27 14:03:42
  100. // @param edbIdList []string
  101. // @param userIdList []int
  102. // @return err error
  103. func SetPermissionEdbChartByEdbIdList(edbIdList []string, userIdList []int) (err error) {
  104. edbNum := len(edbIdList)
  105. if edbNum <= 0 {
  106. return
  107. }
  108. o, err := orm.NewOrmUsingDB("data").Begin()
  109. if err != nil {
  110. return
  111. }
  112. defer func() {
  113. if err != nil {
  114. _ = o.Rollback()
  115. } else {
  116. _ = o.Commit()
  117. }
  118. }()
  119. // 获取已经配置的指标权限用户
  120. edbInfoPermissionList := make([]*EdbInfoPermission, 0)
  121. sql := `SELECT * FROM edb_info_permission WHERE edb_info_id in (` + utils.GetOrmInReplace(edbNum) + `) `
  122. _, err = o.Raw(sql, edbIdList).QueryRows(&edbInfoPermissionList)
  123. if err != nil {
  124. return
  125. }
  126. edbInfoPermissionMap := make(map[string]*EdbInfoPermission)
  127. for _, v := range edbInfoPermissionList {
  128. edbInfoPermissionMap[fmt.Sprint(v.EdbInfoId, "_", v.SysUserId)] = v
  129. }
  130. // 标记指标是否纳入权限管控
  131. {
  132. // 默认 标记指标为纳入权限管控
  133. isJoinPermission := 1
  134. // 用户不选的情况下,说明是要给这些指标移除权限管控
  135. if len(userIdList) <= 0 {
  136. // 标记指标为不纳入权限管控
  137. isJoinPermission = 0
  138. }
  139. sql = `UPDATE edb_info SET is_join_permission=?,modify_time=now() WHERE edb_info_id in (` + utils.GetOrmInReplace(edbNum) + `) `
  140. _, err = o.Raw(sql, isJoinPermission, edbIdList).Exec()
  141. if err != nil {
  142. return
  143. }
  144. }
  145. // 待添加的配置项
  146. addList := make([]*EdbInfoPermission, 0)
  147. // 遍历待配置的指标和用户,筛选出需要添加的配置项
  148. for _, edbInfoIdStr := range edbIdList {
  149. edbInfoId, tmpErr := strconv.ParseInt(edbInfoIdStr, 10, 64)
  150. if tmpErr != nil {
  151. err = tmpErr
  152. return
  153. }
  154. for _, userId := range userIdList {
  155. key := fmt.Sprint(edbInfoId, "_", userId)
  156. if _, ok := edbInfoPermissionMap[key]; ok {
  157. // 如果存在那么就移除,说明不需要处理了
  158. delete(edbInfoPermissionMap, key)
  159. } else {
  160. // 如果不存在,那么就提那家
  161. addList = append(addList, &EdbInfoPermission{
  162. //PermissionId: 0,
  163. EdbInfoId: int32(edbInfoId),
  164. SysUserId: int32(userId),
  165. ModifyTime: time.Now(),
  166. CreateTime: time.Now(),
  167. })
  168. }
  169. }
  170. }
  171. // 添加待配置项
  172. if len(addList) > 0 {
  173. _, err = o.InsertMulti(500, addList)
  174. if err != nil {
  175. return
  176. }
  177. }
  178. // 移除废弃的配置项
  179. {
  180. // 待移除的配置项
  181. deletePermissionIdList := make([]int64, 0)
  182. for _, v := range edbInfoPermissionMap {
  183. deletePermissionIdList = append(deletePermissionIdList, v.PermissionId)
  184. }
  185. deletePermissionIdNum := len(deletePermissionIdList)
  186. if deletePermissionIdNum > 0 {
  187. sql = "DELETE FROM edb_info_permission WHERE permission_id in (" + utils.GetOrmInReplace(deletePermissionIdNum) + ")"
  188. _, err = o.Raw(sql, deletePermissionIdList).Exec()
  189. if err != nil {
  190. return
  191. }
  192. }
  193. }
  194. return
  195. }
  196. // SetEdbChartClassifyPermissionReq
  197. // @Description: 设置数据分类权限请求
  198. type SetEdbChartClassifyPermissionReq struct {
  199. Source int `description:"来源id"`
  200. SubSource int `description:"子来源id"`
  201. UserList []int `description:"赋权用户id列表,如果为空,说明要给这些数据分类移除权限管控"`
  202. ClassifyIdList []int `description:"指标/图表/表格分类唯一id列表"`
  203. }
  204. // SetPermissionEdbChartClassifyIdByClassifyIdList
  205. // @Description: 根据指标分类ID列表设置分类的用户权限
  206. // @author: Roc
  207. // @datetime 2024-03-28 14:53:04
  208. // @param classifyIdList []int
  209. // @param userIdList []int
  210. // @return err error
  211. func SetPermissionEdbChartClassifyIdByClassifyIdList(classifyIdList []int, userIdList []int) (err error) {
  212. userNum := len(userIdList)
  213. if userNum <= 0 {
  214. return
  215. }
  216. o, err := orm.NewOrmUsingDB("data").Begin()
  217. if err != nil {
  218. return
  219. }
  220. defer func() {
  221. if err != nil {
  222. _ = o.Rollback()
  223. } else {
  224. _ = o.Commit()
  225. }
  226. }()
  227. // 获取当前选择用户已经配置的指标分类权限
  228. classifyPermissionList := make([]*EdbClassifyPermission, 0)
  229. sql := `SELECT * FROM edb_classify_permission WHERE sys_user_id in (` + utils.GetOrmInReplace(userNum) + `) `
  230. _, err = o.Raw(sql, userIdList).QueryRows(&classifyPermissionList)
  231. if err != nil {
  232. return
  233. }
  234. classifyPermissionMap := make(map[string]*EdbClassifyPermission)
  235. for _, v := range classifyPermissionList {
  236. classifyPermissionMap[fmt.Sprint(v.EdbClassifyId, "_", v.SysUserId)] = v
  237. }
  238. // 待添加的配置项
  239. addList := make([]*EdbClassifyPermission, 0)
  240. // 遍历待配置的指标和用户,筛选出需要添加的配置项
  241. for _, userId := range userIdList {
  242. for _, classifyId := range classifyIdList {
  243. key := fmt.Sprint(classifyId, "_", userId)
  244. if _, ok := classifyPermissionMap[key]; ok {
  245. // 如果存在那么就移除,说明不需要处理了
  246. delete(classifyPermissionMap, key)
  247. } else {
  248. // 如果不存在,那么就提那家
  249. addList = append(addList, &EdbClassifyPermission{
  250. //PermissionId: 0,
  251. EdbClassifyId: int32(classifyId),
  252. SysUserId: int32(userId),
  253. ModifyTime: time.Now(),
  254. CreateTime: time.Now(),
  255. })
  256. }
  257. }
  258. }
  259. // 添加待配置项
  260. if len(addList) > 0 {
  261. _, err = o.InsertMulti(500, addList)
  262. if err != nil {
  263. return
  264. }
  265. }
  266. // 移除废弃的配置项
  267. {
  268. // 获取移除的配置项
  269. deletePermissionIdList := make([]int64, 0)
  270. for _, v := range classifyPermissionMap {
  271. deletePermissionIdList = append(deletePermissionIdList, v.PermissionId)
  272. }
  273. deletePermissionIdNum := len(deletePermissionIdList)
  274. if deletePermissionIdNum > 0 {
  275. sql = "DELETE FROM edb_classify_permission WHERE permission_id in (" + utils.GetOrmInReplace(deletePermissionIdNum) + ")"
  276. _, err = o.Raw(sql, deletePermissionIdList).Exec()
  277. if err != nil {
  278. return
  279. }
  280. }
  281. }
  282. return
  283. }
  284. // GetPermissionEdbIdList
  285. // @Description: 获取用户权限的指标列表
  286. // @author: Roc
  287. // @datetime 2024-03-28 16:50:47
  288. // @param userId int
  289. // @param edbInfoId int
  290. // @return idList []int
  291. // @return err error
  292. func GetPermissionEdbIdList(userId, edbInfoId int) (idList []int, err error) {
  293. pars := []interface{}{userId}
  294. o := orm.NewOrmUsingDB("data")
  295. sql := `SELECT edb_info_id FROM edb_info_permission WHERE sys_user_id = ? `
  296. if edbInfoId > 0 {
  297. sql += ` AND edb_info_id = ? `
  298. pars = append(pars, edbInfoId)
  299. }
  300. _, err = o.Raw(sql, pars).QueryRows(&idList)
  301. return
  302. }
  303. // GetPermissionEdbClassifyIdList
  304. // @Description: 获取用户权限的指标分类列表
  305. // @author: Roc
  306. // @datetime 2024-03-28 16:50:47
  307. // @param userId int
  308. // @param classifyId int
  309. // @return idList []int
  310. // @return err error
  311. func GetPermissionEdbClassifyIdList(userId, classifyId int) (idList []int, err error) {
  312. pars := []interface{}{userId}
  313. o := orm.NewOrmUsingDB("data")
  314. sql := `SELECT edb_classify_id FROM edb_classify_permission WHERE sys_user_id = ? `
  315. if classifyId > 0 {
  316. sql += ` AND edb_classify_id = ? `
  317. pars = append(pars, classifyId)
  318. }
  319. _, err = o.Raw(sql, pars).QueryRows(&idList)
  320. return
  321. }