sysDeptModel.go 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package dept
  2. import (
  3. "context"
  4. "database/sql"
  5. "errors"
  6. "fmt"
  7. "strings"
  8. "github.com/zeromicro/go-zero/core/stores/cache"
  9. "github.com/zeromicro/go-zero/core/stores/sqlx"
  10. )
  11. var ErrUpdateConflict = errors.New("update conflict: data has been modified by another operation")
  12. var _ SysDeptModel = (*customSysDeptModel)(nil)
  13. type (
  14. SysDeptModel interface {
  15. sysDeptModel
  16. FindAll(ctx context.Context) ([]*SysDept, error)
  17. FindByParentId(ctx context.Context, parentId int64) ([]*SysDept, error)
  18. FindByPathPrefix(ctx context.Context, pathPrefix string) ([]*SysDept, error)
  19. UpdateWithOptLock(ctx context.Context, data *SysDept, expectedUpdateTime int64) error
  20. }
  21. customSysDeptModel struct {
  22. *defaultSysDeptModel
  23. }
  24. )
  25. func NewSysDeptModel(conn sqlx.SqlConn, c cache.CacheConf, cachePrefix string, opts ...cache.Option) SysDeptModel {
  26. return &customSysDeptModel{
  27. defaultSysDeptModel: newSysDeptModel(conn, c, cachePrefix, opts...),
  28. }
  29. }
  30. func (m *customSysDeptModel) FindAll(ctx context.Context) ([]*SysDept, error) {
  31. var list []*SysDept
  32. query := fmt.Sprintf("SELECT %s FROM %s ORDER BY `sort` ASC, `id` ASC", sysDeptRows, m.table)
  33. if err := m.QueryRowsNoCacheCtx(ctx, &list, query); err != nil {
  34. return nil, err
  35. }
  36. return list, nil
  37. }
  38. func (m *customSysDeptModel) FindByParentId(ctx context.Context, parentId int64) ([]*SysDept, error) {
  39. var list []*SysDept
  40. query := fmt.Sprintf("SELECT %s FROM %s WHERE `parentId` = ? ORDER BY `sort` ASC, `id` ASC", sysDeptRows, m.table)
  41. if err := m.QueryRowsNoCacheCtx(ctx, &list, query, parentId); err != nil {
  42. return nil, err
  43. }
  44. return list, nil
  45. }
  46. func (m *customSysDeptModel) FindByPathPrefix(ctx context.Context, pathPrefix string) ([]*SysDept, error) {
  47. escaped := strings.NewReplacer("%", "\\%", "_", "\\_").Replace(pathPrefix)
  48. var list []*SysDept
  49. query := fmt.Sprintf("SELECT %s FROM %s WHERE `path` LIKE ? ORDER BY `sort` ASC, `id` ASC", sysDeptRows, m.table)
  50. if err := m.QueryRowsNoCacheCtx(ctx, &list, query, escaped+"%"); err != nil {
  51. return nil, err
  52. }
  53. return list, nil
  54. }
  55. func (m *customSysDeptModel) UpdateWithOptLock(ctx context.Context, data *SysDept, expectedUpdateTime int64) error {
  56. sysDeptIdKey := fmt.Sprintf("%s%v", cacheSysDeptIdPrefix, data.Id)
  57. res, err := m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (sql.Result, error) {
  58. query := fmt.Sprintf("UPDATE %s SET `name`=?, `sort`=?, `deptType`=?, `remark`=?, `status`=?, `updateTime`=? WHERE `id`=? AND `updateTime`=?", m.table)
  59. return conn.ExecCtx(ctx, query, data.Name, data.Sort, data.DeptType, data.Remark, data.Status, data.UpdateTime, data.Id, expectedUpdateTime)
  60. }, sysDeptIdKey)
  61. if err != nil {
  62. return err
  63. }
  64. affected, _ := res.RowsAffected()
  65. if affected == 0 {
  66. return ErrUpdateConflict
  67. }
  68. return nil
  69. }