system_service.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560
  1. package backend
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "kpt-pasture/model"
  7. "kpt-pasture/util"
  8. "net/http"
  9. "strconv"
  10. "strings"
  11. "time"
  12. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  13. "go.uber.org/zap"
  14. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  15. operationPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/operation"
  16. "gitee.com/xuyiping_admin/pkg/jwt"
  17. "gitee.com/xuyiping_admin/pkg/xerr"
  18. "gorm.io/gorm"
  19. )
  20. const (
  21. CurrentUserName = "userName"
  22. CurrentFarmId = "FarmId"
  23. )
  24. // Login 用户登录
  25. func (s *StoreEntry) Login(ctx context.Context, req *pasturePb.SearchUserRequest) (*pasturePb.SystemUserResponse, error) {
  26. systemUser := &model.SystemUser{}
  27. if err := s.DB.Where("name = ?", req.Name).
  28. First(systemUser).Error; err != nil {
  29. return nil, xerr.WithStack(err)
  30. }
  31. if systemUser.Password != req.Password {
  32. return nil, xerr.Customf("密码错误,来自用户:%s", req.Name)
  33. }
  34. if systemUser.IsShow == pasturePb.IsShow_No {
  35. return nil, xerr.Customf("该账号已被禁用,请联系管理员")
  36. }
  37. if systemUser.IsDelete == pasturePb.IsShow_No {
  38. return nil, xerr.Customf("该账号已被删除,请联系管理员")
  39. }
  40. zaplog.Info("Login", zap.Any("systemUser", systemUser))
  41. systemRoleList := make([]*model.SystemRole, 0)
  42. if err := s.DB.Model(new(model.SystemRole)).
  43. Where("is_show = ? and is_delete = ?", pasturePb.IsShow_Ok, pasturePb.IsShow_Ok).
  44. Where("id IN ?", systemUser.GetRoleIds()).
  45. Find(&systemRoleList).Error; err != nil {
  46. zaplog.Error("Login", zap.Any("systemRole", err))
  47. }
  48. roleNameList := make([]string, 0)
  49. for _, role := range systemRoleList {
  50. roleNameList = append(roleNameList, role.Name)
  51. }
  52. jwtToken := jwt.NewJWTTokenGen(s.Cfg.AppName, s.Cfg.JwtTokenKeyConfig.PrivateKey)
  53. token, err := jwtToken.GenerateToken(systemUser.Name, s.Cfg.JwtExpireTime)
  54. if err != nil {
  55. return nil, xerr.WithStack(err)
  56. }
  57. if token == "" {
  58. return nil, xerr.Custom("获取token错误")
  59. }
  60. expires := time.Now().Local().Add(time.Duration(s.Cfg.JwtExpireTime) * time.Second).Format(util.LayoutTime)
  61. farmList, err := s.FindPastureList(ctx, systemUser.PastureIds)
  62. if err != nil || len(farmList) == 0 {
  63. return nil, xerr.Custom("牧场信息错误")
  64. }
  65. return &pasturePb.SystemUserResponse{
  66. Code: http.StatusOK,
  67. Msg: "ok",
  68. Data: &pasturePb.SystemUserData{
  69. AccessToken: token,
  70. Expires: expires,
  71. RefreshToken: token,
  72. Username: systemUser.Name,
  73. Roles: roleNameList,
  74. Avatar: systemUser.Avatar,
  75. FarmId: farmList[0].FarmId,
  76. },
  77. }, nil
  78. }
  79. // SearchSystemUserList 查询系统用户
  80. func (s *StoreEntry) SearchSystemUserList(ctx context.Context, req *pasturePb.SearchUserRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchUserResponse, error) {
  81. userModel, err := s.GetUserModel(ctx)
  82. if err != nil {
  83. return nil, xerr.WithStack(err)
  84. }
  85. systemUserList := make([]*model.SystemUser, 0)
  86. var count int64 = 0
  87. pref := s.DB.Model(new(model.SystemUser)).
  88. Where("is_delete = ?", operationPb.IsShow_OK).
  89. Where("FIND_IN_SET(?, pasture_ids) > ?", userModel.AppPasture.Id, 0)
  90. if req.Name != "" {
  91. pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
  92. }
  93. if req.Mobile != "" {
  94. pref.Where("mobile = ?", req.Mobile)
  95. }
  96. if req.DepthId > 0 {
  97. systemDept := &model.SystemDept{}
  98. if err = s.DB.Model(new(model.SystemDept)).Where("id = ?", req.DepthId).
  99. Where("is_delete = ?", operationPb.IsShow_OK).
  100. First(systemDept).Error; err != nil {
  101. return nil, xerr.Custom("部门信息错误")
  102. }
  103. pref.Where("pasture_id = ?", systemDept.PastureId)
  104. if systemDept.DeptType == pasturePb.Depth_Department {
  105. pref.Where("dept_id = ?", req.DepthId)
  106. }
  107. }
  108. if req.IsShow > 0 {
  109. pref.Where("is_show = ?", req.IsShow)
  110. }
  111. if err = pref.Order("is_show asc,id desc").
  112. Count(&count).
  113. Limit(int(pagination.PageSize)).
  114. Offset(int(pagination.PageOffset)).
  115. Find(&systemUserList).Error; err != nil {
  116. return nil, xerr.WithStack(err)
  117. }
  118. roleList, err := s.SearchSystemRoleListByIds(ctx, []int64{})
  119. if err != nil {
  120. return nil, xerr.WithStack(err)
  121. }
  122. deptList, err := s.SearchSystemDeptListByIds(ctx, []int64{})
  123. if err != nil {
  124. return nil, xerr.WithStack(err)
  125. }
  126. return &pasturePb.SearchUserResponse{
  127. Code: http.StatusOK,
  128. Msg: "ok",
  129. Data: &pasturePb.SearchUserData{
  130. List: model.SystemUserSlice(systemUserList).ToPB(deptList, roleList),
  131. Total: int32(count),
  132. PageSize: pagination.PageSize,
  133. Page: pagination.Page,
  134. },
  135. }, nil
  136. }
  137. func (s *StoreEntry) SystemUserList(ctx context.Context) ([]*model.SystemUser, error) {
  138. systemUserList := make([]*model.SystemUser, 0)
  139. if err := s.DB.Where("is_delete = ?", pasturePb.IsShow_Ok).
  140. Where("is_show = ? ", pasturePb.IsShow_Ok).
  141. Find(&systemUserList).Error; err != nil {
  142. return nil, xerr.WithStack(err)
  143. }
  144. return systemUserList, nil
  145. }
  146. // DeleteSystemUser 删除系统用户
  147. func (s *StoreEntry) DeleteSystemUser(ctx context.Context, userId int64) error {
  148. systemUser := &model.SystemUser{
  149. Id: userId,
  150. }
  151. if err := s.DB.Model(new(model.SystemUser)).First(systemUser).Error; err != nil {
  152. if errors.Is(err, gorm.ErrRecordNotFound) {
  153. return xerr.Custom("该用户不存在")
  154. }
  155. return xerr.WithStack(err)
  156. }
  157. if err := s.DB.Model(systemUser).
  158. Update("is_delete", operationPb.IsShow_NO).Error; err != nil {
  159. return xerr.WithStack(err)
  160. }
  161. return nil
  162. }
  163. // IsShowSystemUser 用户是否启用
  164. func (s *StoreEntry) IsShowSystemUser(ctx context.Context, userId int64) error {
  165. systemUser := &model.SystemUser{Id: userId}
  166. if err := s.DB.First(systemUser).Error; err != nil {
  167. if errors.Is(err, gorm.ErrRecordNotFound) {
  168. return xerr.Custom("该用户不存在")
  169. }
  170. return xerr.WithStack(err)
  171. }
  172. isShow := pasturePb.IsShow_No
  173. if systemUser.IsShow == pasturePb.IsShow_No {
  174. isShow = pasturePb.IsShow_Ok
  175. }
  176. if err := s.DB.Model(systemUser).Update("is_show", isShow).Error; err != nil {
  177. return xerr.WithStack(err)
  178. }
  179. return nil
  180. }
  181. // SystemUserCreateOrUpdate 创建或者更新系统用户
  182. func (s *StoreEntry) SystemUserCreateOrUpdate(ctx context.Context, req *pasturePb.SearchUserRequest) error {
  183. systemUser := &model.SystemUser{}
  184. if req.Id > 0 {
  185. systemUser.Id = int64(req.Id)
  186. if err := s.DB.Model(new(model.SystemUser)).First(systemUser).Error; err != nil {
  187. return xerr.WithStack(err)
  188. }
  189. req.Password = systemUser.Password
  190. } else {
  191. if err := s.DB.Model(new(model.SystemUser)).
  192. Where("name = ?", req.Name).
  193. First(systemUser).Error; err != nil {
  194. if !errors.Is(err, gorm.ErrRecordNotFound) {
  195. return xerr.WithStack(err)
  196. }
  197. } else if systemUser.Id > 0 {
  198. return xerr.Custom("该用户名称已经存在")
  199. }
  200. }
  201. deptIds := ""
  202. if len(req.DepthList) > 0 {
  203. for _, dept := range req.DepthList {
  204. deptIds += fmt.Sprintf("%d,", dept.Id)
  205. }
  206. }
  207. if len(deptIds) > 0 {
  208. deptIds = strings.TrimRight(deptIds, ",")
  209. }
  210. if err := s.DB.Model(&model.SystemUser{}).
  211. Where(map[string]interface{}{
  212. "id": req.Id,
  213. }).Assign(map[string]interface{}{
  214. "name": req.Name,
  215. "nick_name": req.NickName,
  216. "mobile": req.Mobile,
  217. "gender": req.Gender,
  218. "password": req.Password,
  219. "dept_ids": deptIds,
  220. "remarks": req.Remarks,
  221. "is_delete": operationPb.IsShow_OK,
  222. "is_show": req.IsShow,
  223. }).FirstOrCreate(&model.SystemUser{}).Error; err != nil {
  224. return xerr.WithStack(err)
  225. }
  226. return nil
  227. }
  228. // ResetPasswordSystemUser 重置系统用户密码
  229. func (s *StoreEntry) ResetPasswordSystemUser(ctx context.Context, req *pasturePb.ResetUserPasswordRequest) error {
  230. systemUser := &model.SystemUser{
  231. Id: int64(req.Id),
  232. }
  233. if err := s.DB.First(systemUser).Error; err != nil {
  234. if errors.Is(err, gorm.ErrRecordNotFound) {
  235. return xerr.Custom("该用户不存在")
  236. }
  237. return xerr.WithStack(err)
  238. }
  239. if err := s.DB.Model(systemUser).Update("password", req.Password).Error; err != nil {
  240. return xerr.WithStack(err)
  241. }
  242. return nil
  243. }
  244. func (s *StoreEntry) SystemUserRole(ctx context.Context, userId int64) (*pasturePb.SystemUserRoleResponse, error) {
  245. systemUser := &model.SystemUser{Id: userId}
  246. if err := s.DB.First(systemUser).Error; err != nil {
  247. if errors.Is(err, gorm.ErrRecordNotFound) {
  248. return nil, xerr.Custom("该用户不存在")
  249. }
  250. return nil, xerr.WithStack(err)
  251. }
  252. roleIds := make([]int32, 0)
  253. if len(systemUser.RoleIds) > 0 {
  254. roleIdsString := strings.Split(systemUser.RoleIds, ",")
  255. for _, r := range roleIdsString {
  256. r1, _ := strconv.Atoi(r)
  257. roleIds = append(roleIds, int32(r1))
  258. }
  259. }
  260. return &pasturePb.SystemUserRoleResponse{
  261. Code: http.StatusOK,
  262. Msg: "ok",
  263. Data: &pasturePb.UserRoleData{
  264. RoleIds: roleIds,
  265. },
  266. }, nil
  267. }
  268. func (s *StoreEntry) SystemUserRoleSave(ctx context.Context, req *pasturePb.SystemUserRoleRequest) error {
  269. systemUser := &model.SystemUser{Id: int64(req.UserId)}
  270. if err := s.DB.First(systemUser).Error; err != nil {
  271. if errors.Is(err, gorm.ErrRecordNotFound) {
  272. return xerr.Custom("该用户不存在")
  273. }
  274. return xerr.WithStack(err)
  275. }
  276. systemRoleList := make([]*model.SystemRole, 0)
  277. if err := s.DB.Model(new(model.SystemRole)).
  278. Where("is_delete = ?", pasturePb.IsShow_Ok).
  279. Where("id IN ?", req.RoleIds).
  280. Find(&systemRoleList).Error; err != nil {
  281. if errors.Is(err, gorm.ErrRecordNotFound) {
  282. return xerr.Custom("该角色不存在")
  283. }
  284. return xerr.WithStack(err)
  285. }
  286. roleIdsStr := ""
  287. for _, systemRole := range systemRoleList {
  288. roleIdsStr += fmt.Sprintf("%d,", systemRole.Id)
  289. }
  290. if len(roleIdsStr) > 0 {
  291. roleIdsStr = strings.TrimRight(roleIdsStr, ",")
  292. }
  293. if err := s.DB.Model(systemUser).
  294. Update("role_ids", roleIdsStr).Error; err != nil {
  295. return xerr.WithStack(err)
  296. }
  297. return nil
  298. }
  299. // GetSystemUserMenu 返回系统用户相关菜单权限
  300. func (s *StoreEntry) GetSystemUserMenu(ctx context.Context) (*pasturePb.SystemUserMenuTreeResponse, error) {
  301. // 根据用户token获取用户数据
  302. systemUser, err := s.GetCurrentSystemUser(ctx)
  303. if err != nil {
  304. return nil, xerr.Custom("该用户数据不存在")
  305. }
  306. if len(systemUser.RoleIds) <= 0 {
  307. return nil, xerr.Custom("该用户没有角色")
  308. }
  309. roleIds := strings.Split(systemUser.RoleIds, ",")
  310. // 获取用户角色数据
  311. systemRoleList := make([]*model.SystemRole, 0)
  312. if err = s.DB.Where("id IN ?", roleIds).
  313. Find(&systemRoleList).Error; err != nil {
  314. if errors.Is(err, gorm.ErrRecordNotFound) {
  315. return nil, xerr.Custom("该用户角色不存在")
  316. }
  317. return nil, xerr.WithStack(err)
  318. }
  319. // 获取用户菜单
  320. systemMenuList := make([]*model.SystemMenu, 0)
  321. if err = s.DB.Table(fmt.Sprintf("%s as a", new(model.SystemRoleMenu).TableName())).
  322. Select("b.*").
  323. Joins("LEFT JOIN system_menu AS b ON a.menu_id = b.id").
  324. Where("a.role_id IN ? and b.is_delete = ?", roleIds, pasturePb.IsShow_Ok).
  325. Find(&systemMenuList).Error; err != nil {
  326. return nil, xerr.WithStack(err)
  327. }
  328. // 获取菜单权限
  329. return &pasturePb.SystemUserMenuTreeResponse{
  330. Code: http.StatusOK,
  331. Msg: "ok",
  332. Data: model.SystemMenuSlice(systemMenuList).ToTree(),
  333. }, nil
  334. }
  335. // SystemRoleCreateOrUpdate 添加角色
  336. func (s *StoreEntry) SystemRoleCreateOrUpdate(ctx context.Context, req *pasturePb.SearchRoleRequest) error {
  337. isShow := pasturePb.IsShow_Ok
  338. if req.Id > 0 {
  339. isShow = req.IsShow
  340. }
  341. if err := s.DB.Model(&model.SystemRole{}).Where(map[string]interface{}{
  342. "id": req.Id,
  343. }).Assign(map[string]interface{}{
  344. "name": req.Name,
  345. "remarks": req.Remarks,
  346. "is_delete": operationPb.IsShow_OK,
  347. "is_show": isShow,
  348. }).FirstOrCreate(&model.SystemRole{}).Error; err != nil {
  349. return xerr.WithStack(err)
  350. }
  351. return nil
  352. }
  353. // DeleteSystemRole 删除系统角色
  354. func (s *StoreEntry) DeleteSystemRole(ctx context.Context, roleId int64) error {
  355. systemRole := &model.SystemRole{
  356. Id: roleId,
  357. }
  358. if err := s.DB.First(systemRole).Error; err != nil {
  359. if errors.Is(err, gorm.ErrRecordNotFound) {
  360. return xerr.Custom("该数据不存在")
  361. }
  362. return xerr.WithStack(err)
  363. }
  364. if err := s.DB.Model(systemRole).Update("is_delete", pasturePb.IsShow_No).Error; err != nil {
  365. return xerr.WithStack(err)
  366. }
  367. return nil
  368. }
  369. // IsShowSystemRole 角色是否启用
  370. func (s *StoreEntry) IsShowSystemRole(ctx context.Context, roleId int64) error {
  371. systemRole := &model.SystemRole{
  372. Id: roleId,
  373. }
  374. if err := s.DB.First(systemRole).Error; err != nil {
  375. if errors.Is(err, gorm.ErrRecordNotFound) {
  376. return xerr.Custom("该角色不存在")
  377. }
  378. return xerr.WithStack(err)
  379. }
  380. isShow := pasturePb.IsShow_No
  381. if systemRole.IsShow == pasturePb.IsShow_No {
  382. isShow = pasturePb.IsShow_Ok
  383. }
  384. if err := s.DB.Model(systemRole).Update("is_show", isShow).Error; err != nil {
  385. return xerr.WithStack(err)
  386. }
  387. return nil
  388. }
  389. // SearchSystemRoleList 查询系统角色
  390. func (s *StoreEntry) SearchSystemRoleList(ctx context.Context, req *pasturePb.SearchRoleRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchRoleResponse, error) {
  391. systemRoleList := make([]*model.SystemRole, 0)
  392. var count int64 = 0
  393. pref := s.DB.Model(new(model.SystemRole)).Where("is_delete = ?", operationPb.IsShow_OK)
  394. if req.Name != "" {
  395. pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
  396. }
  397. if req.IsShow > 0 {
  398. pref.Where("is_show = ?", req.IsShow)
  399. }
  400. if err := pref.Order("id desc").Count(&count).Limit(int(pagination.PageSize)).
  401. Offset(int(pagination.PageOffset)).Find(&systemRoleList).Error; err != nil {
  402. return nil, xerr.WithStack(err)
  403. }
  404. return &pasturePb.SearchRoleResponse{
  405. Code: http.StatusOK,
  406. Msg: "ok",
  407. Data: &pasturePb.SearchRoleData{
  408. Page: pagination.Page,
  409. Total: int32(count),
  410. PageSize: pagination.PageSize,
  411. List: model.SystemRoleSlice(systemRoleList).ToPB(),
  412. },
  413. }, nil
  414. }
  415. // SearchSystemRoleListByIds 根据id查询角色列表
  416. func (s *StoreEntry) SearchSystemRoleListByIds(ctx context.Context, ids []int64) ([]*model.SystemRole, error) {
  417. systemRoleList := make([]*model.SystemRole, 0)
  418. if err := s.DB.Model(new(model.SystemRole)).
  419. Where("is_show = ?", operationPb.IsShow_OK).
  420. Find(&systemRoleList, ids).Error; err != nil {
  421. return nil, xerr.WithStack(err)
  422. }
  423. return systemRoleList, nil
  424. }
  425. // GetRoleMenuList 查询系统角色对应的菜单数据
  426. func (s *StoreEntry) GetRoleMenuList(ctx context.Context, roleId int64) (*pasturePb.SystemRoleMenuResponse, error) {
  427. systemRole := &model.SystemRole{
  428. Id: roleId,
  429. }
  430. if err := s.DB.First(systemRole).Error; err != nil {
  431. if errors.Is(err, gorm.ErrRecordNotFound) {
  432. return nil, xerr.Custom("该数据不存在")
  433. }
  434. return nil, xerr.WithStack(err)
  435. }
  436. if systemRole.IsDelete == pasturePb.IsShow_No {
  437. return nil, xerr.Custom("该数据已被删除")
  438. }
  439. menuList := make([]*model.SystemRoleMenu, 0)
  440. if err := s.DB.Where("role_id = ?", systemRole.Id).Find(&menuList).Error; err != nil {
  441. zaplog.Error("GetSystemRoleMenuList", zap.Any("Err", err))
  442. }
  443. return &pasturePb.SystemRoleMenuResponse{
  444. Code: http.StatusOK,
  445. Msg: "ok",
  446. Data: model.SystemRoleMenuSlice(menuList).ToPB(),
  447. }, nil
  448. }
  449. // RoleMenuSave 保存系统角色对应的菜单数据
  450. func (s *StoreEntry) RoleMenuSave(ctx context.Context, res *pasturePb.SystemRoleMenuRequest) error {
  451. if len(res.MenuIds) <= 0 {
  452. return xerr.Custom("请选择菜单")
  453. }
  454. systemRole := &model.SystemRole{
  455. Id: int64(res.RoleId),
  456. }
  457. if err := s.DB.First(systemRole).Error; err != nil {
  458. if errors.Is(err, gorm.ErrRecordNotFound) {
  459. return xerr.Custom("该数据不存在")
  460. }
  461. return xerr.WithStack(err)
  462. }
  463. if err := s.DB.Transaction(func(tx *gorm.DB) error {
  464. if err := tx.Model(new(model.SystemRoleMenu)).Where("role_id = ?", systemRole.Id).Delete(&model.SystemRoleMenu{}).Error; err != nil {
  465. return xerr.WithStack(err)
  466. }
  467. for _, menuId := range res.MenuIds {
  468. if err := tx.Create(&model.SystemRoleMenu{
  469. RoleId: systemRole.Id,
  470. MenuId: int64(menuId),
  471. }).Error; err != nil {
  472. return xerr.WithStack(err)
  473. }
  474. }
  475. return nil
  476. }); err != nil {
  477. return xerr.WithStack(err)
  478. }
  479. return nil
  480. }
  481. func (s *StoreEntry) SystemRoleList(ctx context.Context) (*pasturePb.GetRoleListResponse, error) {
  482. systemRoleList := make([]*model.SystemRole, 0)
  483. if err := s.DB.Model(new(model.SystemRole)).
  484. Where("is_delete = ? and is_show = ?", pasturePb.IsShow_Ok, pasturePb.IsShow_Ok).
  485. Find(&systemRoleList).Error; err != nil {
  486. return nil, xerr.WithStack(err)
  487. }
  488. return &pasturePb.GetRoleListResponse{
  489. Code: http.StatusOK,
  490. Msg: "ok",
  491. Data: model.SystemRoleSlice(systemRoleList).ToPB(),
  492. }, nil
  493. }