2025-04-14 15:42:22 +08:00

101 lines
2.6 KiB
Go

package system
import (
"context"
"management/internal/erpserver/model/dto"
"management/internal/erpserver/model/system"
"management/internal/erpserver/repository"
)
type roleRepository struct {
store repository.Store
}
var _ system.RoleRepository = (*roleRepository)(nil)
func NewRoleRepository(store repository.Store) *roleRepository {
return &roleRepository{
store: store,
}
}
func (r *roleRepository) Create(ctx context.Context, obj *system.Role) error {
return r.store.DB(ctx).Create(obj).Error
}
func (r *roleRepository) Update(ctx context.Context, obj *system.Role) error {
return r.store.DB(ctx).Save(obj).Error
}
func (r *roleRepository) Get(ctx context.Context, id int32) (*system.Role, error) {
var role system.Role
err := r.store.DB(ctx).Where("id = ?", id).First(&role).Error
if err != nil {
return nil, err
}
return &role, nil
}
func (r *roleRepository) All(ctx context.Context) ([]*system.Role, error) {
var roles []*system.Role
err := r.store.DB(ctx).Find(&roles).Error
if err != nil {
return nil, err
}
return roles, nil
}
func (r *roleRepository) List(ctx context.Context, q dto.SearchDto) ([]*system.Role, int64, error) {
query := r.store.DB(ctx).
Model(&system.Role{}).
Where("created_at BETWEEN ? AND ?", q.SearchTimeBegin, q.SearchTimeEnd)
if q.SearchID != 0 {
query = query.Where("id = ?", q.SearchID)
}
if q.SearchParentID != 0 && q.SearchParentID != 1 {
query = query.Where("parent_id = ?", q.SearchParentID)
}
if q.SearchName != "" {
query = query.Where("name LIKE ?", "%"+q.SearchName+"%")
}
if q.SearchStatus != 9999 {
query = query.Where("status = ?", q.SearchStatus)
}
var count int64
err := query.Count(&count).Error
if err != nil {
return nil, 0, err
}
var departs []*system.Role
err = query.
Order("id DESC").
Offset((q.Page - 1) * q.Rows).
Limit(q.Rows).
Find(&departs).Error
if err != nil {
return nil, 0, err
}
return departs, count, nil
}
func (r *roleRepository) RebuildParentPath(ctx context.Context) error {
query := `UPDATE sys_role AS tm
SET parent_path = (SELECT ',' || string_agg(cast(t.parent_id AS VARCHAR), ',') || ','
FROM (WITH RECURSIVE temp (id, parent_id) AS (SELECT id, tm.parent_id
FROM sys_role
WHERE id = tm.id
UNION ALL
SELECT sys_role.id, sys_role.parent_id
FROM sys_role,
temp
WHERE sys_role.id = temp.parent_id)
SELECT id, parent_id
FROM temp
ORDER BY id) AS t)
WHERE tm.status = 0;`
return r.store.DB(ctx).Exec(query).Error
}