role_service.go 28KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860
  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, department_id int64, deapartment_name string) (*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. Department: deapartment_name,
  324. DepartmentId: department_id,
  325. }
  326. if createApp_RoleErr := tx.Create(&app_role).Error; createApp_RoleErr != nil {
  327. tx.Rollback()
  328. return nil, "", createApp_RoleErr
  329. }
  330. tx.Commit()
  331. return &adminUser, password, nil
  332. }
  333. type PurviewTreeViewModel struct {
  334. ID int64 `json:"id"`
  335. PID int64 `json:"pid"`
  336. Name string `json:"name"`
  337. Childs []*PurviewTreeViewModel `json:"childs"`
  338. Number int64 `json:"number"`
  339. Url string `json:"url"`
  340. ParentUrl string `json:"parent_url"`
  341. }
  342. func GetAllGeneralPurviewVMsProcessed(module int) ([]*PurviewTreeViewModel, error) {
  343. var originPurviews []*models.Purview
  344. getPurviewErr := readUserDb.Model(models.Purview{}).Where("module = ? AND status = 1", module).Order("listorder asc").Order("id asc").Find(&originPurviews).Error
  345. if getPurviewErr != nil {
  346. return nil, getPurviewErr
  347. }
  348. // 加工这些规则:树形化
  349. purviewVMs := make([]*PurviewTreeViewModel, 0)
  350. pid_childs := make(map[int64][]*PurviewTreeViewModel)
  351. for _, purview := range originPurviews {
  352. // warning:下面这个算法只适用最多两层树形结构的菜单,对于两层以上的会丢失掉第三层及其以下的节点
  353. // 因为取出 originPurviews 的时候已经排过序了,所以顶级节点肯定最先处理,不需要担心子节点比父节点先处理
  354. pvm := &PurviewTreeViewModel{
  355. ID: purview.Id,
  356. PID: purview.Parentid,
  357. Name: purview.Name,
  358. Number: 2,
  359. }
  360. if purview.Parentid == 0 {
  361. purviewVMs = append(purviewVMs, pvm)
  362. } else {
  363. childs := pid_childs[purview.Parentid]
  364. if childs == nil {
  365. childs = make([]*PurviewTreeViewModel, 0)
  366. }
  367. childs = append(childs, pvm)
  368. pid_childs[purview.Parentid] = childs
  369. }
  370. }
  371. for _, vm := range purviewVMs {
  372. vm.Childs = pid_childs[vm.ID]
  373. }
  374. return purviewVMs, nil
  375. }
  376. func GetAllGeneralFuncPurviewVMsProcessed() ([]*PurviewTreeViewModel, error) {
  377. var originPurviews []*models.SgjUserOperatePurview
  378. getPurviewErr := readUserDb.Model(models.SgjUserOperatePurview{}).Where(" status = 1").Order("number asc").Find(&originPurviews).Error
  379. if getPurviewErr != nil {
  380. return nil, getPurviewErr
  381. }
  382. // 加工这些规则:树形化
  383. purviewVMs := make([]*PurviewTreeViewModel, 0)
  384. for _, purview := range originPurviews {
  385. // warning:下面这个算法只适用最多两层树形结构的菜单,对于两层以上的会丢失掉第三层及其以下的节点
  386. // 因为取出 originPurviews 的时候已经排过序了,所以顶级节点肯定最先处理,不需要担心子节点比父节点先处理
  387. pvm := &PurviewTreeViewModel{
  388. ID: purview.ID,
  389. PID: purview.Parentid,
  390. Name: purview.Name,
  391. }
  392. purviewVMs = append(purviewVMs, pvm)
  393. }
  394. return purviewVMs, nil
  395. }
  396. func GetRolePurviewIds(roleID int64) (string, error) {
  397. var rolePurview models.RolePurview
  398. err := readUserDb.Where("role_id = ?", roleID).First(&rolePurview).Error
  399. if err != nil {
  400. if err == gorm.ErrRecordNotFound {
  401. return "", nil
  402. } else {
  403. return "", err
  404. }
  405. }
  406. return rolePurview.PurviewIds, nil
  407. }
  408. func SaveRolePurviewIds(orgID int64, appID int64, roleID int64, purviewIds string) error {
  409. var rolePurview models.RolePurview
  410. getRPErr := readUserDb.Where("org_id = ? AND app_id = ? AND role_id = ?", orgID, appID, roleID).First(&rolePurview).Error
  411. if getRPErr != nil {
  412. if getRPErr == gorm.ErrRecordNotFound {
  413. rolePurview = models.RolePurview{
  414. RoleId: roleID,
  415. OrgId: orgID,
  416. AppId: appID,
  417. Status: 1,
  418. CreateTime: time.Now().Unix(),
  419. }
  420. } else {
  421. return getRPErr
  422. }
  423. }
  424. rolePurview.PurviewIds = purviewIds
  425. rolePurview.ModifyTime = time.Now().Unix()
  426. tx := writeUserDb.Begin()
  427. if err := tx.Save(&rolePurview).Error; err != nil {
  428. tx.Rollback()
  429. return err
  430. }
  431. return tx.Commit().Error
  432. }
  433. func SaveFuncRolePurviewIds(orgID int64, appID int64, roleID int64, funcPurviewIds string) error {
  434. var rolePurview models.SgjUserRoleFuncPurview
  435. getRPErr := readUserDb.Where("org_id = ? AND app_id = ? AND role_id = ?", orgID, appID, roleID).First(&rolePurview).Error
  436. if getRPErr != nil {
  437. if getRPErr == gorm.ErrRecordNotFound {
  438. rolePurview = models.SgjUserRoleFuncPurview{
  439. RoleId: roleID,
  440. OrgId: orgID,
  441. AppId: appID,
  442. Status: 1,
  443. Ctime: time.Now().Unix(),
  444. }
  445. } else {
  446. return getRPErr
  447. }
  448. }
  449. rolePurview.PurviewIds = funcPurviewIds
  450. rolePurview.Mtime = time.Now().Unix()
  451. tx := writeUserDb.Begin()
  452. if err := tx.Save(&rolePurview).Error; err != nil {
  453. tx.Rollback()
  454. return err
  455. }
  456. return tx.Commit().Error
  457. }
  458. func ModifyAdminUserInfo(adminUserID int64, orgID int64, appID int64, name string, avatar string, newPassword string) error {
  459. tx := writeUserDb.Begin()
  460. 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
  461. if editInfoErr != nil {
  462. tx.Rollback()
  463. return editInfoErr
  464. }
  465. if len(newPassword) > 0 {
  466. editPwdErr := tx.Exec("update sgj_user_admin set password = ?, mtime = ? where id = ?", newPassword, time.Now().Unix(), adminUserID).Error
  467. if editPwdErr != nil {
  468. tx.Rollback()
  469. return editPwdErr
  470. }
  471. }
  472. tx.Commit()
  473. return nil
  474. }
  475. func GetOrgApp(orgID int64, app_type int) (*models.OrgApp, error) {
  476. var apps models.OrgApp
  477. err := readUserDb.Where("app_type = ? AND org_id = ? AND status = 1", app_type, orgID).First(&apps).Error
  478. if err != nil {
  479. return nil, err
  480. }
  481. return &apps, nil
  482. }
  483. func GetAllOrgValidRoles(orgID int64, isSubSuperAdmin bool) ([]*models.Role, error) {
  484. var roles []*models.Role
  485. db := readUserDb.Model(models.Org{})
  486. if isSubSuperAdmin {
  487. db = db.Where("role_name != '子管理员' AND is_system != 1")
  488. }
  489. err := db.Where("org_id = ? AND status = 1", orgID).
  490. Order("number desc,ctime").
  491. Find(&roles).
  492. Error
  493. if err != nil {
  494. if err == gorm.ErrRecordNotFound {
  495. return make([]*models.Role, 0), nil
  496. } else {
  497. return nil, err
  498. }
  499. }
  500. for _, item := range roles {
  501. var total int64
  502. readUserDb.Model(&models.App_Role{}).Where("org_id = ? AND find_in_set(?, role_ids)", orgID, item.Id).Count(&total)
  503. item.StaffNumber = total
  504. }
  505. return roles, nil
  506. }
  507. func CreateUserRole(userRole *models.App_Role) (err error) {
  508. err = writeUserDb.Create(&userRole).Error
  509. return
  510. }
  511. func CreateOrgRole(role *models.Role) (err error) {
  512. err = writeUserDb.Create(&role).Error
  513. return
  514. }
  515. func GetRolePurview(roleID int64) (models.RolePurview, error) {
  516. var rolePurviews models.RolePurview
  517. var err error
  518. err = readUserDb.Where("role_id = ?", roleID).First(&rolePurviews).Error
  519. return rolePurviews, err
  520. }
  521. func GetFuncRolePurview(roleID int64) (models.SgjUserRoleFuncPurview, error) {
  522. var rolePurviews models.SgjUserRoleFuncPurview
  523. var err error
  524. err = readUserDb.Where("role_id = ?", roleID).First(&rolePurviews).Error
  525. return rolePurviews, err
  526. }
  527. func SaveRolePurview(purview *models.RolePurview) (err error) {
  528. err = writeUserDb.Save(&purview).Error
  529. return
  530. }
  531. func CreateRolePurview(purview *models.RolePurview) (err error) {
  532. err = writeUserDb.Create(&purview).Error
  533. return
  534. }
  535. func CreateFuncRolePurview(purview *models.SgjUserRoleFuncPurview) (err error) {
  536. err = writeUserDb.Create(&purview).Error
  537. return
  538. }
  539. func GetAllPurview(module int64, pid int64) ([]*models.Purview, error) {
  540. var originPurviews []*models.Purview
  541. 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
  542. return originPurviews, getPurviewErr
  543. }
  544. type NewAdminUserModel struct {
  545. ID int64 `gorm:"id" json:"id"`
  546. AdminUserId int `gorm:"admin_user_id" json:"user_id"`
  547. UserName string `gorm:"user_name" json:"user_name"`
  548. UserTitle int `gorm:"user_title_name" json:"user_title_name"`
  549. Ip string `gorm:"ip" json:"ip"`
  550. Ctime int64 `gorm:"ctime" json:"last_login_time"`
  551. Status int `gorm:"status" json:"status"`
  552. Avatar string `gorm:"avatar" json:"avatar"`
  553. RoleIds string `gorm:"role_ids" json:"role_ids"`
  554. IsSubAdmin bool `gorm:"-" json:"is_sub_admin"`
  555. }
  556. func GetAllAdminUsersAndRole(orgID int64, appID int64, page int, count int) ([]*NewAdminUserModel, int, error) {
  557. var viewModels []*NewAdminUserModel = make([]*NewAdminUserModel, 0)
  558. var rows *sql.Rows
  559. var err error
  560. 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()
  561. defer rows.Close()
  562. if err != nil {
  563. if err == gorm.ErrRecordNotFound {
  564. return viewModels, 0, nil
  565. } else {
  566. return nil, 0, err
  567. }
  568. }
  569. for rows.Next() {
  570. var viewModel NewAdminUserModel
  571. readUserDb.ScanRows(rows, &viewModel)
  572. viewModels = append(viewModels, &viewModel)
  573. }
  574. for _, items := range viewModels {
  575. if len(items.RoleIds) > 0 {
  576. ids := strings.Split(items.RoleIds, ",")
  577. for _, ids := range ids {
  578. id, _ := strconv.ParseInt(ids, 10, 64)
  579. if id != 0 {
  580. role, _ := GetRoleByRoleID(id)
  581. if role != nil {
  582. if role.IsSystem == 1 && role.RoleName == "子管理员" {
  583. items.IsSubAdmin = true
  584. }
  585. }
  586. }
  587. }
  588. }
  589. }
  590. total := 0
  591. return viewModels, total, nil
  592. }
  593. func FindAdminUserByID(admin_user_id int64, org_id int64) (total int64, err error) {
  594. err = readUserDb.Model(&models.App_Role{}).Where("admin_user_id = ? AND org_id = ?", admin_user_id, org_id).Count(&total).Error
  595. return
  596. }
  597. func GetRoleAndPurviewById(role_id int64, org_id int64, app_id int64) (rolePurview models.RolePurview, err error) {
  598. 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
  599. return
  600. }
  601. func SaveRole(role *models.Role) (err error) {
  602. err = writeUserDb.Save(&role).Error
  603. return
  604. }
  605. // 拥有xx角色的管理员的数量
  606. func RoleAdminUserCountTwo(orgID int64, appID int64, roleID int64) (int, error) {
  607. var count int
  608. err := readUserDb.Model(models.App_Role{}).
  609. Where("org_id = ? AND app_id = ? AND find_in_set(?, role_ids)", orgID, appID, roleID).
  610. Count(&count).
  611. Error
  612. if err != nil {
  613. return 0, err
  614. } else {
  615. return count, nil
  616. }
  617. }
  618. func FindAdminUserID(id int64) (role models.App_Role, err error) {
  619. err = readUserDb.Model(&models.App_Role{}).Where("id = ?", id).First(&role).Error
  620. return
  621. }
  622. func SaveAdminUser(role *models.App_Role) (err error) {
  623. err = writeUserDb.Save(&role).Error
  624. return
  625. }
  626. func GetFunctionPurview() (purview []*models.SgjUserOperatePurview, err error) {
  627. err = readUserDb.Model(&models.SgjUserOperatePurview{}).Where("status = 1 ").Order("number asc").Find(&purview).Error
  628. return
  629. }
  630. func GetRoleFuncPurviewIds(roleID int64) (string, error) {
  631. var rolePurview models.SgjUserRoleFuncPurview
  632. err := readUserDb.Where("role_id = ?", roleID).First(&rolePurview).Error
  633. if err != nil {
  634. if err == gorm.ErrRecordNotFound {
  635. return "", nil
  636. } else {
  637. return "", err
  638. }
  639. }
  640. return rolePurview.PurviewIds, nil
  641. }
  642. func GetRoleFuncPurview(roleID int64) (rolePurviews models.SgjUserRoleFuncPurview, err error) {
  643. err = readUserDb.Where("role_id = ?", roleID).First(&rolePurviews).Error
  644. return
  645. }
  646. func SaveRoleFuncPurview(purview *models.SgjUserRoleFuncPurview) (err error) {
  647. err = writeUserDb.Save(purview).Error
  648. return
  649. }
  650. func GetUserAllRole(org_id int64, admin_user_id int64) (role models.App_Role, err error) {
  651. err = readUserDb.Model(&models.App_Role{}).Where("status = 1 AND org_id = ? AND admin_user_id = ?", org_id, admin_user_id).First(&role).Error
  652. return
  653. }
  654. func GetAllFunctionPurview() (purview []models.SgjUserOperatePurview, err error) {
  655. err = readUserDb.Model(&models.SgjUserOperatePurview{}).Where("status = 1 ").Order("number asc").Find(&purview).Error
  656. return
  657. }
  658. func FindErrorMsgByStr(str string) (string, error) {
  659. var purview models.SgjUserOperatePurview
  660. var err error
  661. err = readUserDb.Model(&models.SgjUserOperatePurview{}).Where("find_in_set(?, urlfor)", str).First(&purview).Error
  662. return purview.ErrorMsg, err
  663. }
  664. func GetNewAllOrgValidRoles(orgID int64) ([]*models.Role, error) {
  665. var roles []*models.Role
  666. db := readUserDb.Model(models.Org{})
  667. err := db.Where("org_id = ? AND status = 1", orgID).
  668. Order("number desc,ctime").
  669. Find(&roles).
  670. Error
  671. if err != nil {
  672. if err == gorm.ErrRecordNotFound {
  673. return make([]*models.Role, 0), nil
  674. } else {
  675. return nil, err
  676. }
  677. }
  678. for _, item := range roles {
  679. var total int64
  680. readUserDb.Model(&models.App_Role{}).Where("org_id = ? AND find_in_set(?, role_ids)", orgID, item.Id).Count(&total)
  681. item.StaffNumber = total
  682. }
  683. return roles, nil
  684. }
  685. func FindRoleRecordByRoleName(name string, org_id int64) (total int64) {
  686. readUserDb.Model(&models.Role{}).Where("status = 1 AND role_name = ? AND org_id = ?", name, org_id).Count(&total)
  687. return
  688. }
  689. func FindAllFuncPurview(ids []string) (purview []*models.SgjUserOperatePurview, err error) {
  690. err = readUserDb.Model(&models.SgjUserOperatePurview{}).Where("status = 1 AND id in (?)", ids).Order("number asc").Find(&purview).Error
  691. return
  692. }
  693. func GetSystemPurview() (purview []*models.Purview, err error) {
  694. err = readUserDb.Model(&models.Purview{}).Where("status = 1 AND module = 3 AND super_admin_exclusive = 1").Find(&purview).Error
  695. return
  696. }
  697. func GetAllSystemPurview() (purview []*models.Purview, err error) {
  698. err = readUserDb.Model(&models.Purview{}).Where("status = 1 AND module = 3 ").Find(&purview).Error
  699. return
  700. }
  701. type Purview struct {
  702. Id int64 `gorm:"PRIMARY_KEY;AUTO_INCREMENT" json:"id"`
  703. Parentid int64 `json:"pid"` // 父级ID
  704. Module int8 `json:"module"` // 所属应用类型 1.病友经营;2.科普号;3.血透经营;4.慢病管理;
  705. Name string `json:"name"` // 规则名称(也是菜单名)
  706. Urlfor string `json:"urlfor"` // 规则唯一英文标识,(Controller.Method)
  707. MenuIconClass string `gorm:"menu_icon_class" json:"menu_icon_class"` // 菜单图标的 css 样式
  708. SuperAdminExclusive int8 `gorm:"super_admin_exclusive" json:"super_admin_exclusive"` // 是否为超级管理员专属 0否1是
  709. Listorder int `json:"-"` // 排序ID
  710. Status int8 `json:"status"` // 状态 0.无效 1.有效 2.禁用
  711. CreateTime int64 `gorm:"column:ctime" json:"-"` // 创建时间
  712. ModifyTime int64 `gorm:"column:mtime" json:"-"` // 修改时间
  713. Purview []*Purview `gorm:"ForeignKey:Parentid;AssociationForeignKey:ID" json:"sub_purview"`
  714. IconUrl string `gorm:"column:icon_url" json:"icon_url" form:"icon_url"`
  715. Desc string `gorm:"column:desc" json:"desc" form:"desc"`
  716. ParentUrl string `gorm:"column:parent_url" json:"parent_url" form:"parent_url"`
  717. Link string `gorm:"-" json:"link"` // urlfor 解析后的链接
  718. Childs []*Purview `gorm:"-" json:"childs"` // 子节点
  719. }
  720. func (Purview) TableName() string {
  721. return "sgj_user_purview"
  722. }
  723. func GetNewAllPurview(url string) ([]*Purview, error) {
  724. var originPurviews []*Purview
  725. getPurviewErr := readUserDb.Model(Purview{}).Preload("Purview", "status = 1").Where("parent_url = ? AND status = 1", url).Order("listorder asc").Order("id asc").Find(&originPurviews).Error
  726. return originPurviews, getPurviewErr
  727. }
  728. func GetOtherNewAllPurview(url string) ([]*Purview, error) {
  729. var originPurviews []*Purview
  730. getPurviewErr := readUserDb.Model(Purview{}).Preload("Purview", func(db *gorm.DB) *gorm.DB {
  731. return db.Preload("Purview", "status = 1").Where("status = 1")
  732. }).Where("parent_url = ? AND status = 1", url).Order("listorder asc").Order("id asc").Find(&originPurviews).Error
  733. return originPurviews, getPurviewErr
  734. }
  735. func GetAllFuncPurview() ([]*models.SgjUserOperatePurview, error) {
  736. var originPurviews []*models.SgjUserOperatePurview
  737. getPurviewErr := readUserDb.Model(&models.SgjUserOperatePurview{}).Where(" status = 1").Error
  738. return originPurviews, getPurviewErr
  739. }
  740. func GetOtherAllGeneralPurviewVMsProcessed(url string) ([]*PurviewTreeViewModel, error, []*models.Purview) {
  741. var originPurviews []*models.Purview
  742. getPurviewErr := readUserDb.Model(Purview{}).Where("status = 1 AND parent_url = ?", url).Order("listorder asc").Order("id asc").Find(&originPurviews).Error
  743. if getPurviewErr != nil {
  744. return nil, getPurviewErr, nil
  745. }
  746. // 加工这些规则:树形化
  747. purviewVMs := make([]*PurviewTreeViewModel, 0)
  748. pid_childs := make(map[int64][]*PurviewTreeViewModel)
  749. fmt.Println(originPurviews)
  750. for _, purview := range originPurviews {
  751. // warning:下面这个算法只适用最多两层树形结构的菜单,对于两层以上的会丢失掉第三层及其以下的节点
  752. // 因为取出 originPurviews 的时候已经排过序了,所以顶级节点肯定最先处理,不需要担心子节点比父节点先处理
  753. pvm := &PurviewTreeViewModel{
  754. ID: purview.Id,
  755. PID: purview.Parentid,
  756. Name: purview.Name,
  757. Number: 2,
  758. ParentUrl: purview.ParentUrl,
  759. Url: purview.Urlfor,
  760. }
  761. if purview.Parentid == 0 {
  762. purviewVMs = append(purviewVMs, pvm)
  763. } else {
  764. childs := pid_childs[purview.Parentid]
  765. if childs == nil {
  766. childs = make([]*PurviewTreeViewModel, 0)
  767. }
  768. childs = append(childs, pvm)
  769. pid_childs[purview.Parentid] = childs
  770. }
  771. }
  772. for _, vm := range purviewVMs {
  773. vm.Childs = pid_childs[vm.ID]
  774. }
  775. return purviewVMs, nil, originPurviews
  776. }