You cannot 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
6.2 KiB
Go

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package price
import (
article2 "cls-server/internal/application/article"
column2 "cls-server/internal/application/column"
"cls-server/internal/domain/article"
"cls-server/internal/domain/column"
"cls-server/internal/domain/price"
"cls-server/internal/domain/price_default"
"cls-server/pkg/logger"
"cls-server/pkg/util/page"
"errors"
"time"
"xorm.io/builder"
)
var (
ErrInvalidAmount = errors.New("价格不能小于0")
ErrInvalidType = errors.New("无效的价格类型")
ErrInvalidDuration = errors.New("无效的订阅时长")
)
// PriceService 价格管理服务
type PriceService struct {
repo price.PriceRepository
articleRepo article.ArticleRepository
columnRepo column.ColumnRepository
pdRepo price_default.PriceDefaultRepository
log logger.Logger
}
// NewService 创建价格管理服务
func NewPriceService(repo price.PriceRepository, articleRepo article.ArticleRepository, columnRepo column.ColumnRepository, pdRepo price_default.PriceDefaultRepository, log logger.New) *PriceService {
return &PriceService{
repo: repo,
articleRepo: articleRepo,
columnRepo: columnRepo,
pdRepo: pdRepo,
log: log("cls:service:price"),
}
}
func (s *PriceService) GetArticlePricePage(p *page.Page) error {
conds := make([]builder.Cond, 0)
//conds = append(conds, builder.Eq{"type": price.TypeArticle})
// todo 加入付费文章条件
conds = append(conds, builder.And(builder.Gt{"ctime": time.Now().AddDate(0, 0, -7).Unix()}))
data := make([]*article.LianV1Article, 0)
p.Content = &data
err := s.articleRepo.Find(p, conds)
if err != nil {
s.log.Error(err)
return err
}
ids := make([]uint64, 0, len(data))
for _, v := range data {
ids = append(ids, v.Id)
}
priceList, err := s.repo.FindPriceByIds(&ids, price.TypeArticle)
if err != nil {
s.log.Error(err)
return err
}
asMap := make(map[uint64]*PriceDto, 0)
for _, v := range *priceList {
asMap[v.TargetID] = &PriceDto{
ID: v.ID,
TargetID: v.TargetID,
Amount: v.Amount,
Discount: v.Discount,
}
}
dtoData := make([]*ArticlePriceDto, 0, len(data))
for _, v := range data {
t := time.Unix(v.Ctime, 0) // 秒数和纳秒数0 表示没有纳秒部分
dtoData = append(dtoData, &ArticlePriceDto{
Article: &article2.ArticleDto{
EventId: v.Id,
Title: v.Title,
Class: article2.GetClassNameById(v.Type),
Stocks: v.Stocks,
ReleaseDate: t.Format("2006-01-02"),
ReleaseTime: t.Format("15:04"),
Brief: v.Brief,
Content: v.Content,
},
Price: asMap[v.Id],
})
}
p.Content = &dtoData
return nil
}
func (s *PriceService) GetColumnPricePage(p *page.Page) error {
conds := make([]builder.Cond, 0)
data := make([]*column.Column, 0)
p.Content = &data
err := s.columnRepo.FindAll(p, conds)
if err != nil {
s.log.Error(err.Error())
}
ids := make([]uint64, 0, len(data))
for _, v := range data {
ids = append(ids, v.ID)
}
priceList, err := s.repo.FindPriceByIds(&ids, price.TypeColumn)
if err != nil {
s.log.Error(err)
return err
}
asMap := make(map[uint64]*PriceDto, 0)
for _, v := range *priceList {
asMap[v.TargetID] = &PriceDto{
ID: v.ID,
TargetID: v.TargetID,
FirstMontDiscount: v.FirstMontDiscount,
OneMonthPrice: v.OneMonthPrice,
ThreeMonthsPrice: v.ThreeMonthsPrice,
SixMonthsPrice: v.SixMonthsPrice,
OneYearPrice: v.OneYearPrice,
Discount: v.Discount,
}
}
dtoData := make([]*ColumnPriceDto, 0, len(data))
for _, v := range data {
dtoData = append(dtoData, &ColumnPriceDto{
Column: &column2.ColumnDto{
ID: v.ID,
Title: v.Title,
Brief: v.Brief,
Cover: v.Cover,
AuthorID: v.AuthorID,
ArticleNum: v.ArticleNum,
FollowNum: v.FollowNum,
PurchaseNum: v.PurchaseNum,
CreatedAt: v.CreatedAt,
},
Price: asMap[v.ID],
})
}
p.Content = &dtoData
return err
}
// 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
}
var err error
articlePrice := &price.Price{
TargetID: dto.TargetID,
Type: dto.Type,
Discount: dto.Discount,
}
if dto.ID < 1 {
if dto.Type == price.TypeArticle {
articlePrice.Amount = dto.Amount
} else {
articlePrice.OneMonthPrice = dto.OneMonthPrice
articlePrice.ThreeMonthsPrice = dto.ThreeMonthsPrice
articlePrice.SixMonthsPrice = dto.SixMonthsPrice
articlePrice.OneYearPrice = dto.OneYearPrice
articlePrice.FirstMontDiscount = dto.FirstMontDiscount
articlePrice.AdminID = dto.AdminID
}
err = s.repo.Save(articlePrice)
if err != nil {
s.log.Error(err)
}
} else {
if dto.Type == price.TypeArticle {
articlePrice.Amount = dto.Amount
} else {
articlePrice.OneMonthPrice = dto.OneMonthPrice
articlePrice.ThreeMonthsPrice = dto.ThreeMonthsPrice
articlePrice.SixMonthsPrice = dto.SixMonthsPrice
articlePrice.OneYearPrice = dto.OneYearPrice
articlePrice.FirstMontDiscount = dto.FirstMontDiscount
articlePrice.AdminID = dto.AdminID
}
err = s.repo.Update(articlePrice)
if err != nil {
s.log.Error(err)
}
}
return err
}
func (s *PriceService) GetPriceDefault() (*PriceDefaultDto, error) {
data, err := s.pdRepo.Get()
if err != nil {
s.log.Error(err.Error())
}
return &PriceDefaultDto{
Id: data.Id,
Amount: data.Amount,
FirstMontDiscount: data.FirstMontDiscount,
OneMonthPrice: data.OneMonthPrice,
ThreeMonthsPrice: data.ThreeMonthsPrice,
SixMonthsPrice: data.SixMonthsPrice,
OneYearPrice: data.OneYearPrice,
Discount: data.Discount,
}, err
}
func (s *PriceService) UpdatePriceDefault(pdDto *PriceDefaultDto) error {
err := s.pdRepo.Save(&price_default.PriceDefault{
Id: pdDto.Id,
Amount: pdDto.Amount,
FirstMontDiscount: pdDto.FirstMontDiscount,
OneMonthPrice: pdDto.OneMonthPrice,
ThreeMonthsPrice: pdDto.ThreeMonthsPrice,
SixMonthsPrice: pdDto.SixMonthsPrice,
OneYearPrice: pdDto.OneYearPrice,
Discount: pdDto.Discount,
})
if err != nil {
s.log.Error(err)
}
return err
}