264 lines
6.3 KiB
Go
264 lines
6.3 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"cms-api/internal/dao"
|
|
"cms-api/internal/model"
|
|
|
|
"github.com/gogf/gf/v2/errors/gerror"
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
"github.com/gogf/gf/v2/os/gtime"
|
|
)
|
|
|
|
type sPartner struct{}
|
|
|
|
func Partner() *sPartner {
|
|
return &sPartner{}
|
|
}
|
|
|
|
// GetById 根据ID获取合作伙伴信息
|
|
func (s *sPartner) GetById(ctx context.Context, id int) (*model.Partner, error) {
|
|
return dao.Partner.GetById(ctx, id)
|
|
}
|
|
|
|
// List 获取合作伙伴列表
|
|
func (s *sPartner) List(ctx context.Context, req *model.PartnerListRequest) (*model.PageResponse, error) {
|
|
var (
|
|
page = req.Page
|
|
pageSize = req.PageSize
|
|
)
|
|
|
|
if page <= 0 {
|
|
page = 1
|
|
}
|
|
if pageSize <= 0 {
|
|
pageSize = 20
|
|
}
|
|
|
|
// 设置分页参数
|
|
req.Page = page
|
|
req.PageSize = pageSize
|
|
|
|
// 获取列表
|
|
partners, total, err := dao.Partner.List(ctx, req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &model.PageResponse{
|
|
List: partners,
|
|
Total: total,
|
|
Page: page,
|
|
PageSize: pageSize,
|
|
TotalPages: (total + pageSize - 1) / pageSize,
|
|
}, nil
|
|
}
|
|
|
|
// GetAll 获取所有启用的合作伙伴
|
|
func (s *sPartner) GetAll(ctx context.Context) ([]*model.Partner, error) {
|
|
return dao.Partner.GetAll(ctx)
|
|
}
|
|
|
|
// GetFeatured 获取推荐合作伙伴
|
|
func (s *sPartner) GetFeatured(ctx context.Context, limit int) ([]*model.Partner, error) {
|
|
if limit <= 0 {
|
|
limit = 10
|
|
}
|
|
return dao.Partner.GetFeatured(ctx, limit)
|
|
}
|
|
|
|
// GetByCategory 根据分类获取合作伙伴
|
|
func (s *sPartner) GetByCategory(ctx context.Context, category string) ([]*model.Partner, error) {
|
|
return dao.Partner.GetByCategory(ctx, category)
|
|
}
|
|
|
|
// Create 创建合作伙伴
|
|
func (s *sPartner) Create(ctx context.Context, req *model.CreatePartnerRequest) error {
|
|
// 检查合作伙伴名称是否存在
|
|
existPartner, err := dao.Partner.GetByName(ctx, req.Name)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if existPartner != nil {
|
|
return gerror.New("合作伙伴名称已存在")
|
|
}
|
|
|
|
// 创建合作伙伴
|
|
partner := &model.Partner{
|
|
Name: req.Name,
|
|
Logo: req.Logo,
|
|
Website: req.Website,
|
|
Description: req.Description,
|
|
Category: req.Category,
|
|
SortOrder: req.SortOrder,
|
|
IsFeatured: req.IsFeatured,
|
|
Status: req.Status,
|
|
CreatedAt: gtime.Now(),
|
|
UpdatedAt: gtime.Now(),
|
|
}
|
|
|
|
_, err = dao.Partner.Create(ctx, partner)
|
|
return err
|
|
}
|
|
|
|
// Update 更新合作伙伴
|
|
func (s *sPartner) Update(ctx context.Context, id int, req *model.UpdatePartnerRequest) error {
|
|
// 检查合作伙伴是否存在
|
|
partner, err := s.GetById(ctx, id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if partner == nil {
|
|
return gerror.New("合作伙伴不存在")
|
|
}
|
|
|
|
// 检查合作伙伴名称是否被其他记录使用
|
|
existPartner, err := dao.Partner.GetByName(ctx, req.Name)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if existPartner != nil && existPartner.Id != id {
|
|
return gerror.New("合作伙伴名称已被使用")
|
|
}
|
|
|
|
// 更新合作伙伴
|
|
updateData := g.Map{
|
|
"name": req.Name,
|
|
"logo": req.Logo,
|
|
"website": req.Website,
|
|
"description": req.Description,
|
|
"category": req.Category,
|
|
"sort_order": req.SortOrder,
|
|
"is_featured": req.IsFeatured,
|
|
"status": req.Status,
|
|
"updated_at": gtime.Now(),
|
|
}
|
|
|
|
return dao.Partner.Update(ctx, id, updateData)
|
|
}
|
|
|
|
// Delete 删除合作伙伴
|
|
func (s *sPartner) Delete(ctx context.Context, id int) error {
|
|
// 检查合作伙伴是否存在
|
|
partner, err := s.GetById(ctx, id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if partner == nil {
|
|
return gerror.New("合作伙伴不存在")
|
|
}
|
|
|
|
return dao.Partner.Delete(ctx, id)
|
|
}
|
|
|
|
// UpdateStatus 更新合作伙伴状态
|
|
func (s *sPartner) UpdateStatus(ctx context.Context, id int, status int) error {
|
|
// 检查合作伙伴是否存在
|
|
partner, err := s.GetById(ctx, id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if partner == nil {
|
|
return gerror.New("合作伙伴不存在")
|
|
}
|
|
|
|
return dao.Partner.UpdateStatus(ctx, id, status)
|
|
}
|
|
|
|
// SetFeatured 设置推荐状态
|
|
func (s *sPartner) SetFeatured(ctx context.Context, id int, isFeatured int) error {
|
|
// 检查合作伙伴是否存在
|
|
partner, err := s.GetById(ctx, id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if partner == nil {
|
|
return gerror.New("合作伙伴不存在")
|
|
}
|
|
|
|
return dao.Partner.Update(ctx, id, g.Map{
|
|
"is_featured": isFeatured,
|
|
"updated_at": gtime.Now(),
|
|
})
|
|
}
|
|
|
|
// UpdateSortOrder 更新排序
|
|
func (s *sPartner) UpdateSortOrder(ctx context.Context, id int, sortOrder int) error {
|
|
// 检查合作伙伴是否存在
|
|
partner, err := s.GetById(ctx, id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if partner == nil {
|
|
return gerror.New("合作伙伴不存在")
|
|
}
|
|
|
|
return dao.Partner.Update(ctx, id, g.Map{
|
|
"sort_order": sortOrder,
|
|
"updated_at": gtime.Now(),
|
|
})
|
|
}
|
|
|
|
// GetStats 获取合作伙伴统计信息
|
|
func (s *sPartner) GetStats(ctx context.Context) (map[string]interface{}, error) {
|
|
// 获取总合作伙伴数
|
|
totalCount, err := dao.Partner.GetCount(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// 获取启用的合作伙伴数
|
|
activeCount, err := dao.Partner.GetCountByStatus(ctx, 1)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// 获取推荐合作伙伴数
|
|
featuredCount, err := dao.Partner.GetFeaturedCount(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// 获取各分类合作伙伴数
|
|
categories, err := dao.Partner.GetCategories(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
categoryStats := make(map[string]int)
|
|
for _, category := range categories {
|
|
count, err := dao.Partner.GetCountByCategory(ctx, category)
|
|
if err == nil {
|
|
categoryStats[category] = count
|
|
}
|
|
}
|
|
|
|
return map[string]interface{}{
|
|
"total_count": totalCount,
|
|
"active_count": activeCount,
|
|
"featured_count": featuredCount,
|
|
"category_stats": categoryStats,
|
|
}, nil
|
|
}
|
|
|
|
// BatchUpdateStatus 批量更新状态
|
|
func (s *sPartner) BatchUpdateStatus(ctx context.Context, ids []int, status int) error {
|
|
for _, id := range ids {
|
|
if err := s.UpdateStatus(ctx, id, status); err != nil {
|
|
g.Log().Error(ctx, "批量更新合作伙伴状态失败, ID:", id, "错误:", err)
|
|
// 继续更新其他记录,不中断整个过程
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// BatchDelete 批量删除合作伙伴
|
|
func (s *sPartner) BatchDelete(ctx context.Context, ids []int) error {
|
|
for _, id := range ids {
|
|
if err := s.Delete(ctx, id); err != nil {
|
|
g.Log().Error(ctx, "批量删除合作伙伴失败, ID:", id, "错误:", err)
|
|
// 继续删除其他记录,不中断整个过程
|
|
}
|
|
}
|
|
return nil
|
|
} |