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 ,
} )
}