system_service_more.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584
  1. package backend
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "kpt-pasture/model"
  7. "net/http"
  8. "gorm.io/gorm"
  9. "go.uber.org/zap"
  10. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  11. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  12. operationPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/operation"
  13. "gitee.com/xuyiping_admin/pkg/xerr"
  14. )
  15. func (s *StoreEntry) SystemMenuTree(ctx context.Context, req *pasturePb.SearchMenuRequest) (*pasturePb.SystemMenuTreeResponse, error) {
  16. userModel, err := s.GetUserModel(ctx)
  17. if err != nil {
  18. return nil, xerr.WithStack(err)
  19. }
  20. systemPastureMenuList := make([]*model.SystemPastureMenu, 0)
  21. if err = s.DB.Model(new(model.SystemPastureMenu)).
  22. Where("pasture_id = ?", userModel.AppPasture.Id).
  23. Find(&systemPastureMenuList).
  24. Error; err != nil {
  25. return nil, xerr.WithStack(err)
  26. }
  27. if len(systemPastureMenuList) <= 0 {
  28. return nil, xerr.Customf("系统菜单未初始化,请联系管理员!")
  29. }
  30. systemMenuList := make([]*model.SystemMenu, 0)
  31. pref := s.DB.Model(new(model.SystemMenu)).
  32. Where("id IN ? ", model.SystemPastureMenuSlice(systemPastureMenuList).GetMenuIds()).
  33. Where("is_delete = ? ", operationPb.IsShow_OK)
  34. if req.Name != "" {
  35. pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
  36. }
  37. if err = pref.Order("parent_id ASC,id ASC").
  38. Find(&systemMenuList).Error; err != nil {
  39. return nil, xerr.WithStack(err)
  40. }
  41. return &pasturePb.SystemMenuTreeResponse{
  42. Code: http.StatusOK,
  43. Msg: "ok",
  44. Data: model.SystemMenuSlice(systemMenuList).ToTree(),
  45. }, nil
  46. }
  47. // SearchSystemMenuList 菜单列表查询
  48. func (s *StoreEntry) SearchSystemMenuList(ctx context.Context, req *pasturePb.SearchMenuRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchMenuResponse, error) {
  49. userModel, err := s.GetUserModel(ctx)
  50. if err != nil {
  51. return nil, xerr.WithStack(err)
  52. }
  53. systemPastureMenuList := make([]*model.SystemPastureMenu, 0)
  54. if err = s.DB.Model(new(model.SystemPastureMenu)).
  55. Where("pasture_id = ?", userModel.AppPasture.Id).
  56. Find(&systemPastureMenuList).
  57. Error; err != nil {
  58. return nil, xerr.WithStack(err)
  59. }
  60. if len(systemPastureMenuList) <= 0 {
  61. return nil, xerr.Customf("系统菜单未初始化,请联系管理员!")
  62. }
  63. systemMenuList := make([]*model.SystemMenu, 0)
  64. var count int64 = 0
  65. pref := s.DB.Model(new(model.SystemMenu)).
  66. Where("id IN ? ", model.SystemPastureMenuSlice(systemPastureMenuList).GetMenuIds()).
  67. Where("is_delete = ? ", operationPb.IsShow_OK)
  68. if req.Name != "" {
  69. pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
  70. }
  71. if err = pref.Order("parent_id").
  72. Count(&count).
  73. Find(&systemMenuList).Error; err != nil {
  74. return nil, xerr.WithStack(err)
  75. }
  76. return &pasturePb.SearchMenuResponse{
  77. Code: http.StatusOK,
  78. Msg: "ok",
  79. Data: &pasturePb.SearchMenuData{
  80. Page: pagination.Page,
  81. Total: int32(count),
  82. PageSize: pagination.PageSize,
  83. List: model.SystemMenuSlice(systemMenuList).ToPB(),
  84. },
  85. }, nil
  86. }
  87. func (s *StoreEntry) SearchSystemDeptList(ctx context.Context, req *pasturePb.SearchDeptRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchDeptResponse, error) {
  88. userModel, err := s.GetUserModel(ctx)
  89. if err != nil {
  90. return nil, xerr.WithStack(err)
  91. }
  92. deptList := make([]*model.SystemDept, 0)
  93. var count int64 = 0
  94. pastureId := userModel.AppPasture.Id
  95. pref := s.DB.Model(new(model.SystemDept)).
  96. Where("pasture_id = ?", pastureId).
  97. Where("is_delete = ?", operationPb.IsShow_OK)
  98. if req.Name != "" {
  99. pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
  100. }
  101. if req.IsShow > 0 {
  102. pref.Where("is_show = ?", req.IsShow)
  103. }
  104. if err = pref.Order("sort desc").
  105. Count(&count).
  106. Limit(int(pagination.PageSize)).
  107. Offset(int(pagination.PageOffset)).
  108. Find(&deptList).Error; err != nil {
  109. return nil, xerr.WithStack(err)
  110. }
  111. systemUserList, _ := s.SystemUserList(ctx, pastureId)
  112. return &pasturePb.SearchDeptResponse{
  113. Code: http.StatusOK,
  114. Msg: "ok",
  115. Data: &pasturePb.DeptData{
  116. List: model.SystemDeptSlice(deptList).ToPB(systemUserList),
  117. Total: int32(count),
  118. PageSize: pagination.PageSize,
  119. Page: pagination.Page,
  120. },
  121. }, nil
  122. }
  123. func (s *StoreEntry) SystemDepthDelete(ctx context.Context, id int64) error {
  124. userModel, err := s.GetUserModel(ctx)
  125. if err != nil {
  126. return xerr.WithStack(err)
  127. }
  128. dept := &model.SystemDept{}
  129. if err = s.DB.Model(new(model.SystemDept)).
  130. Where("id = ?", id).
  131. Where("pasture_id = ?", userModel.AppPasture.Id).
  132. First(dept).Error; err != nil {
  133. return xerr.WithStack(err)
  134. }
  135. if dept.IsInit == pasturePb.IsShow_Ok {
  136. return xerr.Custom("该部门不可删除")
  137. }
  138. if dept.IsShow == pasturePb.IsShow_No {
  139. return nil
  140. }
  141. if err = s.DB.Model(new(model.SystemDept)).
  142. Where("id = ?", id).
  143. Update("is_delete", operationPb.IsShow_NO).
  144. Error; err != nil {
  145. return xerr.WithStack(err)
  146. }
  147. return nil
  148. }
  149. func (s *StoreEntry) SystemDeptCreateOrUpdate(ctx context.Context, req *pasturePb.SearchDeptRequest) error {
  150. userModel, err := s.GetUserModel(ctx)
  151. if err != nil {
  152. return xerr.WithStack(err)
  153. }
  154. pastureId := userModel.AppPasture.Id
  155. if req.Id > 0 {
  156. systemDept := &model.SystemDept{}
  157. if err = s.DB.Model(new(model.SystemDept)).
  158. Where("id = ?", req.Id).
  159. Where("pasture_id = ?", pastureId).
  160. Where("is_delete = ?", pasturePb.IsShow_Ok).
  161. First(systemDept).Error; err != nil {
  162. zaplog.Error("SystemDeptCreateOrUpdate", zap.Any("req", req), zap.Any("err", err))
  163. return xerr.Customf("部门信息错误: %s", err.Error())
  164. }
  165. // 更新部门信息
  166. systemDept.DepthUpdate(req)
  167. if err = s.DB.Model(new(model.SystemDept)).
  168. Where("id = ?", systemDept.Id).
  169. Where("pasture_id = ?", pastureId).
  170. Select("name", "parent_id", "sort", "remarks", "is_show").
  171. Updates(systemDept).Error; err != nil {
  172. return xerr.WithStack(err)
  173. }
  174. } else {
  175. newSystemDepth := model.NewSystemDept(pastureId, req)
  176. if err = s.DB.Model(new(model.SystemDept)).
  177. Create(newSystemDepth).Error; err != nil {
  178. return xerr.WithStack(err)
  179. }
  180. }
  181. return nil
  182. }
  183. func (s *StoreEntry) SearchUserPastureList(ctx context.Context) (*pasturePb.SystemUserPastureListResponse, error) {
  184. currentUser, err := s.GetCurrentSystemUser(ctx)
  185. if err != nil {
  186. return nil, xerr.WithStack(err)
  187. }
  188. farmList, err := s.FindPastureListByIds(ctx, currentUser.GetPastureIds())
  189. if err != nil {
  190. return nil, xerr.WithStack(err)
  191. }
  192. return &pasturePb.SystemUserPastureListResponse{
  193. Code: http.StatusOK,
  194. Msg: "ok",
  195. Data: model.AppPastureListSlice(farmList).ToPB(),
  196. }, err
  197. }
  198. func (s *StoreEntry) SystemDeptTree(ctx context.Context, req *pasturePb.SearchDeptRequest) (*pasturePb.DeptTreeResponse, error) {
  199. currentUser, err := s.GetCurrentSystemUser(ctx)
  200. if err != nil {
  201. return nil, xerr.WithStack(err)
  202. }
  203. pastureIdsStr := currentUser.PastureIds
  204. if pastureIdsStr == "" {
  205. return nil, xerr.Customf("请先将该用户绑定牧场!谢谢!")
  206. }
  207. userModel, err := s.GetUserModel(ctx)
  208. if err != nil {
  209. return nil, xerr.WithStack(err)
  210. }
  211. systemDeptList := make([]*model.SystemDept, 0)
  212. pref := s.DB.Model(new(model.SystemDept)).
  213. Where("is_delete = ?", pasturePb.IsShow_Ok).
  214. Where("pasture_id = ?", userModel.AppPasture.Id)
  215. if req.Name != "" {
  216. pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
  217. }
  218. if req.IsShow > 0 {
  219. pref.Where("is_show = ?", req.IsShow)
  220. }
  221. if err = pref.Find(&systemDeptList).Error; err != nil {
  222. return nil, xerr.WithStack(err)
  223. }
  224. if req.Name != "" {
  225. parentDepths, err := s.findAllParentDepths(ctx, systemDeptList, []int32{int32(userModel.AppPasture.Id)})
  226. if err != nil {
  227. return nil, xerr.WithStack(err)
  228. }
  229. systemDeptList = append(systemDeptList, parentDepths...)
  230. }
  231. // 没有搜到部门数据,默认返回所有牧场一级数据
  232. if len(systemDeptList) == 0 {
  233. systemDeptList = s.SearchDepthPastureList(ctx)
  234. }
  235. return &pasturePb.DeptTreeResponse{
  236. Code: http.StatusOK,
  237. Msg: "ok",
  238. Data: model.SystemDeptSlice(systemDeptList).ToTree(),
  239. }, nil
  240. }
  241. func (s *StoreEntry) SearchDepthPastureList(ctx context.Context) []*model.SystemDept {
  242. systemDeptList := make([]*model.SystemDept, 0)
  243. currentUser, err := s.GetCurrentSystemUser(ctx)
  244. if err != nil {
  245. return systemDeptList
  246. }
  247. pastureIds := currentUser.GetPastureIds()
  248. if err = s.DB.Model(new(model.SystemDept)).
  249. Where("is_delete = ?", pasturePb.IsShow_Ok).
  250. Where("pasture_id IN ?", pastureIds).
  251. Where("parent_id = ?", 0).
  252. Find(&systemDeptList).Error; err != nil {
  253. return systemDeptList
  254. }
  255. return systemDeptList
  256. }
  257. // findAllParentDepths 递归查找所有上级部门
  258. func (s *StoreEntry) findAllParentDepths(ctx context.Context, depths []*model.SystemDept, pastureIds []int32) ([]*model.SystemDept, error) {
  259. var allDepths []*model.SystemDept
  260. var parentIDs []int64
  261. foundDepths := make(map[int64]bool)
  262. // 收集所有需要查找的父部门ID
  263. for _, dept := range depths {
  264. if dept.ParentId > 0 && !foundDepths[dept.ParentId] {
  265. parentIDs = append(parentIDs, dept.ParentId)
  266. foundDepths[dept.ParentId] = true
  267. }
  268. }
  269. if len(parentIDs) == 0 {
  270. return allDepths, nil
  271. }
  272. // 查询这些父部门
  273. var parentDepths []*model.SystemDept
  274. if err := s.DB.Model(new(model.SystemDept)).
  275. Where("id IN ?", parentIDs).
  276. Where("pasture_id IN ?", pastureIds).
  277. Where("is_delete = ?", pasturePb.IsShow_Ok).
  278. Find(&parentDepths).Error; err != nil {
  279. return nil, err
  280. }
  281. // 递归查找更上级的部门
  282. higherParents, err := s.findAllParentDepths(ctx, parentDepths, pastureIds)
  283. if err != nil {
  284. return nil, err
  285. }
  286. allDepths = append(allDepths, parentDepths...)
  287. allDepths = append(allDepths, higherParents...)
  288. return allDepths, nil
  289. }
  290. // SystemRoleCreateOrUpdate 添加角色
  291. func (s *StoreEntry) SystemRoleCreateOrUpdate(ctx context.Context, req *pasturePb.SearchRoleRequest) error {
  292. userModel, err := s.GetUserModel(ctx)
  293. if err != nil {
  294. return xerr.WithStack(err)
  295. }
  296. if req.Id > 0 {
  297. systemRole := &model.SystemRole{}
  298. if err = s.DB.Model(systemRole).
  299. Where("id = ?", req.Id).
  300. Where("pasture_id = ?", userModel.AppPasture.Id).
  301. First(systemRole).Error; err != nil {
  302. return xerr.WithStack(err)
  303. }
  304. if systemRole.IsDelete == pasturePb.IsShow_No {
  305. return xerr.Custom("角色已删除")
  306. }
  307. systemRole.RoleUpdate(req)
  308. if err = s.DB.Model(systemRole).
  309. Select("name", "remarks", "is_show").
  310. Where("id = ?", req.Id).
  311. Where("pasture_id = ?", userModel.AppPasture.Id).
  312. Updates(systemRole).Error; err != nil {
  313. return xerr.WithStack(err)
  314. }
  315. } else {
  316. newSystemRole := model.NewSystemRole(userModel.AppPasture.Id, req)
  317. if err = s.DB.Model(new(model.SystemRole)).Create(newSystemRole).Error; err != nil {
  318. return xerr.WithStack(err)
  319. }
  320. }
  321. return nil
  322. }
  323. // DeleteSystemRole 删除系统角色
  324. func (s *StoreEntry) DeleteSystemRole(ctx context.Context, roleId int64) error {
  325. userModel, err := s.GetUserModel(ctx)
  326. if err != nil {
  327. return xerr.WithStack(err)
  328. }
  329. systemRole := &model.SystemRole{}
  330. if err = s.DB.Model(new(model.SystemRole)).
  331. Where("id = ? ", roleId).
  332. Where("pasture_id = ?", userModel.AppPasture.Id).
  333. Where("is_delete = ?", pasturePb.IsShow_Ok).
  334. First(systemRole).Error; err != nil {
  335. return xerr.WithStack(err)
  336. }
  337. if err = s.DB.Model(systemRole).
  338. Update("is_delete", pasturePb.IsShow_No).Error; err != nil {
  339. return xerr.WithStack(err)
  340. }
  341. return nil
  342. }
  343. // IsShowSystemRole 角色是否启用
  344. func (s *StoreEntry) IsShowSystemRole(ctx context.Context, roleId int64) error {
  345. userModel, err := s.GetUserModel(ctx)
  346. if err != nil {
  347. return xerr.WithStack(err)
  348. }
  349. systemRole := &model.SystemRole{}
  350. if err = s.DB.Model(new(model.SystemRole)).
  351. Where("id = ?", roleId).
  352. Where("pasture_id = ?", userModel.AppPasture.Id).
  353. Where("is_delete = ?", pasturePb.IsShow_Ok).
  354. First(systemRole).Error; err != nil {
  355. if errors.Is(err, gorm.ErrRecordNotFound) {
  356. return xerr.Custom("该角色不存在")
  357. }
  358. return xerr.WithStack(err)
  359. }
  360. isShow := pasturePb.IsShow_No
  361. if systemRole.IsShow == pasturePb.IsShow_No {
  362. isShow = pasturePb.IsShow_Ok
  363. }
  364. if err = s.DB.Model(systemRole).Update("is_show", isShow).Error; err != nil {
  365. return xerr.WithStack(err)
  366. }
  367. return nil
  368. }
  369. // SearchSystemRoleList 查询系统角色
  370. func (s *StoreEntry) SearchSystemRoleList(ctx context.Context, req *pasturePb.SearchRoleRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchRoleResponse, error) {
  371. userModel, err := s.GetUserModel(ctx)
  372. if err != nil {
  373. return nil, xerr.WithStack(err)
  374. }
  375. systemRoleList := make([]*model.SystemRole, 0)
  376. var count int64 = 0
  377. pref := s.DB.Model(new(model.SystemRole)).
  378. Where("pasture_id = ?", userModel.AppPasture.Id).
  379. Where("is_delete = ?", operationPb.IsShow_OK)
  380. if req.Name != "" {
  381. pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
  382. }
  383. if req.IsShow > 0 {
  384. pref.Where("is_show = ?", req.IsShow)
  385. }
  386. if err = pref.Order("is_show asc,id desc").
  387. Count(&count).
  388. Limit(int(pagination.PageSize)).
  389. Offset(int(pagination.PageOffset)).
  390. Find(&systemRoleList).Error; err != nil {
  391. return nil, xerr.WithStack(err)
  392. }
  393. return &pasturePb.SearchRoleResponse{
  394. Code: http.StatusOK,
  395. Msg: "ok",
  396. Data: &pasturePb.SearchRoleData{
  397. Page: pagination.Page,
  398. Total: int32(count),
  399. PageSize: pagination.PageSize,
  400. List: model.SystemRoleSlice(systemRoleList).ToPB(),
  401. },
  402. }, nil
  403. }
  404. // SearchSystemRoleListByIds 根据id查询角色列表
  405. func (s *StoreEntry) SearchSystemRoleListByIds(ctx context.Context, pastureId int64, ids []int64) ([]*model.SystemRole, error) {
  406. systemRoleList := make([]*model.SystemRole, 0)
  407. if err := s.DB.Model(new(model.SystemRole)).
  408. Where("pasture_id = ?", pastureId).
  409. Where("is_show = ?", operationPb.IsShow_OK).
  410. Find(&systemRoleList, ids).Error; err != nil {
  411. return nil, xerr.WithStack(err)
  412. }
  413. return systemRoleList, nil
  414. }
  415. // GetRoleMenuList 查询系统角色对应的菜单数据
  416. func (s *StoreEntry) GetRoleMenuList(ctx context.Context, roleId int64) (*pasturePb.SystemRoleMenuResponse, error) {
  417. systemRole := &model.SystemRole{
  418. Id: roleId,
  419. }
  420. if err := s.DB.First(systemRole).Error; err != nil {
  421. if errors.Is(err, gorm.ErrRecordNotFound) {
  422. return nil, xerr.Custom("该数据不存在")
  423. }
  424. return nil, xerr.WithStack(err)
  425. }
  426. if systemRole.IsDelete == pasturePb.IsShow_No {
  427. return nil, xerr.Custom("该数据已被删除")
  428. }
  429. menuList := make([]*model.SystemRoleMenu, 0)
  430. if err := s.DB.Where("role_id = ?", systemRole.Id).Find(&menuList).Error; err != nil {
  431. zaplog.Error("GetSystemRoleMenuList", zap.Any("Err", err))
  432. }
  433. return &pasturePb.SystemRoleMenuResponse{
  434. Code: http.StatusOK,
  435. Msg: "ok",
  436. Data: model.SystemRoleMenuSlice(menuList).ToPB(),
  437. }, nil
  438. }
  439. // RoleMenuSave 保存系统角色对应的菜单数据
  440. func (s *StoreEntry) RoleMenuSave(ctx context.Context, res *pasturePb.SystemRoleMenuRequest) error {
  441. userModel, err := s.GetUserModel(ctx)
  442. if err != nil {
  443. return xerr.WithStack(err)
  444. }
  445. if len(res.MenuIds) <= 0 {
  446. return xerr.Custom("请选择菜单")
  447. }
  448. systemRole := &model.SystemRole{}
  449. if err = s.DB.Model(new(model.SystemRole)).
  450. Where("id = ?", res.RoleId).
  451. Where("pasture_id = ?", userModel.AppPasture.Id).
  452. First(systemRole).Error; err != nil {
  453. if errors.Is(err, gorm.ErrRecordNotFound) {
  454. return xerr.Custom("该数据不存在")
  455. }
  456. return xerr.WithStack(err)
  457. }
  458. if systemRole.IsDelete == pasturePb.IsShow_No {
  459. return xerr.Custom("该数据已删除")
  460. }
  461. if systemRole.IsShow == pasturePb.IsShow_No {
  462. return xerr.Custom("该数据已禁用")
  463. }
  464. if err = s.DB.Transaction(func(tx *gorm.DB) error {
  465. if err = tx.Model(new(model.SystemRoleMenu)).
  466. Where("role_id = ?", systemRole.Id).
  467. Delete(&model.SystemRoleMenu{}).
  468. Error; err != nil {
  469. return xerr.WithStack(err)
  470. }
  471. newSystemRoleMenuList := model.NewSystemRoleMenu(systemRole.Id, res.MenuIds)
  472. if err = tx.Model(new(model.SystemRoleMenu)).
  473. Create(newSystemRoleMenuList).Error; err != nil {
  474. return xerr.WithStack(err)
  475. }
  476. return nil
  477. }); err != nil {
  478. return xerr.WithStack(err)
  479. }
  480. return nil
  481. }
  482. func (s *StoreEntry) SystemRoleList(ctx context.Context) (*pasturePb.GetRoleListResponse, error) {
  483. userModel, err := s.GetUserModel(ctx)
  484. if err != nil {
  485. return nil, xerr.WithStack(err)
  486. }
  487. systemRoleList := make([]*model.SystemRole, 0)
  488. if err = s.DB.Model(new(model.SystemRole)).
  489. Where("is_delete = ?", pasturePb.IsShow_Ok).
  490. Where("pasture_id = ?", userModel.AppPasture.Id).
  491. Find(&systemRoleList).Error; err != nil {
  492. return nil, xerr.WithStack(err)
  493. }
  494. return &pasturePb.GetRoleListResponse{
  495. Code: http.StatusOK,
  496. Msg: "ok",
  497. Data: model.SystemRoleSlice(systemRoleList).ToPB(),
  498. }, nil
  499. }