package youngee_talent_service import ( "context" "fmt" "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: err.Error()} } 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: "data query failed"} } 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()} } // 生成达人平台账号信息快照 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"} } // 计算平台服务费 // 先获取稿费形式 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: -5, Msg: err.Error()} } // 根据稿费形式、平台、粉丝数查询服务费 whereStr1 := fmt.Sprintf("fee_form = %d and platform = %d and fans_low <= %d and fans_up >= %d", strategy.FeeForm, projectDetail.ProjectPlatform, accountInfo.FansCount, accountInfo.FansCount) 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) var pricing *model.InfoPricingStrategy err = g.DB().Model("info_pricing_strategy").WithAll().Where(whereStr1).Scan(&pricing) if err != nil { return &TalentHttpResult{Code: -5, Msg: err.Error()} } serviceRate = pricing.ServiceRate serviceCharge = allPayment * float64(serviceRate) / 1000 allReward = allPayment - serviceCharge break case 3: // 自报价,m3 = x3 * r3 allReward = float64(signTaskInfo.Offer) var pricing *model.InfoPricingStrategy err = g.DB().Model("info_pricing_strategy").WithAll().Where(whereStr1).Scan(&pricing) if err != nil { return &TalentHttpResult{Code: -5, Msg: err.Error()} } serviceRate = pricing.ServiceRate serviceCharge = allReward * float64(serviceRate) / 1000 allPayment = allReward + serviceCharge break default: break } err = g.DB().Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error { // 在task_info表中插入任务 taskId, err1 := tx.Ctx(ctx).Model(dao.YoungeeTaskInfo.Table).Data(model.YoungeeTaskInfo{ ProjectId: int(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, Penalty: 0, FeeForm: strategy.FeeForm, ServiceCharge: serviceCharge, ServiceRate: serviceRate, TaskStatus: 1, CreateDate: gtime.Now(), CompleteStatus: 1, }).InsertAndGetId() if err1 != nil { return err1 } // 对应项目的报名人数自增 _, err1 = tx.Ctx(ctx).Model(dao.ProjectInfo.Table).Where(dao.ProjectInfo.Columns.ProjectId, projectDetail.ProjectId).Increment(dao.ProjectInfo.Columns.ApplyNum, 1) if err1 != nil { return err1 } fmt.Printf("%+v", taskId) return nil }) if err != nil { return &TalentHttpResult{Code: -18, Msg: "add Task data failed"} } return &TalentHttpResult{Code: 0, Msg: "success"} } // 判断是否已报名任务 func IsSignUpTask(r *ghttp.Request) *TalentHttpResult { projectId := r.GetQueryInt("project_id", -1) accountId := r.GetQueryInt("account_id", -1) fmt.Printf("%+v\n", projectId) fmt.Printf("%+v\n", accountId) isSignUp, err := g.Model(dao.YoungeeTaskInfo.Table).Where("project_id = ? and account_id = ?", projectId, accountId).Count() if err != nil { return &TalentHttpResult{Code: -1, Msg: err.Error()} } return &TalentHttpResult{Code: 0, Msg: "success", Data: isSignUp} } // 查询所有任务 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"} } // 为每个任务根据项目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 project info failed"} } mainPhoto, err := g.Model(dao.YounggeeProductPhoto.Table).One("product_id = ? and symbol = 1", projectInfo[dao.ProjectInfo.Columns.ProductId]) if err != nil { return &TalentHttpResult{Code: -1, Msg: "Get product mainphoto failed"} } platform, err := g.Model(dao.InfoThirdPlatform.Table).One("platform_id = ?", projectInfo[dao.ProjectInfo.Columns.ProjectPlatform]) if err != nil { return &TalentHttpResult{Code: -1, Msg: "Get platform 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: uint64(v.TaskId), PlatformIconUrl: platform[dao.InfoThirdPlatform.Columns.PlatformIcon].String(), PlatformName: platform[dao.InfoThirdPlatform.Columns.PlatformName].String(), PlatformNickName: account[dao.YoungeePlatformAccountInfo.Columns.PlatformNickname].String(), ProjectName: projectInfo[dao.ProjectInfo.Columns.ProjectName].String(), ProductImgUrl: mainPhoto[dao.YounggeeProductPhoto.Columns.PhotoUrl].String(), TaskStatus: v.TaskStatus, TaskStage: v.TaskStage, } taskBriefList.AllTaskInfoList = append(taskBriefList.AllTaskInfoList, taskInfoBrief) if v.TaskStage <= 3 { taskBriefList.SignUpTaskInfoList = append(taskBriefList.SignUpTaskInfoList, taskInfoBrief) } else if v.TaskStage <= 9 && v.TaskStage >= 5 { 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 taskList []*model.YoungeeTaskInfo err = g.Model(dao.YoungeeTaskInfo.Table).Where("talent_id = ?", tid).And("task_stage IN(?)", g.Slice{8, 11, 14, 17}).Scan(&taskList) if err != nil { return &TalentHttpResult{Code: -1, Msg: "Get task list failed"} } // 为每个任务根据项目id查询项目名称和主图 taskBriefList := youngee_talent_model.EXETaskInfoBriefList{} 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 project info failed"} } mainPhoto, err := g.Model(dao.YounggeeProductPhoto.Table).One("product_id = ? and symbol = 1", projectInfo[dao.ProjectInfo.Columns.ProductId]) if err != nil { return &TalentHttpResult{Code: -1, Msg: "Get product mainphoto failed"} } platform, err := g.Model(dao.InfoThirdPlatform.Table).One("platform_id = ?", projectInfo[dao.ProjectInfo.Columns.ProjectPlatform]) if err != nil { return &TalentHttpResult{Code: -1, Msg: "Get platform 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: uint64(v.TaskId), PlatformIconUrl: platform[dao.InfoThirdPlatform.Columns.PlatformIcon].String(), PlatformName: platform[dao.InfoThirdPlatform.Columns.PlatformName].String(), PlatformNickName: account[dao.YoungeePlatformAccountInfo.Columns.PlatformNickname].String(), ProjectName: projectInfo[dao.ProjectInfo.Columns.ProjectName].String(), ProductImgUrl: mainPhoto[dao.YounggeeProductPhoto.Columns.PhotoUrl].String(), TaskStatus: v.TaskStatus, TaskStage: v.TaskStage, } if v.TaskStage == 8 { taskBriefList.List1 = append(taskBriefList.List1, taskInfoBrief) } else if v.TaskStage == 11 { taskBriefList.List2 = append(taskBriefList.List2, taskInfoBrief) } else if v.TaskStage == 14 { taskBriefList.List3 = append(taskBriefList.List3, taskInfoBrief) } else if v.TaskStage == 17 { taskBriefList.List4 = append(taskBriefList.List4, taskInfoBrief) } } return &TalentHttpResult{Code: 0, Msg: "success", Data: taskBriefList} } 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 <= 3", tid) whereStr3 := fmt.Sprintf("talent_id = '%s' and task_stage <= 19 and task_stage >= 5", tid) whereStr4 := fmt.Sprintf("talent_id = '%s' and (task_stage = 4 or task_stage >= 20)", 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 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, } return &TalentHttpResult{Code: 0, Msg: "success", Data: taskDetail} } // 获取物流信息 func GetTaskLogisticsInfo(r *ghttp.Request) *TalentHttpResult { taskId := r.GetQueryInt("task_id", -1) var logistics *model.YoungeeTaskLogistics err := g.Model(dao.YoungeeTaskLogistics.Table).Where("task_id = ?", taskId).Scan(&logistics) if err != nil { return &TalentHttpResult{Code: -1, Msg: "Get logistics info failed"} } return &TalentHttpResult{Code: 0, Msg: "success", Data: logistics} }