You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

234 lines
5.0 KiB

9 months ago
package service
import (
"pure-admin/global"
"pure-admin/model"
"pure-admin/model/request"
)
func UpdateCategory(id uint, name string) error {
err := global.MG_DB.Model(&model.TbCategory{}).Where("id = ?", id).Update("name", name).Error
if err != nil {
return err
}
return nil
}
type CategoryValue struct {
Id int64 `json:"id"`
Name string `json:"name"`
}
type CategoryItem struct {
Id int64 `json:"id"`
One CategoryValue `json:"one"`
Two CategoryValue `json:"two"`
Three CategoryValue `json:"three"`
Four CategoryValue `json:"four"`
Five CategoryValue `json:"five"`
}
func ListCategoryMap() (m map[int64]*model.CategoryParentTree, err error) {
var all []model.TbCategory
m = make(map[int64]*model.CategoryParentTree)
err = global.MG_DB.Model(&model.TbCategory{}).Where("`status` = 1").Order("layer DESC").Find(&all).Error
if err != nil {
return nil, err
}
for _, v := range all {
m[int64(v.ID)] = &model.CategoryParentTree{v, nil}
}
return m, nil
}
func GetCategoryTree(id int64) (vos CategoryItem, err error) {
var v model.TbCategory
db := global.MG_DB.Model(&model.TbCategory{}).Where("`status` = 1").Order("layer DESC")
err = db.Order("layer DESC").First(&v).Error
if err != nil {
return
}
m, err := ListCategoryMap()
if err != nil {
return
}
tmps := make([]model.CategoryParentTree, 0)
var cp = model.CategoryParentTree{v, nil}
_ = getCategoryParent(&cp, m)
var item = CategoryItem{
Id: int64(v.ID),
}
if cp.Parent != nil {
transferCategoryParents(&cp, &tmps)
} else {
item.One = CategoryValue{
Id: int64(v.ID),
Name: v.Name,
}
}
for _, v := range tmps {
switch v.Layer {
case 5:
item.Five = CategoryValue{
Id: int64(v.ID),
Name: v.Name,
}
case 4:
item.Four = CategoryValue{
Id: int64(v.ID),
Name: v.Name,
}
case 3:
item.Three = CategoryValue{
Id: int64(v.ID),
Name: v.Name,
}
case 2:
item.Two = CategoryValue{
Id: int64(v.ID),
Name: v.Name,
}
case 1:
item.One = CategoryValue{
Id: int64(v.ID),
Name: v.Name,
}
}
}
return item, nil
}
func ListCategoryTree(req request.ListCategoryPage) (vos []CategoryItem, total int64, err error) {
offset := req.PageSize * (req.Page - 1)
var list []model.TbCategory
db := global.MG_DB.Model(&model.TbCategory{}).Where("`status` = 1")
if req.One != ""{
db = db.Where("name LIKE ? AND layer=1", "%"+req.One+"%")
}
if req.Two != ""{
db = db.Where("name LIKE ? AND layer=2", "%"+req.Two+"%")
}
if req.Three != ""{
db = db.Where("name LIKE ? AND layer=3", "%"+req.Three+"%")
}
if req.Four != ""{
db = db.Where("name LIKE ? AND layer=4", "%"+req.Four+"%")
}
if req.Five != ""{
db = db.Where("name LIKE ? AND layer=5", "%"+req.Five+"%")
}
err = db.Count(&total).Error
if err != nil {
return nil, 0, err
}
err = db.Offset(offset).Order("id DESC").Limit(req.PageSize).Find(&list).Error
if err != nil {
return nil, 0, err
}
m, err := ListCategoryMap()
if err != nil {
return nil, 0, err
}
vos = make([]CategoryItem, 0)
for _, v := range list {
tmps := make([]model.CategoryParentTree, 0)
var cp = model.CategoryParentTree{v, nil}
_ = getCategoryParent(&cp, m)
var item = CategoryItem{
Id: int64(v.ID),
}
if cp.Parent != nil {
transferCategoryParents(&cp, &tmps)
} else {
item.One = CategoryValue{
Id: int64(v.ID),
Name: v.Name,
}
}
for _, v := range tmps {
switch v.Layer {
case 5:
item.Five = CategoryValue{
Id: int64(v.ID),
Name: v.Name,
}
case 4:
item.Four = CategoryValue{
Id: int64(v.ID),
Name: v.Name,
}
case 3:
item.Three = CategoryValue{
Id: int64(v.ID),
Name: v.Name,
}
case 2:
item.Two = CategoryValue{
Id: int64(v.ID),
Name: v.Name,
}
case 1:
item.One = CategoryValue{
Id: int64(v.ID),
Name: v.Name,
}
}
}
vos = append(vos, item)
}
return vos, total, nil
}
func getCategoryParent(v *model.CategoryParentTree, m map[int64]*model.CategoryParentTree) (err error) {
if v==nil || v.Pid == 0 {
return nil
}
v.Parent = m[int64(v.Pid)]
err = getCategoryParent(v.Parent, m)
return err
}
func transferCategoryParents(info *model.CategoryParentTree, list *[]model.CategoryParentTree) {
if info.ID != 0 {
*list = append(*list, *info)
if info.Parent != nil {
transferCategoryParents(info.Parent, list)
}
}
}
func DeleteCategory(ids []int) error {
var category model.TbCategory
err := global.MG_DB.Where(" id IN (?)", ids).Delete(&category).Error
return err
}
func CreateCategory(name string, pid, layer int) error {
global.MG_DB.Model(&model.TbCategory{}).Where("id = ?", pid).Update("is_leaf", false)
err := global.MG_DB.Create(&model.TbCategory{
Name: name,
Layer: layer,
Pid: uint(pid),
IsLeaf: true,
Status: 1,
}).Error
return err
}
func ListCategoryChildren(pid int) (list []model.TbCategory, err error) {
err = global.MG_DB.Model(&model.TbCategory{}).Where("pid = ?", pid).Find(&list).Error
return list, err
}