role_service.go 28KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858
  1. package service
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "strconv"
  6. "strings"
  7. "time"
  8. "XT_New/models"
  9. "XT_New/utils"
  10. "github.com/jinzhu/gorm"
  11. )
  12. func GetRoles(orgID int64, appID int64, page int, count int) ([]*models.Role, int, error) {
  13. var roles []*models.Role
  14. var totalCount int
  15. err := readUserDb.Model(&models.Role{}).
  16. Where("org_id = ? AND app_id = ?", orgID, appID).
  17. Count(&totalCount).
  18. Order("ctime asc").Limit(count).Offset((page - 1) * count).
  19. Find(&roles).
  20. Error
  21. if err != nil {
  22. if err == gorm.ErrRecordNotFound {
  23. return make([]*models.Role, 0), 0, nil
  24. } else {
  25. return nil, 0, err
  26. }
  27. }
  28. return roles, totalCount, nil
  29. }
  30. func GetAppRole(orgID int64, appID int64, adminUserID int64) (*models.App_Role, error) {
  31. var appRole models.App_Role
  32. err := readUserDb.Model(models.App_Role{}).Preload("AdminUser", "status = 1").Where("org_id = ? and app_id = ? and admin_user_id = ?", orgID, appID, adminUserID).First(&appRole).Error
  33. if err != nil {
  34. if err == gorm.ErrRecordNotFound {
  35. return nil, nil
  36. } else {
  37. return nil, err
  38. }
  39. }
  40. if len(appRole.RoleIds) > 0 {
  41. role_ids := strings.Split(appRole.RoleIds, ",")
  42. for _, item := range role_ids {
  43. id, _ := strconv.ParseInt(item, 10, 64)
  44. if id != 0 {
  45. role, _ := GetRoleByRoleID(id)
  46. if role != nil {
  47. if role.IsSystem == 1 && role.RoleName == "子管理员" {
  48. appRole.IsSubSuperAdmin = true
  49. }
  50. }
  51. }
  52. }
  53. }
  54. return &appRole, nil
  55. }
  56. func CreateRole(adminUserID int64, orgID int64, appID int64, name string, intro string) (*models.Role, error) {
  57. role := models.Role{
  58. RoleName: name,
  59. RoleIntro: intro,
  60. Creator: adminUserID,
  61. OrgId: orgID,
  62. AppId: appID,
  63. IsSuperAdmin: false,
  64. Status: 1,
  65. CreateTime: time.Now().Unix(),
  66. ModifyTime: time.Now().Unix(),
  67. }
  68. tx := writeUserDb.Begin()
  69. if err := tx.Create(&role).Error; err != nil {
  70. tx.Rollback()
  71. return nil, err
  72. }
  73. tx.Commit()
  74. return &role, nil
  75. }
  76. func GetRoleByRoleID(roleID int64) (*models.Role, error) {
  77. var role models.Role
  78. err := readUserDb.Model(&models.Role{}).Where("id = ?", roleID).First(&role).Error
  79. if err != nil {
  80. if err == gorm.ErrRecordNotFound {
  81. return nil, nil
  82. }
  83. return nil, err
  84. } else {
  85. return &role, nil
  86. }
  87. }
  88. func ModifyRole(role *models.Role) error {
  89. tx := writeUserDb.Begin()
  90. if err := tx.Save(role).Error; err != nil {
  91. tx.Rollback()
  92. return err
  93. }
  94. return tx.Commit().Error
  95. }
  96. // 拥有xx角色的管理员的数量
  97. func RoleAdminUserCount(orgID int64, appID int64, roleID int64) (int, error) {
  98. var count int
  99. err := readUserDb.Model(models.App_Role{}).
  100. Where("org_id = ? AND app_id = ? AND role_id = ? AND status = 1", orgID, appID, roleID).
  101. Count(&count).
  102. Error
  103. if err != nil {
  104. return 0, err
  105. } else {
  106. return count, nil
  107. }
  108. }
  109. type AdminUserManageViewModel struct {
  110. AdminUserId int `gorm:"admin_user_id" json:"user_id"`
  111. UserName string `gorm:"user_name" json:"user_name"`
  112. RoleName string `gorm:"role_name" json:"role_name"`
  113. UserTitle int `gorm:"user_title" json:"user_title"`
  114. Ip string `gorm:"ip" json:"ip"`
  115. Ctime int64 `gorm:"ctime" json:"last_login_time"`
  116. Status int `gorm:"status" json:"status"`
  117. Avatar string `gorm:"avatar" json:"avatar"`
  118. RoleIds string `gorm:"role_ids" json:"role_ids"`
  119. // LastLoginTimeStr string `gorm:"-" json:"last_login_time_formatted"`
  120. TitleName string `gorm:"-" json:"title_name"`
  121. IsSubSuperAdmin bool `gorm:"-" json:"is_sub_super_admin"`
  122. //mobile string `gorm:"-" json:"mobile"`
  123. Sort int `gorm:"sort" json:"sort"`
  124. }
  125. func GetAdminUsersAndLoginInfo(orgID int64, appID int64, page int, count int) ([]*AdminUserManageViewModel, int, error) {
  126. if count <= 0 {
  127. return []*AdminUserManageViewModel{}, 0, nil
  128. }
  129. if page < 1 {
  130. page = 1
  131. }
  132. var viewModels []*AdminUserManageViewModel = make([]*AdminUserManageViewModel, 0)
  133. rows, err := readUserDb.Raw("SELECT u_a_r.admin_user_id, u_a_r.user_name, u_a_r.user_title, u_l.ip, u_l.ctime, u_a_r.status,u_a_r.avatar,u_a_r.role_ids,u_a_r.sort FROM sgj_user_admin_role AS u_a_r LEFT JOIN (SELECT * FROM (SELECT admin_user_id, org_id, app_id, ip, ctime FROM sgj_user_admin_login_log WHERE org_id = ? AND app_id = ? ORDER BY ctime DESC) AS t GROUP BY admin_user_id) AS u_l ON u_a_r.org_id = u_l.org_id AND u_a_r.app_id = u_l.app_id AND u_a_r.admin_user_id = u_l.admin_user_id WHERE u_a_r.org_id = ? AND u_a_r.app_id = ? GROUP BY u_a_r.admin_user_id LIMIT ? OFFSET ?;", orgID, appID, orgID, appID, count, (page-1)*count).Rows()
  134. defer rows.Close()
  135. if err != nil {
  136. if err == gorm.ErrRecordNotFound {
  137. return viewModels, 0, nil
  138. } else {
  139. return nil, 0, err
  140. }
  141. }
  142. for rows.Next() {
  143. var viewModel AdminUserManageViewModel
  144. readUserDb.ScanRows(rows, &viewModel)
  145. title, _ := models.UserTitle[viewModel.UserTitle]
  146. viewModel.TitleName = title
  147. // if viewModel.Ctime == 0 {
  148. // viewModel.LastLoginTimeStr = ""
  149. // } else {
  150. // loginTime := time.Unix(viewModel.Ctime, 0)
  151. // viewModel.LastLoginTimeStr = loginTime.Format("2006-01-02 15:04")
  152. // }
  153. viewModels = append(viewModels, &viewModel)
  154. }
  155. for _, item := range viewModels {
  156. if len(item.RoleIds) > 0 {
  157. ids := strings.Split(item.RoleIds, ",")
  158. for _, id := range ids {
  159. id, _ := strconv.ParseInt(id, 10, 64)
  160. if id != 0 {
  161. role, _ := GetRoleByRoleID(id)
  162. if role != nil {
  163. if role.IsSystem == 1 && role.RoleName == "子管理员" {
  164. item.IsSubSuperAdmin = true
  165. }
  166. if len(item.RoleName) == 0 {
  167. item.RoleName = role.RoleName
  168. } else {
  169. item.RoleName = item.RoleName + "," + role.RoleName
  170. }
  171. }
  172. }
  173. }
  174. }
  175. //admin, _ := GetAdminUserByUserID(int64(item.AdminUserId))
  176. //item.mobile = admin.Mobile
  177. }
  178. total := 0
  179. //readUserDb.Table("sgj_user_admin_role as u_a_r").Joins("join sgj_user_role as u_r on u_r.org_id = u_a_r.org_id AND u_r.app_id = u_a_r.app_id AND u_r.id = u_a_r.role_id").Where("u_a_r.org_id = ? AND u_a_r.app_id = ?", orgID, appID).Count(&total)
  180. return viewModels, total, nil
  181. }
  182. func GetValidRoleCount(orgID int64, appID int64, superAdminUserID int64) (int, error) {
  183. var count int
  184. err := readUserDb.Model(models.Role{}).
  185. Where("org_id = ? AND app_id = ? AND creator = ? AND is_super_admin = 0 AND status = 1", orgID, appID, superAdminUserID).
  186. Count(&count).
  187. Error
  188. if err != nil {
  189. return 0, err
  190. } else {
  191. return count, nil
  192. }
  193. }
  194. func GetAllValidRoles(orgID int64, appID int64) ([]*models.Role, error) {
  195. var roles []*models.Role
  196. err := readUserDb.Model(models.Role{}).
  197. Where("org_id = ? AND app_id = ? AND status = 1", orgID, appID).
  198. Order("number desc,ctime").
  199. Find(&roles).
  200. Error
  201. if err != nil {
  202. if err == gorm.ErrRecordNotFound {
  203. return make([]*models.Role, 0), nil
  204. } else {
  205. return nil, err
  206. }
  207. }
  208. return roles, nil
  209. }
  210. func IsRoleExist(orgID int64, appID int64, roleID int64) (bool, error) {
  211. var count int
  212. err := readUserDb.Model(models.Role{}).Where("org_id = ? AND app_id = ? AND id = ? AND status = 1", orgID, appID, roleID).Count(&count).Error
  213. if err != nil {
  214. return false, err
  215. } else {
  216. return count > 0, nil
  217. }
  218. }
  219. type AdminUserEditViewModel struct {
  220. AdminUserId int64 `gorm:"admin_user_id" json:"user_id"`
  221. UserName string `gorm:"user_name" json:"user_name"`
  222. Mobile string `gorm:"mobile" json:"mobile"`
  223. UserType int `gorm:"user_type" json:"user_type"`
  224. UserTitle int `gorm:"user_title" json:"user_title"`
  225. Intro string `gorm:"intro" json:"intro"`
  226. RoleId int64 `gorm:"role_id" json:"role_id"`
  227. }
  228. func GetGeneralAdminUser(orgID int64, appID int64, user_id int64) (*AdminUserEditViewModel, error) {
  229. rows, err := readUserDb.Raw("SELECT u_a.mobile, u_a_r.admin_user_id, u_a_r.user_name, u_a_r.user_type, u_a_r.user_title, u_a_r.intro, u_a_r.role_id FROM sgj_user_admin AS u_a, sgj_user_admin_role AS u_a_r WHERE u_a.id = u_a_r.admin_user_id AND u_a.id = ? AND u_a_r.status = 1 AND u_a_r.org_id = ? AND u_a_r.app_id = ?;", user_id, orgID, appID).Rows()
  230. defer rows.Close()
  231. if err != nil {
  232. if err == gorm.ErrRecordNotFound {
  233. return nil, nil
  234. } else {
  235. return nil, err
  236. }
  237. }
  238. if rows.Next() {
  239. var viewModel AdminUserEditViewModel
  240. err := readUserDb.ScanRows(rows, &viewModel)
  241. if err != nil {
  242. return nil, err
  243. } else {
  244. return &viewModel, nil
  245. }
  246. }
  247. return nil, nil
  248. }
  249. func SaveAppRole(appRole *models.App_Role) error {
  250. tx := writeUserDb.Begin()
  251. if err := tx.Model(&models.App_Role{}).Save(appRole).Error; err != nil {
  252. tx.Rollback()
  253. return err
  254. }
  255. return tx.Commit().Error
  256. }
  257. func IsMobileDidUsedAtApp(orgID int64, appID int64, mobile string) (bool, error) {
  258. var count int
  259. rows, err := readUserDb.Raw("select count(u_a.id) as count from sgj_user_admin as u_a, sgj_user_admin_role as u_a_r where u_a_r.org_id = ? and u_a_r.app_id = ? and u_a.mobile = ? and u_a.id = u_a_r.admin_user_id;", orgID, appID, mobile).Rows()
  260. defer rows.Close()
  261. if err != nil {
  262. if err == gorm.ErrRecordNotFound {
  263. return false, nil
  264. } else {
  265. return true, err
  266. }
  267. }
  268. if rows.Next() {
  269. rows.Scan(&count)
  270. return count > 0, nil
  271. }
  272. return true, nil
  273. }
  274. func IsUserSuperAdminWithMobile(mobile string) (bool, error) {
  275. var user models.AdminUser
  276. err := readUserDb.Where("mobile = ?", mobile).First(&user).Error
  277. if err != nil {
  278. if err == gorm.ErrRecordNotFound {
  279. return false, nil
  280. } else {
  281. return false, err
  282. }
  283. }
  284. return user.IsSuperAdmin, nil
  285. }
  286. func CreateGeneralAdminUser(orgID int64, appID int64, mobile string, name string, userTitle string, roleIds string, user_type int, user_title int) (*models.AdminUser, string, error) {
  287. now := time.Now().Unix()
  288. tx := writeUserDb.Begin()
  289. var adminUser models.AdminUser
  290. err := readUserDb.Where("mobile = ? AND status = 1", mobile).First(&adminUser).Error
  291. password := ""
  292. if err != nil {
  293. if err != gorm.ErrRecordNotFound {
  294. return nil, "", err
  295. } else {
  296. password = utils.RandomNumberString(6)
  297. adminUser.Mobile = mobile
  298. adminUser.Password = utils.String2md5(password)
  299. adminUser.IsSuperAdmin = false
  300. adminUser.Status = 1
  301. adminUser.CreateTime = now
  302. adminUser.ModifyTime = now
  303. if createErr := tx.Create(&adminUser).Error; createErr != nil {
  304. tx.Rollback()
  305. return nil, "", createErr
  306. }
  307. }
  308. }
  309. app_role := models.App_Role{
  310. AdminUserId: adminUser.Id,
  311. OrgId: orgID,
  312. AppId: appID,
  313. Avatar: "",
  314. UserName: name,
  315. UserTitleName: userTitle,
  316. UserTitle: int8(user_title),
  317. UserType: int8(user_type),
  318. Status: 1,
  319. CreateTime: now,
  320. ModifyTime: now,
  321. RoleIds: roleIds,
  322. IsSort: 1,
  323. }
  324. if createApp_RoleErr := tx.Create(&app_role).Error; createApp_RoleErr != nil {
  325. tx.Rollback()
  326. return nil, "", createApp_RoleErr
  327. }
  328. tx.Commit()
  329. return &adminUser, password, nil
  330. }
  331. type PurviewTreeViewModel struct {
  332. ID int64 `json:"id"`
  333. PID int64 `json:"pid"`
  334. Name string `json:"name"`
  335. Childs []*PurviewTreeViewModel `json:"childs"`
  336. Number int64 `json:"number"`
  337. Url string `json:"url"`
  338. ParentUrl string `json:"parent_url"`
  339. }
  340. func GetAllGeneralPurviewVMsProcessed(module int) ([]*PurviewTreeViewModel, error) {
  341. var originPurviews []*models.Purview
  342. getPurviewErr := readUserDb.Model(models.Purview{}).Where("module = ? AND status = 1", module).Order("listorder asc").Order("id asc").Find(&originPurviews).Error
  343. if getPurviewErr != nil {
  344. return nil, getPurviewErr
  345. }
  346. // 加工这些规则:树形化
  347. purviewVMs := make([]*PurviewTreeViewModel, 0)
  348. pid_childs := make(map[int64][]*PurviewTreeViewModel)
  349. for _, purview := range originPurviews {
  350. // warning:下面这个算法只适用最多两层树形结构的菜单,对于两层以上的会丢失掉第三层及其以下的节点
  351. // 因为取出 originPurviews 的时候已经排过序了,所以顶级节点肯定最先处理,不需要担心子节点比父节点先处理
  352. pvm := &PurviewTreeViewModel{
  353. ID: purview.Id,
  354. PID: purview.Parentid,
  355. Name: purview.Name,
  356. Number: 2,
  357. }
  358. if purview.Parentid == 0 {
  359. purviewVMs = append(purviewVMs, pvm)
  360. } else {
  361. childs := pid_childs[purview.Parentid]
  362. if childs == nil {
  363. childs = make([]*PurviewTreeViewModel, 0)
  364. }
  365. childs = append(childs, pvm)
  366. pid_childs[purview.Parentid] = childs
  367. }
  368. }
  369. for _, vm := range purviewVMs {
  370. vm.Childs = pid_childs[vm.ID]
  371. }
  372. return purviewVMs, nil
  373. }
  374. func GetAllGeneralFuncPurviewVMsProcessed() ([]*PurviewTreeViewModel, error) {
  375. var originPurviews []*models.SgjUserOperatePurview
  376. getPurviewErr := readUserDb.Model(models.SgjUserOperatePurview{}).Where(" status = 1").Order("number asc").Find(&originPurviews).Error
  377. if getPurviewErr != nil {
  378. return nil, getPurviewErr
  379. }
  380. // 加工这些规则:树形化
  381. purviewVMs := make([]*PurviewTreeViewModel, 0)
  382. for _, purview := range originPurviews {
  383. // warning:下面这个算法只适用最多两层树形结构的菜单,对于两层以上的会丢失掉第三层及其以下的节点
  384. // 因为取出 originPurviews 的时候已经排过序了,所以顶级节点肯定最先处理,不需要担心子节点比父节点先处理
  385. pvm := &PurviewTreeViewModel{
  386. ID: purview.ID,
  387. PID: purview.Parentid,
  388. Name: purview.Name,
  389. }
  390. purviewVMs = append(purviewVMs, pvm)
  391. }
  392. return purviewVMs, nil
  393. }
  394. func GetRolePurviewIds(roleID int64) (string, error) {
  395. var rolePurview models.RolePurview
  396. err := readUserDb.Where("role_id = ?", roleID).First(&rolePurview).Error
  397. if err != nil {
  398. if err == gorm.ErrRecordNotFound {
  399. return "", nil
  400. } else {
  401. return "", err
  402. }
  403. }
  404. return rolePurview.PurviewIds, nil
  405. }
  406. func SaveRolePurviewIds(orgID int64, appID int64, roleID int64, purviewIds string) error {
  407. var rolePurview models.RolePurview
  408. getRPErr := readUserDb.Where("org_id = ? AND app_id = ? AND role_id = ?", orgID, appID, roleID).First(&rolePurview).Error
  409. if getRPErr != nil {
  410. if getRPErr == gorm.ErrRecordNotFound {
  411. rolePurview = models.RolePurview{
  412. RoleId: roleID,
  413. OrgId: orgID,
  414. AppId: appID,
  415. Status: 1,
  416. CreateTime: time.Now().Unix(),
  417. }
  418. } else {
  419. return getRPErr
  420. }
  421. }
  422. rolePurview.PurviewIds = purviewIds
  423. rolePurview.ModifyTime = time.Now().Unix()
  424. tx := writeUserDb.Begin()
  425. if err := tx.Save(&rolePurview).Error; err != nil {
  426. tx.Rollback()
  427. return err
  428. }
  429. return tx.Commit().Error
  430. }
  431. func SaveFuncRolePurviewIds(orgID int64, appID int64, roleID int64, funcPurviewIds string) error {
  432. var rolePurview models.SgjUserRoleFuncPurview
  433. getRPErr := readUserDb.Where("org_id = ? AND app_id = ? AND role_id = ?", orgID, appID, roleID).First(&rolePurview).Error
  434. if getRPErr != nil {
  435. if getRPErr == gorm.ErrRecordNotFound {
  436. rolePurview = models.SgjUserRoleFuncPurview{
  437. RoleId: roleID,
  438. OrgId: orgID,
  439. AppId: appID,
  440. Status: 1,
  441. Ctime: time.Now().Unix(),
  442. }
  443. } else {
  444. return getRPErr
  445. }
  446. }
  447. rolePurview.PurviewIds = funcPurviewIds
  448. rolePurview.Mtime = time.Now().Unix()
  449. tx := writeUserDb.Begin()
  450. if err := tx.Save(&rolePurview).Error; err != nil {
  451. tx.Rollback()
  452. return err
  453. }
  454. return tx.Commit().Error
  455. }
  456. func ModifyAdminUserInfo(adminUserID int64, orgID int64, appID int64, name string, avatar string, newPassword string) error {
  457. tx := writeUserDb.Begin()
  458. editInfoErr := tx.Exec("update sgj_user_admin_role set user_name = ?, avatar = ?, mtime = ? where admin_user_id = ? and org_id = ?", name, avatar, time.Now().Unix(), adminUserID, orgID).Error
  459. if editInfoErr != nil {
  460. tx.Rollback()
  461. return editInfoErr
  462. }
  463. if len(newPassword) > 0 {
  464. editPwdErr := tx.Exec("update sgj_user_admin set password = ?, mtime = ? where id = ?", newPassword, time.Now().Unix(), adminUserID).Error
  465. if editPwdErr != nil {
  466. tx.Rollback()
  467. return editPwdErr
  468. }
  469. }
  470. tx.Commit()
  471. return nil
  472. }
  473. func GetOrgApp(orgID int64, app_type int) (*models.OrgApp, error) {
  474. var apps models.OrgApp
  475. err := readUserDb.Where("app_type = ? AND org_id = ? AND status = 1", app_type, orgID).First(&apps).Error
  476. if err != nil {
  477. return nil, err
  478. }
  479. return &apps, nil
  480. }
  481. func GetAllOrgValidRoles(orgID int64, isSubSuperAdmin bool) ([]*models.Role, error) {
  482. var roles []*models.Role
  483. db := readUserDb.Model(models.Org{})
  484. if isSubSuperAdmin {
  485. db = db.Where("role_name != '子管理员' AND is_system != 1")
  486. }
  487. err := db.Where("org_id = ? AND status = 1", orgID).
  488. Order("number desc,ctime").
  489. Find(&roles).
  490. Error
  491. if err != nil {
  492. if err == gorm.ErrRecordNotFound {
  493. return make([]*models.Role, 0), nil
  494. } else {
  495. return nil, err
  496. }
  497. }
  498. for _, item := range roles {
  499. var total int64
  500. readUserDb.Model(&models.App_Role{}).Where("org_id = ? AND find_in_set(?, role_ids)", orgID, item.Id).Count(&total)
  501. item.StaffNumber = total
  502. }
  503. return roles, nil
  504. }
  505. func CreateUserRole(userRole *models.App_Role) (err error) {
  506. err = writeUserDb.Create(&userRole).Error
  507. return
  508. }
  509. func CreateOrgRole(role *models.Role) (err error) {
  510. err = writeUserDb.Create(&role).Error
  511. return
  512. }
  513. func GetRolePurview(roleID int64) (models.RolePurview, error) {
  514. var rolePurviews models.RolePurview
  515. var err error
  516. err = readUserDb.Where("role_id = ?", roleID).First(&rolePurviews).Error
  517. return rolePurviews, err
  518. }
  519. func GetFuncRolePurview(roleID int64) (models.SgjUserRoleFuncPurview, error) {
  520. var rolePurviews models.SgjUserRoleFuncPurview
  521. var err error
  522. err = readUserDb.Where("role_id = ?", roleID).First(&rolePurviews).Error
  523. return rolePurviews, err
  524. }
  525. func SaveRolePurview(purview *models.RolePurview) (err error) {
  526. err = writeUserDb.Save(&purview).Error
  527. return
  528. }
  529. func CreateRolePurview(purview *models.RolePurview) (err error) {
  530. err = writeUserDb.Create(&purview).Error
  531. return
  532. }
  533. func CreateFuncRolePurview(purview *models.SgjUserRoleFuncPurview) (err error) {
  534. err = writeUserDb.Create(&purview).Error
  535. return
  536. }
  537. func GetAllPurview(module int64, pid int64) ([]*models.Purview, error) {
  538. var originPurviews []*models.Purview
  539. getPurviewErr := readUserDb.Model(models.Purview{}).Preload("Purview", "status = 1").Where("module = ? AND status = 1 AND parentid = ? AND super_admin_exclusive = 0", module, pid).Order("listorder asc").Order("id asc").Find(&originPurviews).Error
  540. return originPurviews, getPurviewErr
  541. }
  542. type NewAdminUserModel struct {
  543. ID int64 `gorm:"id" json:"id"`
  544. AdminUserId int `gorm:"admin_user_id" json:"user_id"`
  545. UserName string `gorm:"user_name" json:"user_name"`
  546. UserTitle int `gorm:"user_title_name" json:"user_title_name"`
  547. Ip string `gorm:"ip" json:"ip"`
  548. Ctime int64 `gorm:"ctime" json:"last_login_time"`
  549. Status int `gorm:"status" json:"status"`
  550. Avatar string `gorm:"avatar" json:"avatar"`
  551. RoleIds string `gorm:"role_ids" json:"role_ids"`
  552. IsSubAdmin bool `gorm:"-" json:"is_sub_admin"`
  553. }
  554. func GetAllAdminUsersAndRole(orgID int64, appID int64, page int, count int) ([]*NewAdminUserModel, int, error) {
  555. var viewModels []*NewAdminUserModel = make([]*NewAdminUserModel, 0)
  556. var rows *sql.Rows
  557. var err error
  558. rows, err = readUserDb.Raw("SELECT u_a_r.id, u_a_r.admin_user_id, u_a_r.user_name, u_a_r.user_title, u_a_r.status,u_a_r.avatar,u_a_r.role_ids FROM sgj_user_admin_role AS u_a_r WHERE org_id = ? AND app_id = ? ORDER BY ctime asc", orgID, appID).Rows()
  559. defer rows.Close()
  560. if err != nil {
  561. if err == gorm.ErrRecordNotFound {
  562. return viewModels, 0, nil
  563. } else {
  564. return nil, 0, err
  565. }
  566. }
  567. for rows.Next() {
  568. var viewModel NewAdminUserModel
  569. readUserDb.ScanRows(rows, &viewModel)
  570. viewModels = append(viewModels, &viewModel)
  571. }
  572. for _, items := range viewModels {
  573. if len(items.RoleIds) > 0 {
  574. ids := strings.Split(items.RoleIds, ",")
  575. for _, ids := range ids {
  576. id, _ := strconv.ParseInt(ids, 10, 64)
  577. if id != 0 {
  578. role, _ := GetRoleByRoleID(id)
  579. if role != nil {
  580. if role.IsSystem == 1 && role.RoleName == "子管理员" {
  581. items.IsSubAdmin = true
  582. }
  583. }
  584. }
  585. }
  586. }
  587. }
  588. total := 0
  589. return viewModels, total, nil
  590. }
  591. func FindAdminUserByID(admin_user_id int64, org_id int64) (total int64, err error) {
  592. err = readUserDb.Model(&models.App_Role{}).Where("admin_user_id = ? AND org_id = ?", admin_user_id, org_id).Count(&total).Error
  593. return
  594. }
  595. func GetRoleAndPurviewById(role_id int64, org_id int64, app_id int64) (rolePurview models.RolePurview, err error) {
  596. err = readUserDb.Model(&models.RolePurview{}).Preload("Role", "status = 1").Where("role_id = ? AND status = 1 AND org_id = ? AND app_id = ?", role_id, org_id, app_id).First(&rolePurview).Error
  597. return
  598. }
  599. func SaveRole(role *models.Role) (err error) {
  600. err = writeUserDb.Save(&role).Error
  601. return
  602. }
  603. // 拥有xx角色的管理员的数量
  604. func RoleAdminUserCountTwo(orgID int64, appID int64, roleID int64) (int, error) {
  605. var count int
  606. err := readUserDb.Model(models.App_Role{}).
  607. Where("org_id = ? AND app_id = ? AND find_in_set(?, role_ids)", orgID, appID, roleID).
  608. Count(&count).
  609. Error
  610. if err != nil {
  611. return 0, err
  612. } else {
  613. return count, nil
  614. }
  615. }
  616. func FindAdminUserID(id int64) (role models.App_Role, err error) {
  617. err = readUserDb.Model(&models.App_Role{}).Where("id = ?", id).First(&role).Error
  618. return
  619. }
  620. func SaveAdminUser(role *models.App_Role) (err error) {
  621. err = writeUserDb.Save(&role).Error
  622. return
  623. }
  624. func GetFunctionPurview() (purview []*models.SgjUserOperatePurview, err error) {
  625. err = readUserDb.Model(&models.SgjUserOperatePurview{}).Where("status = 1 ").Order("number asc").Find(&purview).Error
  626. return
  627. }
  628. func GetRoleFuncPurviewIds(roleID int64) (string, error) {
  629. var rolePurview models.SgjUserRoleFuncPurview
  630. err := readUserDb.Where("role_id = ?", roleID).First(&rolePurview).Error
  631. if err != nil {
  632. if err == gorm.ErrRecordNotFound {
  633. return "", nil
  634. } else {
  635. return "", err
  636. }
  637. }
  638. return rolePurview.PurviewIds, nil
  639. }
  640. func GetRoleFuncPurview(roleID int64) (rolePurviews models.SgjUserRoleFuncPurview, err error) {
  641. err = readUserDb.Where("role_id = ?", roleID).First(&rolePurviews).Error
  642. return
  643. }
  644. func SaveRoleFuncPurview(purview *models.SgjUserRoleFuncPurview) (err error) {
  645. err = writeUserDb.Save(purview).Error
  646. return
  647. }
  648. func GetUserAllRole(org_id int64, admin_user_id int64) (role models.App_Role, err error) {
  649. err = readUserDb.Model(&models.App_Role{}).Where("status = 1 AND org_id = ? AND admin_user_id = ?", org_id, admin_user_id).First(&role).Error
  650. return
  651. }
  652. func GetAllFunctionPurview() (purview []models.SgjUserOperatePurview, err error) {
  653. err = readUserDb.Model(&models.SgjUserOperatePurview{}).Where("status = 1 ").Order("number asc").Find(&purview).Error
  654. return
  655. }
  656. func FindErrorMsgByStr(str string) (string, error) {
  657. var purview models.SgjUserOperatePurview
  658. var err error
  659. err = readUserDb.Model(&models.SgjUserOperatePurview{}).Where("find_in_set(?, urlfor)", str).First(&purview).Error
  660. return purview.ErrorMsg, err
  661. }
  662. func GetNewAllOrgValidRoles(orgID int64) ([]*models.Role, error) {
  663. var roles []*models.Role
  664. db := readUserDb.Model(models.Org{})
  665. err := db.Where("org_id = ? AND status = 1", orgID).
  666. Order("number desc,ctime").
  667. Find(&roles).
  668. Error
  669. if err != nil {
  670. if err == gorm.ErrRecordNotFound {
  671. return make([]*models.Role, 0), nil
  672. } else {
  673. return nil, err
  674. }
  675. }
  676. for _, item := range roles {
  677. var total int64
  678. readUserDb.Model(&models.App_Role{}).Where("org_id = ? AND find_in_set(?, role_ids)", orgID, item.Id).Count(&total)
  679. item.StaffNumber = total
  680. }
  681. return roles, nil
  682. }
  683. func FindRoleRecordByRoleName(name string, org_id int64) (total int64) {
  684. readUserDb.Model(&models.Role{}).Where("status = 1 AND role_name = ? AND org_id = ?", name, org_id).Count(&total)
  685. return
  686. }
  687. func FindAllFuncPurview(ids []string) (purview []*models.SgjUserOperatePurview, err error) {
  688. err = readUserDb.Model(&models.SgjUserOperatePurview{}).Where("status = 1 AND id in (?)", ids).Order("number asc").Find(&purview).Error
  689. return
  690. }
  691. func GetSystemPurview() (purview []*models.Purview, err error) {
  692. err = readUserDb.Model(&models.Purview{}).Where("status = 1 AND module = 3 AND super_admin_exclusive = 1").Find(&purview).Error
  693. return
  694. }
  695. func GetAllSystemPurview() (purview []*models.Purview, err error) {
  696. err = readUserDb.Model(&models.Purview{}).Where("status = 1 AND module = 3 ").Find(&purview).Error
  697. return
  698. }
  699. type Purview struct {
  700. Id int64 `gorm:"PRIMARY_KEY;AUTO_INCREMENT" json:"id"`
  701. Parentid int64 `json:"pid"` // 父级ID
  702. Module int8 `json:"module"` // 所属应用类型 1.病友经营;2.科普号;3.血透经营;4.慢病管理;
  703. Name string `json:"name"` // 规则名称(也是菜单名)
  704. Urlfor string `json:"urlfor"` // 规则唯一英文标识,(Controller.Method)
  705. MenuIconClass string `gorm:"menu_icon_class" json:"menu_icon_class"` // 菜单图标的 css 样式
  706. SuperAdminExclusive int8 `gorm:"super_admin_exclusive" json:"super_admin_exclusive"` // 是否为超级管理员专属 0否1是
  707. Listorder int `json:"-"` // 排序ID
  708. Status int8 `json:"status"` // 状态 0.无效 1.有效 2.禁用
  709. CreateTime int64 `gorm:"column:ctime" json:"-"` // 创建时间
  710. ModifyTime int64 `gorm:"column:mtime" json:"-"` // 修改时间
  711. Purview []*Purview `gorm:"ForeignKey:Parentid;AssociationForeignKey:ID" json:"sub_purview"`
  712. IconUrl string `gorm:"column:icon_url" json:"icon_url" form:"icon_url"`
  713. Desc string `gorm:"column:desc" json:"desc" form:"desc"`
  714. ParentUrl string `gorm:"column:parent_url" json:"parent_url" form:"parent_url"`
  715. Link string `gorm:"-" json:"link"` // urlfor 解析后的链接
  716. Childs []*Purview `gorm:"-" json:"childs"` // 子节点
  717. }
  718. func (Purview) TableName() string {
  719. return "sgj_user_purview"
  720. }
  721. func GetNewAllPurview(url string) ([]*Purview, error) {
  722. var originPurviews []*Purview
  723. getPurviewErr := readUserDb.Model(Purview{}).Preload("Purview", "status = 1").Where("parent_url = ? AND status = 1", url).Order("listorder asc").Order("id asc").Find(&originPurviews).Error
  724. return originPurviews, getPurviewErr
  725. }
  726. func GetOtherNewAllPurview(url string) ([]*Purview, error) {
  727. var originPurviews []*Purview
  728. getPurviewErr := readUserDb.Model(Purview{}).Preload("Purview", func(db *gorm.DB) *gorm.DB {
  729. return db.Preload("Purview", "status = 1").Where("status = 1")
  730. }).Where("parent_url = ? AND status = 1", url).Order("listorder asc").Order("id asc").Find(&originPurviews).Error
  731. return originPurviews, getPurviewErr
  732. }
  733. func GetAllFuncPurview() ([]*models.SgjUserOperatePurview, error) {
  734. var originPurviews []*models.SgjUserOperatePurview
  735. getPurviewErr := readUserDb.Model(&models.SgjUserOperatePurview{}).Where(" status = 1").Error
  736. return originPurviews, getPurviewErr
  737. }
  738. func GetOtherAllGeneralPurviewVMsProcessed(url string) ([]*PurviewTreeViewModel, error, []*models.Purview) {
  739. var originPurviews []*models.Purview
  740. getPurviewErr := readUserDb.Model(Purview{}).Where("status = 1 AND parent_url = ?", url).Order("listorder asc").Order("id asc").Find(&originPurviews).Error
  741. if getPurviewErr != nil {
  742. return nil, getPurviewErr, nil
  743. }
  744. // 加工这些规则:树形化
  745. purviewVMs := make([]*PurviewTreeViewModel, 0)
  746. pid_childs := make(map[int64][]*PurviewTreeViewModel)
  747. fmt.Println(originPurviews)
  748. for _, purview := range originPurviews {
  749. // warning:下面这个算法只适用最多两层树形结构的菜单,对于两层以上的会丢失掉第三层及其以下的节点
  750. // 因为取出 originPurviews 的时候已经排过序了,所以顶级节点肯定最先处理,不需要担心子节点比父节点先处理
  751. pvm := &PurviewTreeViewModel{
  752. ID: purview.Id,
  753. PID: purview.Parentid,
  754. Name: purview.Name,
  755. Number: 2,
  756. ParentUrl: purview.ParentUrl,
  757. Url: purview.Urlfor,
  758. }
  759. if purview.Parentid == 0 {
  760. purviewVMs = append(purviewVMs, pvm)
  761. } else {
  762. childs := pid_childs[purview.Parentid]
  763. if childs == nil {
  764. childs = make([]*PurviewTreeViewModel, 0)
  765. }
  766. childs = append(childs, pvm)
  767. pid_childs[purview.Parentid] = childs
  768. }
  769. }
  770. for _, vm := range purviewVMs {
  771. vm.Childs = pid_childs[vm.ID]
  772. }
  773. return purviewVMs, nil, originPurviews
  774. }