package price import ( "cls/internal/domain/price" "cls/pkg/logger" "cls/pkg/util/page" "cls/pkg/web" "errors" ) var ( ErrInvalidAmount = errors.New("价格不能小于0") ErrInvalidType = errors.New("无效的价格类型") ErrInvalidDuration = errors.New("无效的订阅时长") ) // PriceService 价格管理服务 type PriceService struct { repo price.PriceRepository log logger.Logger } // NewService 创建价格管理服务 func NewPriceService(repo price.PriceRepository, log logger.New) *PriceService { return &PriceService{ repo: repo, log: log("cls:service:price"), } } // SetPrice 设置价格 func (s *PriceService) SetPrice(dto *PriceDto) error { if dto.Amount < 0 { return ErrInvalidAmount } // 检查是否已存在价格记录 existingPrice, err := s.repo.FindByTargetID(dto.TargetID, dto.Type) if err != nil { // 如果记录不存在,创建新记录 newPrice := dto.ToPrice() return s.repo.Save(newPrice) } // 如果记录存在,更新价格 existingPrice.Amount = dto.Amount existingPrice.OneMonthPrice = dto.OneMonthPrice existingPrice.ThreeMonthsPrice = dto.ThreeMonthsPrice existingPrice.SixMonthsPrice = dto.SixMonthsPrice existingPrice.OneYearPrice = dto.OneYearPrice existingPrice.AdminID = dto.AdminID return s.repo.Update(existingPrice) } func (s *PriceService) GetArticlePrice(dto *PriceDto) (*PriceDto, error) { dto.Type = price.TypeArticle return s.GetPrice(dto) } func (s *PriceService) GetColumnPrice(dto *PriceDto) (*PriceDto, error) { dto.Type = price.TypeColumn return s.GetPrice(dto) } // GetPrice 获取价格(如果不存在则使用默认价格) func (s *PriceService) GetPrice(dto *PriceDto) (*PriceDto, error) { // 检查是否已存在价格记录 existingPrice, err := s.repo.FindByTargetID(dto.TargetID, dto.Type) if err != nil { // 如果记录不存在,使用默认价格 var defaultAmount int64 switch dto.Type { case price.TypeArticle: defaultAmount = price.DefaultArticlePrice case price.TypeColumn: defaultAmount = price.DefaultColumnPrice default: return nil, ErrInvalidType } // 创建默认价格记录 newPrice := price.NewPrice(dto.TargetID, dto.Type, defaultAmount, 0) if err := s.repo.Save(newPrice); err != nil { return nil, err } if dto.Type == price.TypeArticle { return &PriceDto{ Amount: newPrice.Amount, Discount: newPrice.Discount, }, nil } return &PriceDto{ OneMonthPrice: newPrice.OneMonthPrice, ThreeMonthsPrice: newPrice.ThreeMonthsPrice, SixMonthsPrice: newPrice.SixMonthsPrice, OneYearPrice: newPrice.OneYearPrice, Discount: 0.3, }, nil } priceDto := &PriceDto{ Discount: existingPrice.Discount, } if dto.Type == price.TypeArticle { priceDto.Amount = existingPrice.Amount } else { priceDto.OneMonthPrice = existingPrice.OneMonthPrice priceDto.ThreeMonthsPrice = existingPrice.ThreeMonthsPrice priceDto.SixMonthsPrice = existingPrice.SixMonthsPrice priceDto.OneYearPrice = existingPrice.OneYearPrice } return priceDto, nil } // GetPriceList 获取价格列表 func (s *PriceService) GetPriceList(page *page.Page, params map[string]string) error { conds := web.ParseFilters(params) return s.repo.FindAll(page, conds) } // DeletePrice 删除价格记录 func (s *PriceService) DeletePrice(id uint64) error { return s.repo.Delete(id) } func (s *PriceService) UpdatePrice(dto *PriceDto) error { if err := dto.Validate(); err != nil { return err } existingPrice, err := s.repo.FindByTargetID(dto.TargetID, dto.Type) if err != nil { return err } existingPrice.Amount = dto.Amount existingPrice.OneMonthPrice = dto.OneMonthPrice existingPrice.ThreeMonthsPrice = dto.ThreeMonthsPrice existingPrice.SixMonthsPrice = dto.SixMonthsPrice existingPrice.OneYearPrice = dto.OneYearPrice existingPrice.AdminID = dto.AdminID return s.repo.Update(existingPrice) }