sysProductMemberModel.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package productmember
  2. import (
  3. "context"
  4. "fmt"
  5. "strings"
  6. "perms-system-server/internal/consts"
  7. "github.com/zeromicro/go-zero/core/stores/cache"
  8. "github.com/zeromicro/go-zero/core/stores/sqlx"
  9. )
  10. var _ SysProductMemberModel = (*customSysProductMemberModel)(nil)
  11. type (
  12. SysProductMemberModel interface {
  13. sysProductMemberModel
  14. FindListByProductCode(ctx context.Context, productCode string, page, pageSize int64) ([]*SysProductMember, int64, error)
  15. FindMapByProductCodeUserIds(ctx context.Context, productCode string, userIds []int64) (map[int64]*SysProductMember, error)
  16. CountActiveAdmins(ctx context.Context, productCode string) (int64, error)
  17. CountActiveAdminsTx(ctx context.Context, session sqlx.Session, productCode string) (int64, error)
  18. FindOneForUpdateTx(ctx context.Context, session sqlx.Session, id int64) (*SysProductMember, error)
  19. }
  20. customSysProductMemberModel struct {
  21. *defaultSysProductMemberModel
  22. }
  23. )
  24. func NewSysProductMemberModel(conn sqlx.SqlConn, c cache.CacheConf, cachePrefix string, opts ...cache.Option) SysProductMemberModel {
  25. return &customSysProductMemberModel{
  26. defaultSysProductMemberModel: newSysProductMemberModel(conn, c, cachePrefix, opts...),
  27. }
  28. }
  29. func (m *customSysProductMemberModel) FindListByProductCode(ctx context.Context, productCode string, page, pageSize int64) ([]*SysProductMember, int64, error) {
  30. var total int64
  31. countQuery := fmt.Sprintf("SELECT COUNT(*) FROM %s WHERE `productCode` = ?", m.table)
  32. if err := m.QueryRowNoCacheCtx(ctx, &total, countQuery, productCode); err != nil {
  33. return nil, 0, err
  34. }
  35. var list []*SysProductMember
  36. query := fmt.Sprintf("SELECT %s FROM %s WHERE `productCode` = ? ORDER BY id DESC LIMIT ?,?", sysProductMemberRows, m.table)
  37. if err := m.QueryRowsNoCacheCtx(ctx, &list, query, productCode, (page-1)*pageSize, pageSize); err != nil {
  38. return nil, 0, err
  39. }
  40. return list, total, nil
  41. }
  42. func (m *customSysProductMemberModel) CountActiveAdmins(ctx context.Context, productCode string) (int64, error) {
  43. var count int64
  44. query := fmt.Sprintf("SELECT COUNT(*) FROM %s WHERE `productCode` = ? AND `memberType` = ? AND `status` = ?", m.table)
  45. if err := m.QueryRowNoCacheCtx(ctx, &count, query, productCode, consts.MemberTypeAdmin, consts.StatusEnabled); err != nil {
  46. return 0, err
  47. }
  48. return count, nil
  49. }
  50. func (m *customSysProductMemberModel) CountActiveAdminsTx(ctx context.Context, session sqlx.Session, productCode string) (int64, error) {
  51. var ids []int64
  52. query := fmt.Sprintf("SELECT `id` FROM %s WHERE `productCode` = ? AND `memberType` = ? AND `status` = ? FOR UPDATE", m.table)
  53. if err := session.QueryRowsCtx(ctx, &ids, query, productCode, consts.MemberTypeAdmin, consts.StatusEnabled); err != nil {
  54. return 0, err
  55. }
  56. return int64(len(ids)), nil
  57. }
  58. func (m *customSysProductMemberModel) FindOneForUpdateTx(ctx context.Context, session sqlx.Session, id int64) (*SysProductMember, error) {
  59. var data SysProductMember
  60. query := fmt.Sprintf("SELECT %s FROM %s WHERE `id` = ? FOR UPDATE", sysProductMemberRows, m.table)
  61. if err := session.QueryRowCtx(ctx, &data, query, id); err != nil {
  62. return nil, err
  63. }
  64. return &data, nil
  65. }
  66. func (m *customSysProductMemberModel) FindMapByProductCodeUserIds(ctx context.Context, productCode string, userIds []int64) (map[int64]*SysProductMember, error) {
  67. if len(userIds) == 0 {
  68. return make(map[int64]*SysProductMember), nil
  69. }
  70. placeholders := make([]string, len(userIds))
  71. args := make([]interface{}, 0, len(userIds)+1)
  72. args = append(args, productCode)
  73. for i, id := range userIds {
  74. placeholders[i] = "?"
  75. args = append(args, id)
  76. }
  77. var list []*SysProductMember
  78. query := fmt.Sprintf("SELECT %s FROM %s WHERE `productCode` = ? AND `userId` IN (%s)", sysProductMemberRows, m.table, strings.Join(placeholders, ","))
  79. if err := m.QueryRowsNoCacheCtx(ctx, &list, query, args...); err != nil {
  80. return nil, err
  81. }
  82. result := make(map[int64]*SysProductMember, len(list))
  83. for _, pm := range list {
  84. result[pm.UserId] = pm
  85. }
  86. return result, nil
  87. }