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 }