You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

151 lines
3.6 KiB

package shopping_trolley
import (
"github.com/gin-gonic/gin"
"github.com/jinzhu/gorm"
"recook/internal/back"
"recook/internal/dbc"
"recook/internal/model/goods"
"recook/internal/model/shopping_trolley"
"recook/internal/model/user"
"recook/internal/v2/lib/jcook"
"recook/tools"
"strconv"
)
type addCartParam struct {
UserID uint `json:"userID"`
SkuID uint `json:"skuID" validate:"required"`
Quantity uint `json:"quantity" validate:"required"`
Address string `json:"address"`
}
/*
先判断这个商品以前是否加入过购物车 加入过则直接加数据 没有加入过则创建
*/
func Create(c *gin.Context) {
var p addCartParam
err := tools.ParseParams(&p, c)
if err != nil {
back.Fail(c, err.Error())
return
}
if p.UserID == 0 {
back.Suc(c, "操作成功", nil)
return
}
if p.Quantity > 50 {
back.Fail(c, "单件最多拍50件")
return
}
/*找到购物车是否有了这个品牌*/
var shoppingTrolleyInfo shopping_trolley.Information
err = dbc.DB.First(&shoppingTrolleyInfo, "user_id = ? AND sku_id = ?", p.UserID, p.SkuID).Error
if err != nil && false == gorm.IsRecordNotFoundError(err) {
back.Err(c, err.Error())
return
}
var sku goods.Sku
err = dbc.DB.First(&sku, "id = ?", p.SkuID).Error
if err != nil {
back.Fail(c, err.Error())
return
}
if sku.ThirdPartyType == 3 {
var defaultAddr user.Addr
err = dbc.DB.First(&defaultAddr, "user_id = ? AND is_default = 1", p.UserID).Error
if err != nil && false == gorm.IsRecordNotFoundError(err) {
back.Err(c, err.Error())
return
}
if p.Address == "" {
p.Address = defaultAddr.Province + defaultAddr.Address
}
if p.Address == "" {
back.Err(c, "请填写默认收货地址")
return
}
id, _ := strconv.Atoi(sku.ThirdPartySkuId)
client := jcook.GetClient()
req := jcook.SkuStockReq{
Address: p.Address,
SkuList: []jcook.SkuQuantity{
{
SkuID: uint(id),
Quantity: p.Quantity,
},
},
}
var resp []jcook.SkuStockResp
if err = client.Exec(req, &resp); err != nil {
back.Fail(c, err.Error())
return
}
if resp[0].StockState == 0 {
back.Err(c, "该地区无商品")
return
}
}
inventory := sku.Inventory
// 判断商品在不在活动里
//var promotionSku promotion.Sku
//{
// var promotionGoods promotion.Goods
// dbc.DB.First(&(promotionGoods), "goods_id = ? AND promotion_start_date = ?", sku.GoodsID, time.Now().Format("2006-01-02"))
// if promotionGoods.ID == 0 {
// //不是活动
// tomorrow := time.Now().Add(24 * time.Hour)
// dbc.DB.First(&(promotionGoods), "goods_id = ? AND promotion_start_date = ?", sku.GoodsID, tomorrow.Format("2006-01-02"))
// }
// if promotionGoods.ID > 0 {
// //是活动
// dbc.DB.First(&promotionSku, "promotion_goods_id = ? AND sku_id = ?", promotionGoods.ID, sku.ID)
// inventory = promotionSku.Inventory
//
// }
//}
quan := p.Quantity + shoppingTrolleyInfo.Quantity
if quan > inventory {
back.Fail(c, "超出库存")
return
}
if quan > 50 {
quan = 50
}
if shoppingTrolleyInfo.ID > 0 {
if err := dbc.DB.Model(&shoppingTrolleyInfo).
Updates(shopping_trolley.Information{Quantity: quan}).Error; err != nil {
back.Err(c, err.Error())
return
}
} else {
var info goods.Information
dbc.DB.Select("id, brand_id").First(&info, "id = ?", sku.GoodsID)
shoppingTrolleyInfo = shopping_trolley.Information{
UserID: p.UserID,
BrandID: info.BrandID,
GoodsID: info.ID,
SkuID: p.SkuID,
Quantity: p.Quantity,
}
if err := dbc.DB.Create(&shoppingTrolleyInfo).Error; err != nil {
back.Err(c, err.Error())
return
}
}
back.Suc(c, "操作成功", &shoppingTrolleyInfo)
}