sys_dept.go 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. package service
  2. import (
  3. "context"
  4. "dashoo.cn/micro/app/dao"
  5. "dashoo.cn/micro/app/model"
  6. "dashoo.cn/opms_libary/myerrors"
  7. "github.com/gogf/gf/database/gdb"
  8. "github.com/gogf/gf/frame/g"
  9. "github.com/gogf/gf/util/gconv"
  10. "strconv"
  11. "strings"
  12. )
  13. type DeptService struct {
  14. *contextService
  15. Dao *dao.SysDeptDao
  16. roleDeptDao *dao.SysRoleDeptDao
  17. }
  18. func NewDeptService(ctx context.Context) (svc *DeptService, err error) {
  19. svc = new(DeptService)
  20. if svc.contextService, err = svc.Init(ctx); err != nil {
  21. return nil, err
  22. }
  23. svc.Dao = dao.NewSysDeptDao(svc.Tenant)
  24. return svc, nil
  25. }
  26. func (s *DeptService) GetList(searchParams *model.SysDeptSearchParams) ([]*model.SysDept, error) {
  27. deptModel := s.Dao.M
  28. if searchParams.DeptName != "" {
  29. deptModel = deptModel.WhereLike("dept_name", "%"+searchParams.DeptName+"%")
  30. }
  31. if searchParams.Status != "" {
  32. deptModel = deptModel.Where("status", searchParams.Status)
  33. }
  34. depts := ([]*model.SysDept)(nil)
  35. if err := deptModel.OrderAsc(s.Dao.C.Sort).Scan(&depts); err != nil {
  36. return nil, err
  37. }
  38. list := make([]*model.SysDept, 0, len(depts))
  39. if searchParams.ExcludeId != 0 {
  40. for _, v := range depts {
  41. if searchParams.ExcludeId != v.Id {
  42. list = append(list, v)
  43. }
  44. }
  45. return list, nil
  46. } else {
  47. return depts, nil
  48. }
  49. }
  50. // GetAllDeptName 获取所有部门名称
  51. func (s *DeptService) GetAllDeptName() (g.MapIntStr, error) {
  52. depts := ([]*model.SysDept)(nil)
  53. if err := s.Dao.Fields(s.Dao.C.Id, s.Dao.C.DeptName).Scan(&depts); err != nil {
  54. return nil, err
  55. }
  56. result := make(g.MapIntStr)
  57. for _, v := range depts {
  58. result[v.Id] = v.DeptName
  59. }
  60. return result, nil
  61. }
  62. func (s *DeptService) GetRoleDepts(roleId int) ([]int, error) {
  63. s.roleDeptDao = dao.NewSysRoleDeptDao(s.Tenant)
  64. result, err := s.roleDeptDao.Fields(s.roleDeptDao.C.DeptId).Where(s.roleDeptDao.C.RoleId, roleId).Array()
  65. if err != nil {
  66. return nil, err
  67. }
  68. return gconv.Ints(result), nil
  69. }
  70. // GetSonAndSelfIdByParentId 获取本部门下的所有子级部门(包含本部门)
  71. // enable 仅当为false时才查询包含未启用的子部门
  72. func (s *DeptService) GetSonAndSelfIdByParentId(deptId int, enable ...bool) ([]int, error) {
  73. db := s.Dao.Fields(s.Dao.C.Id).Wheref("find_in_set( %d , ancestors )", deptId)
  74. if !(len(enable) > 0 && !enable[0]) {
  75. db.Where(s.Dao.C.Status, "10")
  76. }
  77. result, err := db.Array()
  78. if err != nil {
  79. return nil, err
  80. }
  81. return gconv.Ints(result), nil
  82. }
  83. func (s *DeptService) FindSonByParentId(depts []*model.SysDept, deptId int) []*model.SysDept {
  84. children := make([]*model.SysDept, 0, len(depts))
  85. for _, v := range depts {
  86. if v.ParentId == deptId {
  87. children = append(children, v)
  88. fChildren := s.FindSonByParentId(depts, v.Id)
  89. children = append(children, fChildren...)
  90. }
  91. }
  92. return children
  93. }
  94. func (s *DeptService) GetDeptListTree(pid int, list []*model.SysDept) []*model.SysDeptTreeRes {
  95. tree := make([]*model.SysDeptTreeRes, 0, len(list))
  96. for _, v := range list {
  97. if v.ParentId == pid {
  98. t := &model.SysDeptTreeRes{
  99. SysDept: v,
  100. }
  101. child := s.GetDeptListTree(v.Id, list)
  102. if len(child) > 0 {
  103. t.Children = child
  104. }
  105. tree = append(tree, t)
  106. }
  107. }
  108. return tree
  109. }
  110. func (s *DeptService) GetDeptById(id int) (dept *model.SysDept, err error) {
  111. dept, err = s.Dao.WherePri(id).One()
  112. if err != nil {
  113. return nil, err
  114. }
  115. if dept == nil {
  116. return nil, myerrors.TipsError("部门不存在")
  117. }
  118. return
  119. }
  120. func (s *DeptService) Create(req *model.SysDeptReq) (err error) {
  121. // 检查上级部门
  122. dept, err := s.GetDeptById(req.ParentId)
  123. if err != nil {
  124. return err
  125. }
  126. data := new(model.SysDept)
  127. if err := gconv.Struct(req, data); err != nil {
  128. return err
  129. }
  130. data.Ancestors = dept.Ancestors + "," + gconv.String(dept.Id)
  131. SetCreatedInfo(data, s.GetCxtUserId(), s.GetCxtUserName())
  132. //开启事务管理
  133. err = s.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) (err error) {
  134. lastId, err := s.Dao.Ctx(ctx).Data(data).InsertAndGetId()
  135. if err != nil {
  136. return err
  137. }
  138. err = s.setAncestors(ctx, req.ParentId, lastId)
  139. return err
  140. })
  141. return
  142. }
  143. func (s *DeptService) UpdateById(req *model.UpdateSysDeptReq) error {
  144. // 检查上级部门
  145. dept, err := s.GetDeptById(req.ParentId)
  146. if err != nil {
  147. return err
  148. }
  149. data := new(model.SysDept)
  150. if err := gconv.Struct(req, data); err != nil {
  151. return err
  152. }
  153. data.Ancestors = dept.Ancestors + "," + gconv.String(dept.Id)
  154. SetUpdatedInfo(data, s.GetCxtUserId(), s.GetCxtUserName())
  155. //开启事务管理
  156. err = s.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) (err error) {
  157. _, err = s.Dao.Ctx(ctx).FieldsEx(UpdateFieldEx...).Data(data).WherePri(data.Id).Update()
  158. if err != nil {
  159. return myerrors.TipsError("修改失败")
  160. }
  161. //修改祖籍字段
  162. if dept.ParentId != req.ParentId {
  163. err := s.setAncestors(ctx, req.ParentId, req.Id)
  164. if err != nil {
  165. return err
  166. }
  167. lId := strconv.FormatInt(req.Id, 10)
  168. value, _ := s.Dao.Ctx(ctx).Fields(dao.SysDept.C.Ancestors).WhereLike(dao.SysDept.C.Ancestors, "%"+lId+"%").Array()
  169. if req.ParentId == -1 {
  170. for _, v := range value {
  171. newAncestors := strings.Replace(v.String(), dept.Ancestors, lId, -1)
  172. //修改相关祖籍字段
  173. _, err := s.Dao.Ctx(ctx).
  174. Data(dao.SysDept.C.Ancestors, newAncestors).
  175. Where(dao.SysDept.C.Ancestors, v.String()).Update()
  176. if err != nil {
  177. g.Log().Error(err)
  178. return myerrors.TipsError("关联祖籍修改失败")
  179. }
  180. }
  181. } else {
  182. //查询现有的进行拼接
  183. for _, v := range value {
  184. newAncestors := strings.Replace(dept.Ancestors, lId, "", -1)
  185. newAncestor := newAncestors + v.String()
  186. //修改相关祖籍字段
  187. _, err := s.Dao.Ctx(ctx).
  188. Data(dao.SysDept.C.Ancestors, newAncestor).
  189. Where(dao.SysDept.C.Ancestors, v.String()).
  190. WhereNot(dao.SysDept.C.Id, req.Id).
  191. Update()
  192. if err != nil {
  193. g.Log().Error(err)
  194. return myerrors.TipsError("关联祖籍修改失败")
  195. }
  196. }
  197. }
  198. }
  199. return nil
  200. })
  201. return err
  202. }
  203. func (s *DeptService) DeleteByIds(id int) error {
  204. ids, err := s.GetSonAndSelfIdByParentId(id, false)
  205. if err != nil {
  206. return err
  207. }
  208. _, err = s.Dao.Where(s.Dao.C.Id+" in (?)", ids).Delete()
  209. return err
  210. }
  211. // 修改祖籍字段
  212. func (s *DeptService) setAncestors(ctx context.Context, ParentId int, lastId int64) (err error) {
  213. lId := strconv.FormatInt(lastId, 10)
  214. if ParentId == -1 { //根级别,修改祖籍为自己
  215. _, err := s.Dao.Ctx(ctx).Data(dao.SysDept.C.Ancestors, lId).WherePri(lastId).Update()
  216. if err != nil {
  217. g.Log().Error(err)
  218. return myerrors.TipsError("祖籍修改失败")
  219. }
  220. } else {
  221. var oldDept *model.SysDept
  222. err = s.Dao.Ctx(ctx).WherePri(ParentId).Scan(&oldDept)
  223. if err != nil {
  224. g.Log().Error(err)
  225. return myerrors.TipsError("查询祖籍失败")
  226. }
  227. _, err := s.Dao.Ctx(ctx).Data(dao.SysDept.C.Ancestors, oldDept.Ancestors+","+lId).WherePri(lastId).Update()
  228. if err != nil {
  229. g.Log().Error(err)
  230. return myerrors.TipsError("祖籍修改失败")
  231. }
  232. }
  233. return
  234. }