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 }