123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506 |
- package youngee_task_service
- import (
- "context"
- "fmt"
- "strconv"
- "youngmini_server/app/dao"
- "youngmini_server/app/model"
- "youngmini_server/app/model/youngee_talent_model"
- "youngmini_server/app/utils"
- "github.com/gogf/gf/database/gdb"
- "github.com/gogf/gf/encoding/gjson"
- "github.com/gogf/gf/frame/g"
- "github.com/gogf/gf/net/ghttp"
- "github.com/gogf/gf/os/gtime"
- )
- // 新建任务service
- func SignUpTask(r *ghttp.Request) *TalentHttpResult {
- tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
- if err != nil {
- return &TalentHttpResult{Code: -1, Msg: "Get talent info failed"}
- }
- var signTaskInfo *youngee_talent_model.SignTaskInfo
- err = r.ParseForm(&signTaskInfo)
- if err != nil {
- return &TalentHttpResult{Code: -2, Msg: "data query failed"}
- }
- var projectDetail *youngee_talent_model.ProjectDetail
- err = g.DB().Model(youngee_talent_model.ProjectDetail{}).WithAll().Where("project_id", signTaskInfo.ProjectId).Scan(&projectDetail)
- if err != nil {
- return &TalentHttpResult{Code: -3, Msg: err.Error()}
- }
- var talentInfo *youngee_talent_model.TalentInfo
- err = g.DB().Model("youngee_talent_info").WithAll().Where("id", tid).Scan(&talentInfo)
- if err != nil {
- return &TalentHttpResult{Code: -4, Msg: "Get talent info failed"}
- }
- var accountInfo *youngee_talent_model.PlatformAccountInfo
- err = g.DB().Model("youngee_platform_account_info").WithAll().Where("talent_id = ? and platform_id = ?", tid, projectDetail.ProjectPlatform).Scan(&accountInfo)
- if err != nil {
- return &TalentHttpResult{Code: -5, Msg: err.Error()}
- }
- address, err := g.DB().Model(dao.YoungeeTalentDeliveryAddress.Table).One("talent_id = ? and address_id = ?", tid, signTaskInfo.AddressId)
- if err != nil {
- return &TalentHttpResult{Code: -6, Msg: err.Error()}
- }
- var newTaskId string
- // 首先生成任务id
- newTaskId = utils.GetUuid.GetTaskId(projectDetail.ProjectId, projectDetail.EnterpriseId, tid)
- // 生成达人平台账号信息快照
- accountSnap, err := gjson.Encode(accountInfo)
- if err != nil {
- return &TalentHttpResult{Code: -7, Msg: "encode platform snap failed"}
- }
- // 生成达人信息快照
- talentSnap, err := gjson.Encode(talentInfo)
- if err != nil {
- return &TalentHttpResult{Code: -8, Msg: "encode talent info snap failed"}
- }
- // 生成收货地址快照
- addrSnap, err := gjson.Encode(address)
- if err != nil {
- return &TalentHttpResult{Code: -9, Msg: "encode delivery address snap failed"}
- }
- taskInfo := model.YoungeeTaskInfo{}
- if projectDetail.ProjectType == 1 {
- // 全流程任务
- // 计算平台服务费
- // 1. 先获取稿费形式
- var strategy *youngee_talent_model.RecruitStrategy
- err = g.DB().Model("recruit_strategy").WithAll().Where("strategy_id = ? and project_id= ?", signTaskInfo.StrategyId, signTaskInfo.ProjectId).Scan(&strategy)
- if err != nil {
- return &TalentHttpResult{Code: -10, Msg: err.Error()}
- }
- // 2. 根据稿费形式、平台、粉丝数获取服务费最高的定价策略
- // 2.1 查询所有对应定价策略
- whereStr1 := fmt.Sprintf("fee_form = %d and platform = %d and fans_low <= %d and fans_up > %d", strategy.FeeForm, projectDetail.ProjectPlatform, strategy.FollowersLow, strategy.FollowersLow)
- orStr1 := fmt.Sprintf("fee_form = %d and platform = %d and fans_low < %d and fans_up >= %d", strategy.FeeForm, projectDetail.ProjectPlatform, strategy.FollowersUp, strategy.FollowersUp)
- orStr2 := fmt.Sprintf("fee_form = %d and platform = %d and fans_low >= %d and fans_up <= %d", strategy.FeeForm, projectDetail.ProjectPlatform, strategy.FollowersLow, strategy.FollowersUp)
- orStr3 := fmt.Sprintf("fee_form = %d and platform = %d and fans_low <= %d and fans_up >= %d", strategy.FeeForm, projectDetail.ProjectPlatform, strategy.FollowersLow, strategy.FollowersUp)
- var pricings []*model.InfoPricingStrategy
- err = g.DB().Model("info_pricing_strategy").WithAll().Where(whereStr1).Or(orStr1).Or(orStr2).Or(orStr3).Scan(&pricings)
- if err != nil {
- return &TalentHttpResult{Code: -11, Msg: err.Error()}
- } else if pricings == nil {
- return &TalentHttpResult{Code: -12, Msg: "无相关定价策略"}
- }
- var pricing *model.InfoPricingStrategy
- // 2.2 从对应定价策略中选取服务费率最高
- if strategy.FeeForm == 1 {
- var maxCharge float64 = 0
- for _, v := range pricings {
- if v.ServiceCharge >= maxCharge {
- maxCharge = v.ServiceCharge
- pricing = v
- }
- }
- } else {
- var maxRate int = 0
- for _, v := range pricings {
- if v.ServiceRate >= maxRate {
- maxRate = v.ServiceRate
- pricing = v
- }
- }
- }
- var serviceCharge = 0.0
- var serviceRate = 0
- var allReward = 0.0
- var allPayment = 0.0
- switch strategy.FeeForm {
- case 1: // 产品置换,服务费固定,在项目生成时确定
- serviceCharge = float64(strategy.ServiceCharge)
- allPayment = serviceCharge
- break
- case 2: // 固定稿费,m2 = y2 * r2
- allPayment = float64(strategy.Offer)
- serviceRate = pricing.ServiceRate
- serviceCharge = allPayment * float64(serviceRate) / 1000
- allReward = allPayment - serviceCharge
- break
- case 3: // 自报价,m3 = x3 * r3
- allReward = float64(signTaskInfo.Offer)
- serviceRate = pricing.ServiceRate
- var tmpRate = float64(1000-serviceRate) / 1000
- allPayment = allReward / tmpRate
- serviceCharge = allPayment - allReward
- break
- default:
- break
- }
- taskInfo = model.YoungeeTaskInfo{
- TaskId: newTaskId,
- ProjectId: signTaskInfo.ProjectId,
- TalentId: tid,
- AccountId: accountInfo.AccountId,
- TalentPlatformInfoSnap: string(accountSnap),
- TalentPersonalInfoSnap: string(talentSnap),
- TalentPostAddrSnap: string(addrSnap),
- StrategyId: signTaskInfo.StrategyId,
- TaskReward: allReward,
- SettleAmount: allReward,
- AllPayment: allPayment,
- TaskStage: 1,
- RealPayment: allPayment,
- FeeForm: strategy.FeeForm,
- ServiceCharge: serviceCharge,
- ServiceRate: serviceRate,
- CreateDate: gtime.Now(),
- TaskStatus: 1,
- LogisticsStatus: 1,
- LinkStatus: 1,
- DataStatus: 1,
- ScriptStatus: 1,
- SketchStatus: 1,
- CompleteStatus: 1,
- CurDefaultType: 0,
- WithdrawStatus: 1,
- SettleStatus: 1,
- }
- } else {
- // 专项任务
- taskInfo = model.YoungeeTaskInfo{
- TaskId: newTaskId,
- ProjectId: signTaskInfo.ProjectId,
- TalentId: tid,
- AccountId: accountInfo.AccountId,
- TalentPlatformInfoSnap: string(accountSnap),
- TalentPersonalInfoSnap: string(talentSnap),
- TalentPostAddrSnap: string(addrSnap),
- TaskStage: 1,
- CreateDate: gtime.Now(),
- TaskStatus: 1,
- LogisticsStatus: 1,
- LinkStatus: 1,
- DataStatus: 1,
- ScriptStatus: 1,
- SketchStatus: 1,
- CompleteStatus: 1,
- CurDefaultType: 0,
- WithdrawStatus: 1,
- }
- }
- err = g.DB().Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
- // 在task_info表中插入任务
- _, err = tx.Ctx(ctx).Model(dao.YoungeeTaskInfo.Table).Data(&taskInfo).Insert()
- if err != nil {
- return err
- }
- // 对应项目的报名人数自增
- _, err = tx.Ctx(ctx).Model(dao.ProjectInfo.Table).Where(dao.ProjectInfo.Columns.ProjectId, projectDetail.ProjectId).Increment(dao.ProjectInfo.Columns.ApplyNum, 1)
- if err != nil {
- return err
- }
- return nil
- })
- if err != nil {
- return &TalentHttpResult{Code: -18, Msg: "add Task data failed"}
- }
- return &TalentHttpResult{Code: 0, Msg: "success", Data: newTaskId}
- }
- // 判断是否已报名任务
- func IsSignUpTask(r *ghttp.Request) *TalentHttpResult {
- tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
- if err != nil {
- return &TalentHttpResult{Code: -1, Msg: "Get talent info failed"}
- }
- projectId := r.GetQueryInt("project_id", -1)
- fmt.Printf("%+v\n", projectId)
- task := []model.YoungeeTaskInfo{}
- err = g.Model(dao.YoungeeTaskInfo.Table).Where("project_id = ? and talent_id = ?", projectId, tid).Scan(&task)
- if err != nil {
- return &TalentHttpResult{Code: -1, Msg: err.Error()}
- }
- isSign := youngee_talent_model.IsSign{}
- if len(task) != 0 {
- isSign.TaskInfo = &task[0]
- isSign.IsSign = 1
- isSign.IsAgree = task[0].TaskStatus
- } else {
- isSign.IsSign = 0
- isSign.IsAgree = 0
- }
- return &TalentHttpResult{Code: 0, Msg: "success", Data: isSign}
- }
- // 查询所有任务
- func GetTaskBriefList(r *ghttp.Request) *TalentHttpResult {
- tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
- if err != nil {
- return &TalentHttpResult{Code: -1, Msg: "Get talent info failed"}
- }
- // 构造查询条件
- whereStr := fmt.Sprintf("talent_id = '%s'", tid)
- fmt.Print(whereStr)
- // 获取任务列表
- var taskList []*model.YoungeeTaskInfo
- err = g.Model(dao.YoungeeTaskInfo.Table).Where(whereStr).Scan(&taskList)
- if err != nil {
- return &TalentHttpResult{Code: -1, Msg: "Get task list failed"}
- }
- platformMap := make(map[string]model.InfoThirdPlatform)
- platformInfo := []*model.InfoThirdPlatform{}
- if len(taskList) != 0 {
- err := g.Model(dao.InfoThirdPlatform.Table).Scan(&platformInfo)
- if err != nil {
- return &TalentHttpResult{Code: -1, Msg: "Get platform failed"}
- }
- for i, _ := range platformInfo {
- platformMap[strconv.Itoa(platformInfo[i].PlatformId)] = *platformInfo[i]
- }
- }
- // 为每个任务根据项目id查询项目名称和主图
- taskBriefList := youngee_talent_model.TaskInfoBriefList{}
- for _, v := range taskList {
- projectInfo, err := g.Model(dao.ProjectInfo.Table).Where("project_id = ?", v.ProjectId).One()
- if err != nil {
- return &TalentHttpResult{Code: -1, Msg: "Get fullproject info failed"}
- }
- account, err := g.Model(dao.YoungeePlatformAccountInfo.Table).One("platform_id = ? and talent_id = ?", projectInfo[dao.ProjectInfo.Columns.ProjectPlatform], v.TalentId)
- if err != nil {
- return &TalentHttpResult{Code: -1, Msg: "Get account info failed"}
- }
- taskInfoBrief := &youngee_talent_model.TaskInfoBrief{
- TaskId: v.TaskId,
- PlatformIconUrl: platformMap[projectInfo[dao.ProjectInfo.Columns.ProjectPlatform].String()].PlatformIcon,
- PlatformName: platformMap[projectInfo[dao.ProjectInfo.Columns.ProjectPlatform].String()].PlatformName,
- PlatformNickName: account[dao.YoungeePlatformAccountInfo.Columns.PlatformNickname].String(),
- ProjectName: projectInfo[dao.ProjectInfo.Columns.ProjectName].String(),
- ProductPhotoSnap: projectInfo[dao.ProjectInfo.Columns.ProductPhotoSnap].String(),
- TaskStatus: v.TaskStatus,
- TaskStage: v.TaskStage,
- LinkStatus: v.LinkStatus,
- DataStatus: v.DataStatus,
- ScriptStatus: v.ScriptStatus,
- SketchStatus: v.SketchStatus,
- TaskReward: v.TaskReward,
- BreakRate: v.ScriptBreakRate + v.SketchBreakRate + v.LinkBreakRate + v.DataBreakRate,
- CurBreakAt: v.CurBreakAt,
- FeeForm: v.FeeForm,
- }
- taskBriefList.AllTaskInfoList = append(taskBriefList.AllTaskInfoList, taskInfoBrief)
- if v.TaskStage <= 2 {
- taskBriefList.SignUpTaskInfoList = append(taskBriefList.SignUpTaskInfoList, taskInfoBrief)
- } else if v.TaskStage <= 14 && v.TaskStage >= 4 {
- taskBriefList.GoingOnTaskInfoList = append(taskBriefList.GoingOnTaskInfoList, taskInfoBrief)
- } else {
- taskBriefList.CompletedTaskInfoList = append(taskBriefList.CompletedTaskInfoList, taskInfoBrief)
- }
- }
- return &TalentHttpResult{Code: 0, Msg: "success", Data: taskBriefList}
- }
- // 查询执行中所有任务
- func GetExeTaskBriefList(r *ghttp.Request) *TalentHttpResult {
- tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
- if err != nil {
- return &TalentHttpResult{Code: -1, Msg: "Get talent info failed"}
- }
- var taskStageList = [5]int{0, 7, 9, 11, 13}
- taskStageKey := r.GetQueryInt("taskStage", 0)
- if taskStageKey == 0 {
- return &TalentHttpResult{Code: -2, Msg: "parse param error"}
- }
- taskStage := taskStageList[taskStageKey+1]
- // 获取任务列表
- var taskList []*model.YoungeeTaskInfo
- whereCondition := g.Map{
- dao.YoungeeTaskInfo.Columns.TalentId: tid,
- dao.YoungeeTaskInfo.Columns.TaskStage: taskStage,
- }
- err = g.Model(dao.YoungeeTaskInfo.Table).Where(whereCondition).Scan(&taskList)
- if err != nil {
- return &TalentHttpResult{Code: -1, Msg: "Get task list failed"}
- }
- platformMap := make(map[string]model.InfoThirdPlatform)
- var platformInfo []*model.InfoThirdPlatform
- if len(taskList) != 0 {
- err := g.Model(dao.InfoThirdPlatform.Table).Scan(&platformInfo)
- if err != nil {
- return &TalentHttpResult{Code: -1, Msg: "Get platform failed"}
- }
- for i, _ := range platformInfo {
- platformMap[strconv.Itoa(platformInfo[i].PlatformId)] = *platformInfo[i]
- }
- }
- // 为每个任务根据项目id查询项目名称和主图
- var taskBriefList []*youngee_talent_model.TaskInfoBrief
- for _, v := range taskList {
- whereCondition = g.Map{
- dao.ProjectInfo.Columns.ProjectId: v.ProjectId,
- }
- projectInfo, err := g.Model(dao.ProjectInfo.Table).Where(whereCondition).One()
- if err != nil {
- return &TalentHttpResult{Code: -1, Msg: "Get fullproject info failed"}
- }
- whereCondition = g.Map{
- dao.YoungeePlatformAccountInfo.Columns.PlatformId: projectInfo[dao.ProjectInfo.Columns.ProjectPlatform],
- dao.YoungeePlatformAccountInfo.Columns.TalentId: v.TalentId,
- }
- account, err := g.Model(dao.YoungeePlatformAccountInfo.Table).Where(whereCondition).One()
- if err != nil {
- return &TalentHttpResult{Code: -1, Msg: "Get account info failed"}
- }
- taskInfoBrief := &youngee_talent_model.TaskInfoBrief{
- TaskId: v.TaskId,
- PlatformIconUrl: platformMap[projectInfo[dao.ProjectInfo.Columns.ProjectPlatform].String()].PlatformIcon,
- PlatformName: platformMap[projectInfo[dao.ProjectInfo.Columns.ProjectPlatform].String()].PlatformName,
- PlatformNickName: account[dao.YoungeePlatformAccountInfo.Columns.PlatformNickname].String(),
- ProjectName: projectInfo[dao.ProjectInfo.Columns.ProjectName].String(),
- ProductPhotoSnap: projectInfo[dao.ProjectInfo.Columns.ProductPhotoSnap].String(),
- TaskStatus: v.TaskStatus,
- TaskStage: v.TaskStage,
- LinkStatus: v.LinkStatus,
- DataStatus: v.DataStatus,
- ScriptStatus: v.ScriptStatus,
- SketchStatus: v.SketchStatus,
- TaskReward: v.TaskReward,
- BreakRate: v.ScriptBreakRate + v.SketchBreakRate + v.LinkBreakRate + v.DataBreakRate,
- CurBreakAt: v.CurBreakAt,
- FeeForm: v.FeeForm,
- }
- taskBriefList = append(taskBriefList, taskInfoBrief)
- }
- return &TalentHttpResult{Code: 0, Msg: "success", Data: taskBriefList}
- }
- // 查询执行中所有任务
- func GetExeTaskNum(r *ghttp.Request) *TalentHttpResult {
- tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
- if err != nil {
- return &TalentHttpResult{Code: -1, Msg: "Get talent info failed"}
- }
- nums, err := g.Model("youngee_task_info").Where("talent_id = ?", tid).Fields("COUNT(*) ,task_stage").Group("task_stage").All()
- if err != nil {
- return &TalentHttpResult{Code: -1, Msg: "Get talent info failed"}
- }
- return &TalentHttpResult{Code: 0, Msg: "success", Data: nums}
- }
- func GetTaskNum(r *ghttp.Request) *TalentHttpResult {
- tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
- if err != nil {
- return &TalentHttpResult{Code: -1, Msg: "Get talent info failed"}
- }
- // 构造查询条件
- whereStr1 := fmt.Sprintf("talent_id = '%s'", tid)
- whereStr2 := fmt.Sprintf("talent_id = '%s' and task_stage <= 2", tid)
- whereStr3 := fmt.Sprintf("talent_id = '%s' and task_stage <= 14 and task_stage >= 4", tid)
- whereStr4 := fmt.Sprintf("talent_id = '%s' and (task_stage = 3 or task_stage >= 15)", tid)
- num1, err := g.Model(dao.YoungeeTaskInfo.Table).Where(whereStr1).Count()
- if err != nil {
- return &TalentHttpResult{Code: -1, Msg: "Get account info failed"}
- }
- num2, err := g.Model(dao.YoungeeTaskInfo.Table).Where(whereStr2).Count()
- if err != nil {
- return &TalentHttpResult{Code: -1, Msg: "Get account info failed"}
- }
- num3, err := g.Model(dao.YoungeeTaskInfo.Table).Where(whereStr3).Count()
- if err != nil {
- return &TalentHttpResult{Code: -1, Msg: "Get account info failed"}
- }
- num4, err := g.Model(dao.YoungeeTaskInfo.Table).Where(whereStr4).Count()
- if err != nil {
- return &TalentHttpResult{Code: -1, Msg: "Get account info failed"}
- }
- TaskNum := &youngee_talent_model.TaskNum{
- AllNum: num1,
- SignUpNum: num2,
- GoingOnNum: num3,
- CompletedNum: num4,
- }
- return &TalentHttpResult{Code: 0, Msg: "success", Data: TaskNum}
- }
- // 获取任务详情
- func GetTaskDetail(r *ghttp.Request) *TalentHttpResult {
- taskId := r.GetQueryInt("task_id", -1)
- var task *model.YoungeeTaskInfo
- err := g.Model(dao.YoungeeTaskInfo.Table).Where("task_id = ?", taskId).Scan(&task)
- if err != nil {
- return &TalentHttpResult{Code: -1, Msg: "Get task info failed"}
- }
- var projectDetail *youngee_talent_model.ProjectDetail
- err = g.Model(youngee_talent_model.ProjectDetail{}).WithAll().Where("project_id", task.ProjectId).Scan(&projectDetail)
- if err != nil {
- return &TalentHttpResult{Code: -3, Msg: "data query failed"}
- }
- var productPhoto *model.YounggeeProductPhoto
- err = g.Model(dao.YounggeeProductPhoto.Table).Where("product_id = ? and symbol = 1", projectDetail.ProductId).Scan(&productPhoto)
- if err != nil {
- return &TalentHttpResult{Code: -3, Msg: "data query failed"}
- }
- var withdrawStatus = 1
- var taskIncome *model.YounggeeTalentIncome
- err = g.Model(dao.YounggeeTalentIncome.Table).Where("task_id = ? and income_type = 1", taskId).Scan(&taskIncome)
- if err != nil {
- return &TalentHttpResult{Code: -3, Msg: "Get task income detail failed."}
- }
- if taskIncome != nil {
- withdrawStatus = taskIncome.WithdrawStatus + 1
- }
- taskDetail := &youngee_talent_model.TaskDetail{}
- if projectDetail.ProjectType == 1 {
- var strategy *model.RecruitStrategy
- err = g.Model(dao.RecruitStrategy.Table).Where("project_id = ? and strategy_id = ?", task.ProjectId, task.StrategyId).Scan(&strategy)
- if err != nil {
- return &TalentHttpResult{Code: -3, Msg: "data query failed"}
- }
- taskDetail = &youngee_talent_model.TaskDetail{
- TaskInfo: task,
- ProjectDetail: projectDetail,
- ProductPhoto: productPhoto,
- Strategy: strategy,
- WithdrawStatus: withdrawStatus,
- }
- } else {
- taskDetail = &youngee_talent_model.TaskDetail{
- TaskInfo: task,
- ProjectDetail: projectDetail,
- ProductPhoto: productPhoto,
- WithdrawStatus: withdrawStatus,
- }
- }
- return &TalentHttpResult{Code: 0, Msg: "success", Data: taskDetail}
- }
|