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.

283 lines
5.9 KiB
Go

package service
import (
"joybuywork/internal/repository/cache"
"joybuywork/internal/repository/model"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/repository/withdefault"
containers "joybuywork/internal/service/containers/mall"
"joybuywork/internal/service/provider/malls"
"joybuywork/internal/utils/logic"
pb "joybuywork/proto/go_proto/w_mall"
"gorm.io/gen/field"
)
type WMall struct {
Service
}
// List 商城列表
func (s *WMall) List(req *pb.ListReq, res *pb.ListRes) (err error) {
defer s.checkErr()
*res = pb.ListRes{}
container := new(containers.List)
{
container.Init(s.ctx)
container.Req = req
container.Res = res
}
return container.Run()
}
// Store 商城创建
func (s *WMall) Store(req *pb.StoreReq, res *pb.StoreRes) (err error) {
defer s.checkErr()
project, err := s.ProjectErrNil(req.GetProjectHashId())
if err != nil {
return
}
mall := withdefault.RedeemMall(&model.RedeemMall{
ProjectID: project.ID,
Title: req.GetTitle(),
})
if err = s.GetDao().RedeemMall.WithContext(s.ctx).Create(mall); err != nil {
err = s.BE().MysqlError(err)
return
}
*res = pb.StoreRes{
Id: mall.ID,
}
return
}
// Update 商城更新
func (s *WMall) Update(req *pb.UpdateReq, res *pb.UpdateRes) (err error) {
defer s.checkErr()
mall, err := cache.NewRedeemMall(s.ctx).FindById(req.GetId())
if err != nil {
err = s.BE().CacheError(err)
return
}
if mall == nil {
return
}
m := s.GetDao().RedeemMall
var up []field.AssignExpr
if req.GetTitle() != mall.Title {
up = append(up, m.Title.Value(req.GetTitle()))
}
if len(up) > 0 {
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(mall.ID)).UpdateSimple(up...)
if err != nil {
err = s.BE().MysqlError(err)
return
}
_ = cache.NewRedeemMall(s.ctx).Clear(mall)
}
*res = pb.UpdateRes{
Id: mall.ID,
}
return
}
// Destroy 商城删除
func (s *WMall) Destroy(req *pb.DestroyReq, res *pb.DestroyRes) (err error) {
defer s.checkErr()
mall, err := cache.NewRedeemMall(s.ctx).FindById(req.GetId())
if err != nil {
err = s.BE().CacheError(err)
return
}
if mall == nil || mall.IsDel == mtype.Yes {
return
}
relateM := s.GetDao().RedeemMallRelate
count, err := relateM.WithContext(s.ctx).Where(relateM.MallID.Eq(mall.ID), relateM.CancelTime.Eq(mtype.No)).Count()
if err != nil {
err = s.BE().MysqlError(err)
return
}
if count > 0 {
err = s.BE().VerifyError("mall used")
return
}
m := s.GetDao().RedeemMall
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(mall.ID)).UpdateSimple(m.IsDel.Value(mtype.Yes))
if err != nil {
err = s.BE().MysqlError(err)
return
}
*res = pb.DestroyRes{}
return
}
// ItemList 商城奖品列表
func (s *WMall) ItemList(req *pb.ItemListReq, res *pb.ItemListRes) (err error) {
defer s.checkErr()
*res = pb.ItemListRes{}
container := new(containers.ItemList)
{
container.Init(s.ctx)
container.Req = req
container.Res = res
}
return container.Run()
}
// ItemStore 商城奖品创建
func (s *WMall) ItemStore(req *pb.ItemStoreReq, res *pb.ItemStoreRes) (err error) {
defer s.checkErr()
container := new(containers.ItemStore)
{
container.Init(s.ctx, logic.WithTran())
container.Req = req
container.Res = res
}
return container.Run()
}
// ItemUpdate 商城奖品更新
func (s *WMall) ItemUpdate(req *pb.ItemUpdateReq, res *pb.ItemUpdateRes) (err error) {
defer s.checkErr()
*res = pb.ItemUpdateRes{}
container := new(containers.ItemUpdate)
{
container.Init(s.ctx, logic.WithTran())
container.Req = req
container.Res = res
}
return container.Run()
}
// ItemStatus 商城奖品状态修改
func (s *WMall) ItemStatus(req *pb.ItemStatusReq, res *pb.ItemStatusRes) (err error) {
defer s.checkErr()
*res = pb.ItemStatusRes{}
container := new(containers.ItemStatus)
{
container.Init(s.ctx, logic.WithTran())
container.Req = req
container.Res = res
}
return container.Run()
}
// ItemSort 商城奖品排序
func (s *WMall) ItemSort(req *pb.ItemSortReq, res *pb.ItemSortRes) (err error) {
defer s.checkErr()
m := s.GetDao().RedeemMallItem
l := len(req.GetIds())
for i, id := range req.GetIds() {
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(id)).UpdateSimple(m.Sort.Value(int32(l - i)))
if err != nil {
err = s.BE().MysqlError(err)
return
}
}
*res = pb.ItemSortRes{}
return
}
// Select 商城选择
func (s *WMall) Select(req *pb.SelectReq, res *pb.SelectRes) (err error) {
defer s.checkErr()
project, err := s.ProjectErrNil(req.GetProjectHashId())
if err != nil {
return
}
m := s.GetDao().RedeemMall
list, err := m.WithContext(s.ctx).Select(m.ID, m.Title).Where(m.ProjectID.Eq(project.ID), m.IsDel.Eq(mtype.No)).Order(m.ID.Desc()).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
*res = pb.SelectRes{
List: make([]*pb.SelectRes_One, 0, len(list)),
}
for _, v := range list {
res.List = append(res.List, &pb.SelectRes_One{
Id: v.ID,
Title: v.Title,
})
}
return
}
// RelateMall 关联商城
func (s *WMall) RelateMall(req *pb.RelateMallReq, res *pb.RelateMallRes) (err error) {
defer s.checkErr()
relate, err := malls.NewRelate(s.ctx, req.GetRelateId(), req.GetRelateTable())
if err != nil {
return
}
err = relate.Related(int8(req.GetSource()), req.GetMallIds()...)
if err != nil {
return
}
*res = pb.RelateMallRes{}
return
}
// UserItemList 用户商城奖品列表
func (s *WMall) UserItemList(req *pb.UserItemListReq, res *pb.UserItemListRes) (err error) {
defer s.checkErr()
*res = pb.UserItemListRes{}
container := new(containers.UserItemList)
{
container.Init(s.ctx)
container.Req = req
container.Res = res
}
return container.Run()
}
// ExchangeItem 商城奖品兑换
func (s *WMall) ExchangeItem(req *pb.ExchangeItemReq, res *pb.ExchangeItemRes) (err error) {
defer s.checkErr()
*res = pb.ExchangeItemRes{}
container := new(containers.ExchangeItem)
{
container.Init(s.ctx, logic.WithTran())
container.Req = req
container.Res = res
}
return container.Run()
}