| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249 |
- package service
- import (
- "context"
- "dashoo.cn/micro/app/dao"
- "dashoo.cn/micro/app/model"
- "dashoo.cn/opms_libary/myerrors"
- "github.com/gogf/gf/database/gdb"
- "github.com/gogf/gf/frame/g"
- "github.com/gogf/gf/util/gconv"
- "strconv"
- "strings"
- )
- type DeptService struct {
- *contextService
- Dao *dao.SysDeptDao
- roleDeptDao *dao.SysRoleDeptDao
- }
- func NewDeptService(ctx context.Context) (svc *DeptService, err error) {
- svc = new(DeptService)
- if svc.contextService, err = svc.Init(ctx); err != nil {
- return nil, err
- }
- svc.Dao = dao.NewSysDeptDao(svc.Tenant)
- return svc, nil
- }
- func (s *DeptService) GetList(searchParams *model.SysDeptSearchParams) ([]*model.SysDept, error) {
- deptModel := s.Dao.M
- if searchParams.DeptName != "" {
- deptModel = deptModel.WhereLike("dept_name", "%"+searchParams.DeptName+"%")
- }
- if searchParams.Status != "" {
- deptModel = deptModel.Where("status", searchParams.Status)
- }
- depts := ([]*model.SysDept)(nil)
- if err := deptModel.OrderAsc(s.Dao.C.Sort).Scan(&depts); err != nil {
- return nil, err
- }
- list := make([]*model.SysDept, 0, len(depts))
- if searchParams.ExcludeId != 0 {
- for _, v := range depts {
- if searchParams.ExcludeId != v.Id {
- list = append(list, v)
- }
- }
- return list, nil
- } else {
- return depts, nil
- }
- }
- // GetAllDeptName 获取所有部门名称
- func (s *DeptService) GetAllDeptName() (g.MapIntStr, error) {
- depts := ([]*model.SysDept)(nil)
- if err := s.Dao.Fields(s.Dao.C.Id, s.Dao.C.DeptName).Scan(&depts); err != nil {
- return nil, err
- }
- result := make(g.MapIntStr)
- for _, v := range depts {
- result[v.Id] = v.DeptName
- }
- return result, nil
- }
- func (s *DeptService) GetRoleDepts(roleId int) ([]int, error) {
- s.roleDeptDao = dao.NewSysRoleDeptDao(s.Tenant)
- result, err := s.roleDeptDao.Fields(s.roleDeptDao.C.DeptId).Where(s.roleDeptDao.C.RoleId, roleId).Array()
- if err != nil {
- return nil, err
- }
- return gconv.Ints(result), nil
- }
- // GetSonAndSelfIdByParentId 获取本部门下的所有子级部门(包含本部门)
- // enable 仅当为false时才查询包含未启用的子部门
- func (s *DeptService) GetSonAndSelfIdByParentId(deptId int, enable ...bool) ([]int, error) {
- db := s.Dao.Fields(s.Dao.C.Id).Wheref("find_in_set( %d , ancestors )", deptId)
- if !(len(enable) > 0 && !enable[0]) {
- db.Where(s.Dao.C.Status, "10")
- }
- result, err := db.Array()
- if err != nil {
- return nil, err
- }
- return gconv.Ints(result), nil
- }
- func (s *DeptService) FindSonByParentId(depts []*model.SysDept, deptId int) []*model.SysDept {
- children := make([]*model.SysDept, 0, len(depts))
- for _, v := range depts {
- if v.ParentId == deptId {
- children = append(children, v)
- fChildren := s.FindSonByParentId(depts, v.Id)
- children = append(children, fChildren...)
- }
- }
- return children
- }
- func (s *DeptService) GetDeptListTree(pid int, list []*model.SysDept) []*model.SysDeptTreeRes {
- tree := make([]*model.SysDeptTreeRes, 0, len(list))
- for _, v := range list {
- if v.ParentId == pid {
- t := &model.SysDeptTreeRes{
- SysDept: v,
- }
- child := s.GetDeptListTree(v.Id, list)
- if len(child) > 0 {
- t.Children = child
- }
- tree = append(tree, t)
- }
- }
- return tree
- }
- func (s *DeptService) GetDeptById(id int) (dept *model.SysDept, err error) {
- dept, err = s.Dao.WherePri(id).One()
- if err != nil {
- return nil, err
- }
- if dept == nil {
- return nil, myerrors.TipsError("部门不存在")
- }
- return
- }
- func (s *DeptService) Create(req *model.SysDeptReq) (err error) {
- // 检查上级部门
- dept, err := s.GetDeptById(req.ParentId)
- if err != nil {
- return err
- }
- data := new(model.SysDept)
- if err := gconv.Struct(req, data); err != nil {
- return err
- }
- data.Ancestors = dept.Ancestors + "," + gconv.String(dept.Id)
- SetCreatedInfo(data, s.GetCxtUserId(), s.GetCxtUserName())
- //开启事务管理
- err = s.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) (err error) {
- lastId, err := s.Dao.Ctx(ctx).Data(data).InsertAndGetId()
- if err != nil {
- return err
- }
- err = s.setAncestors(ctx, req.ParentId, lastId)
- return err
- })
- return
- }
- func (s *DeptService) UpdateById(req *model.UpdateSysDeptReq) error {
- // 检查上级部门
- dept, err := s.GetDeptById(req.ParentId)
- if err != nil {
- return err
- }
- data := new(model.SysDept)
- if err := gconv.Struct(req, data); err != nil {
- return err
- }
- data.Ancestors = dept.Ancestors + "," + gconv.String(dept.Id)
- SetUpdatedInfo(data, s.GetCxtUserId(), s.GetCxtUserName())
- //开启事务管理
- err = s.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) (err error) {
- _, err = s.Dao.Ctx(ctx).FieldsEx(UpdateFieldEx...).Data(data).WherePri(data.Id).Update()
- if err != nil {
- return myerrors.TipsError("修改失败")
- }
- //修改祖籍字段
- if dept.ParentId != req.ParentId {
- err := s.setAncestors(ctx, req.ParentId, req.Id)
- if err != nil {
- return err
- }
- lId := strconv.FormatInt(req.Id, 10)
- value, _ := s.Dao.Ctx(ctx).Fields(dao.SysDept.C.Ancestors).WhereLike(dao.SysDept.C.Ancestors, "%"+lId+"%").Array()
- if req.ParentId == -1 {
- for _, v := range value {
- newAncestors := strings.Replace(v.String(), dept.Ancestors, lId, -1)
- //修改相关祖籍字段
- _, err := s.Dao.Ctx(ctx).
- Data(dao.SysDept.C.Ancestors, newAncestors).
- Where(dao.SysDept.C.Ancestors, v.String()).Update()
- if err != nil {
- g.Log().Error(err)
- return myerrors.TipsError("关联祖籍修改失败")
- }
- }
- } else {
- //查询现有的进行拼接
- for _, v := range value {
- newAncestors := strings.Replace(dept.Ancestors, lId, "", -1)
- newAncestor := newAncestors + v.String()
- //修改相关祖籍字段
- _, err := s.Dao.Ctx(ctx).
- Data(dao.SysDept.C.Ancestors, newAncestor).
- Where(dao.SysDept.C.Ancestors, v.String()).
- WhereNot(dao.SysDept.C.Id, req.Id).
- Update()
- if err != nil {
- g.Log().Error(err)
- return myerrors.TipsError("关联祖籍修改失败")
- }
- }
- }
- }
- return nil
- })
- return err
- }
- func (s *DeptService) DeleteByIds(id int) error {
- ids, err := s.GetSonAndSelfIdByParentId(id, false)
- if err != nil {
- return err
- }
- _, err = s.Dao.Where(s.Dao.C.Id+" in (?)", ids).Delete()
- return err
- }
- // 修改祖籍字段
- func (s *DeptService) setAncestors(ctx context.Context, ParentId int, lastId int64) (err error) {
- lId := strconv.FormatInt(lastId, 10)
- if ParentId == -1 { //根级别,修改祖籍为自己
- _, err := s.Dao.Ctx(ctx).Data(dao.SysDept.C.Ancestors, lId).WherePri(lastId).Update()
- if err != nil {
- g.Log().Error(err)
- return myerrors.TipsError("祖籍修改失败")
- }
- } else {
- var oldDept *model.SysDept
- err = s.Dao.Ctx(ctx).WherePri(ParentId).Scan(&oldDept)
- if err != nil {
- g.Log().Error(err)
- return myerrors.TipsError("查询祖籍失败")
- }
- _, err := s.Dao.Ctx(ctx).Data(dao.SysDept.C.Ancestors, oldDept.Ancestors+","+lId).WherePri(lastId).Update()
- if err != nil {
- g.Log().Error(err)
- return myerrors.TipsError("祖籍修改失败")
- }
- }
- return
- }
|