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.

140 lines
4.3 KiB

6 months ago
package service
import (
"errors"
"shop-api/global"
"shop-api/model"
"shop-api/model/request"
"shop-api/utils"
"gorm.io/gorm"
)
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
}
tx := global.MG_DB.Begin()
err = tx.Model(&model.CollectionMission{}).Where("mission_id = ? AND create_by = ?", info.MissionId, uuid).Find(&tmp).Error
if err != nil {
return
}
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 GetCollectionMissionList(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 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
}