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.

1310 lines
44 KiB

9 months ago
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
}