|
|
|
package jyy
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
"fmt"
|
|
|
|
"github.com/shopspring/decimal"
|
|
|
|
"recook/internal/v2/model/jyy"
|
|
|
|
goods2 "recook/internal/v2/model/recook/goods"
|
|
|
|
"recook/internal/v2/model/recook/user"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"git.oa00.com/go/mysql"
|
|
|
|
)
|
|
|
|
|
|
|
|
type logic struct {
|
|
|
|
}
|
|
|
|
|
|
|
|
var Logic = logic{}
|
|
|
|
|
|
|
|
func (o logic) Banners() (res jyy.Banner, err error) {
|
|
|
|
now := time.Now()
|
|
|
|
mysql.Db.Where("start < ?", now).Where("end > ?", now).Order("order_sort asc").Order("id desc").Find(&res)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
func (o logic) Activities() (res jyy.Activity, err error) {
|
|
|
|
mysql.Db.Where("status = 1").Order("order_sort asc").Order("id desc").Find(&res)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
type ArgsEntryReq struct {
|
|
|
|
UserID uint `json:"user_id"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type ShopCartSku struct {
|
|
|
|
ID uint `json:"id"`
|
|
|
|
SkuID uint `json:"sku_id"`
|
|
|
|
DiscountPrice decimal.Decimal `json:"discount_price"`
|
|
|
|
SalePrice decimal.Decimal `json:"sale_price"`
|
|
|
|
Quantity uint `json:"quantity"`
|
|
|
|
Limit int `json:"limit"`
|
|
|
|
Min int `json:"min"`
|
|
|
|
SkuName string `json:"sku_name"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type ShopCartEntry struct {
|
|
|
|
GoodsID uint `json:"goods_id"`
|
|
|
|
GoodsName string `json:"goods_name"`
|
|
|
|
MainPhoto string `json:"main_photo"`
|
|
|
|
SkuList []ShopCartSku `json:"sku_list"`
|
|
|
|
SalePublish uint `json:"sale_publish"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func (o logic) ShopCartEntries(args ArgsEntryReq) (res []ShopCartEntry) {
|
|
|
|
sc := make([]jyy.ShopCartEntry, 0)
|
|
|
|
mysql.Db.Model(&jyy.ShopCartEntry{}).Where("user_id = ?", args.UserID).Find(&sc)
|
|
|
|
ids := make([]uint, 0)
|
|
|
|
idsMap := make(map[uint]uint)
|
|
|
|
skuMap := make(map[uint]uint)
|
|
|
|
for _, v := range sc {
|
|
|
|
ids = append(ids, v.SkuID)
|
|
|
|
idsMap[v.SkuID] = v.Quantity
|
|
|
|
skuMap[v.SkuID] = v.ID
|
|
|
|
}
|
|
|
|
|
|
|
|
var u1 user.RecookUserInfoModel
|
|
|
|
mysql.Db.First(&u1, "user_id = ?", args.UserID)
|
|
|
|
|
|
|
|
skuList := make([]goods2.RecookGoodsSkuModel, 0)
|
|
|
|
mysql.Db.Preload("GoodsInfo.MainPhoto").Where("id in (?)", ids).Find(&skuList)
|
|
|
|
|
|
|
|
goodsMap := make(map[uint][]ShopCartSku)
|
|
|
|
for _, v := range skuList {
|
|
|
|
goodsMap[v.GoodsId] = append(goodsMap[v.GoodsId], ShopCartSku{
|
|
|
|
ID: skuMap[v.Id],
|
|
|
|
SkuID: v.Id,
|
|
|
|
DiscountPrice: v.DiscountPrice,
|
|
|
|
SalePrice: v.GetSalePrice(u1.Level),
|
|
|
|
Quantity: idsMap[v.Id],
|
|
|
|
Limit: v.Limit,
|
|
|
|
Min: v.Min,
|
|
|
|
SkuName: v.Name,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
inRes := make(map[uint]bool)
|
|
|
|
for _, v := range skuList {
|
|
|
|
if inRes[v.GoodsId] {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
inRes[v.GoodsId] = true
|
|
|
|
res = append(res, ShopCartEntry{
|
|
|
|
GoodsID: v.GoodsId,
|
|
|
|
GoodsName: v.GoodsInfo.GoodsName,
|
|
|
|
MainPhoto: v.GoodsInfo.MainPhoto.Url,
|
|
|
|
SkuList: goodsMap[v.GoodsId],
|
|
|
|
SalePublish: v.GoodsInfo.SalePublish,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
type skuEntry struct {
|
|
|
|
SkuID uint `json:"sku_id"`
|
|
|
|
Quantity int `json:"quantity"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type ArgsAddSku struct {
|
|
|
|
UserID uint `json:"user_id"`
|
|
|
|
SkuList []skuEntry `json:"sku_list" validate:"required,gte=1"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func (o logic) ShopCartAddSku(args ArgsAddSku) (err error) {
|
|
|
|
var skuList []goods2.RecookGoodsSkuModel
|
|
|
|
ids := make([]uint, 0)
|
|
|
|
idMap := make(map[uint]int)
|
|
|
|
for _, v := range args.SkuList {
|
|
|
|
ids = append(ids, v.SkuID)
|
|
|
|
idMap[v.SkuID] = v.Quantity
|
|
|
|
}
|
|
|
|
mysql.Db.Preload("GoodsInfo").Find(&skuList, "id in (?)", ids)
|
|
|
|
if len(skuList) != len(ids) {
|
|
|
|
return errors.New("商品选择错误")
|
|
|
|
}
|
|
|
|
for _, v := range skuList {
|
|
|
|
if v.GoodsInfo.SalePublish != 1 {
|
|
|
|
return fmt.Errorf("%d商品下架", v.GoodsId)
|
|
|
|
}
|
|
|
|
if !v.GoodsInfo.IsSale {
|
|
|
|
return fmt.Errorf("%d商品不可批发", v.GoodsId)
|
|
|
|
}
|
|
|
|
if idMap[v.Id] < v.Min {
|
|
|
|
return fmt.Errorf("%s商品最低%d", v.Name, v.Min)
|
|
|
|
}
|
|
|
|
if idMap[v.Id]%v.Limit != 0 {
|
|
|
|
return fmt.Errorf("%s商品每手至少%d", v.Name, v.Min)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
data := make([]jyy.ShopCartEntry, 0)
|
|
|
|
mysql.Db.Find(&data, "user_id = ?", args.UserID)
|
|
|
|
isUsed := make(map[uint]bool)
|
|
|
|
|
|
|
|
for _, v := range data {
|
|
|
|
if idMap[v.SkuID] != 0 {
|
|
|
|
v.Quantity += uint(idMap[v.SkuID])
|
|
|
|
mysql.Db.Save(v)
|
|
|
|
isUsed[v.SkuID] = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
res := make([]jyy.ShopCartEntry, 0)
|
|
|
|
for _, v := range skuList {
|
|
|
|
if isUsed[v.Id] {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
res = append(res, jyy.ShopCartEntry{
|
|
|
|
SkuID: v.Id,
|
|
|
|
GoodsID: v.GoodsId,
|
|
|
|
UserID: args.UserID,
|
|
|
|
Quantity: uint(idMap[v.Id]),
|
|
|
|
})
|
|
|
|
}
|
|
|
|
if len(res) == 0 {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
if err = mysql.Db.Create(&res).Error; err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|