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