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.
306 lines
11 KiB
306 lines
11 KiB
9 months ago
|
package service
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"gorm.io/gorm"
|
||
|
"pure/global"
|
||
|
"pure/model"
|
||
|
"pure/model/request"
|
||
|
"pure/model/response"
|
||
|
"pure/utils"
|
||
|
"strconv"
|
||
|
)
|
||
|
|
||
|
func ChangeCollectionMission(uuid string, info request.MissionId) (err error, id uint) {
|
||
|
var (
|
||
|
tmp model.CollectionMission
|
||
|
collectionMission model.CollectionMission
|
||
|
)
|
||
|
err = global.MG_DB.Model(&model.Mission{}).Where("id = ?", info.MissionId).First(&model.Mission{}).Error
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
err = global.MG_DB.Model(&model.CollectionMission{}).Where("mission_id = ? AND create_by = ?", info.MissionId, uuid).Find(&tmp).Error
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
tx := global.MG_DB.Begin()
|
||
|
if tmp.ID == 0 {
|
||
|
collectionMission.MissionId = info.MissionId
|
||
|
collectionMission.CreateBy = uuid
|
||
|
err = tx.Model(&model.CollectionMission{}).Create(&collectionMission).Error
|
||
|
if err != nil {
|
||
|
tx.Rollback()
|
||
|
err = errors.New("收藏失败")
|
||
|
return
|
||
|
}
|
||
|
//任务收藏数+1
|
||
|
err = tx.Model(&model.Mission{}).Where("id = ?", info.MissionId).UpdateColumn("collection_num", gorm.Expr("collection_num + 1")).Error
|
||
|
if err != nil {
|
||
|
tx.Rollback()
|
||
|
return
|
||
|
}
|
||
|
} else {
|
||
|
err = tx.Model(&model.CollectionMission{}).Delete(&tmp).Error
|
||
|
if err != nil {
|
||
|
tx.Rollback()
|
||
|
err = errors.New("取消收藏失败")
|
||
|
return
|
||
|
}
|
||
|
//任务收藏数-1
|
||
|
err = tx.Model(&model.Mission{}).Where("id = ? AND collection_num > 0", info.MissionId).UpdateColumn("collection_num", gorm.Expr("collection_num - 1")).Error
|
||
|
if err != nil {
|
||
|
tx.Rollback()
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
tx.Commit()
|
||
|
id = collectionMission.ID
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// 已废弃
|
||
|
func GetCollectionMissionListBak(uuid string, info request.SearchCollectionMission) (err error, list interface{}, total int64) {
|
||
|
limit := info.PageSize
|
||
|
offset := info.PageSize * (info.Page - 1)
|
||
|
db := global.MG_DB.Model(&model.CollectionMission{}).Joins("INNER JOIN mission ON mission.id = collection_mission.mission_id").
|
||
|
Where("collection_mission.create_by = ?", uuid)
|
||
|
err = db.Count(&total).Error
|
||
|
var res []model.MissionDetail
|
||
|
err = db.Select("mission.id,mission.title,mission.goods_id,mission.goods_status,mission.num,mission.hire_type,mission.hire_money,mission.hire_ratio,mission.start_time,mission.end_time,mission.`status`,mission.create_by").
|
||
|
Preload("Goods", func(db *gorm.DB) *gorm.DB {
|
||
|
return db.Select("id,spu_no,title,title_eng,cover,images,tags,retail_price,price_min,price_max")
|
||
|
}).Order("collection_mission.id DESC").Limit(limit).Offset(offset).Find(&res).Error
|
||
|
if err != nil {
|
||
|
return err, nil, 0
|
||
|
}
|
||
|
var (
|
||
|
ids []uint
|
||
|
uuids []string
|
||
|
)
|
||
|
for i := 0; i < len(res); i++ {
|
||
|
if res[i].CreateBy != "" {
|
||
|
uuids = append(uuids, res[i].CreateBy)
|
||
|
}
|
||
|
if res[i].HireType == 1 { //1:固定佣金
|
||
|
res[i].HireMoneyExpect = utils.FormatFloatToString(res[i].HireMoney)
|
||
|
} else { //2:比例抽成
|
||
|
if res[i].Goods.PriceMin == res[i].Goods.PriceMax {
|
||
|
res[i].HireMoneyExpect = utils.FormatFloatToString(res[i].Goods.PriceMin * (res[i].HireRatio / 100))
|
||
|
} else {
|
||
|
res[i].HireMoneyExpect = utils.FormatFloatToString(res[i].Goods.PriceMin*(res[i].HireRatio/100)) + "-" + utils.FormatFloatToString(res[i].Goods.PriceMax*(res[i].HireRatio/100))
|
||
|
}
|
||
|
}
|
||
|
ids = append(ids, res[i].ID)
|
||
|
//res[i].CollectStatus = getMissionCollectStatus(uuid, res[i].ID)
|
||
|
}
|
||
|
if len(ids) != 0 {
|
||
|
statusMap := getMissionCollectStatusMap(uuid, ids)
|
||
|
for i := 0; i < len(res); i++ {
|
||
|
res[i].CollectStatus = statusMap[res[i].ID]
|
||
|
}
|
||
|
}
|
||
|
if len(uuids) != 0 {
|
||
|
_, storeMap := getSellerStoreInfoMap(uuids)
|
||
|
for i := 0; i < len(res); i++ {
|
||
|
if val, ok := storeMap[res[i].CreateBy]; ok {
|
||
|
res[i].Store = val
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return err, res, total
|
||
|
}
|
||
|
|
||
|
// 收藏任务列表
|
||
|
func GetCollectionMissionList(uuid string, info request.SearchCollectionMission) (err error, list []response.MissionCollectView, total int64) {
|
||
|
limit := info.PageSize
|
||
|
offset := info.PageSize * (info.Page - 1)
|
||
|
db := global.MG_DB.Model(&model.CollectionMission{}).Joins("INNER JOIN mission ON mission.id = collection_mission.mission_id").
|
||
|
Where("collection_mission.create_by = ?", uuid)
|
||
|
err = db.Count(&total).Error
|
||
|
var res []model.MissionDetail
|
||
|
|
||
|
err = db.Select("mission.id,mission.title,mission.goods_id,mission.goods_status,mission.num,mission.hire_type,mission.hire_money,mission.hire_ratio,mission.start_time,mission.end_time,mission.`status`,mission.create_by").
|
||
|
Preload("Goods", func(db *gorm.DB) *gorm.DB {
|
||
|
return db.Select("id,spu_no,title,title_eng,cover,images,tags,retail_price,price_min,price_max")
|
||
|
}).Order("collection_mission.id DESC").Limit(limit).Offset(offset).Find(&res).Error
|
||
|
if err != nil {
|
||
|
return err, nil, 0
|
||
|
}
|
||
|
var (
|
||
|
ids []uint
|
||
|
uuids []string
|
||
|
missionList []response.MissionCollectView
|
||
|
)
|
||
|
for i := 0; i < len(res); i++ {
|
||
|
if res[i].CreateBy != "" {
|
||
|
uuids = append(uuids, res[i].CreateBy)
|
||
|
}
|
||
|
if res[i].HireType == 1 { //1:固定佣金
|
||
|
res[i].HireMoneyExpect = utils.FormatFloatToString(res[i].HireMoney)
|
||
|
} else { //2:比例抽成
|
||
|
//按最高价显示
|
||
|
res[i].HireMoneyExpect = utils.FormatFloatToString(res[i].Goods.PriceMax * (res[i].HireRatio / 100))
|
||
|
}
|
||
|
bonus, sales, _ := GetMissionBonusAndSales(res[i].ID)
|
||
|
vMission := response.MissionCollectView{
|
||
|
ID: 0,
|
||
|
MissionId: res[i].ID,
|
||
|
AchieveNum: sales,
|
||
|
TotalBonus: bonus.Total,
|
||
|
Status: res[i].Status,
|
||
|
HireType: res[i].HireType,
|
||
|
HireMoneyExpect: res[i].HireMoneyExpect,
|
||
|
Goods: response.MissionGoodsView{
|
||
|
GoodsId: res[i].GoodsId,
|
||
|
SkuNo: "",
|
||
|
Title: res[i].Goods.Title,
|
||
|
Images: res[i].Goods.Cover,
|
||
|
Price: res[i].Goods.PriceMax,
|
||
|
SpuNo: res[i].Goods.SpuNo,
|
||
|
TitleEng: res[i].Goods.TitleEng,
|
||
|
},
|
||
|
}
|
||
|
missionList = append(missionList, vMission)
|
||
|
|
||
|
ids = append(ids, res[i].ID)
|
||
|
//res[i].CollectStatus = getMissionCollectStatus(uuid, res[i].ID)
|
||
|
}
|
||
|
|
||
|
return err, missionList, total
|
||
|
}
|
||
|
|
||
|
func getMissionCollectStatus(uuid string, id uint) (result bool) {
|
||
|
err := global.MG_DB.Model(&model.CollectionMission{}).Where("create_by = ? AND mission_id = ?", uuid, id).First(&model.CollectionMission{}).Error
|
||
|
if err != nil {
|
||
|
return false
|
||
|
}
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
func getMissionCollectStatusMap(uuid string, ids []uint) map[uint]bool {
|
||
|
var (
|
||
|
list []model.CollectionMission
|
||
|
result = make(map[uint]bool)
|
||
|
)
|
||
|
err := global.MG_DB.Model(&model.CollectionMission{}).Where("create_by = ? AND mission_id IN (?)", uuid, ids).Find(&list).Error
|
||
|
if err != nil {
|
||
|
return result
|
||
|
}
|
||
|
for i := 0; i < len(list); i++ {
|
||
|
result[list[i].MissionId] = true
|
||
|
}
|
||
|
for i := 0; i < len(ids); i++ {
|
||
|
if _, ok := result[ids[i]]; !ok {
|
||
|
result[ids[i]] = false
|
||
|
}
|
||
|
}
|
||
|
return result
|
||
|
}
|
||
|
|
||
|
// 收藏任务列表
|
||
|
func GetRecommendMissionList(info request.SearchRecommendMission) (err error, list []response.MissionRecommendResponse, total int64) {
|
||
|
limit := info.PageSize
|
||
|
offset := info.PageSize * (info.Page - 1)
|
||
|
db := global.MG_DB.Model(&model.MissionRecommend{}).
|
||
|
Joins("inner join mission_claim_video on mission_recommend.relation_id = mission_claim_video.id").
|
||
|
Joins("inner join mission on mission.id = mission_claim_video.mission_id").
|
||
|
Where("mission_claim_video.status = 2"). //审核通过状态
|
||
|
Order("mission_recommend.sort desc")
|
||
|
err = db.Count(&total).Error
|
||
|
if err != nil {
|
||
|
return err, nil, 0
|
||
|
}
|
||
|
var res []model.MissionRecommendDetail
|
||
|
|
||
|
err = db.Preload("MissionVideo", func(db *gorm.DB) *gorm.DB {
|
||
|
return db.Preload("Mission", func(db *gorm.DB) *gorm.DB {
|
||
|
return db.Select("id,title,goods_id,goods_status,num,hire_type,hire_money,hire_ratio,claim_num,start_time,end_time,`status`,has_video,video_channel_ids,video_country_id,claim_days,create_by").
|
||
|
Preload("Goods", func(db *gorm.DB) *gorm.DB {
|
||
|
return db.Select("id,spu_no,title,title_eng,images,retail_price,price_min,price_max,stock,sales,online,created_at,updated_at")
|
||
|
})
|
||
|
}).Preload("Influencer", func(db *gorm.DB) *gorm.DB {
|
||
|
return db.Select("uuid,nick_name,phone")
|
||
|
})
|
||
|
}).Order("id DESC").Limit(limit).Offset(offset).Find(&res).Error
|
||
|
|
||
|
if err != nil {
|
||
|
return err, nil, 0
|
||
|
}
|
||
|
for i := 0; i < len(res); i++ {
|
||
|
//精简字段赋值
|
||
|
vRes := formatMissionRecommendData(res[i])
|
||
|
vRes.Tag = GetTagNamesByRelation(strconv.Itoa(int(vRes.MissionRecommend.RelationId)), "02")
|
||
|
list = append(list, vRes)
|
||
|
}
|
||
|
|
||
|
return err, list, total
|
||
|
}
|
||
|
|
||
|
func GetRecommendMissionDetail(id request.IdReq) (err error, data response.MissionRecommendResponse) {
|
||
|
|
||
|
db := global.MG_DB.Model(&model.MissionRecommend{}).
|
||
|
Joins("inner join mission_claim_video on mission_recommend.relation_id = mission_claim_video.id").
|
||
|
Joins("inner join mission on mission.id = mission_claim_video.mission_id").
|
||
|
Where("mission_recommend.id = ?", id.ID)
|
||
|
var res model.MissionRecommendDetail
|
||
|
|
||
|
err = db.Preload("MissionVideo", func(db *gorm.DB) *gorm.DB {
|
||
|
return db.Preload("Mission", func(db *gorm.DB) *gorm.DB {
|
||
|
return db.Select("id,title,goods_id,goods_status,num,hire_type,hire_money,hire_ratio,claim_num,start_time,end_time,`status`,has_video,video_channel_ids,video_country_id,claim_days,create_by").
|
||
|
Preload("Goods", func(db *gorm.DB) *gorm.DB {
|
||
|
return db.Select("id,spu_no,title,title_eng,images,retail_price,price_min,price_max,stock,sales,online,created_at,updated_at")
|
||
|
})
|
||
|
}).Preload("Influencer", func(db *gorm.DB) *gorm.DB {
|
||
|
return db.Select("uuid,nick_name,phone")
|
||
|
})
|
||
|
}).First(&res).Error
|
||
|
|
||
|
if err != nil {
|
||
|
return err, data
|
||
|
}
|
||
|
data = formatMissionRecommendData(res)
|
||
|
|
||
|
return err, data
|
||
|
}
|
||
|
|
||
|
func formatMissionRecommendData(res model.MissionRecommendDetail) response.MissionRecommendResponse {
|
||
|
bonus, sales, claimNum := GetMissionBonusAndSales(res.MissionVideo.MissionId)
|
||
|
if res.MissionVideo.Mission.HireType == 1 { //1:固定佣金
|
||
|
res.MissionVideo.Mission.HireMoneyExpect = utils.FormatFloatToString(res.MissionVideo.Mission.HireMoney)
|
||
|
} else { //2:比例抽成
|
||
|
//按最高价显示
|
||
|
res.MissionVideo.Mission.HireMoneyExpect = utils.FormatFloatToString(res.MissionVideo.Mission.Goods.PriceMax * (res.MissionVideo.Mission.HireRatio / 100))
|
||
|
}
|
||
|
//精简字段赋值
|
||
|
vRes := response.MissionRecommendResponse{
|
||
|
MissionRecommend: res.MissionRecommend,
|
||
|
MissionVideoCommonData: response.MissionVideoCommonData{
|
||
|
MissionId: res.MissionVideo.MissionId,
|
||
|
VideoUrl: res.MissionVideo.VideoUrl,
|
||
|
Cover: res.MissionVideo.Cover,
|
||
|
Title: res.MissionVideo.Mission.Title,
|
||
|
GoodsTitle: res.MissionVideo.Mission.Goods.Title,
|
||
|
GoodsTitleEng: res.MissionVideo.Mission.Goods.TitleEng,
|
||
|
Influencer: res.MissionVideo.Influencer,
|
||
|
Tag: "",
|
||
|
MissionStatus: res.MissionVideo.Mission.Status,
|
||
|
StartTime: res.MissionVideo.Mission.StartTime,
|
||
|
EndTime: res.MissionVideo.Mission.EndTime,
|
||
|
HireType: res.MissionVideo.Mission.HireType,
|
||
|
HireMoney: res.MissionVideo.Mission.HireMoney,
|
||
|
HireRatio: res.MissionVideo.Mission.HireRatio,
|
||
|
HireMoneyExpect: res.MissionVideo.Mission.HireMoneyExpect,
|
||
|
ReleaseCountry: res.MissionVideo.Mission.ReleaseCountry,
|
||
|
ReleaseChannels: res.MissionVideo.Mission.ReleaseChannels,
|
||
|
AchieveNum: sales,
|
||
|
TotalBonus: bonus.Total,
|
||
|
BoughtNum: bonus.UserTotal,
|
||
|
Width: res.MissionVideo.Width,
|
||
|
Height: res.MissionVideo.Height,
|
||
|
ClaimNum: claimNum,
|
||
|
},
|
||
|
}
|
||
|
return vRes
|
||
|
}
|