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
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
|
||
|
|
||
|
}
|