优化结构

This commit is contained in:
Yvan
2026-08-22 12:13:16 +08:00
parent d987244d0e
commit b27a66e9d3
200 changed files with 1794 additions and 1715 deletions
+33 -32
View File
@@ -2,12 +2,13 @@ package system
import (
"context"
"kra/internal/biz/system"
"sort"
"time"
"gorm.io/gorm"
"kra/internal/biz"
"kra/pkg/database/pagination"
"gorm.io/gorm"
)
type versionPO struct {
@@ -25,11 +26,11 @@ func (versionPO) TableName() string { return "sys_versions" }
type versionRepo struct{ data Provider }
func NewVersionRepo(data Provider) biz.VersionRepo { return &versionRepo{data: data} }
func versionFromPO(v versionPO) *biz.Version {
return &biz.Version{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, Name: v.Name, Code: v.Code, Description: v.Description, Data: v.Data}
func NewVersionRepo(data Provider) system.VersionRepo { return &versionRepo{data: data} }
func versionFromPO(v versionPO) *system.Version {
return &system.Version{ID: v.ID, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, Name: v.Name, Code: v.Code, Description: v.Description, Data: v.Data}
}
func (r *versionRepo) CreateVersion(ctx context.Context, v *biz.Version) error {
func (r *versionRepo) CreateVersion(ctx context.Context, v *system.Version) error {
po := versionPO{Name: v.Name, Code: v.Code, Description: v.Description, Data: v.Data}
if err := r.data.DB().WithContext(ctx).Create(&po).Error; err != nil {
return err
@@ -40,14 +41,14 @@ func (r *versionRepo) CreateVersion(ctx context.Context, v *biz.Version) error {
func (r *versionRepo) DeleteVersions(ctx context.Context, ids []uint) error {
return r.data.DB().WithContext(ctx).Where("id IN ?", ids).Delete(&versionPO{}).Error
}
func (r *versionRepo) FindVersion(ctx context.Context, id uint) (*biz.Version, error) {
func (r *versionRepo) FindVersion(ctx context.Context, id uint) (*system.Version, error) {
var po versionPO
if err := r.data.DB().WithContext(ctx).First(&po, id).Error; err != nil {
return nil, err
}
return versionFromPO(po), nil
}
func (r *versionRepo) ListVersions(ctx context.Context, page, size int, name, code string, createdAtRange []*time.Time) ([]*biz.Version, int64, error) {
func (r *versionRepo) ListVersions(ctx context.Context, page, size int, name, code string, createdAtRange []*time.Time) ([]*system.Version, int64, error) {
db := r.data.DB().WithContext(ctx).Model(&versionPO{})
if len(createdAtRange) == 2 && createdAtRange[0] != nil && createdAtRange[1] != nil {
db = db.Where("created_at BETWEEN ? AND ?", createdAtRange[0], createdAtRange[1])
@@ -66,21 +67,21 @@ func (r *versionRepo) ListVersions(ctx context.Context, page, size int, name, co
if err := pagination.Apply(db, page, size, 100).Find(&pos).Error; err != nil {
return nil, 0, err
}
out := make([]*biz.Version, 0, len(pos))
out := make([]*system.Version, 0, len(pos))
for _, po := range pos {
out = append(out, versionFromPO(po))
}
return out, total, nil
}
func (r *versionRepo) BuildVersionBundle(ctx context.Context, menuIDs, apiIDs, dictIDs []uint) (*biz.VersionBundle, error) {
bundle := &biz.VersionBundle{}
func (r *versionRepo) BuildVersionBundle(ctx context.Context, menuIDs, apiIDs, dictIDs []uint) (*system.VersionBundle, error) {
bundle := &system.VersionBundle{}
var menus []menuPO
if len(menuIDs) > 0 {
if err := r.data.DB().WithContext(ctx).Where("id IN ?", menuIDs).Order("sort,id").Find(&menus).Error; err != nil {
return nil, &biz.VersionStageError{Stage: biz.VersionStageMenus, Err: err}
return nil, &system.VersionStageError{Stage: system.VersionStageMenus, Err: err}
}
}
byID := map[uint]*biz.Menu{}
byID := map[uint]*system.Menu{}
for _, po := range menus {
v := menuFromPO(po)
byID[po.ID] = v
@@ -88,20 +89,20 @@ func (r *versionRepo) BuildVersionBundle(ctx context.Context, menuIDs, apiIDs, d
if len(menuIDs) > 0 {
var buttons []menuButtonPO
if err := r.data.DB().WithContext(ctx).Where("sys_base_menu_id IN ?", menuIDs).Find(&buttons).Error; err != nil {
return nil, &biz.VersionStageError{Stage: biz.VersionStageMenus, Err: err}
return nil, &system.VersionStageError{Stage: system.VersionStageMenus, Err: err}
}
for _, button := range buttons {
if menu := byID[button.MenuID]; menu != nil {
menu.Buttons = append(menu.Buttons, &biz.MenuButton{Name: button.Name, Description: button.Description})
menu.Buttons = append(menu.Buttons, &system.MenuButton{Name: button.Name, Description: button.Description})
}
}
var parameters []menuParameterPO
if err := r.data.DB().WithContext(ctx).Where("sys_base_menu_id IN ?", menuIDs).Find(&parameters).Error; err != nil {
return nil, &biz.VersionStageError{Stage: biz.VersionStageMenus, Err: err}
return nil, &system.VersionStageError{Stage: system.VersionStageMenus, Err: err}
}
for _, parameter := range parameters {
if menu := byID[parameter.MenuID]; menu != nil {
menu.Parameters = append(menu.Parameters, &biz.MenuParameter{Type: parameter.Type, Key: parameter.Key, Value: parameter.Value})
menu.Parameters = append(menu.Parameters, &system.MenuParameter{Type: parameter.Type, Key: parameter.Key, Value: parameter.Value})
}
}
}
@@ -113,16 +114,16 @@ func (r *versionRepo) BuildVersionBundle(ctx context.Context, menuIDs, apiIDs, d
bundle.Menus = append(bundle.Menus, v)
}
}
var sortMenus func([]*biz.Menu)
sortMenus = func(items []*biz.Menu) {
var sortMenus func([]*system.Menu)
sortMenus = func(items []*system.Menu) {
sort.Slice(items, func(i, j int) bool { return items[i].Sort < items[j].Sort })
for _, item := range items {
sortMenus(item.Children)
}
}
sortMenus(bundle.Menus)
var cleanMenu func(*biz.Menu)
cleanMenu = func(menu *biz.Menu) {
var cleanMenu func(*system.Menu)
cleanMenu = func(menu *system.Menu) {
menu.ID = 0
menu.ParentID = 0
for _, button := range menu.Buttons {
@@ -144,7 +145,7 @@ func (r *versionRepo) BuildVersionBundle(ctx context.Context, menuIDs, apiIDs, d
var apis []apiPO
if len(apiIDs) > 0 {
if err := r.data.DB().WithContext(ctx).Where("id IN ?", apiIDs).Find(&apis).Error; err != nil {
return nil, &biz.VersionStageError{Stage: biz.VersionStageAPIs, Err: err}
return nil, &system.VersionStageError{Stage: system.VersionStageAPIs, Err: err}
}
}
for _, po := range apis {
@@ -155,16 +156,16 @@ func (r *versionRepo) BuildVersionBundle(ctx context.Context, menuIDs, apiIDs, d
var dictionaries []dictionaryPO
if len(dictIDs) > 0 {
if err := r.data.DB().WithContext(ctx).Where("id IN ?", dictIDs).Find(&dictionaries).Error; err != nil {
return nil, &biz.VersionStageError{Stage: biz.VersionStageDictionaries, Err: err}
return nil, &system.VersionStageError{Stage: system.VersionStageDictionaries, Err: err}
}
}
dictionariesRepo := &dictionaryRepo{data: r.data}
for _, po := range dictionaries {
v := dictionaryFromPO(po)
v.ID = 0
details, _, err := dictionariesRepo.ListDictionaryDetails(ctx, 0, 0, biz.DictionaryDetailFilter{DictionaryID: po.ID})
details, _, err := dictionariesRepo.ListDictionaryDetails(ctx, 0, 0, system.DictionaryDetailFilter{DictionaryID: po.ID})
if err != nil {
return nil, &biz.VersionStageError{Stage: biz.VersionStageDictionaries, Err: err}
return nil, &system.VersionStageError{Stage: system.VersionStageDictionaries, Err: err}
}
for _, d := range details {
d.ID = 0
@@ -178,27 +179,27 @@ func (r *versionRepo) BuildVersionBundle(ctx context.Context, menuIDs, apiIDs, d
}
return bundle, nil
}
func (r *versionRepo) ImportVersionBundle(ctx context.Context, b *biz.VersionBundle) error {
func (r *versionRepo) ImportVersionBundle(ctx context.Context, b *system.VersionBundle) error {
db := r.data.DB().WithContext(ctx)
if len(b.Menus) > 0 {
if err := db.Transaction(func(tx *gorm.DB) error { return importVersionMenus(tx, b.Menus, 0) }); err != nil {
return &biz.VersionStageError{Stage: biz.VersionStageMenus, Err: err}
return &system.VersionStageError{Stage: system.VersionStageMenus, Err: err}
}
}
if len(b.APIs) > 0 {
if err := db.Transaction(func(tx *gorm.DB) error { return importVersionAPIs(tx, b.APIs) }); err != nil {
return &biz.VersionStageError{Stage: biz.VersionStageAPIs, Err: err}
return &system.VersionStageError{Stage: system.VersionStageAPIs, Err: err}
}
}
if len(b.Dictionaries) > 0 {
if err := db.Transaction(func(tx *gorm.DB) error { return importVersionDictionaries(tx, b.Dictionaries) }); err != nil {
return &biz.VersionStageError{Stage: biz.VersionStageDictionaries, Err: err}
return &system.VersionStageError{Stage: system.VersionStageDictionaries, Err: err}
}
}
return nil
}
func importVersionMenus(tx *gorm.DB, items []*biz.Menu, parentID uint) error {
func importVersionMenus(tx *gorm.DB, items []*system.Menu, parentID uint) error {
for _, item := range items {
var existing menuPO
if err := tx.Where("name = ? AND path = ?", item.Name, item.Path).First(&existing).Error; err == nil {
@@ -230,7 +231,7 @@ func importVersionMenus(tx *gorm.DB, items []*biz.Menu, parentID uint) error {
return nil
}
func importVersionAPIs(tx *gorm.DB, items []*biz.API) error {
func importVersionAPIs(tx *gorm.DB, items []*system.API) error {
for _, item := range items {
var existing apiPO
if err := tx.Where("path = ? AND method = ?", item.Path, item.Method).First(&existing).Error; err == nil {
@@ -243,7 +244,7 @@ func importVersionAPIs(tx *gorm.DB, items []*biz.API) error {
return nil
}
func importVersionDictionaries(tx *gorm.DB, items []*biz.Dictionary) error {
func importVersionDictionaries(tx *gorm.DB, items []*system.Dictionary) error {
for _, item := range items {
var existing dictionaryPO
if err := tx.Where("type = ?", item.Type).First(&existing).Error; err == nil {