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.

286 lines
7.9 KiB

package promotion
import (
"recook/internal/back"
"recook/internal/dbc"
"recook/internal/model/activity"
"recook/internal/model/goods"
"recook/internal/model/promotion"
"recook/internal/model/vend"
"recook/tools"
"time"
"github.com/gin-gonic/gin"
"github.com/shopspring/decimal"
)
type goodsListParam struct {
Date string `json:"date" validate:"required" time_format:"2006-01-02"`
IsSale bool `json:"is_sale"`
}
type PromotionReq struct {
IsSale bool `json:"is_sale"`
}
func QueryWaitingList(c *gin.Context) {
var p PromotionReq
err := tools.Params(&p, c)
if err != nil {
back.Fail(c, err.Error())
return
}
var l []promotion.Information
dbc.DB.Where("is_sale = ?", p.IsSale).Find(&l, "start_date > ? ", time.Now().Format("2006-01-02"))
back.Suc(c, "操作成功", l)
}
func QueryActiveList(c *gin.Context) {
var p PromotionReq
err := tools.Params(&p, c)
if err != nil {
back.Fail(c, err.Error())
return
}
var l []promotion.Information
format := time.Now().Format("2006-01-02")
dbc.DB.Where("is_sale = ?", p.IsSale).Find(&l, "start_date <= ? AND end_date >= ?", format, format)
back.Suc(c, "操作成功", l)
}
func QueryExpiredList(c *gin.Context) {
var p PromotionReq
err := tools.Params(&p, c)
if err != nil {
back.Fail(c, err.Error())
}
var l []promotion.Information
dbc.DB.Where("is_sale = ?", p.IsSale).Find(&l, "end_date < ?", time.Now().Format("2006-01-02"))
back.Suc(c, "操作成功", l)
}
func QueryCheckPromotionDate(c *gin.Context) {
var p goodsListParam
err := tools.Params(&p, c)
if err != nil {
back.Fail(c, err.Error())
return
}
startDate, err := time.Parse("2006-01-02", p.Date)
if err != nil {
back.Fail(c, "日期无法解析")
return
}
var count uint
dbc.DB.Table((&promotion.Information{}).TableName()).Where("is_sale = ?", p.IsSale).
Where("start_date = ?", startDate.Format("2006-01-02")).Count(&count)
if count > 0 {
back.Fail(c, "该日期已创建过活动,请更改日期")
return
}
back.Suc(c, "", nil)
}
type queryPromotionTimeItemsParam struct {
PromotionID uint `json:"promotionID" validate:"required"`
}
type queryPromotionTimeItemsResp struct {
ID uint `json:"timeItemId,omitempty"`
StartTime string `json:"startTime,omitempty"`
}
func QueryPromotionTimeItems(c *gin.Context) {
var p queryPromotionTimeItemsParam
if err := tools.Params(&p, c); err != nil {
back.Fail(c, err.Error())
return
}
timeItems := make([]promotion.TimeItem, 0, 0)
dbc.DB.Order("start_time asc").Find(&timeItems, "promotion_id = ?", p.PromotionID)
list := make([]queryPromotionTimeItemsResp, 0, 0)
for _, v := range timeItems {
list = append(list, queryPromotionTimeItemsResp{
ID: v.ID,
StartTime: v.StartTime.Time.Format("15:04"),
})
}
back.Suc(c, "", &list)
}
type queryGoodsInTimeItemParam struct {
TimeItemID uint `json:"timeItemID" validate:"required"`
}
type queryGoodsInTimeItemResp struct {
GoodsList []goodsList `json:"goodsList"`
ActivityList []activityList `json:"activityList"`
}
type goodsList struct {
PromotionGoodsID uint `json:"promotionGoodsId"`
GoodsID uint `json:"goodsId"`
GoodsName string `json:"goodsName"`
Subtitle string `json:"subtitle"`
VendorName string `json:"vendorName"`
MainPhotoURL string `json:"mainPhotoUrl"`
PublishStatus uint `json:"publishStatus"`
BrandName string `json:"brandName"`
CateName string `json:"cateName"`
SkuList []customSku `json:"skuList"`
}
type activityList struct {
PromotionGoodsID uint `json:"promotionGoodsId"`
ActivityList activity.Info `json:"activityList"`
ActivitySortId uint `json:"activity_sort_id"`
}
type customSku struct {
promotion.Sku
CommissionRate decimal.Decimal `json:"commissionRate"`
}
func QueryTimeItemGoods(c *gin.Context) {
var p queryGoodsInTimeItemParam
if err := tools.Params(&p, c); err != nil {
back.Fail(c, err.Error())
return
}
var promGoodsList []promotion.Goods
dbc.DB.Order("`order` asc").Select("id, goods_id, subtitle, activity_id,activity_sort_id").Find(&promGoodsList, "promotion_time_item_id = ?", p.TimeItemID)
list := make([]queryGoodsInTimeItemResp, 0, 0)
gl := make([]goodsList, 0, 0)
actList := make([]activityList, 0, 0)
var lastPromActId uint
var lastActivityId uint
var activitySortId uint
for _, v := range promGoodsList {
// 需要判断是活动还是商品
if v.ActivityID > 0 {
lastPromActId = v.ID
lastActivityId = v.ActivityID
activitySortId = v.ActivitySortId
} else {
var goodsInfo goods.Information
dbc.DB.Select("id, goods_name, brand_id, second_category_id, first_category_id, publish_status").First(&goodsInfo, v.GoodsID)
var firCate goods.Category
dbc.DB.Select("name").First(&firCate, goodsInfo.FirstCategoryID)
var secCate goods.Category
dbc.DB.Select("name").First(&secCate, goodsInfo.SecondCategoryID)
var brandInfo goods.Brand
dbc.DB.Select("name").First(&brandInfo, goodsInfo.BrandID)
vendorName := "自营"
if goodsInfo.VendorID > 0 {
var vendor vend.Information
dbc.DB.Select("username").First(&vendor, goodsInfo.VendorID)
vendorName = vendor.Username
}
// var mainPhoto goods.Cover
// dbc.DB.Select("url").First(&mainPhoto, "goods_id = ? AND is_master = 0", goodsInfo.ID)
var mainPhoto goods.MainPhoto
dbc.DB.Select("url").First(&mainPhoto, "goods_id = ? AND is_master = 1", goodsInfo.ID)
var skuList []promotion.Sku
dbc.DB.Find(&skuList, "promotion_goods_id = ?", v.ID)
var customSkuList []customSku
for i, v := range skuList {
var s goods.Sku
dbc.DB.Select("commission_rate").First(&s, v.SkuID)
customSkuList = append(customSkuList, customSku{
Sku: skuList[i],
CommissionRate: s.CommissionRate,
})
}
gl = append(gl, goodsList{
PromotionGoodsID: v.ID,
GoodsID: goodsInfo.ID,
GoodsName: goodsInfo.GoodsName,
Subtitle: v.Subtitle,
MainPhotoURL: mainPhoto.URL,
PublishStatus: goodsInfo.PublishStatus,
CateName: firCate.Name + "/" + secCate.Name,
VendorName: vendorName,
BrandName: brandInfo.Name,
SkuList: customSkuList,
})
}
}
// 只取最后一个, lastActivityId
if lastActivityId > 0 {
var activityInfo activity.Info
dbc.DB.Where("id=?", lastActivityId).Find(&activityInfo)
actList = append(actList, activityList{
PromotionGoodsID: lastPromActId,
ActivityList: activityInfo,
ActivitySortId: activitySortId,
})
}
list = append(list, queryGoodsInTimeItemResp{
GoodsList: gl,
ActivityList: actList,
})
back.Suc(c, "操作成功", &list)
}
type forbidGoodsListParam struct {
StartDate string `json:"startDate" validate:"required"`
EndDate string `json:"endDate" validate:"required"`
}
func QueryForbidSelectGoodsList(c *gin.Context) {
var p forbidGoodsListParam
if err := tools.Params(&p, c); err != nil {
back.Fail(c, err.Error())
return
}
startDate, err := time.Parse("2006-01-02", p.StartDate)
if err != nil {
back.Fail(c, "日期无法解析")
return
}
startTime := time.Date(startDate.Year(), startDate.Month(), startDate.Day(), 0, 0, 0, 0, time.Local)
endDate, err := time.Parse("2006-01-02", p.EndDate)
if err != nil {
back.Fail(c, "日期无法解析")
return
}
endTime := time.Date(endDate.Year(), endDate.Month(), endDate.Day(), 23, 59, 59, 0, time.Local)
var promotionGoodsList []promotion.Goods
// dbc.DB.Select("goods_id").
// Find(&promotionGoodsList, "(start_time >= ? AND start_time < ?) OR (end_time > ? AND end_time < ?) OR (start_time >= ? AND end_time < ?)",
// startTime, endTime, startTime, endTime, startTime, endTime)
dbc.DB.Select("goods_id").
Find(&promotionGoodsList, "start_time < ? AND end_time > ?", endTime, startTime)
ids := make([]uint, 0, 0)
for _, v := range promotionGoodsList {
ids = append(ids, v.GoodsID)
}
back.Suc(c, "操作成功", &ids)
}