TeamMember.go 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. package models
  2. import (
  3. "errors"
  4. "github.com/astaxie/beego"
  5. "github.com/astaxie/beego/orm"
  6. "github.com/mindoc-org/mindoc/conf"
  7. )
  8. type TeamMember struct {
  9. TeamMemberId int `orm:"column(team_member_id);pk;auto;unique;" json:"team_member_id"`
  10. TeamId int `orm:"column(team_id);type(int)" json:"team_id"`
  11. MemberId int `orm:"column(member_id);type(int)" json:"member_id"`
  12. // RoleId 角色:0 创始人(创始人不能被移除) / 1 管理员/2 编辑者/3 观察者
  13. RoleId conf.BookRole `orm:"column(role_id);type(int)" json:"role_id"`
  14. RoleName string `orm:"-" json:"role_name"`
  15. Account string `orm:"-" json:"account"`
  16. RealName string `orm:"-" json:"real_name"`
  17. Avatar string `orm:"-" json:"avatar"`
  18. }
  19. // TableName 获取对应数据库表名.
  20. func (m *TeamMember) TableName() string {
  21. return "team_member"
  22. }
  23. func (m *TeamMember) TableNameWithPrefix() string {
  24. return conf.GetDatabasePrefix() + m.TableName()
  25. }
  26. // TableEngine 获取数据使用的引擎.
  27. func (m *TeamMember) TableEngine() string {
  28. return "INNODB"
  29. }
  30. // 联合唯一键
  31. func (m *TeamMember) TableUnique() [][]string {
  32. return [][]string{{"team_id", "member_id"}}
  33. }
  34. func (m *TeamMember) QueryTable() orm.QuerySeter {
  35. return orm.NewOrm().QueryTable(m.TableNameWithPrefix())
  36. }
  37. func NewTeamMember() *TeamMember {
  38. return &TeamMember{}
  39. }
  40. func (m *TeamMember) First(id int, cols ...string) (*TeamMember, error) {
  41. if id <= 0 {
  42. return nil, errors.New("参数错误")
  43. }
  44. o := orm.NewOrm()
  45. err := o.QueryTable(m.TableNameWithPrefix()).Filter("team_member_id", id).One(m, cols...)
  46. if err != nil && err != orm.ErrNoRows {
  47. beego.Error("查询团队成员错误 ->", err)
  48. }
  49. return m.Include(), err
  50. }
  51. func (m *TeamMember) ChangeRoleId(teamId int, memberId int, roleId conf.BookRole) (member *TeamMember, err error) {
  52. if teamId <= 0 || memberId <= 0 || roleId <= 0 || roleId > conf.BookObserver {
  53. return nil, ErrInvalidParameter
  54. }
  55. o := orm.NewOrm()
  56. err = o.QueryTable(m.TableNameWithPrefix()).Filter("team_id", teamId).Filter("member_id", memberId).OrderBy("-team_member_id").One(m)
  57. if err != nil {
  58. beego.Error("查询团队用户时失败 ->", err)
  59. return m, err
  60. }
  61. m.RoleId = roleId
  62. err = m.Save("role_id")
  63. if err == nil {
  64. m.Include()
  65. }
  66. return m, err
  67. }
  68. //查询团队中指定的用户.
  69. func (m *TeamMember) FindFirst(teamId, memberId int) (*TeamMember, error) {
  70. if teamId <= 0 || memberId <= 0 {
  71. return nil, ErrInvalidParameter
  72. }
  73. o := orm.NewOrm()
  74. err := o.QueryTable(m.TableNameWithPrefix()).Filter("team_id", teamId).Filter("member_id", memberId).One(m)
  75. if err != nil {
  76. beego.Error("查询团队用户失败 ->", err)
  77. return nil, err
  78. }
  79. return m.Include(), nil
  80. }
  81. //更新或插入团队用户.
  82. func (m *TeamMember) Save(cols ...string) (err error) {
  83. if m.TeamId <= 0 {
  84. return errors.New("团队不能为空")
  85. }
  86. if m.MemberId <= 0 {
  87. return errors.New("用户不能为空")
  88. }
  89. o := orm.NewOrm()
  90. if !o.QueryTable(NewTeam().TableNameWithPrefix()).Filter("team_id", m.TeamId).Exist() {
  91. return errors.New("团队不存在")
  92. }
  93. if !o.QueryTable(NewMember()).Filter("member_id", m.MemberId).Filter("status", 0).Exist() {
  94. return errors.New("用户不存在或已禁用")
  95. }
  96. if m.TeamMemberId <= 0 {
  97. if o.QueryTable(m.TableNameWithPrefix()).Filter("team_id", m.TeamId).Filter("member_id", m.MemberId).Exist() {
  98. return errors.New("团队中已存在该用户")
  99. }
  100. _, err = o.Insert(m)
  101. } else {
  102. _, err = o.Update(m, cols...)
  103. }
  104. if err != nil {
  105. beego.Error("在保存团队时出错 ->", err)
  106. }
  107. return
  108. }
  109. //删除一个团队用户.
  110. func (m *TeamMember) Delete(id int) (err error) {
  111. if id <= 0 {
  112. return ErrInvalidParameter
  113. }
  114. _, err = orm.NewOrm().QueryTable(m.TableNameWithPrefix()).Filter("team_member_id", id).Delete()
  115. if err != nil {
  116. beego.Error("删除团队用户时出错 ->", err)
  117. }
  118. return
  119. }
  120. //分页查询团队用户.
  121. func (m *TeamMember) FindToPager(teamId, pageIndex, pageSize int) (list []*TeamMember, totalCount int, err error) {
  122. if teamId <= 0 {
  123. err = ErrInvalidParameter
  124. return
  125. }
  126. offset := (pageIndex - 1) * pageSize
  127. o := orm.NewOrm()
  128. _, err = o.QueryTable(m.TableNameWithPrefix()).Filter("team_id", teamId).Offset(offset).Limit(pageSize).All(&list)
  129. if err != nil {
  130. if err != orm.ErrNoRows {
  131. beego.Error("查询团队成员失败 ->", err)
  132. }
  133. return
  134. }
  135. c, err := o.QueryTable(m.TableNameWithPrefix()).Filter("team_id", teamId).Count()
  136. if err != nil {
  137. return
  138. }
  139. totalCount = int(c)
  140. //将来优化
  141. for _, item := range list {
  142. item.Include()
  143. }
  144. return
  145. }
  146. //查询关联数据.
  147. func (m *TeamMember) Include() *TeamMember {
  148. if member, err := NewMember().Find(m.MemberId, "account", "real_name", "avatar"); err == nil {
  149. m.Account = member.Account
  150. m.RealName = member.RealName
  151. m.Avatar = member.Avatar
  152. }
  153. if m.RoleId == 0 {
  154. m.RoleName = "创始人"
  155. } else if m.RoleId == 1 {
  156. m.RoleName = "管理员"
  157. } else if m.RoleId == 2 {
  158. m.RoleName = "编辑者"
  159. } else if m.RoleId == 3 {
  160. m.RoleName = "观察者"
  161. }
  162. return m
  163. }
  164. //查询未加入团队的用户。
  165. func (m *TeamMember) FindNotJoinMemberByAccount(teamId int, account string, limit int) (*SelectMemberResult, error) {
  166. if teamId <= 0 {
  167. return nil, ErrInvalidParameter
  168. }
  169. o := orm.NewOrm()
  170. sql := `select member.member_id,member.account,member.real_name,team.team_member_id
  171. from md_members as member
  172. left join md_team_member as team on team.team_id = ? and member.member_id = team.member_id
  173. where member.account like ? or member.real_name like ? AND team_member_id IS NULL
  174. order by member.member_id desc
  175. limit ?;`
  176. members := make([]*Member, 0)
  177. _, err := o.Raw(sql, teamId, "%"+account+"%", "%"+account+"%", limit).QueryRows(&members)
  178. if err != nil {
  179. beego.Error("查询团队用户时出错 ->", err)
  180. return nil, err
  181. }
  182. result := SelectMemberResult{}
  183. items := make([]KeyValueItem, 0)
  184. for _, member := range members {
  185. item := KeyValueItem{}
  186. item.Id = member.MemberId
  187. item.Text = member.Account + "(" + member.RealName + ")"
  188. items = append(items, item)
  189. }
  190. result.Result = items
  191. return &result, err
  192. }
  193. func (m *TeamMember) FindByBookIdAndMemberId(bookId, memberId int) (*TeamMember, error) {
  194. if bookId <= 0 || memberId <= 0 {
  195. return nil, ErrInvalidParameter
  196. }
  197. //一个用户可能在多个团队中,且一个项目可能有多个团队参与。因此需要查询用户最大权限。
  198. sql := `select *
  199. from md_team_member as team
  200. where team.team_id in (select rel.team_id from md_team_relationship as rel where rel.book_id = ?)
  201. and team.member_id = ? order by team.role_id asc limit 1;`
  202. o := orm.NewOrm()
  203. err := o.Raw(sql, bookId, memberId).QueryRow(m)
  204. if err != nil {
  205. beego.Error("查询用户项目所在团队失败 ->bookId=", bookId, " memberId=", memberId, err)
  206. return nil, err
  207. }
  208. return m, nil
  209. }