TeamMember.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. package models
  2. import (
  3. "github.com/lifei6671/mindoc/conf"
  4. "errors"
  5. "github.com/astaxie/beego/orm"
  6. "github.com/astaxie/beego"
  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 NewTeamMember() *TeamMember {
  35. return &TeamMember{}
  36. }
  37. func (m *TeamMember) First(id int, cols ...string) (*TeamMember, error) {
  38. if id <= 0 {
  39. return nil, errors.New("参数错误")
  40. }
  41. o := orm.NewOrm()
  42. err := o.QueryTable(m.TableNameWithPrefix()).Filter("team_member_id", id).One(m, cols...)
  43. if err != nil && err != orm.ErrNoRows {
  44. beego.Error("查询团队成员错误 ->", err)
  45. }
  46. return m.Include(), err
  47. }
  48. func (m *TeamMember) ChangeRoleId(teamId int, memberId int, roleId conf.BookRole) (member *TeamMember, err error) {
  49. if teamId <= 0 || memberId <= 0 || roleId <= 0 || roleId > conf.BookObserver {
  50. return nil, ErrInvalidParameter
  51. }
  52. o := orm.NewOrm()
  53. err = o.QueryTable(m.TableNameWithPrefix()).Filter("team_id", teamId).Filter("member_id", memberId).OrderBy("-team_member_id").One(m)
  54. if err != nil {
  55. beego.Error("查询团队用户时失败 ->", err)
  56. return m, err
  57. }
  58. m.RoleId = roleId
  59. err = m.Save("role_id")
  60. if err == nil {
  61. m.Include()
  62. }
  63. return m, err
  64. }
  65. //查询团队中指定的用户.
  66. func (m *TeamMember) FindFirst(teamId, memberId int) (*TeamMember, error) {
  67. if teamId <= 0 || memberId <= 0 {
  68. return nil, ErrInvalidParameter
  69. }
  70. o := orm.NewOrm()
  71. err := o.QueryTable(m.TableNameWithPrefix()).Filter("team_id",teamId).Filter("member_id",memberId).One(m)
  72. if err != nil {
  73. beego.Error("查询团队用户失败 ->",err)
  74. return nil,err
  75. }
  76. return m.Include(),nil
  77. }
  78. //更新或插入团队用户.
  79. func (m *TeamMember) Save(cols ...string) (err error) {
  80. if m.TeamId <= 0 {
  81. return errors.New("团队不能为空")
  82. }
  83. if m.MemberId <= 0 {
  84. return errors.New("用户不能为空")
  85. }
  86. o := orm.NewOrm()
  87. if !o.QueryTable(NewTeam().TableNameWithPrefix()).Filter("team_id", m.TeamId).Exist() {
  88. return errors.New("团队不存在")
  89. }
  90. if !o.QueryTable(NewMember()).Filter("member_id", m.MemberId).Filter("status", 0).Exist() {
  91. return errors.New("用户不存在或已禁用")
  92. }
  93. if m.TeamMemberId <= 0 {
  94. if o.QueryTable(m.TableNameWithPrefix()).Filter("team_id",m.TeamId).Filter("member_id",m.MemberId).Exist() {
  95. return errors.New("团队中已存在该用户")
  96. }
  97. _, err = o.Insert(m)
  98. } else {
  99. _, err = o.Update(m, cols...)
  100. }
  101. if err != nil {
  102. beego.Error("在保存团队时出错 ->", err)
  103. }
  104. return
  105. }
  106. //删除一个团队用户.
  107. func (m *TeamMember) Delete(id int) (err error) {
  108. if id <= 0 {
  109. return ErrInvalidParameter
  110. }
  111. _, err = orm.NewOrm().QueryTable(m.TableNameWithPrefix()).Filter("team_member_id", id).Delete()
  112. if err != nil {
  113. beego.Error("删除团队用户时出错 ->", err)
  114. }
  115. return
  116. }
  117. //分页查询团队用户.
  118. func (m *TeamMember) FindToPager(teamId, pageIndex, pageSize int) (list []*TeamMember, totalCount int, err error) {
  119. if teamId <= 0 {
  120. err = ErrInvalidParameter
  121. return
  122. }
  123. offset := (pageIndex - 1) * pageSize
  124. o := orm.NewOrm()
  125. _, err = o.QueryTable(m.TableNameWithPrefix()).Filter("team_id", teamId).Offset(offset).Limit(pageSize).All(&list)
  126. if err != nil {
  127. if err != orm.ErrNoRows {
  128. beego.Error("查询团队成员失败 ->", err)
  129. }
  130. return
  131. }
  132. c, err := o.QueryTable(m.TableNameWithPrefix()).Filter("team_id", teamId).Count()
  133. if err != nil {
  134. return
  135. }
  136. totalCount = int(c)
  137. //将来优化
  138. for _, item := range list {
  139. item.Include()
  140. }
  141. return
  142. }
  143. //查询关联数据.
  144. func (m *TeamMember) Include() *TeamMember {
  145. if member, err := NewMember().Find(m.MemberId, "account", "real_name", "avatar"); err == nil {
  146. m.Account = member.Account
  147. m.RealName = member.RealName
  148. m.Avatar = member.Avatar
  149. }
  150. if m.RoleId == 0 {
  151. m.RoleName = "创始人"
  152. } else if m.RoleId == 1 {
  153. m.RoleName = "管理员"
  154. } else if m.RoleId == 2 {
  155. m.RoleName = "编辑者"
  156. } else if m.RoleId == 3 {
  157. m.RoleName = "观察者"
  158. }
  159. return m
  160. }
  161. //查询未加入团队的用户。
  162. func (m *TeamMember) FindNotJoinMemberByAccount(teamId int, account string, limit int) (*SelectMemberResult, error) {
  163. if teamId <= 0 {
  164. return nil, ErrInvalidParameter
  165. }
  166. o := orm.NewOrm()
  167. sql := `select member.member_id,member.account
  168. from md_members as member
  169. left join md_team_member as team on team.team_id = ? and member.member_id != team.member_id
  170. where member.account like ? and team.member_id isnull
  171. order by member.member_id desc
  172. limit ?;`
  173. members := make([]*Member, 0)
  174. _, err := o.Raw(sql, teamId, "%"+account+"%", limit).QueryRows(&members)
  175. if err != nil {
  176. beego.Error("查询团队用户时出错 ->", err)
  177. return nil, err
  178. }
  179. result := SelectMemberResult{}
  180. items := make([]KeyValueItem, 0)
  181. for _, member := range members {
  182. item := KeyValueItem{}
  183. item.Id = member.MemberId
  184. item.Text = member.Account
  185. items = append(items, item)
  186. }
  187. result.Result = items
  188. return &result, err
  189. }