system_service_more.go 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. package backend
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "kpt-pasture/model"
  7. "net/http"
  8. "go.uber.org/zap"
  9. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  10. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  11. operationPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/operation"
  12. "gitee.com/xuyiping_admin/pkg/xerr"
  13. "gorm.io/gorm"
  14. )
  15. // CreateOrUpdateSystemMenu 添加或者更新系统菜单权限
  16. func (s *StoreEntry) CreateOrUpdateSystemMenu(ctx context.Context, req *pasturePb.SearchMenuRequest) error {
  17. if req.Id > 0 {
  18. systemMenu := &model.SystemMenu{Id: int64(req.Id)}
  19. if err := s.DB.Model(&model.SystemMenu{}).First(systemMenu).Error; err != nil {
  20. if !errors.Is(err, gorm.ErrRecordNotFound) {
  21. return xerr.WithStack(err)
  22. }
  23. }
  24. }
  25. if err := s.DB.Model(&model.SystemMenu{}).Where(map[string]interface{}{
  26. "id": req.Id,
  27. }).Assign(map[string]interface{}{
  28. "name": req.Name,
  29. "path": req.Path,
  30. "title": req.Title,
  31. "menu_type": req.MenuType,
  32. "parent_id": req.ParentId,
  33. "frame_src": req.FrameSrc,
  34. "frame_loading": model.BooleanToIsShow(req.FrameLoading),
  35. "keepalive": model.BooleanToIsShow(req.Keepalive),
  36. "hidden_tag": model.BooleanToIsShow(req.HiddenTag),
  37. "show_link": model.BooleanToIsShow(req.ShowLink),
  38. "show_parent": model.BooleanToIsShow(req.ShowParent),
  39. "icon": req.Icon,
  40. "component": req.Component,
  41. "redirect": req.Redirect,
  42. "auths": req.Auths,
  43. "rank": req.Rank,
  44. "extra_icon": req.ExtraIcon,
  45. "enter_transition": req.EnterTransition,
  46. "leave_transition": req.LeaveTransition,
  47. "active_path": req.ActivePath,
  48. "is_delete": pasturePb.IsShow_Ok,
  49. "is_show": pasturePb.IsShow_Ok,
  50. }).FirstOrCreate(&model.SystemMenu{}).Error; err != nil {
  51. return xerr.WithStack(err)
  52. }
  53. return nil
  54. }
  55. func (s *StoreEntry) SystemMenuTree(ctx context.Context) (*pasturePb.SystemMenuTreeResponse, error) {
  56. systemMenuList := make([]*model.SystemMenu, 0)
  57. if err := s.DB.Model(new(model.SystemMenu)).Where("is_delete = ?", pasturePb.IsShow_Ok).
  58. Where("is_show = ?", pasturePb.IsShow_Ok).Find(&systemMenuList).Error; err != nil {
  59. return nil, xerr.WithStack(err)
  60. }
  61. return &pasturePb.SystemMenuTreeResponse{
  62. Code: http.StatusOK,
  63. Msg: "ok",
  64. Data: model.SystemMenuSlice(systemMenuList).ToPB(),
  65. }, nil
  66. }
  67. // SearchSystemMenuList 菜单列表查询
  68. func (s *StoreEntry) SearchSystemMenuList(ctx context.Context, req *pasturePb.SearchMenuRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchMenuResponse, error) {
  69. systemMenuList := make([]*model.SystemMenu, 0)
  70. var count int64 = 0
  71. if err := s.DB.Model(new(model.SystemMenu)).
  72. Where("is_delete = ? ", operationPb.IsShow_OK).
  73. Order("parent_id").Count(&count).
  74. Find(&systemMenuList).Error; err != nil {
  75. return nil, xerr.WithStack(err)
  76. }
  77. return &pasturePb.SearchMenuResponse{
  78. Code: http.StatusOK,
  79. Msg: "ok",
  80. Data: &pasturePb.SearchMenuData{
  81. Page: pagination.Page,
  82. Total: int32(count),
  83. PageSize: pagination.PageSize,
  84. List: model.SystemMenuSlice(systemMenuList).ToPB(),
  85. },
  86. }, nil
  87. }
  88. // DeleteSystemMenu 删除系统菜单
  89. func (s *StoreEntry) DeleteSystemMenu(ctx context.Context, menuId int64) error {
  90. systemMenu := &model.SystemMenu{Id: menuId}
  91. if err := s.DB.First(systemMenu).Error; err != nil {
  92. if errors.Is(err, gorm.ErrRecordNotFound) {
  93. return xerr.Custom("该数据不存在")
  94. }
  95. return xerr.WithStack(err)
  96. }
  97. if err := s.DB.Model(systemMenu).Update("is_delete", pasturePb.IsShow_No).Error; err != nil {
  98. return xerr.WithStack(err)
  99. }
  100. return nil
  101. }
  102. func (s *StoreEntry) SearchSystemDeptList(ctx context.Context, req *pasturePb.SearchDeptRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchDeptResponse, error) {
  103. deptList := make([]*model.SystemDept, 0)
  104. var count int64 = 0
  105. pref := s.DB.Model(new(model.SystemDept)).
  106. Where("is_delete = ?", operationPb.IsShow_OK)
  107. if req.Name != "" {
  108. pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
  109. }
  110. if req.IsShow > 0 {
  111. pref.Where("is_show = ?", req.IsShow)
  112. }
  113. if err := pref.Order("sort desc").
  114. Count(&count).
  115. Limit(int(pagination.PageSize)).
  116. Offset(int(pagination.PageOffset)).
  117. Find(&deptList).Error; err != nil {
  118. return nil, xerr.WithStack(err)
  119. }
  120. systemUserList, _ := s.SystemUserList(ctx)
  121. return &pasturePb.SearchDeptResponse{
  122. Code: http.StatusOK,
  123. Msg: "ok",
  124. Data: &pasturePb.DeptData{
  125. List: model.SystemDeptSlice(deptList).ToPB(systemUserList),
  126. Total: int32(count),
  127. PageSize: pagination.PageSize,
  128. Page: pagination.Page,
  129. },
  130. }, nil
  131. }
  132. func (s *StoreEntry) SystemDepDelete(ctx context.Context, id int64) error {
  133. dept := &model.SystemDept{Id: id}
  134. if err := s.DB.First(dept).Error; err != nil {
  135. return xerr.WithStack(err)
  136. }
  137. if dept.IsShow == pasturePb.IsShow_No {
  138. return nil
  139. }
  140. if err := s.DB.Model(dept).Update("is_delete", operationPb.IsShow_NO).Error; err != nil {
  141. return xerr.WithStack(err)
  142. }
  143. return nil
  144. }
  145. func (s *StoreEntry) SystemDeptCreateOrUpdate(ctx context.Context, req *pasturePb.SearchDeptRequest) error {
  146. if req.Id > 0 {
  147. systemDept := &model.SystemDept{}
  148. if err := s.DB.Model(new(model.SystemDept)).
  149. Where("id = ?", req.Id).
  150. Where("pasture_id = ?", req.PastureId).
  151. First(systemDept).Error; err != nil {
  152. zaplog.Error("部门信息错误", zap.Any("req", req))
  153. }
  154. if err := s.DB.Model(systemDept).
  155. Where("id = ?", req.Id).
  156. Where("pasture_id = ?", req.PastureId).
  157. Updates(map[string]interface{}{
  158. "name": req.Name,
  159. "parent_id": req.ParentId,
  160. "sort": req.Sort,
  161. "remarks": req.Remarks,
  162. "is_show": req.IsShow,
  163. "is_delete": req.IsDelete,
  164. }).Error; err != nil {
  165. return xerr.WithStack(err)
  166. }
  167. } else {
  168. newSystemDepth := model.NewSystemDept(req)
  169. if err := s.DB.Model(&model.SystemDept{}).Create(newSystemDepth).Error; err != nil {
  170. return xerr.WithStack(err)
  171. }
  172. }
  173. return nil
  174. }
  175. func (s *StoreEntry) SearchUserPastureList(ctx context.Context) (*pasturePb.SystemUserPastureListResponse, error) {
  176. currentUser, err := s.GetCurrentSystemUser(ctx)
  177. if err != nil {
  178. return nil, xerr.WithStack(err)
  179. }
  180. farmList, err := s.FindPastureList(ctx, currentUser.PastureIds)
  181. if err != nil {
  182. return nil, xerr.WithStack(err)
  183. }
  184. return &pasturePb.SystemUserPastureListResponse{
  185. Code: http.StatusOK,
  186. Msg: "ok",
  187. Data: model.AppPastureListSlice(farmList).ToPB(),
  188. }, err
  189. }
  190. func (s *StoreEntry) SystemDeptTree(ctx context.Context, req *pasturePb.SearchDeptRequest) (*pasturePb.DeptTreeResponse, error) {
  191. currentUser, err := s.GetCurrentSystemUser(ctx)
  192. if err != nil {
  193. return nil, xerr.WithStack(err)
  194. }
  195. pastureIdsStr := currentUser.PastureIds
  196. if pastureIdsStr == "" {
  197. return nil, xerr.Customf("请先将该用户绑定牧场!谢谢!")
  198. }
  199. pastureIds := currentUser.GetPastureIds()
  200. systemDeptList := make([]*model.SystemDept, 0)
  201. pref := s.DB.Model(new(model.SystemDept)).
  202. Where("is_delete = ?", pasturePb.IsShow_Ok)
  203. if req.PastureId > 0 {
  204. pref.Where("pasture_id = ?", req.PastureId)
  205. } else {
  206. pref.Where("pasture_id IN ?", pastureIds)
  207. }
  208. if req.Name != "" {
  209. pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
  210. }
  211. if req.IsShow > 0 {
  212. pref.Where("is_show = ?", req.IsShow)
  213. }
  214. if err = pref.Find(&systemDeptList).Error; err != nil {
  215. return nil, xerr.WithStack(err)
  216. }
  217. if req.Name != "" {
  218. parentDepths, err := s.findAllParentDepths(ctx, systemDeptList, pastureIds)
  219. if err != nil {
  220. return nil, xerr.WithStack(err)
  221. }
  222. systemDeptList = append(systemDeptList, parentDepths...)
  223. }
  224. // 没有搜到部门数据,默认返回所有牧场一级数据
  225. if len(systemDeptList) == 0 {
  226. systemDeptList = s.SearchDepthPastureList(ctx)
  227. }
  228. return &pasturePb.DeptTreeResponse{
  229. Code: http.StatusOK,
  230. Msg: "ok",
  231. Data: model.SystemDeptSlice(systemDeptList).ToTree(),
  232. }, nil
  233. }
  234. func (s *StoreEntry) SearchDepthPastureList(ctx context.Context) []*model.SystemDept {
  235. systemDeptList := make([]*model.SystemDept, 0)
  236. currentUser, err := s.GetCurrentSystemUser(ctx)
  237. if err != nil {
  238. return systemDeptList
  239. }
  240. pastureIds := currentUser.GetPastureIds()
  241. if err = s.DB.Model(new(model.SystemDept)).
  242. Where("is_delete = ?", pasturePb.IsShow_Ok).
  243. Where("pasture_id IN ?", pastureIds).
  244. Where("parent_id = ?", 0).
  245. Find(&systemDeptList).Error; err != nil {
  246. return systemDeptList
  247. }
  248. return systemDeptList
  249. }
  250. // findAllParentDepths 递归查找所有上级部门
  251. func (s *StoreEntry) findAllParentDepths(ctx context.Context, depths []*model.SystemDept, pastureIds []int64) ([]*model.SystemDept, error) {
  252. var allDepths []*model.SystemDept
  253. var parentIDs []int64
  254. foundDepths := make(map[int64]bool)
  255. // 收集所有需要查找的父部门ID
  256. for _, dept := range depths {
  257. if dept.ParentId > 0 && !foundDepths[dept.ParentId] {
  258. parentIDs = append(parentIDs, dept.ParentId)
  259. foundDepths[dept.ParentId] = true
  260. }
  261. }
  262. if len(parentIDs) == 0 {
  263. return allDepths, nil
  264. }
  265. // 查询这些父部门
  266. var parentDepths []*model.SystemDept
  267. if err := s.DB.Model(new(model.SystemDept)).
  268. Where("id IN ?", parentIDs).
  269. Where("pasture_id IN ?", pastureIds).
  270. Where("is_delete = ?", pasturePb.IsShow_Ok).
  271. Find(&parentDepths).Error; err != nil {
  272. return nil, err
  273. }
  274. // 递归查找更上级的部门
  275. higherParents, err := s.findAllParentDepths(ctx, parentDepths, pastureIds)
  276. if err != nil {
  277. return nil, err
  278. }
  279. allDepths = append(allDepths, parentDepths...)
  280. allDepths = append(allDepths, higherParents...)
  281. return allDepths, nil
  282. }