v2_system
This commit is contained in:
174
internal/erpserver/biz/v1/system/category.go
Normal file
174
internal/erpserver/biz/v1/system/category.go
Normal file
@@ -0,0 +1,174 @@
|
||||
package system
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"management/internal/db/model/dto"
|
||||
db "management/internal/db/sqlc"
|
||||
"management/internal/erpserver/model/view"
|
||||
"management/internal/global/keys"
|
||||
"management/internal/pkg/redis"
|
||||
)
|
||||
|
||||
type CategoryBiz interface {
|
||||
Create(ctx context.Context, arg *db.CreateCategoryParams) (*db.Category, error)
|
||||
Update(ctx context.Context, arg *db.UpdateCategoryParams) (*db.Category, error)
|
||||
All(ctx context.Context) ([]*db.Category, error)
|
||||
List(ctx context.Context, q dto.SearchDto) ([]*db.Category, int64, error)
|
||||
Get(ctx context.Context, id int32) (*db.Category, error)
|
||||
Refresh(ctx context.Context) ([]*db.Category, error)
|
||||
RebuildParentPath(ctx context.Context) error
|
||||
|
||||
Tree(ctx context.Context, id int32) ([]*view.LayuiTree, error)
|
||||
XmSelect(ctx context.Context, id int32) ([]*view.XmSelectTree, error)
|
||||
}
|
||||
|
||||
type categoryBiz struct {
|
||||
store db.Store
|
||||
redis redis.IRedis
|
||||
}
|
||||
|
||||
var _ CategoryBiz = (*categoryBiz)(nil)
|
||||
|
||||
func NewCategory(store db.Store, redis redis.IRedis) *categoryBiz {
|
||||
return &categoryBiz{
|
||||
store: store,
|
||||
redis: redis,
|
||||
}
|
||||
}
|
||||
|
||||
func (b *categoryBiz) All(ctx context.Context) ([]*db.Category, error) {
|
||||
key := keys.GetManageKey(ctx, keys.AllCategories)
|
||||
bs, err := redis.GetBytes(ctx, key)
|
||||
if err == nil {
|
||||
var res []*db.Category
|
||||
if err := json.Unmarshal(bs, &res); err == nil {
|
||||
return res, nil
|
||||
}
|
||||
}
|
||||
|
||||
return b.Refresh(ctx)
|
||||
}
|
||||
|
||||
func (b *categoryBiz) List(ctx context.Context, q dto.SearchDto) ([]*db.Category, int64, error) {
|
||||
countArg := &db.CountCategoriesConditionParams{
|
||||
IsStatus: q.SearchStatus != 9999,
|
||||
Status: int16(q.SearchStatus),
|
||||
IsID: q.SearchID != 0,
|
||||
ID: int32(q.SearchID),
|
||||
IsParentID: q.SearchParentID != 0,
|
||||
ParentID: int32(q.SearchParentID),
|
||||
Name: q.SearchName,
|
||||
}
|
||||
|
||||
dataArg := &db.ListCategoriesConditionParams{
|
||||
IsStatus: q.SearchStatus != 9999,
|
||||
Status: int16(q.SearchStatus),
|
||||
IsID: q.SearchID != 0,
|
||||
ID: int32(q.SearchID),
|
||||
IsParentID: q.SearchParentID != 0,
|
||||
ParentID: int32(q.SearchParentID),
|
||||
Name: q.SearchName,
|
||||
Skip: (int32(q.Page) - 1) * int32(q.Rows),
|
||||
Size: int32(q.Rows),
|
||||
}
|
||||
count, err := b.store.CountCategoriesCondition(ctx, countArg)
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
departs, err := b.store.ListCategoriesCondition(ctx, dataArg)
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
return departs, count, nil
|
||||
}
|
||||
|
||||
func (b *categoryBiz) Get(ctx context.Context, id int32) (*db.Category, error) {
|
||||
return b.store.GetCategory(ctx, id)
|
||||
}
|
||||
|
||||
func (b *categoryBiz) Create(ctx context.Context, arg *db.CreateCategoryParams) (*db.Category, error) {
|
||||
return b.store.CreateCategory(ctx, arg)
|
||||
}
|
||||
|
||||
func (b *categoryBiz) Update(ctx context.Context, arg *db.UpdateCategoryParams) (*db.Category, error) {
|
||||
return b.store.UpdateCategory(ctx, arg)
|
||||
}
|
||||
|
||||
func (b *categoryBiz) Refresh(ctx context.Context) ([]*db.Category, error) {
|
||||
all, err := b.store.AllCategories(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
bs, err := json.Marshal(all)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
redis.Del(ctx, keys.GetManageKey(ctx, keys.AllCategorySimple))
|
||||
key := keys.GetManageKey(ctx, keys.AllCategories)
|
||||
err = redis.Set(ctx, key, bs, time.Hour*6)
|
||||
return all, err
|
||||
}
|
||||
|
||||
func (b *categoryBiz) RebuildParentPath(ctx context.Context) error {
|
||||
return b.store.CategoryRebuildPath(ctx)
|
||||
}
|
||||
|
||||
func (b *categoryBiz) Tree(ctx context.Context, id int32) ([]*view.LayuiTree, error) {
|
||||
all, err := b.All(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return b.toTree(id, all), nil
|
||||
}
|
||||
|
||||
func (b *categoryBiz) XmSelect(ctx context.Context, id int32) ([]*view.XmSelectTree, error) {
|
||||
all, err := b.All(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return b.toXmSelectTree(id, all), nil
|
||||
}
|
||||
|
||||
func (b *categoryBiz) toTree(parentId int32, data []*db.Category) []*view.LayuiTree {
|
||||
var res []*view.LayuiTree
|
||||
for _, v := range data {
|
||||
if v.ParentID == parentId {
|
||||
item := view.LayuiTree{}
|
||||
item.ID = strconv.FormatInt(int64(v.ID), 10)
|
||||
item.Title = v.Name
|
||||
item.Children = b.toTree(v.ID, data)
|
||||
if v.ParentID == 0 {
|
||||
item.Spread = true
|
||||
}
|
||||
res = append(res, &item)
|
||||
}
|
||||
}
|
||||
|
||||
return res
|
||||
}
|
||||
|
||||
func (b *categoryBiz) toXmSelectTree(parentId int32, data []*db.Category) []*view.XmSelectTree {
|
||||
var res []*view.XmSelectTree
|
||||
for _, v := range data {
|
||||
if v.ParentID == parentId {
|
||||
item := view.XmSelectTree{
|
||||
Name: v.Name,
|
||||
Value: strconv.FormatInt(int64(v.ID), 10),
|
||||
Children: b.toXmSelectTree(v.ID, data),
|
||||
}
|
||||
res = append(res, &item)
|
||||
}
|
||||
}
|
||||
|
||||
return res
|
||||
}
|
||||
@@ -13,6 +13,11 @@ import (
|
||||
)
|
||||
|
||||
type ConfigBiz interface {
|
||||
Create(ctx context.Context, arg *db.CreateSysConfigParams) error
|
||||
Update(ctx context.Context, arg *db.UpdateSysConfigByKeyParams) error
|
||||
Get(ctx context.Context, id int32) (*db.SysConfig, error)
|
||||
List(ctx context.Context, q dto.SearchDto) ([]*db.SysConfig, int64, error)
|
||||
|
||||
ConfigExpansion
|
||||
}
|
||||
|
||||
@@ -34,6 +39,36 @@ func NewConfig(store db.Store, redis redis.IRedis) *configBiz {
|
||||
}
|
||||
}
|
||||
|
||||
func (b *configBiz) Create(ctx context.Context, arg *db.CreateSysConfigParams) error {
|
||||
return b.store.CreateSysConfig(ctx, arg)
|
||||
}
|
||||
|
||||
func (b *configBiz) Update(ctx context.Context, arg *db.UpdateSysConfigByKeyParams) error {
|
||||
return b.store.UpdateSysConfigByKey(ctx, arg)
|
||||
}
|
||||
|
||||
func (b *configBiz) Get(ctx context.Context, id int32) (*db.SysConfig, error) {
|
||||
return b.store.GetSysConfig(ctx, id)
|
||||
}
|
||||
|
||||
func (b *configBiz) List(ctx context.Context, q dto.SearchDto) ([]*db.SysConfig, int64, error) {
|
||||
count, err := b.store.CountSysConfigCondition(ctx, q.SearchKey)
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
configs, err := b.store.ListSysConfigCondition(ctx, &db.ListSysConfigConditionParams{
|
||||
Key: q.SearchName,
|
||||
Skip: (int32(q.Page) - 1) * int32(q.Rows),
|
||||
Size: int32(q.Rows),
|
||||
})
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
return configs, count, nil
|
||||
}
|
||||
|
||||
func (b *configBiz) Pear(ctx context.Context) (*dto.PearConfig, error) {
|
||||
// 判断redis是否存储
|
||||
key := keys.GetManageKey(ctx, keys.PearAdmin)
|
||||
|
||||
@@ -3,6 +3,7 @@ package system
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"slices"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
@@ -32,9 +33,11 @@ type MenuExpansion interface {
|
||||
MapOwnerMenuByRoleID(ctx context.Context, roleID int32) (map[string]*dto.OwnerMenuDto, error)
|
||||
SetOwnerMapMenuByRoleID(ctx context.Context, roleID int32) (map[string]*dto.OwnerMenuDto, error)
|
||||
RefreshMenus(ctx context.Context) error
|
||||
SetMenuViewData(ctx context.Context, roleID int32) ([]*dto.SetMenuDto, error)
|
||||
|
||||
Tree(ctx context.Context, id int32) ([]*view.LayuiTree, error)
|
||||
XmSelect(ctx context.Context, id int32) ([]*view.XmSelectTree, error)
|
||||
SetMenu(ctx context.Context, roleID int32, menus []*db.SysMenu) error
|
||||
}
|
||||
|
||||
type menuBiz struct {
|
||||
@@ -274,6 +277,42 @@ func (b *menuBiz) XmSelect(ctx context.Context, id int32) ([]*view.XmSelectTree,
|
||||
return b.toXmSelectTree(id, all), nil
|
||||
}
|
||||
|
||||
func (b *menuBiz) SetMenu(ctx context.Context, roleID int32, menus []*db.SysMenu) error {
|
||||
return b.store.ExecTx(ctx, func(q *db.Queries) error {
|
||||
err := q.DeleteRoleMneuByRoleID(ctx, roleID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, m := range menus {
|
||||
err := q.CreateRoleMenu(ctx, &db.CreateRoleMenuParams{
|
||||
RoleID: roleID,
|
||||
MenuID: m.ID,
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
func (b *menuBiz) SetMenuViewData(ctx context.Context, roleID int32) ([]*dto.SetMenuDto, error) {
|
||||
// 获取该用户已经有的权限
|
||||
hs, err := b.store.ListSysMenuIDByRoleID(ctx, roleID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
all, err := b.AllMenusCache(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return toSetMenuTree(all, hs, 0), nil
|
||||
}
|
||||
|
||||
func (b *menuBiz) ownerMenusByRoleID(ctx context.Context, roleID int32) ([]*db.SysMenu, error) {
|
||||
// 判断当前用户是否有vip角色
|
||||
role, err := b.store.GetSysRole(ctx, roleID)
|
||||
@@ -458,3 +497,49 @@ func uniqueSysMenus(sm []*db.SysMenu) []*db.SysMenu {
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func toSetMenuTree(data []*db.SysMenu, ids []int32, parentID int32) []*dto.SetMenuDto {
|
||||
var res []*dto.SetMenuDto
|
||||
for _, v := range data {
|
||||
if v.ParentID == parentID {
|
||||
isSelect := hasValueInArray(ids, v.ID)
|
||||
if v.IsList {
|
||||
item := dto.SetMenuDto{
|
||||
ID: v.ID,
|
||||
Name: v.DisplayName,
|
||||
Link: v.Type,
|
||||
IsList: v.IsList,
|
||||
IsSelect: isSelect,
|
||||
}
|
||||
item.Items = []*dto.SetMenuDto{
|
||||
{
|
||||
ID: v.ID,
|
||||
Name: "列表",
|
||||
Link: "btn",
|
||||
IsList: false,
|
||||
IsSelect: isSelect,
|
||||
Items: toSetMenuTree(data, ids, v.ID),
|
||||
},
|
||||
}
|
||||
item.Items = append(item.Items, toSetMenuTree(data, ids, v.ID)...)
|
||||
res = append(res, &item)
|
||||
} else {
|
||||
item := dto.SetMenuDto{
|
||||
ID: v.ID,
|
||||
Name: v.DisplayName,
|
||||
Link: v.Type,
|
||||
IsList: v.IsList,
|
||||
IsSelect: isSelect,
|
||||
Items: toSetMenuTree(data, ids, v.ID),
|
||||
}
|
||||
res = append(res, &item)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return res
|
||||
}
|
||||
|
||||
func hasValueInArray(data []int32, id int32) bool {
|
||||
return slices.Contains(data, id)
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ type SystemBiz interface {
|
||||
ConfigBiz() ConfigBiz
|
||||
AuditBiz() AuditBiz
|
||||
LoginLogBiz() LoginLogBiz
|
||||
CategoryBiz() CategoryBiz
|
||||
}
|
||||
|
||||
type systemBiz struct {
|
||||
@@ -59,3 +60,7 @@ func (b *systemBiz) AuditBiz() AuditBiz {
|
||||
func (b *systemBiz) LoginLogBiz() LoginLogBiz {
|
||||
return NewLoginLog(b.store)
|
||||
}
|
||||
|
||||
func (b *systemBiz) CategoryBiz() CategoryBiz {
|
||||
return NewCategory(b.store, b.redis)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user