duidui_fiber/internal/camp/service/section_service.go
2026-03-27 10:34:03 +08:00

203 lines
5.6 KiB
Go

package service
import (
"fmt"
"dd_fiber_api/internal/camp"
"dd_fiber_api/internal/camp/dao"
"dd_fiber_api/pkg/snowflake"
)
// SectionService 小节服务
type SectionService struct {
sectionDAO *dao.SectionDAO
campDAO *dao.CampDAO
}
// NewSectionService 创建小节服务
func NewSectionService(sectionDAO *dao.SectionDAO, campDAO *dao.CampDAO) *SectionService {
return &SectionService{
sectionDAO: sectionDAO,
campDAO: campDAO,
}
}
// CreateSection 创建小节
func (s *SectionService) CreateSection(req *camp.CreateSectionRequest) (*camp.CreateSectionResponse, error) {
sectionID := snowflake.GetInstance().NextIDString()
section := &camp.Section{
ID: sectionID,
CampID: req.CampID,
Title: req.Title,
SectionNumber: req.SectionNumber,
PriceFen: req.PriceFen,
RequirePreviousSection: req.RequirePreviousSection,
TimeIntervalType: req.TimeIntervalType,
TimeIntervalValue: req.TimeIntervalValue,
}
err := s.sectionDAO.Create(section)
if err != nil {
return &camp.CreateSectionResponse{
Success: false,
Message: fmt.Sprintf("创建小节失败: %v", err),
}, nil
}
// 更新打卡营的小节数量
if err := s.campDAO.UpdateSectionCount(req.CampID); err != nil {
return &camp.CreateSectionResponse{
Success: false,
Message: fmt.Sprintf("创建小节成功,但更新打卡营小节数量失败: %v", err),
}, nil
}
return &camp.CreateSectionResponse{
ID: sectionID,
Success: true,
Message: "创建小节成功",
}, nil
}
// GetSection 获取小节
func (s *SectionService) GetSection(id string) (*camp.GetSectionResponse, error) {
section, err := s.sectionDAO.GetByID(id)
if err != nil {
return &camp.GetSectionResponse{
Success: false,
Message: fmt.Sprintf("获取小节失败: %v", err),
}, nil
}
return &camp.GetSectionResponse{
Section: section,
Success: true,
Message: "获取小节成功",
}, nil
}
// UpdateSection 更新小节
func (s *SectionService) UpdateSection(req *camp.UpdateSectionRequest) (*camp.UpdateSectionResponse, error) {
// 先获取原有小节信息,检查 camp_id 是否变更,并保留 require_previous_section 原值(该字段已从管理端移除)
var oldCampID string
var existingRequirePreviousSection bool
if existingSection, err := s.sectionDAO.GetByID(req.ID); err == nil {
oldCampID = existingSection.CampID
existingRequirePreviousSection = existingSection.RequirePreviousSection
}
section := &camp.Section{
ID: req.ID,
CampID: req.CampID,
Title: req.Title,
SectionNumber: req.SectionNumber,
PriceFen: req.PriceFen,
RequirePreviousSection: existingRequirePreviousSection, // 保留原值,不再接受请求体
TimeIntervalType: req.TimeIntervalType,
TimeIntervalValue: req.TimeIntervalValue,
}
err := s.sectionDAO.Update(section)
if err != nil {
return &camp.UpdateSectionResponse{
Success: false,
Message: fmt.Sprintf("更新小节失败: %v", err),
}, nil
}
// 更新打卡营的小节数量
// 如果 camp_id 变更,需要更新两个打卡营的数量
if oldCampID != "" && oldCampID != req.CampID {
// 更新原打卡营的小节数量
if err := s.campDAO.UpdateSectionCount(oldCampID); err != nil {
return &camp.UpdateSectionResponse{
Success: false,
Message: fmt.Sprintf("更新小节成功,但更新原打卡营小节数量失败: %v", err),
}, nil
}
}
// 更新新打卡营的小节数量
if err := s.campDAO.UpdateSectionCount(req.CampID); err != nil {
return &camp.UpdateSectionResponse{
Success: false,
Message: fmt.Sprintf("更新小节成功,但更新打卡营小节数量失败: %v", err),
}, nil
}
return &camp.UpdateSectionResponse{
Success: true,
Message: "更新小节成功",
}, nil
}
// DeleteSection 删除小节
func (s *SectionService) DeleteSection(id string) (*camp.DeleteSectionResponse, error) {
// 先获取小节信息,以便知道属于哪个打卡营
section, err := s.sectionDAO.GetByID(id)
if err != nil {
return &camp.DeleteSectionResponse{
Success: false,
Message: fmt.Sprintf("获取小节信息失败: %v", err),
}, nil
}
campID := section.CampID
// TODO: 检查是否存在未删除的任务和用户进度
// 暂时先允许删除,后续可以添加检查逻辑
// 删除小节
err = s.sectionDAO.Delete(id)
if err != nil {
return &camp.DeleteSectionResponse{
Success: false,
Message: fmt.Sprintf("删除小节失败: %v", err),
}, nil
}
// 更新打卡营的小节数量
if err := s.campDAO.UpdateSectionCount(campID); err != nil {
return &camp.DeleteSectionResponse{
Success: false,
Message: fmt.Sprintf("删除小节成功,但更新打卡营小节数量失败: %v", err),
}, nil
}
return &camp.DeleteSectionResponse{
Success: true,
Message: "删除小节成功",
}, nil
}
// ListSections 列出小节(支持关键词搜索和筛选)
func (s *SectionService) ListSections(req *camp.ListSectionsRequest) (*camp.ListSectionsResponse, error) {
// 设置默认值
if req.Page < 1 {
req.Page = 1
}
if req.PageSize < 1 {
req.PageSize = 10
}
if req.PageSize > 100 {
req.PageSize = 100
}
sections, total, err := s.sectionDAO.List(req.Keyword, req.CampID, req.Page, req.PageSize)
if err != nil {
return &camp.ListSectionsResponse{
Success: false,
Message: fmt.Sprintf("获取小节列表失败: %v", err),
}, nil
}
return &camp.ListSectionsResponse{
Sections: sections,
Total: total,
Success: true,
Message: "获取小节列表成功",
}, nil
}