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.
233 lines
5.0 KiB
233 lines
5.0 KiB
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
|
|
}
|
|
|