package service import ( "encoding/json" "errors" "fmt" "gorm.io/gorm/clause" "pure-admin/global" "pure-admin/model" "pure-admin/model/request" "pure-admin/model/response" "pure-admin/utils" "strconv" "strings" "time" "github.com/gin-gonic/gin" "gorm.io/gorm" ) func GetMissionDetail(id uint) (error, model.MissionDetail) { var ( err error result model.MissionDetail ) //err = global.MG_DB.Model(&model.Mission{}). err = global.MG_DB.Model(&model.MissionDetail{}). Select("id,title,goods_id,goods_status,num,hire_type,hire_money,hire_ratio,claim_num,start_time,end_time,`status`"). Where("id = ?", id). 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("Seller").First(&result).Error if err != nil { return err, result } switch result.HireType { case 1: result.HireMoneyExpect = fmt.Sprintf("%.f", result.HireMoney) case 2: result.HireMoneyExpect = fmt.Sprintf("%.f", result.HireRatio) } //视频素材 if result.HasVideo == 1 { result.ReleaseCountry = GetSysDictDataLabel(model.ReleaseCountryCode, result.VideoCountryId) var channelNames []string for _, cid := range strings.Split(result.VideoChannelIds, ",") { vLabel := GetSysDictDataLabel(model.ReleaseChannelCode, cid) channelNames = append(channelNames, vLabel) } result.ReleaseChannels = strings.Join(channelNames, "/") } //任务数 missionCountParam := request.SearchMission{SellerId: result.CreateBy} err, result.Seller.ReleaseMissionNum = GetMissionCount(missionCountParam) missionCountParam.Status = 2 err, result.Seller.ValidMissionNum = GetMissionCount(missionCountParam) //任务视频数量 err, result.VideoClaimNum = GetValidMissionVideoCount(result.ID) //todo 结束任务 return nil, result } func GetMissionList(info request.SearchMission) (err error, list []model.MissionDetail, total int64) { limit := info.PageSize offset := info.PageSize * (info.Page - 1) db := global.MG_DB.Model(&model.Mission{}) if info.SellerId != "" { db = db.Where("create_by = ?", info.SellerId) } if info.SellerEmail != "" { db = db.Joins("join seller_store on seller_store.create_by = mission.create_by").Where("seller_store.email like ?", "%"+info.SellerEmail+"%") } if info.HireType > 0 { db = db.Where("mission.hire_type = ?", info.HireType) } if info.VideoChannelId != "" { db = db.Where(fmt.Sprintf("find_in_set(%s,video_channel_ids)", info.VideoChannelId)) } if info.Title != "" { db = db.Where("mission.title LIKE ?", "%"+info.Title+"%") } if info.Status != 0 { db = db.Where("mission.status = ?", info.Status) } if info.MissionTime != "" { var tmpT time.Time tmpT, err = time.ParseInLocation(utils.DateFormat, info.MissionTime, time.UTC) if err != nil { err = errors.New("search mission time format error") return err, nil, 0 } db = db.Where("DATE_FORMAT(start_time,'%Y-%m-%d') <= ? AND end_time >= ?", tmpT, tmpT) } //是否有视频 switch info.HasVideo { case 1: db = db.Where("has_video = 1") case 2: db = db.Where("has_video = 0") } err = db.Count(&total).Error var res []model.MissionDetail err = db.Select("mission.id,title,goods_id,goods_status,num,hire_type,hire_money,hire_ratio,claim_num,start_time,end_time,mission.`status`,has_video,video_channel_ids,video_country_id,claim_days,mission.create_by,claim_stock,video_url,description,has_sample,sample_num"). 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("Seller").Order("id DESC").Limit(limit).Offset(offset).Find(&res).Error if err != nil { return err, nil, 0 } for i := 0; i < len(res); i++ { //查询订单数 switch res[i].HireType { case 1: res[i].HireMoneyExpect = fmt.Sprintf("视频拍摄%.f美元/单,总共%d笔", res[i].HireMoney, res[i].ClaimStock) case 2: res[i].HireMoneyExpect = fmt.Sprintf("订单金额%.f%%", res[i].HireRatio) } //发布国家 if res[i].HasVideo == 1 { res[i].ReleaseCountry = GetSysDictDataLabel(model.ReleaseCountryCode, res[i].VideoCountryId) var channelNames []string for _, cid := range strings.Split(res[i].VideoChannelIds, ",") { vLabel := GetSysDictDataLabel(model.ReleaseChannelCode, cid) channelNames = append(channelNames, vLabel) } res[i].ReleaseChannels = strings.Join(channelNames, "/") } //任务视频数量 _, res[i].VideoClaimNum = GetValidMissionVideoCount(res[i].ID) res[i].Tags = GetTagNamesByRelation(strconv.Itoa(int(res[i].ID)), "01") } return err, res, total } func GetMissionCount(info request.SearchMission) (err error, total int64) { db := global.MG_DB.Model(&model.Mission{}) if info.SellerId != "" { db = db.Where("create_by = ?", info.SellerId) } if info.Status != 0 { db = db.Where("status = ?", info.Status) } err = db.Count(&total).Error return err, total } func GetValidMissionVideoCount(missionId uint) (err error, total int64) { db := global.MG_DB.Model(&model.MissionClaimVideo{}) db = db.Where("mission_id = ?", missionId) err = db.Count(&total).Error return err, total } func GetMissionVideoList(info request.SearchMissionVideo) (err error, list []response.MissionVideoResponse, total int64) { limit := info.PageSize offset := info.PageSize * (info.Page - 1) db := global.MG_DB.Model(&model.MissionClaimVideo{}). Joins("inner join mission on mission.id = mission_claim_video.mission_id") //Where("mission_claim_video.status = 2")//审核通过状态 if info.VideoStatus != 0 { db = db.Where("mission_claim_video.status = ?", info.VideoStatus) } if info.SellerId != "" { db = db.Where("mission.create_by = ?", info.SellerId) } if info.SellerEmail != "" { db = db.Joins("join seller_store on seller_store.create_by = mission.create_by").Where("seller_store.email like ?", "%"+info.SellerEmail+"%") } if info.MissionClaimBy != "" { db = db.Where("mission_claim_video.create_by = ?", info.MissionClaimBy) } if info.SourceType != 0 { db = db.Where("mission_claim_video.source_type = ?", info.SourceType) } if info.HireType > 0 { db = db.Where("mission.hire_type = ?", info.HireType) } if info.Title != "" { db = db.Where("mission.title LIKE ?", "%"+info.Title+"%") } if info.Status != 0 { db = db.Where("mission.status = ?", info.Status) } if info.MissionId != 0 { db = db.Where("mission.id = ?", info.MissionId) } err = db.Count(&total).Error var res []model.MissionClaimVideoDetail err = 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,claim_stock"). 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("Seller") }).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++ { //查询订单数 switch res[i].Mission.HireType { case 1: res[i].Mission.HireMoneyExpect = fmt.Sprintf("视频拍摄%.f美元/单,总共%d笔", res[i].Mission.HireMoney, res[i].Mission.ClaimStock) case 2: res[i].Mission.HireMoneyExpect = fmt.Sprintf("订单金额%.f%%", res[i].Mission.HireRatio) } //发布国家 if res[i].Mission.HasVideo == 1 { res[i].Mission.ReleaseCountry = GetSysDictDataLabel(model.ReleaseCountryCode, res[i].Mission.VideoCountryId) var channelNames []string for _, cid := range strings.Split(res[i].Mission.VideoChannelIds, ",") { vLabel := GetSysDictDataLabel(model.ReleaseChannelCode, cid) channelNames = append(channelNames, vLabel) } res[i].Mission.ReleaseChannels = strings.Join(channelNames, "/") } //精简字段赋值 vRes := response.MissionVideoResponse{ ID: res[i].ID, SourceType: res[i].SourceType, MissionVideoCommonData: response.MissionVideoCommonData{ MissionId: res[i].MissionId, VideoUrl: res[i].VideoUrl, Cover: res[i].Cover, Title: res[i].Mission.Title, GoodsTitle: res[i].Mission.Goods.Title, Influencer: res[i].Influencer, Tag: "", MissionStatus: res[i].Mission.Status, StartTime: res[i].Mission.StartTime, EndTime: res[i].Mission.EndTime, HireType: res[i].Mission.HireType, HireMoney: res[i].Mission.HireMoney, HireRatio: res[i].Mission.HireRatio, HireMoneyExpect: res[i].Mission.HireMoneyExpect, ReleaseCountry: res[i].Mission.ReleaseCountry, ReleaseChannels: res[i].Mission.ReleaseChannels, Seller: res[i].Mission.Seller, }, } vRes.MissionVideoCommonData.Tag = GetTagNamesByRelation(strconv.Itoa(int(vRes.ID)), "02") list = append(list, vRes) } return err, list, total } func AddMissionVideo(uuid string, info request.AddMissionVideo) (err error) { var ( mission model.Mission claimVideo model.MissionClaimVideo tagCheck model.Tags tagRelation model.TagRelation ) err = global.MG_DB.Model(&model.Mission{}).Where("id = ?", info.MissionId).First(&mission).Error if err != nil { err = errors.New("not found mission record") return err } claimVideo.MissionClaimId = 0 claimVideo.VideoUrl = info.VideoUrl claimVideo.Cover = info.Cover claimVideo.Status = 2 //审核已通过 claimVideo.SourceType = 3 //后台上传 claimVideo.MissionId = info.MissionId //任务ID claimVideo.CreateBy = uuid //创建者ID tx := global.MG_DB.Begin() err = tx.Model(&model.MissionClaimVideo{}).Create(&claimVideo).Error if err != nil { tx.Rollback() return err } //打标签 if info.TagId != 0 { err = global.MG_DB.Model(&model.Tags{}).Where("id = ?", info.TagId).First(&tagCheck).Error if errors.Is(err, gorm.ErrRecordNotFound) { tx.Rollback() return err } tagRelation = model.TagRelation{ TagId: info.TagId, RelationId: strconv.Itoa(int(claimVideo.ID)), RelationType: "02", CreateBy: uuid, UpdateBy: uuid, } err = tx.Model(&model.TagRelation{}).Create(&tagRelation).Error if err != nil { tx.Rollback() return errors.New("绑定标签失败") } } tx.Commit() return err } func EditMissionVideo(uuid string, info request.EditMissionVideo) (err error) { var ( check model.MissionClaimVideo claimVideo model.MissionClaimVideo tagCheck model.Tags tagRelation model.TagRelation ) err = global.MG_DB.Model(&model.MissionClaimVideo{}).Where("id = ?", info.ID).First(&check).Error if err != nil { err = errors.New("not found record") return err } tx := global.MG_DB.Begin() claimVideo.MissionClaimId = 0 claimVideo.VideoUrl = info.VideoUrl claimVideo.Cover = info.Cover claimVideo.Status = 2 //2 claimVideo.SourceType = 3 //后台上传 claimVideo.UpdateBy = uuid //创建者ID err = tx.Model(&model.MissionClaimVideo{}).Where("id = ?", info.ID).Updates(claimVideo).Error if err != nil { tx.Rollback() return err } //打标签 if info.TagId != 0 { err = global.MG_DB.Model(&model.Tags{}).Where("id = ?", info.TagId).First(&tagCheck).Error if errors.Is(err, gorm.ErrRecordNotFound) { tx.Rollback() return err } err = tx.Model(&model.TagRelation{}).Where("relation_type= ? and relation_id = ?", "02", info.ID).Delete(&model.TagRelation{}).Error if err != nil { tx.Rollback() return err } tagRelation = model.TagRelation{ TagId: info.TagId, RelationId: strconv.Itoa(int(info.ID)), RelationType: "02", CreateBy: uuid, UpdateBy: uuid, } err = tx.Model(&model.TagRelation{}).Create(&tagRelation).Error if err != nil { tx.Rollback() return errors.New("绑定标签失败") } } tx.Commit() return err } func AddMissionRecommend(q *request.AddMissionRecommend, userID string) error { //添加任务推荐,倒序排序 var ( err error repeat model.MissionRecommend maxSort int64 ) for _, y := range q.List { repeat = model.MissionRecommend{} global.MG_DB.Model(&model.MissionRecommend{}).Where("relation_id=?", y.RelationId).Find(&repeat) if repeat.ID != 0 { break } } if repeat.ID != 0 { return errors.New("已添加该任务") } err, maxSort = GetMissionRecommendMaxSort() //global.MG_DB.Model(&model.BsXzPageTemp{}).Where("date_id=?", q.List[0].DateId).Order("sort desc").Limit(1).Find(&data) for x, _ := range q.List { q.List[x].ID = 0 q.List[x].Sort = int(maxSort) + len(q.List) - x q.List[x].CreateBy = userID q.List[x].UpdateBy = userID } tx := global.MG_DB.Begin() err = tx.Model(&model.MissionRecommend{}).Create(&(q.List)).Error if err != nil { tx.Rollback() return errors.New("添加关联关系失败") } tx.Commit() return nil } func GetMissionRecommendMaxSort() (err error, total int64) { db := global.MG_DB.Model(&model.MissionRecommend{}).Select("IFNULL(MAX(sort),0)") err = db.Scan(&(total)).Error return } func DeleteMissionRecommendByIds(ids request.IdsUReq) (err error) { err = global.MG_DB.Model(model.MissionRecommend{}).Where("id in (?)", ids.Ids).Unscoped().Delete(&model.MissionRecommend{}).Error if err != nil { return errors.New("删除失败") } return err } func MissionRecommendUpData(info request.IdReq, c *gin.Context) error { var ( err error idList []global.BASE_ID_SORT ) err, idList = GetMissionRecommendSortList() if err != nil { return err } for i := 1; i < len(idList); i++ { if idList[i].ID == info.ID { sort := idList[i].Sort if idList[i-1].Sort == idList[i].Sort { idList[i].Sort += 1 } else { idList[i].Sort = idList[i-1].Sort } var tmp = make([]global.BASE_ID_SORT, 0) tmp = append(tmp, global.BASE_ID_SORT{ID: idList[i].ID, Sort: idList[i].Sort}) tmp = append(tmp, global.BASE_ID_SORT{ID: idList[i-1].ID, Sort: sort}) err = updateMissionRecommendSort(tmp) if err != nil { return err } break } } return err } func MissionRecommendDownData(info request.IdReq, c *gin.Context) error { var ( err error idList []global.BASE_ID_SORT ) err, idList = GetMissionRecommendSortList() if err != nil { return err } for i := 0; i < len(idList); i++ { if idList[i].ID == info.ID && i < len(idList)-1 { sort := idList[i].Sort if idList[i+1].Sort == idList[i].Sort { idList[i].Sort -= 1 } else { idList[i].Sort = idList[i+1].Sort } var tmp = make([]global.BASE_ID_SORT, 0) tmp = append(tmp, global.BASE_ID_SORT{ID: idList[i].ID, Sort: idList[i].Sort}) tmp = append(tmp, global.BASE_ID_SORT{ID: idList[i+1].ID, Sort: sort}) err = updateMissionRecommendSort(tmp) if err != nil { return err } break } } return err } func GetMissionRecommendSortList() (err error, list []global.BASE_ID_SORT) { db := global.MG_DB.Model(&model.MissionRecommend{}) var idList []global.BASE_ID_SORT err = db.Select("id,sort").Order("sort desc").Order("id desc").Find(&idList).Error return err, idList } func updateMissionRecommendSort(idList []global.BASE_ID_SORT) error { var err error for _, val := range idList { //_ = UpdateMissionRecommendSort(val) _ = global.MG_DB.Model(&model.MissionRecommend{}).Where("id=?", val.ID).Update("sort", val.Sort).Error } return err } func UpdateMissionRecommendSort(val global.BASE_ID_SORT) error { var err error _ = global.MG_DB.Model(&model.MissionRecommend{}).Where("id=?", val.ID).Update("sort", val.Sort).Error return err } func GetMissionRecommendList(info request.SearchMission) (err error, list []response.MissionRecommendResponse, total int64) { limit := info.PageSize offset := info.PageSize * (info.Page - 1) db := global.MG_DB.Model(&model.MissionRecommendDetail{}). 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") if info.SellerId != "" { db = db.Where("mission.create_by = ?", info.SellerId) } if info.SellerEmail != "" { db = db.Joins("join seller_store on seller_store.create_by = mission.create_by").Where("seller_store.email like ?", "%"+info.SellerEmail+"%") } if info.HireType > 0 { db = db.Where("mission.hire_type = ?", info.HireType) } if info.Title != "" { db = db.Where("mission.title LIKE ?", "%"+info.Title+"%") } if info.Status != 0 { db = db.Where("mission.status = ?", info.Status) } if info.MissionId != 0 { db = db.Where("mission.id = ?", info.MissionId) } err = db.Count(&total).Error 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,claim_stock"). 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("Seller") }).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++ { //查询订单数 switch res[i].MissionVideo.Mission.HireType { case 1: res[i].MissionVideo.Mission.HireMoneyExpect = fmt.Sprintf("视频拍摄%.f美元/单,总共%d笔", res[i].MissionVideo.Mission.HireMoney, res[i].MissionVideo.Mission.ClaimStock) case 2: res[i].MissionVideo.Mission.HireMoneyExpect = fmt.Sprintf("订单金额%.f%%", res[i].MissionVideo.Mission.HireRatio) } //发布国家 if res[i].MissionVideo.Mission.HasVideo == 1 { res[i].MissionVideo.Mission.ReleaseCountry = GetSysDictDataLabel(model.ReleaseCountryCode, res[i].MissionVideo.Mission.VideoCountryId) var channelNames []string for _, cid := range strings.Split(res[i].MissionVideo.Mission.VideoChannelIds, ",") { vLabel := GetSysDictDataLabel(model.ReleaseChannelCode, cid) channelNames = append(channelNames, vLabel) } res[i].MissionVideo.Mission.ReleaseChannels = strings.Join(channelNames, "/") } //精简字段赋值 vRes := response.MissionRecommendResponse{ SortIndex: offset + 1 + i, MissionRecommend: res[i].MissionRecommend, MissionVideoCommonData: response.MissionVideoCommonData{ MissionId: res[i].MissionVideo.MissionId, VideoUrl: res[i].MissionVideo.VideoUrl, Cover: res[i].MissionVideo.Cover, Title: res[i].MissionVideo.Mission.Title, GoodsTitle: res[i].MissionVideo.Mission.Goods.Title, Influencer: res[i].MissionVideo.Influencer, Tag: "", MissionStatus: res[i].MissionVideo.Mission.Status, StartTime: res[i].MissionVideo.Mission.StartTime, EndTime: res[i].MissionVideo.Mission.EndTime, HireType: res[i].MissionVideo.Mission.HireType, HireMoney: res[i].MissionVideo.Mission.HireMoney, HireRatio: res[i].MissionVideo.Mission.HireRatio, HireMoneyExpect: res[i].MissionVideo.Mission.HireMoneyExpect, ReleaseCountry: res[i].MissionVideo.Mission.ReleaseCountry, ReleaseChannels: res[i].MissionVideo.Mission.ReleaseChannels, Seller: res[i].MissionVideo.Mission.Seller, }, } vRes.Status = res[i].MissionVideo.Mission.Status vRes.MissionVideoCommonData.Tag = GetTagNamesByRelation(strconv.Itoa(int(vRes.MissionRecommend.RelationId)), "02") list = append(list, vRes) } return err, list, total } // 任务视频审核详情 func GetMissionClaimVideoDetail(id uint) (err error, data response.MissionClaimVideoDetail) { var ( claimVideo model.MissionClaimVideo missionClaimDetail model.MissionClaimDetail influencerUser *model.InfluencerUserDesc ) err = global.MG_DB.Model(&model.MissionClaimVideo{}).Where("id = ?", id).First(&claimVideo).Error if errors.Is(err, gorm.ErrRecordNotFound) { return gorm.ErrRecordNotFound, data } db := global.MG_DB.Model(&model.MissionClaim{}). Joins("INNER JOIN mission ON mission.id = mission_claim.mission_id"). Where("mission_claim.id = ?", claimVideo.MissionClaimId) err = db.Select("mission_claim.id,mission_id,mission_claim.claim_no,mission_claim.achieve_num,mission_claim.`status`,mission_claim.created_at,mission_claim.updated_at,mission_claim.expire_at,mission_claim.create_by"). Preload("Order", func(db *gorm.DB) *gorm.DB { return db.Select("order_id,mission_claim_id,`status`,courier,courier_url,courier_number,send_time"). Preload("OrderGoods", func(db *gorm.DB) *gorm.DB { return db.Select("order_id,price,sku_no,title,image,specs,id") }) }). Preload("Mission", func(db *gorm.DB) *gorm.DB { return db. Select("id,title,goods_id,goods_status,num,hire_type,hire_money,hire_ratio,start_time,end_time,`status`,create_by,claim_days,claim_num,claim_stock,has_video,video_url,video_channel_ids,video_country_id,claim_days,create_by,claim_stock"). Preload("Goods", func(db *gorm.DB) *gorm.DB { return db.Select("id,spu_no,title,title_eng,images,tags,retail_price,price_min,price_max,status").Unscoped() }) }).First(&missionClaimDetail).Error if err != nil { return err, data } err, influencerUser = GetInfluencerUserDetail(missionClaimDetail.CreateBy) data.InfluencerUser = *influencerUser data.ClaimVideo = claimVideo data.MissionClaim = response.MissionClaimInfo{ MissionId: missionClaimDetail.MissionId, Title: missionClaimDetail.Mission.Title, ClaimAt: missionClaimDetail.CreatedAt, HireType: missionClaimDetail.Mission.HireType, HireMoney: missionClaimDetail.Mission.HireMoney, HireRatio: missionClaimDetail.Mission.HireRatio, HireMoneyExpect: utils.FormatFloatToString(missionClaimDetail.Order.OrderGoods.Price), StartTime: missionClaimDetail.Mission.StartTime, EndTime: missionClaimDetail.Mission.EndTime, Status: missionClaimDetail.Status, ClaimNum: missionClaimDetail.Mission.ClaimNum, ClaimStock: missionClaimDetail.Mission.ClaimStock, OrderNum: missionClaimDetail.Mission.OrderNum, ClaimDays: missionClaimDetail.Mission.ClaimDays, ClaimDemands: missionClaimDetail.Mission.ClaimDemands, Description: missionClaimDetail.Mission.Description, Sample: missionClaimDetail.Mission.Sample, VideoMaterial: missionClaimDetail.Mission.VideoMaterial, ReleaseCountry: "", ReleaseChannels: "", } //发布国家 if data.MissionClaim.HasVideo == 1 { data.MissionClaim.ReleaseCountry = GetSysDictDataLabel(model.ReleaseCountryCode, data.MissionClaim.VideoCountryId) var channelNames []string for _, cid := range strings.Split(data.MissionClaim.VideoChannelIds, ",") { vLabel := GetSysDictDataLabel(model.ReleaseChannelCode, cid) channelNames = append(channelNames, vLabel) } data.MissionClaim.ReleaseChannels = strings.Join(channelNames, "/") } data.ClaimGoods = response.MissionClaimGoods{ GoodsId: missionClaimDetail.Mission.GoodsId, OrderId: missionClaimDetail.Order.OrderID, SpuNo: missionClaimDetail.Mission.Goods.SpuNo, Title: missionClaimDetail.Mission.Goods.Title, TitleEng: missionClaimDetail.Mission.Goods.TitleEng, Sales: 0.0, Sales30: 0.0, Status: missionClaimDetail.Mission.Goods.Status, Specs: missionClaimDetail.Order.OrderGoods.Specs, SkuNo: missionClaimDetail.Order.OrderGoods.SkuNo, Stock: missionClaimDetail.Mission.Goods.Stock, Price: missionClaimDetail.Order.OrderGoods.Price, Image: missionClaimDetail.Order.OrderGoods.Image, Tags: missionClaimDetail.Mission.Goods.Tags, } //查询销量 totalSales := GetMissionClaimSales(missionClaimDetail.ClaimNo, nil, nil) endTime, _ := time.Parse(utils.DateFormat, time.Now().Format(utils.DateFormat)) startTime := endTime.AddDate(0, 0, -29) sales30 := GetMissionClaimSales(missionClaimDetail.ClaimNo, &startTime, &endTime) data.ClaimGoods.Sales = totalSales.Sales data.ClaimGoods.Sales30 = sales30.Sales return err, data } func GetMissionClaimSales(claimNo string, startTime, endTime *time.Time) (result model.OrderSummary) { var ( err error ) db := global.MG_DB.Model(&model.Order{}).Joins("INNER JOIN mission_claim ON mission_claim.claim_no = `order`.code"). Where("`order`.`status` IN (2,3,4) ").Where("`order`.code = ?", claimNo) if startTime != nil && !startTime.IsZero() { db = db.Where("`order`.pay_time >= ?", startTime) } if endTime != nil && !endTime.IsZero() { db = db.Where("`order`.pay_time >= ?", startTime) } err = db.Select("`order`.code,COUNT(1) as count,sum(paid_price) as sales").Find(&result).Error fmt.Println(result) if err != nil { return } return } func StopMission(uuid string, info request.IdReq) (err error) { var ( checkStop, missionStop model.MissionStop ) err = global.MG_DB.Model(&model.MissionStop{}).Where("id = ? and status = 1", info.ID).First(&checkStop).Error if errors.Is(err, gorm.ErrRecordNotFound) { return err } tx := global.MG_DB.Begin() err = global.MG_DB.Model(&model.Mission{}).Where("id = ? AND create_by = ?", checkStop.MissionId, checkStop.CreateBy).Update("status", 3).Update("end_time", time.Now()).Error if err != nil { tx.Rollback() return err } missionStop = model.MissionStop{ Status: 2, AuditBy: uuid, } err = global.MG_DB.Model(&model.MissionStop{}). Where("id = ?", info.ID).Updates(missionStop).Error if err != nil { tx.Rollback() return err } //清除任务定时 _, _ = global.MG_REDIS.Del(fmt.Sprintf("mission_start_%v", info.ID), fmt.Sprintf("mission_stop_%v", info.ID)).Result() tx.Commit() return err } func GetMissionStopList(info request.SearchStopMission) (err error, list []response.MissionStopData, total int64) { limit := info.PageSize offset := info.PageSize * (info.Page - 1) db := global.MG_DB.Model(&model.MissionStopDetail{}). Joins("inner join mission on mission.id = mission_stop.mission_id") if info.AuditStatus != 0 { if info.AuditStatus == 4 { //已审核=审核通过+审核不通过 db = db.Where("mission_stop.status in (2,3)") } else { db = db.Where("mission_stop.status = ?", info.AuditStatus) } } if info.SellerId != "" { db = db.Where("mission.create_by = ?", info.SellerId) } if info.SellerEmail != "" { db = db.Joins("join seller_store on seller_store.create_by = mission.create_by").Where("seller_store.email like ?", "%"+info.SellerEmail+"%") } if info.HireType > 0 { db = db.Where("mission.hire_type = ?", info.HireType) } if info.Title != "" { db = db.Where("mission.title LIKE ?", "%"+info.Title+"%") } if info.Status != 0 { db = db.Where("mission.status = ?", info.Status) } if info.MissionId != 0 { db = db.Where("mission.id = ?", info.MissionId) } if info.VideoChannelId != "" { db = db.Where("find_in_set(?,mission.video_channel_ids)", info.VideoChannelId) } err = db.Count(&total).Error var res []model.MissionStopDetail err = 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,claim_stock,has_sample,description,sample_num"). 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("Seller") }).Order("mission_stop.id DESC").Limit(limit).Offset(offset).Find(&res).Error if err != nil { return err, nil, 0 } for i := 0; i < len(res); i++ { //精简字段赋值 vCommon := formatMissionCommonData(res[i].Mission) vRes := response.MissionStopData{ Remark: res[i].Remark, ID: res[i].ID, MissionCommonData: vCommon, Goods: res[i].Mission.Goods, } list = append(list, vRes) } return err, list, total } func GetMissionStopDetail(info request.IdReq) (err error, data response.MissionStopData) { var ( missionStop model.MissionStop ) err = global.MG_DB.Model(&model.MissionStopDetail{}). Where("id = ?", info.ID).First(&missionStop).Error if errors.Is(err, gorm.ErrRecordNotFound) { return err, data } var res model.MissionDetail err = global.MG_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,claim_stock"). 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("Seller").First(&res).Error if err != nil { return err, data } //精简字段赋值 vCommon := formatMissionCommonData(res) data = response.MissionStopData{ Remark: missionStop.Remark, ID: missionStop.ID, MissionCommonData: vCommon, } return err, data } func formatMissionCommonData(mission model.MissionDetail) response.MissionCommonData { //查询订单数 switch mission.HireType { case 1: mission.HireMoneyExpect = fmt.Sprintf("视频拍摄%.f美元/单,总共%d笔", mission.HireMoney, mission.ClaimStock) case 2: mission.HireMoneyExpect = fmt.Sprintf("订单金额%.f%%", mission.HireRatio) } //发布国家 mission.ReleaseCountry = GetSysDictDataLabel(model.ReleaseCountryCode, mission.VideoCountryId) var channelNames []string for _, cid := range strings.Split(mission.VideoChannelIds, ",") { vLabel := GetSysDictDataLabel(model.ReleaseChannelCode, cid) channelNames = append(channelNames, vLabel) } mission.ReleaseChannels = strings.Join(channelNames, "/") //精简字段赋值 vCommon := response.MissionCommonData{ MissionId: mission.ID, Title: mission.Title, GoodsTitle: mission.Goods.Title, Tag: "", MissionStatus: mission.Status, StartTime: mission.StartTime, EndTime: mission.EndTime, HireType: mission.HireType, HireMoney: mission.HireMoney, HireRatio: mission.HireRatio, HireMoneyExpect: mission.HireMoneyExpect, ReleaseCountry: mission.ReleaseCountry, ReleaseChannels: mission.ReleaseChannels, ClaimNum: mission.ClaimNum, Seller: mission.Seller, HasVideo: mission.HasVideo, HasSample: mission.HasSample, Description: mission.Description, SampleNum: mission.SampleNum, } return vCommon } func getMissionClaim(claimNo string) (model.MissionClaim, error) { var ( err error result model.MissionClaim ) err = global.MG_DB.Model(&model.MissionClaim{}).Where("claim_no = ?", claimNo).First(&result).Error return result, err } func GetMissionClaimList(info request.SearchMissionClaim) (err error, list []response.MissionClaimSimpleData, total int64) { limit := info.PageSize offset := info.PageSize * (info.Page - 1) db := global.MG_DB.Model(&model.MissionClaim{}). Joins("INNER JOIN mission ON mission.id = mission_claim.mission_id") if info.MissionId != 0 { db = db.Where("mission.id = ?", info.MissionId) } if info.Status != 0 { db = db.Where("mission_claim.`status` = ?", info.Status) } if info.Uuid != "" { db = db.Where("mission_claim.create_by = ?", info.Uuid) } if info.Title != "" { db = db.Where("mission.title LIKE ?", "%"+info.Title+"%") } err = db.Count(&total).Error var res []model.MissionClaimDetail err = db.Select("mission_claim.id,mission_claim.mission_id,mission_claim.claim_no,mission_claim.achieve_num,mission_claim.`status`,mission_claim.create_by,mission_claim.created_at,mission_claim.updated_at"). Preload("Mission", func(db *gorm.DB) *gorm.DB { return db.Select("title,id,video_url,has_video,hire_type,hire_ratio,hire_money,start_time,end_time") }).Preload("Video").Limit(limit).Offset(offset).Find(&res).Error if err != nil { return err, nil, 0 } for i := 0; i < len(res); i++ { vClaim := response.MissionClaimSimpleData{ Video: res[i].Video, MissionId: res[i].MissionId, MissionTitle: res[i].Mission.Title, ClaimAt: res[i].CreatedAt, ClaimDays: res[i].Mission.ClaimDays, HireType: res[i].Mission.HireType, VideoUrl: res[i].Mission.VideoUrl, HasVideo: res[i].Mission.HasVideo, SignUrl: "", } vClaim.ClaimNo = res[i].ClaimNo vClaim.MissionClaim.ID = res[i].ID list = append(list, vClaim) } return err, list, total } func getMissionClaimList(info *request.SearchMissionClaim) (error, []model.MissionClaim) { var ( err error result []model.MissionClaim ) db := global.MG_DB.Model(&model.MissionClaim{}) if info.CreateBy != "" { db = db.Where("create_by = ?", info.CreateBy) } if info.MissionId != 0 { db = db.Where("mission_id = ?", info.MissionId) } if info.Status != 0 { db = db.Where("`status` = ?", info.Status) } err = db.Find(&result).Error return err, result } func CreateMissionTagRelation(params request.CreateMissionTagRelation, uuid string) (err error) { var ( data []model.TagRelation check []model.Tags ) err = global.MG_DB.Model(&model.Tags{}).Where("id in (?)", params.TagId).Find(&check).Error if errors.Is(err, gorm.ErrRecordNotFound) { return err } if len(check) != len(params.TagId) { return errors.New("标签不存在") } tx := global.MG_DB.Begin() err = tx.Model(&model.TagRelation{}).Where("tag_id in (?) and relation_id = ? and relation_type = ?", params.TagId, params.RelationId, params.RelationType).Delete(&model.TagRelation{}).Error if err != nil { tx.Rollback() return err } for _, v := range params.TagId { data = append(data, model.TagRelation{ TagId: v, RelationId: params.RelationId, RelationType: params.RelationType, CreateBy: uuid, UpdateBy: uuid, }) } err = tx.Model(&model.TagRelation{}).Create(&data).Error if err != nil { return errors.New("提交失败") } tx.Commit() return err } func GetInfluencerSummaryList(params request.InfluencerSummaryListParam) (err error, list []model.MissionClaimSummary, total int64) { var ( res []model.MissionClaimSummary uids []string influencerMap map[string]model.UserSimple summary model.Sum ) limit := params.PageSize offset := params.PageSize * (params.Page - 1) db := global.MG_DB.Model(&model.MissionClaim{}) if params.Uuid != "" { db = db.Where("create_by = ?", params.Uuid) } err = db.Select("count(distinct create_by) as total_count").First(&summary).Error total = summary.TotalCount db = db.Group("create_by") err = db.Select("count(1) as count,min(created_at) as first_claim_at,create_by").Limit(limit).Offset(offset).Find(&res).Error for i := 0; i < len(res); i++ { uids = append(uids, res[i].CreateBy) } if len(uids) > 0 { var influencerList []model.UserSimple influencerMap = map[string]model.UserSimple{} influencerList, err = getUserSimpleList("influencer", uids) if err != nil { return errors.New("获取网红信息失败"), list, total } for i, user := range influencerList { if user.Platform != "" { var vPlatform []model.Platform json.Unmarshal([]byte(user.Platform), &vPlatform) influencerList[i].Platforms = vPlatform } influencerMap[user.UUID.String()] = influencerList[i] } } for i := 0; i < len(res); i++ { if _, ok := influencerMap[res[i].CreateBy]; ok { res[i].Influencer = model.InfluencerUserView{ UUID: influencerMap[res[i].CreateBy].UUID.String(), NickName: influencerMap[res[i].CreateBy].NickName, Phone: influencerMap[res[i].CreateBy].Phone, } var vPlatforms []string for _, vp := range influencerMap[res[i].CreateBy].Platforms { vPlatforms = append(vPlatforms, vp.Platform) } res[i].Platform = strings.Join(vPlatforms, "/") } _, claims := getMissionClaimList(&request.SearchMissionClaim{CreateBy: res[i].CreateBy}) if len(claims) != 0 { var claimNos = make([]string, 0) for _, claim := range claims { claimNos = append(claimNos, claim.ClaimNo) res[i].Bonus += claim.RewardFinished res[i].TransitBonus += 0 } statistic, _ := getStatisticsOrderByValuesRelationIds([]string{}, "", "2", claimNos) res[i].OrderNum = statistic.OrderNum } } //todo 订单、佣金、在途佣金统计 list = res return } func GetMissionClaimOrder(orderId string) (error, model.MissionClaimOrderDetail) { var ( err error result model.MissionClaimOrderDetail ) err = global.MG_DB.Model(&model.MissionClaimOrder{}). Joins("INNER JOIN mission_claim ON mission_claim.id = mission_claim_order.mission_claim_id"). Joins("INNER JOIN mission ON mission.id = mission_claim.mission_id"). Where("mission_claim_order.order_id = ?", orderId). Select("mission_claim_order.*").Preload("Goods").Preload("Address"). Preload("MissionClaim", func(db *gorm.DB) *gorm.DB { return db.Select("id,mission_id,claim_no,achieve_num,`status`,create_by,created_at,updated_at") }).Preload("MissionClaim.Influencer", func(db *gorm.DB) *gorm.DB { return db.Select("uuid,nick_name,phone") }).First(&result).Error if err != nil { return err, result } return nil, result } func GetMissionClaimOrderList(info request.SearchMissionClaimOrder) (err error, list []model.MissionClaimOrderDetail, total int64) { limit := info.PageSize offset := info.PageSize * (info.Page - 1) db := global.MG_DB.Model(&model.MissionClaimOrder{}).Joins("INNER JOIN mission_claim ON mission_claim.id = mission_claim_order.mission_claim_id"). Joins("INNER JOIN mission ON mission.id = mission_claim.mission_id") if info.SellerId != "" { db = db.Where("mission.create_by = ?", info.SellerId) } if info.Uuid != "" { db = db.Where("mission_claim.create_by = ?", info.Uuid) } if info.OrderID != "" { db = db.Where("mission_claim_order.order_id = ?", info.OrderID) } if info.Status != 0 { db = db.Where("mission_claim_order.`status` = ?", info.Status) } if info.SpuNo != "" { db = db.Where("mission_claim_order.spu_no = ?", info.SpuNo) } if info.MissionTitle != "" { db = db.Where("`mission`.`title` like ?", "%"+info.MissionTitle+"%") } if info.AddressName != "" || info.AddressPhone != "" { db = db.Joins("INNER JOIN mission_claim_address ON mission_claim_address.mission_claim_id = mission_claim.id") if info.AddressName != "" { name := "%" + info.AddressName + "%" db = db.Where("CONCAT(mission_claim_address.first_name,mission_claim_address.last_name) LIKE ? OR CONCAT(mission_claim_address.first_name,' ',mission_claim_address.last_name) LIKE ?", name, name) } if info.AddressPhone != "" { db = db.Where("mission_claim_address.phone LIKE ?", "%"+info.AddressPhone+"%") } } if info.OrderTimeStart != "" { var tmpT time.Time tmpT, err = time.ParseInLocation(utils.DateTimeFormat, info.OrderTimeStart, time.UTC) if err != nil { err = errors.New("search mission time format error") return err, nil, 0 } db = db.Where("mission_claim_order.created_at >= ?", tmpT) } if info.OrderTimeEnd != "" { var tmpT time.Time tmpT, err = time.ParseInLocation(utils.DateTimeFormat, info.OrderTimeEnd, time.UTC) if err != nil { err = errors.New("search mission time format error") return err, nil, 0 } //tmpT = tmpT.AddDate(0, 0, 1) db = db.Where("mission_claim_order.created_at <= ?", tmpT) } err = db.Count(&total).Error var res []model.MissionClaimOrderDetail err = db.Select("mission_claim_order.*").Preload("Goods").Preload("Address"). Preload("MissionClaim", func(db *gorm.DB) *gorm.DB { return db.Select("id,mission_id,claim_no,achieve_num,`status`,create_by,created_at,updated_at").Preload("Influencer", func(db *gorm.DB) *gorm.DB { return db.Select("uuid,nick_name,phone") }) }).Order("mission_claim_order.id DESC").Limit(limit).Offset(offset).Find(&res).Error if err != nil { return err, nil, 0 } return err, res, total } func getMissionFundLockAmount(info *request.SearchMissionFund) (error, float64, int64) { var ( err error result float64 total int64 ) db := global.MG_DB.Model(&model.Mission{}).Where("hire_type = 1") if info.CreateBy != "" { db = db.Where("create_by = ?", info.CreateBy) } if info.StartTime != "" { db = db.Where("created_at >= ?", info.StartTime) } if info.EndTime != "" { db = db.Where("created_at < ?", info.EndTime) } _ = db.Count(&total).Error err = db.Select("SUM(`fund_lock`)").Scan(&result).Error if err != nil { return errors.New("获取失败"), result, total } return nil, result, total } func getMissionClaimViewMap(claimNos []string) (map[string]model.MissionClaimView, error) { var ( err error list []model.MissionClaimView result = make(map[string]model.MissionClaimView) ) err = global.MG_DB.Model(&model.MissionClaim{}).Joins("INNER JOIN mission ON mission.id = mission_claim.mission_id"). Where("mission_claim.claim_no IN (?)", claimNos).Select("mission_claim.mission_id,mission_claim.claim_no,mission_claim.create_by,mission.title as mission_title"). Find(&list).Error if err != nil { return nil, err } var uuids []string for _, claim := range list { uuids = append(uuids, claim.CreateBy) } userMap, _ := getUserViewMap(uuids...) for i := 0; i < len(list); i++ { if val, ok := userMap[list[i].CreateBy]; ok { list[i].User = val } } for _, claim := range list { result[claim.ClaimNo] = claim } return result, nil } // date eg:2023-12-21 func MissionStatisticCountDaily(date string) error { var ( dailySum model.StatisticMissionDaily claimNum, releaseNum, worksNum int64 err error ) global.MG_DB.Model(&model.Mission{}). Where("created_at between ? and ?", fmt.Sprintf("%s 00:00:00", date), fmt.Sprintf("%s 23:59:59", date)).Count(&releaseNum) global.MG_DB.Model(&model.MissionClaim{}). Where("created_at between ? and ?", fmt.Sprintf("%s 00:00:00", date), fmt.Sprintf("%s 23:59:59", date)).Count(&claimNum) global.MG_DB.Model(&model.MissionClaimWorks{}). Where("created_at between ? and ?", fmt.Sprintf("%s 00:00:00", date), fmt.Sprintf("%s 23:59:59", date)).Count(&worksNum) dailySum = model.StatisticMissionDaily{ Type: "daily", Date: date, ReleaseNum: releaseNum, ClaimNum: claimNum, WorksNum: worksNum, } err = global.MG_DB.Model(&model.StatisticMissionDaily{}).Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "type"}, {Name: "daily"}}, UpdateAll: true, // 主键或唯一索引冲突时, 更新除主键的所有字段 }).Create(&dailySum).Error return err } // date eg:2023-12-21 func MissionStatisticCountTotal() error { var ( dailySum model.StatisticMissionDaily claimNum, releaseNum, worksNum int64 err error ) global.MG_DB.Model(&model.Mission{}).Count(&releaseNum) global.MG_DB.Model(&model.MissionClaim{}).Count(&claimNum) global.MG_DB.Model(&model.MissionClaimWorks{}).Count(&worksNum) dailySum = model.StatisticMissionDaily{ Type: "total", Date: time.Now().Format(utils.DateFormat), ReleaseNum: releaseNum, ClaimNum: claimNum, WorksNum: worksNum, } err = global.MG_DB.Model(&model.StatisticMissionDaily{}).Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "type"}, {Name: "daily"}}, UpdateAll: true, // 主键或唯一索引冲突时, 更新除主键的所有字段 }).Create(&dailySum).Error return err } // @date 日期 eg:2023-10-20 // @sumType 类型 total:累计数据 daily:单日数据 func GetMissionStatisticData(date string, sumType string) (error, model.StatisticMissionDaily) { var ( err error data model.StatisticMissionDaily ) db := global.MG_DB.Model(&model.StatisticMissionDaily{}).Where("type = ?", sumType) if sumType == "daily" && date != "" { db = db.Where("date = ?", date) } err = db.Order("date desc").First(&data).Error if err != nil { return err, data } return err, data }