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.

501 lines
16 KiB

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 goods
import (
"fmt"
"recook/internal/back"
"recook/internal/dbc"
"recook/internal/domain"
"recook/internal/model/activity"
"recook/internal/model/goods"
"recook/internal/model/promotion"
goods2 "recook/internal/v2/model/recook/goods"
user2 "recook/internal/v2/model/recook/user"
"recook/internal/v2/model/special_sale"
"recook/tools"
"strconv"
"strings"
"time"
"github.com/gin-gonic/gin"
"github.com/golangkit/formatime"
"github.com/shopspring/decimal"
)
type queryPromotionGoodsParam struct {
TimeItemID uint `json:"timeItemID" validate:"required"`
UserID uint `json:"user_id"`
}
type promotionTimeItemResp struct {
promotion.TimeItem
ShowName string `json:"showName"`
}
type promotionReq struct {
IsSale bool `json:"is_sale"`
}
// QueryPromotionTimeItems 获取首页活动列表
func QueryPromotionTimeItems(c *gin.Context) {
var p promotionReq
err := tools.ParseParams(&p, c)
if err != nil {
back.Fail(c, err.Error())
return
}
list := make([]promotionTimeItemResp, 0)
var yesterdayPromInfo promotion.Information // 昨天的
today := time.Now()
d, _ := time.ParseDuration("-24h")
yesterday := today.Add(d)
dbc.DB.Select("id").First(&yesterdayPromInfo, "is_sale = ? AND start_date = ?", p.IsSale, yesterday.Format("2006-01-02"))
{
yesterdayTimeItems := make([]promotion.TimeItem, 0)
dbc.DB.Order("start_time asc").Find(&yesterdayTimeItems, "promotion_id = ?", yesterdayPromInfo.ID)
for i, _ := range yesterdayTimeItems {
showName := "昨日精选"
list = append(list, promotionTimeItemResp{
TimeItem: yesterdayTimeItems[i],
ShowName: showName,
})
}
}
var todayPromInfo promotion.Information // 今天的
fmt.Println(time.Now().Format("2006-01-02 15:04:06"))
dbc.DB.Select("id").First(&todayPromInfo, "is_sale=? AND start_date = ?", p.IsSale, time.Now().Format("2006-01-02"))
{
todayTimeItems := make([]promotion.TimeItem, 0)
dbc.DB.Order("start_time asc").Find(&todayTimeItems, "promotion_id = ?", todayPromInfo.ID)
length := len(todayTimeItems)
var nextPtr *promotion.TimeItem
now := time.Now().Unix()
for i, cur := range todayTimeItems {
nextPtr = nil
if i+2 <= length {
nextPtr = &todayTimeItems[i+1]
}
showName := ""
if now >= cur.StartTime.Time.Unix() && now < cur.EndTime.Time.Unix() { // 已经开始了
if nextPtr != nil && (now >= nextPtr.StartTime.Time.Unix() && now < nextPtr.EndTime.Time.Unix()) {
showName = "今日特推"
} else {
showName = "今日特推"
}
} else if cur.StartTime.Time.Unix() > now { // 没开始
showName = "今日特推"
} else {
showName = "今日特推"
}
list = append(list, promotionTimeItemResp{
TimeItem: todayTimeItems[i],
ShowName: showName,
})
}
}
var tomorrowPromInfo promotion.Information // 明天的
today = time.Now()
d, _ = time.ParseDuration("24h")
tomorrow := today.Add(d)
dbc.DB.Select("id").First(&tomorrowPromInfo, "is_sale=? AND start_date = ?", p.IsSale, tomorrow.Format("2006-01-02"))
{
tomorrowTimeItems := make([]promotion.TimeItem, 0)
dbc.DB.Order("start_time asc").Find(&tomorrowTimeItems, "promotion_id = ?", tomorrowPromInfo.ID)
for i, _ := range tomorrowTimeItems {
showName := "明日优选"
list = append(list, promotionTimeItemResp{
TimeItem: tomorrowTimeItems[i],
ShowName: showName,
})
}
}
back.Suc(c, "", &list)
}
type promotionList struct {
GoodsList []promotionGoods `json:"goodsList"`
ActivityList []activityList `json:"activityList"`
}
type activityList struct {
LogoUrl string `json:"logoUrl"`
TopUrl string `json:"topUrl"`
ActivityUrl string `json:"activityUrl"`
ActivitySortId uint `json:"activity_sort_id"`
}
type promotionGoods struct {
GoodsID uint `json:"goodsId"`
GoodsName string `json:"goodsName"`
BrandName string `json:"brandName"`
BrandImg string `json:"brandImg"`
BrandId uint `json:"brandId"`
Description string `json:"description"`
Price decimal.Decimal `json:"price"`
PrimePrice decimal.Decimal `json:"primePrice"` // 划线价格
PriceDesc string `json:"priceDesc"`
Commission decimal.Decimal `json:"commission"`
CommissionDesc string `json:"commissionDesc"`
Picture picture `json:"picture"`
Inventory uint `json:"inventory"`
InventoryDesc string `json:"inventoryDesc"`
TotalInventory uint `json:"totalInventory"` // 总库存
TotalInventoryDesc string `json:"totalInventoryDesc"`
TotalSalesVolume uint `json:"totalSalesVolume"` // 总销量
SalesVolumeDesc string `json:"salesVolumeDesc"`
StartTime formatime.Second `json:"startTime"`
EndTime formatime.Second `json:"endTime"`
Percentage decimal.Decimal `json:"percentage"`
PercentageDesc string `json:"percentageDesc"`
Coupon decimal.Decimal `json:"coupon"`
IsImport int `json:"isImport"` //是否进口商品
Storehouse int `json:"storehouse"` //进口商品仓库
IsFerme int `json:"isFerme"` //是否包税
Living live `json:"living"` //是否在直播
SpecialSale []string `json:"special_sale"` //特卖位图标
GysId uint `json:"gys_id"` //供应商id
CountryIcon string `json:"country_icon"`
SecKill SecKillDetail `json:"sec_kill"`
}
type picture struct {
URL string `gorm:"column:url" json:"url,omitempty"`
Width uint `gorm:"column:width" json:"width,omitempty"`
Height uint `gorm:"column:height" json:"height,omitempty"`
}
// QueryPromotionGoodsListYesterday 获取昨日的活动列表
func QueryPromotionGoodsListYesterday(c *gin.Context) {
var p queryPromotionGoodsParam
err := tools.ParseParams(&p, c)
if err != nil {
back.Fail(c, err.Error())
return
}
var u user2.RecookUserInfoModel
dbc.DB.First(&u, "id = ?", p.UserID)
rate := decimal.Zero
{
switch u.Level {
case 1:
rate = decimal.NewFromFloat(0.5)
case 2:
rate = decimal.NewFromFloat(0.7)
}
}
nTime := time.Now()
yesTime := nTime.AddDate(0, 0, -1)
logDay := yesTime.Format("2006-01-02")
var promotionGoodsList []promotion.Goods
dbc.DB.Order("start_time desc").Find(&promotionGoodsList, `start_time like "`+logDay+`%"`)
fmt.Println(logDay)
gList := make([]promotionGoods, 0, 0)
for _, v := range promotionGoodsList {
if v.GoodsID > 0 {
gi := goods.Information{}
dbc.DB.First(&gi, "id = ? AND publish_status = 1", v.GoodsID)
gb := goods.Brand{}
dbc.DB.First(&gb, "id = ?", gi.BrandID)
if gi.ID == 0 {
continue
}
var pic picture
dbc.DB.Table((&goods.MainPhoto{}).TableName()).First(&pic, "goods_id = ? AND is_master = 1", v.GoodsID)
var promotionSku promotion.Sku
var sku goods.Sku
dbc.DB.First(&sku, "promotion_goods_id = ?", v.ID)
dbc.DB.Select("SUM(sales_volume) AS sales_volume, SUM(inventory) AS inventory, MIN(discount_price) AS discount_price, MIN(purchase_price) AS purchase_price, MIN(commission) AS commission").Find(&promotionSku, "promotion_goods_id = ?", v.ID)
salesVolume := 0
if sku.SalesVolume > 0 {
salesVolume = int(sku.SalesVolume)
}
// salesVolumeDesc := "已抢" + fmt.Sprintf("%d", salesVolume) + "件"
salesVolumeDesc := "累计已售" + fmt.Sprintf("%d", 1000+salesVolume) + "件"
if salesVolume == int(sku.Inventory) {
//salesVolumeDesc = "已抢光"
salesVolumeDesc = ""
}
//percentage := decimal.NewFromInt(int64(salesVolume)).Div(decimal.NewFromInt(int64(v.TotalInventory))).Round(2)
//
//percentageDesc := percentage.Mul(decimal.NewFromInt(100)).String() + "%"
inventoryDesc := "库存" + fmt.Sprintf("%d", sku.Inventory)
if sku.Inventory == 0 {
inventoryDesc = "已售罄"
}
var country goods2.RecookAbroadCountryModel
dbc.DB.Table(country.TableName()).First(&country, "id = ?", gi.Country)
var goodsSku goods.Sku
dbc.DB.Where("goods_id = ?", v.GoodsID).Find(&goodsSku)
cm := goodsSku.DiscountPrice.Sub(goodsSku.PurchasePrice).Mul(rate)
gList = append(gList, promotionGoods{
GoodsID: gi.ID,
GoodsName: gi.GoodsName,
BrandName: gb.Name + "品牌馆",
BrandImg: gb.LogoURL,
BrandId: gb.ID,
Description: v.Subtitle,
Price: goodsSku.DiscountPrice,
PrimePrice: goodsSku.OriginalPrice,
PriceDesc: goodsSku.DiscountPrice.String(),
Commission: cm,
CommissionDesc: "赚" + cm.String(),
Picture: pic,
Inventory: sku.Inventory,
InventoryDesc: inventoryDesc,
TotalInventory: v.TotalInventory,
TotalInventoryDesc: "限购" + fmt.Sprintf("%d", v.TotalInventory) + "件",
TotalSalesVolume: uint(salesVolume),
SalesVolumeDesc: salesVolumeDesc,
StartTime: v.StartTime,
EndTime: v.EndTime,
Percentage: decimal.Zero,
PercentageDesc: "",
Coupon: sku.Coupon,
IsImport: gi.IsImport,
Storehouse: gi.Storehouse,
IsFerme: gi.IsFerme,
GysId: gi.VendorID, //供应商id
CountryIcon: country.Icon,
})
}
}
//fmt.Println(promotionGoodsList)
back.Suc(c, "", &promotionGoodsList)
}
// QueryPromotionGoodsList 精品推荐
func QueryPromotionGoodsList(c *gin.Context) {
var p queryPromotionGoodsParam
err := tools.ParseParams(&p, c)
if err != nil {
back.Fail(c, err.Error())
return
}
var u user2.RecookUserInfoModel
dbc.DB.First(&u, "id = ?", p.UserID)
//rate1 := decimal.NewFromFloat32(0.4)
//rate2 := decimal.NewFromFloat32(0.1)
//rate3 := decimal.Zero
//if u.Level == 2 {
// rate3 = decimal.NewFromFloat(0.2)
//}
//p.TimeItemID=1275
var promotionGoodsList []promotion.Goods
dbc.DB.Order("`order` asc").Find(&promotionGoodsList, "promotion_time_item_id = ?", p.TimeItemID)
gList := make([]promotionGoods, 0)
aList := make([]activityList, 0)
/*
秒杀部分
*/
//获取当前时间段的秒杀goodsid
//gmp := GetSecKillGoods()
for _, v := range promotionGoodsList {
if v.GoodsID > 0 {
var gi goods.Information
dbc.DB.First(&gi, "id = ? AND publish_status = 1", v.GoodsID)
gb := goods.Brand{}
dbc.DB.First(&gb, "id = ?", gi.BrandID)
if gi.ID == 0 {
continue
}
var pic picture
dbc.DB.Table((&goods.MainPhoto{}).TableName()).First(&pic, "goods_id = ? AND is_master = 1", v.GoodsID)
var promotionSku promotion.Sku
dbc.DB.Select("SUM(sales_volume) AS sales_volume, SUM(inventory) AS inventory, MIN(discount_price) AS discount_price, MIN(commission) AS commission").First(&promotionSku, "promotion_goods_id = ?", v.ID)
salesVolume := 0
if promotionSku.SalesVolume > 0 {
salesVolume = int(promotionSku.SalesVolume)
}
var goodsSkuVolume goods.Sku
dbc.DB.Select("SUM(sales_volume) AS sales_volume, SUM(sales_volume_inc) AS sales_volume_inc,SUM(inventory) AS inventory").
Find(&goodsSkuVolume, "goods_id = ?", v.GoodsID)
salesVolume1 := int(goodsSkuVolume.SalesVolume) + int(goodsSkuVolume.SalesVolumeInc)
fmt.Println(v.ID)
fmt.Println(goodsSkuVolume)
// salesVolumeDesc := "已抢" + fmt.Sprintf("%d", salesVolume) + "件"
salesVolumeDesc := "累计已售" + fmt.Sprintf("%d", salesVolume1) + "件"
if salesVolume == int(goodsSkuVolume.Inventory) {
//salesVolumeDesc = "已抢光"
salesVolumeDesc = ""
}
// todo已售未改成sku的已售仍然是活动的已售
//percentage := decimal.NewFromInt(int64(salesVolume)).Div(decimal.NewFromInt(int64(v.TotalInventory))).Round(2)
//
//percentageDesc := percentage.Mul(decimal.NewFromInt(100)).String() + "%"
inventoryDesc := "库存" + fmt.Sprintf("%d", goodsSkuVolume.Inventory)
if goodsSkuVolume.Inventory == 0 {
inventoryDesc = "已售罄"
}
var goodsSkus []goods.Sku
dbc.DB.Order("discount_price asc").Where("goods_id = ?", v.GoodsID).Find(&goodsSkus)
goodsSku := goods.Sku{}
if len(goodsSkus) > 0 {
goodsSku = goodsSkus[0]
}
inventory := uint(0)
for _, skus := range goodsSkus {
inventory += skus.Inventory
}
//后面把这个代码删除
//if c.Request.Header.Get("X-Recook-System") == "ios" {
// mytemp := goodsSku.DiscountPrice
// goodsSku.DiscountPrice = goodsSku.OriginalPrice
// goodsSku.OriginalPrice = mytemp
//}
var country goods2.RecookAbroadCountryModel
dbc.DB.Table(country.TableName()).First(&country, "id = ?", gi.Country)
var one SecKillDetail
//if _, ok := gmp[v.ID]; ok {
// //存着有秒杀商品
// one = GetSecKillDetail(v.GoodsID)
//}
//base := goodsSku.GetBase()
//commission1 := base.Mul(rate1).Round(2)
//commission2 := base.Mul(rate2).Round(2)
//commission3 := base.Mul(rate3).Round(2)
//cm := commission1.Add(commission2).Add(commission3)
//if u.Level == 10 {
// cm = goodsSku.DiscountPrice.Sub(goodsSku.PurchasePrice.Mul(decimal.NewFromFloat(1.03))).Mul(decimal.NewFromFloat(define.Coefficient)).Round(2)
//}
cm := goodsSku.GetSelfProfit(u.Level)
gList = append(gList, promotionGoods{
GoodsID: gi.ID,
GoodsName: strings.Join([]string{gi.GoodsName, strings.Replace(goodsSku.Name, "+", " ", -1)}, " "),
BrandName: gb.Name + "品牌馆",
BrandImg: gb.LogoURL,
BrandId: gb.ID,
Description: v.Subtitle,
Price: goodsSku.DiscountPrice, //打折
PrimePrice: goodsSku.OriginalPrice, //卷后
PriceDesc: goodsSku.DiscountPrice.String(),
Commission: cm,
CommissionDesc: "赚" + cm.String(),
Picture: pic,
Inventory: inventory,
InventoryDesc: inventoryDesc,
TotalInventory: v.TotalInventory,
TotalInventoryDesc: "限购" + fmt.Sprintf("%d", v.TotalInventory) + "件",
TotalSalesVolume: uint(salesVolume1),
SalesVolumeDesc: salesVolumeDesc,
StartTime: v.StartTime,
EndTime: v.EndTime,
Percentage: decimal.Zero,
PercentageDesc: "",
Coupon: goodsSku.Coupon,
IsImport: gi.IsImport,
Storehouse: gi.Storehouse,
IsFerme: gi.IsFerme,
GysId: gi.VendorID, //添加供应商id
CountryIcon: country.Icon,
SecKill: one,
})
}
if v.ActivityID > 0 {
var activityInfo activity.Info
dbc.DB.First(&activityInfo, v.ActivityID)
aList = append(aList, activityList{
LogoUrl: activityInfo.LogoUrl,
TopUrl: activityInfo.TopUrl,
ActivityUrl: domain.GetCDN() + "/website/www/activity/t.html?id=" + strconv.Itoa(int(v.ActivityID)),
ActivitySortId: v.ActivitySortId,
})
}
}
/*
在原有的gList上查询该goodsId是否在直播有就添加直播表示
*/
//for i, k := range gList {
// var vo live
// dbc.DB.Table("recook_live_live_item").Where("main_goods_id=?", k.GoodsID).Select("status").Order("id desc").First(&vo)
// if vo.Status == 1 {
// gList[i].Living.Status = 1
// gList[i].Living.RoomId = vo.RoomId
// }
//
//}
/*
新增:前五条新增特外图标,该功能暂时关闭
*/
//var SIcon kingKongIcon.SpecialSaleIconModel
//dbc.DB.Table(SIcon.TableName()).First(&SIcon)
//for i, _ := range gList {
// if i < 5 {
// gList[i].SpecialSale = SIcon.SpecialSaleIcon
// } else {
// break
// }
//}
/*
修改特卖要求,给商品添加特卖图标
*/
var sp special_sale.SpecialSaleModel
var spes special_sale.SpecialSaleAssociationModel
var spess []special_sale.SpecialSaleAssociationModel
var spc []special_sale.SpecialSaleModel
//获取全部的特卖活动
dbc.DB.Table(sp.TableName()).Find(&spc)
//获取活动规则,活动商品或供应商
for i, v := range gList {
var spList []string
for _, k := range spc {
if k.Type == 1 { //全部商品
if k.GysId == v.GysId {
if k.EndTime.Time.Unix() > time.Now().Unix() {
spList = append(spList, k.Url)
}
}
} else { //部分商品
dbc.DB.Table(spes.TableName()).Where("special_sale_id=?", k.Id).Find(&spess)
for _, j := range spess {
if v.GoodsID == j.GoodsId {
if k.EndTime.Time.Unix() > time.Now().Unix() {
spList = append(spList, k.Url)
}
}
}
}
}
fmt.Println("图标路由为:", spList)
gList[i].SpecialSale = spList
}
back.Suc(c, "", &promotionList{
GoodsList: gList,
ActivityList: aList,
})
}