task_info.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  1. package youngee_talent_service
  2. import (
  3. "context"
  4. "fmt"
  5. "youngmini_server/app/dao"
  6. "youngmini_server/app/model"
  7. "youngmini_server/app/model/youngee_talent_model"
  8. "youngmini_server/app/utils"
  9. "github.com/gogf/gf/database/gdb"
  10. "github.com/gogf/gf/encoding/gjson"
  11. "github.com/gogf/gf/frame/g"
  12. "github.com/gogf/gf/net/ghttp"
  13. "github.com/gogf/gf/os/gtime"
  14. )
  15. // 新建任务service
  16. func SignUpTask(r *ghttp.Request) *TalentHttpResult {
  17. tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
  18. if err != nil {
  19. return &TalentHttpResult{Code: -1, Msg: "Get talent info failed"}
  20. }
  21. var signTaskInfo *youngee_talent_model.SignTaskInfo
  22. err = r.ParseForm(&signTaskInfo)
  23. if err != nil {
  24. return &TalentHttpResult{Code: -2, Msg: "data query failed"}
  25. }
  26. var projectDetail *youngee_talent_model.ProjectDetail
  27. err = g.DB().Model(youngee_talent_model.ProjectDetail{}).WithAll().Where("project_id", signTaskInfo.ProjectId).Scan(&projectDetail)
  28. if err != nil {
  29. return &TalentHttpResult{Code: -3, Msg: err.Error()}
  30. }
  31. var talentInfo *youngee_talent_model.TalentInfo
  32. err = g.DB().Model("youngee_talent_info").WithAll().Where("id", tid).Scan(&talentInfo)
  33. if err != nil {
  34. return &TalentHttpResult{Code: -4, Msg: "Get talent info failed"}
  35. }
  36. var accountInfo *youngee_talent_model.PlatformAccountInfo
  37. err = g.DB().Model("youngee_platform_account_info").WithAll().Where("talent_id = ? and platform_id = ?", tid, projectDetail.ProjectPlatform).Scan(&accountInfo)
  38. if err != nil {
  39. return &TalentHttpResult{Code: -5, Msg: err.Error()}
  40. }
  41. address, err := g.DB().Model(dao.YoungeeTalentDeliveryAddress.Table).One("talent_id = ? and address_id = ?", tid, signTaskInfo.AddressId)
  42. if err != nil {
  43. return &TalentHttpResult{Code: -6, Msg: err.Error()}
  44. }
  45. var newTaskId string
  46. // 首先生成任务id
  47. newTaskId = utils.GetUuid.GetTaskId(projectDetail.ProjectId, projectDetail.EnterpriseId, tid)
  48. // 生成达人平台账号信息快照
  49. accountSnap, err := gjson.Encode(accountInfo)
  50. if err != nil {
  51. return &TalentHttpResult{Code: -7, Msg: "encode platform snap failed"}
  52. }
  53. // 生成达人信息快照
  54. talentSnap, err := gjson.Encode(talentInfo)
  55. if err != nil {
  56. return &TalentHttpResult{Code: -8, Msg: "encode talent info snap failed"}
  57. }
  58. // 生成收货地址快照
  59. addrSnap, err := gjson.Encode(address)
  60. if err != nil {
  61. return &TalentHttpResult{Code: -9, Msg: "encode delivery address snap failed"}
  62. }
  63. taskInfo := model.YoungeeTaskInfo{}
  64. if projectDetail.ProjectType == 1 {
  65. // 全流程任务
  66. // 计算平台服务费
  67. // 1. 先获取稿费形式
  68. var strategy *youngee_talent_model.RecruitStrategy
  69. err = g.DB().Model("recruit_strategy").WithAll().Where("strategy_id = ? and project_id= ?", signTaskInfo.StrategyId, signTaskInfo.ProjectId).Scan(&strategy)
  70. if err != nil {
  71. return &TalentHttpResult{Code: -10, Msg: err.Error()}
  72. }
  73. // 2. 根据稿费形式、平台、粉丝数获取服务费最高的定价策略
  74. // 2.1 查询所有对应定价策略
  75. 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)
  76. 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)
  77. var pricings []*model.InfoPricingStrategy
  78. err = g.DB().Model("info_pricing_strategy").WithAll().Where(whereStr1).Or(orStr1).Scan(&pricings)
  79. if err != nil {
  80. return &TalentHttpResult{Code: -11, Msg: err.Error()}
  81. } else if pricings == nil {
  82. return &TalentHttpResult{Code: -12, Msg: "无相关定价策略"}
  83. }
  84. var pricing *model.InfoPricingStrategy
  85. // 2.2 从对应定价策略中选取服务费率最高
  86. if strategy.FeeForm == 1 {
  87. var maxCharge float64 = 0
  88. for _, v := range pricings {
  89. if v.ServiceCharge >= maxCharge {
  90. maxCharge = v.ServiceCharge
  91. pricing = v
  92. }
  93. }
  94. } else {
  95. var maxRate int = 0
  96. for _, v := range pricings {
  97. if v.ServiceRate >= maxRate {
  98. maxRate = v.ServiceRate
  99. pricing = v
  100. }
  101. }
  102. }
  103. var serviceCharge = 0.0
  104. var serviceRate = 0
  105. var allReward = 0.0
  106. var allPayment = 0.0
  107. switch strategy.FeeForm {
  108. case 1: // 产品置换,服务费固定,在项目生成时确定
  109. serviceCharge = float64(strategy.ServiceCharge)
  110. allPayment = serviceCharge
  111. break
  112. case 2: // 固定稿费,m2 = y2 * r2
  113. allPayment = float64(strategy.Offer)
  114. serviceRate = pricing.ServiceRate
  115. serviceCharge = allPayment * float64(serviceRate) / 1000
  116. allReward = allPayment - serviceCharge
  117. break
  118. case 3: // 自报价,m3 = x3 * r3
  119. allReward = float64(signTaskInfo.Offer)
  120. serviceRate = pricing.ServiceRate
  121. var tmpRate = float64(1000-serviceRate) / 1000
  122. allPayment = allReward / tmpRate
  123. serviceCharge = allPayment - allReward
  124. break
  125. default:
  126. break
  127. }
  128. taskInfo = model.YoungeeTaskInfo{
  129. TaskId: newTaskId,
  130. ProjectId: signTaskInfo.ProjectId,
  131. TalentId: tid,
  132. AccountId: accountInfo.AccountId,
  133. TalentPlatformInfoSnap: string(accountSnap),
  134. TalentPersonalInfoSnap: string(talentSnap),
  135. TalentPostAddrSnap: string(addrSnap),
  136. StrategyId: signTaskInfo.StrategyId,
  137. TaskReward: allReward,
  138. SettleAmount: allReward,
  139. AllPayment: allPayment,
  140. TaskStage: 1,
  141. RealPayment: allPayment,
  142. FeeForm: strategy.FeeForm,
  143. ServiceCharge: serviceCharge,
  144. ServiceRate: serviceRate,
  145. CreateDate: gtime.Now(),
  146. TaskStatus: 1,
  147. LogisticsStatus: 1,
  148. LinkStatus: 1,
  149. DataStatus: 1,
  150. ScriptStatus: 1,
  151. SketchStatus: 1,
  152. CompleteStatus: 1,
  153. CurDefaultType: 0,
  154. WithdrawStatus: 1,
  155. }
  156. } else {
  157. // 专项任务
  158. taskInfo = model.YoungeeTaskInfo{
  159. TaskId: newTaskId,
  160. ProjectId: signTaskInfo.ProjectId,
  161. TalentId: tid,
  162. AccountId: accountInfo.AccountId,
  163. TalentPlatformInfoSnap: string(accountSnap),
  164. TalentPersonalInfoSnap: string(talentSnap),
  165. TalentPostAddrSnap: string(addrSnap),
  166. TaskStage: 1,
  167. CreateDate: gtime.Now(),
  168. TaskStatus: 1,
  169. LogisticsStatus: 1,
  170. LinkStatus: 1,
  171. DataStatus: 1,
  172. ScriptStatus: 1,
  173. SketchStatus: 1,
  174. CompleteStatus: 1,
  175. CurDefaultType: 0,
  176. WithdrawStatus: 1,
  177. }
  178. }
  179. err = g.DB().Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
  180. // 在task_info表中插入任务
  181. _, err = tx.Ctx(ctx).Model(dao.YoungeeTaskInfo.Table).Data(&taskInfo).Insert()
  182. if err != nil {
  183. return err
  184. }
  185. // 对应项目的报名人数自增
  186. _, err = tx.Ctx(ctx).Model(dao.ProjectInfo.Table).Where(dao.ProjectInfo.Columns.ProjectId, projectDetail.ProjectId).Increment(dao.ProjectInfo.Columns.ApplyNum, 1)
  187. if err != nil {
  188. return err
  189. }
  190. return nil
  191. })
  192. if err != nil {
  193. return &TalentHttpResult{Code: -18, Msg: "add Task data failed"}
  194. }
  195. return &TalentHttpResult{Code: 0, Msg: "success", Data: newTaskId}
  196. }
  197. // 判断是否已报名任务
  198. func IsSignUpTask(r *ghttp.Request) *TalentHttpResult {
  199. projectId := r.GetQueryInt("project_id", -1)
  200. accountId := r.GetQueryInt("account_id", -1)
  201. fmt.Printf("%+v\n", projectId)
  202. fmt.Printf("%+v\n", accountId)
  203. task := []model.YoungeeTaskInfo{}
  204. err := g.Model(dao.YoungeeTaskInfo.Table).Where("project_id = ? and account_id = ?", projectId, accountId).Scan(&task)
  205. if err != nil {
  206. return &TalentHttpResult{Code: -1, Msg: err.Error()}
  207. }
  208. isSign := youngee_talent_model.IsSign{}
  209. if len(task) != 0 {
  210. isSign.IsSign = 1
  211. isSign.IsAgree = task[0].TaskStatus
  212. } else {
  213. isSign.IsSign = 0
  214. isSign.IsAgree = 0
  215. }
  216. return &TalentHttpResult{Code: 0, Msg: "success", Data: isSign}
  217. }
  218. // 查询所有任务
  219. func GetTaskBriefList(r *ghttp.Request) *TalentHttpResult {
  220. tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
  221. if err != nil {
  222. return &TalentHttpResult{Code: -1, Msg: "Get talent info failed"}
  223. }
  224. // 构造查询条件
  225. whereStr := fmt.Sprintf("talent_id = '%s'", tid)
  226. fmt.Print(whereStr)
  227. // 获取任务列表
  228. var taskList []*model.YoungeeTaskInfo
  229. err = g.Model(dao.YoungeeTaskInfo.Table).Where(whereStr).Scan(&taskList)
  230. if err != nil {
  231. return &TalentHttpResult{Code: -1, Msg: "Get task list failed"}
  232. }
  233. // 为每个任务根据项目id查询项目名称和主图
  234. taskBriefList := youngee_talent_model.TaskInfoBriefList{}
  235. for _, v := range taskList {
  236. projectInfo, err := g.Model(dao.ProjectInfo.Table).Where("project_id = ?", v.ProjectId).One()
  237. if err != nil {
  238. return &TalentHttpResult{Code: -1, Msg: "Get project info failed"}
  239. }
  240. platform, err := g.Model(dao.InfoThirdPlatform.Table).One("platform_id = ?", projectInfo[dao.ProjectInfo.Columns.ProjectPlatform])
  241. if err != nil {
  242. return &TalentHttpResult{Code: -1, Msg: "Get platform failed"}
  243. }
  244. account, err := g.Model(dao.YoungeePlatformAccountInfo.Table).One("platform_id = ? and talent_id = ?", projectInfo[dao.ProjectInfo.Columns.ProjectPlatform], v.TalentId)
  245. if err != nil {
  246. return &TalentHttpResult{Code: -1, Msg: "Get account info failed"}
  247. }
  248. taskInfoBrief := &youngee_talent_model.TaskInfoBrief{
  249. TaskId: v.TaskId,
  250. PlatformIconUrl: platform[dao.InfoThirdPlatform.Columns.PlatformIcon].String(),
  251. PlatformName: platform[dao.InfoThirdPlatform.Columns.PlatformName].String(),
  252. PlatformNickName: account[dao.YoungeePlatformAccountInfo.Columns.PlatformNickname].String(),
  253. ProjectName: projectInfo[dao.ProjectInfo.Columns.ProjectName].String(),
  254. ProductPhotoSnap: projectInfo[dao.ProjectInfo.Columns.ProductPhotoSnap].String(),
  255. TaskStatus: v.TaskStatus,
  256. TaskStage: v.TaskStage,
  257. LinkStatus: v.LinkStatus,
  258. DataStatus: v.DataStatus,
  259. ScriptStatus: v.ScriptStatus,
  260. SketchStatus: v.SketchStatus,
  261. }
  262. taskBriefList.AllTaskInfoList = append(taskBriefList.AllTaskInfoList, taskInfoBrief)
  263. if v.TaskStage <= 2 {
  264. taskBriefList.SignUpTaskInfoList = append(taskBriefList.SignUpTaskInfoList, taskInfoBrief)
  265. } else if v.TaskStage <= 14 && v.TaskStage >= 4 {
  266. taskBriefList.GoingOnTaskInfoList = append(taskBriefList.GoingOnTaskInfoList, taskInfoBrief)
  267. } else {
  268. taskBriefList.CompletedTaskInfoList = append(taskBriefList.CompletedTaskInfoList, taskInfoBrief)
  269. }
  270. }
  271. return &TalentHttpResult{Code: 0, Msg: "success", Data: taskBriefList}
  272. }
  273. // 查询执行中所有任务
  274. func GetExeTaskBriefList(r *ghttp.Request) *TalentHttpResult {
  275. tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
  276. if err != nil {
  277. return &TalentHttpResult{Code: -1, Msg: "Get talent info failed"}
  278. }
  279. var taskStageList = [5]int{0, 7, 9, 11, 13}
  280. taskStageKey := r.GetQueryInt("taskStage", 0)
  281. if taskStageKey == 0 {
  282. return &TalentHttpResult{Code: -2, Msg: "parse param error"}
  283. }
  284. taskStage := taskStageList[taskStageKey]
  285. // 获取任务列表
  286. var taskList []*model.YoungeeTaskInfo
  287. err = g.Model(dao.YoungeeTaskInfo.Table).Where("talent_id = ?", tid).And("task_stage = ?", taskStage).Scan(&taskList)
  288. if err != nil {
  289. return &TalentHttpResult{Code: -1, Msg: "Get task list failed"}
  290. }
  291. // // 获取任务列表
  292. // var taskList []*model.YoungeeTaskInfo
  293. // err = g.Model(dao.YoungeeTaskInfo.Table).Where("talent_id = ?", tid).And("task_stage IN(?)", g.Slice{7, 9, 11, 13}).Scan(&taskList)
  294. // if err != nil {
  295. // return &TalentHttpResult{Code: -1, Msg: "Get task list failed"}
  296. // }
  297. // 为每个任务根据项目id查询项目名称和主图
  298. taskBriefList := youngee_talent_model.EXETaskInfoBriefList{}
  299. for _, v := range taskList {
  300. projectInfo, err := g.Model(dao.ProjectInfo.Table).Where("project_id = ?", v.ProjectId).One()
  301. if err != nil {
  302. return &TalentHttpResult{Code: -1, Msg: "Get project info failed"}
  303. }
  304. platform, err := g.Model(dao.InfoThirdPlatform.Table).One("platform_id = ?", projectInfo[dao.ProjectInfo.Columns.ProjectPlatform])
  305. if err != nil {
  306. return &TalentHttpResult{Code: -1, Msg: "Get platform failed"}
  307. }
  308. account, err := g.Model(dao.YoungeePlatformAccountInfo.Table).One("platform_id = ? and talent_id = ?", projectInfo[dao.ProjectInfo.Columns.ProjectPlatform], v.TalentId)
  309. if err != nil {
  310. return &TalentHttpResult{Code: -1, Msg: "Get account info failed"}
  311. }
  312. taskInfoBrief := &youngee_talent_model.TaskInfoBrief{
  313. TaskId: v.TaskId,
  314. PlatformIconUrl: platform[dao.InfoThirdPlatform.Columns.PlatformIcon].String(),
  315. PlatformName: platform[dao.InfoThirdPlatform.Columns.PlatformName].String(),
  316. PlatformNickName: account[dao.YoungeePlatformAccountInfo.Columns.PlatformNickname].String(),
  317. ProjectName: projectInfo[dao.ProjectInfo.Columns.ProjectName].String(),
  318. ProductPhotoSnap: projectInfo[dao.ProjectInfo.Columns.ProductPhotoSnap].String(),
  319. TaskStatus: v.TaskStatus,
  320. TaskStage: v.TaskStage,
  321. LinkStatus: v.LinkStatus,
  322. DataStatus: v.DataStatus,
  323. ScriptStatus: v.ScriptStatus,
  324. SketchStatus: v.SketchStatus,
  325. }
  326. taskBriefList.List1 = append(taskBriefList.List1, taskInfoBrief)
  327. // if v.TaskStage == 7 {
  328. // taskBriefList.List1 = append(taskBriefList.List1, taskInfoBrief)
  329. // } else if v.TaskStage == 9 {
  330. // taskBriefList.List2 = append(taskBriefList.List2, taskInfoBrief)
  331. // } else if v.TaskStage == 11 {
  332. // taskBriefList.List3 = append(taskBriefList.List3, taskInfoBrief)
  333. // } else if v.TaskStage == 13 {
  334. // taskBriefList.List4 = append(taskBriefList.List4, taskInfoBrief)
  335. // }
  336. }
  337. return &TalentHttpResult{Code: 0, Msg: "success", Data: taskBriefList}
  338. }
  339. func GetTaskNum(r *ghttp.Request) *TalentHttpResult {
  340. tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
  341. if err != nil {
  342. return &TalentHttpResult{Code: -1, Msg: "Get talent info failed"}
  343. }
  344. // 构造查询条件
  345. whereStr1 := fmt.Sprintf("talent_id = '%s'", tid)
  346. whereStr2 := fmt.Sprintf("talent_id = '%s' and task_stage <= 2", tid)
  347. whereStr3 := fmt.Sprintf("talent_id = '%s' and task_stage <= 14 and task_stage >= 4", tid)
  348. whereStr4 := fmt.Sprintf("talent_id = '%s' and (task_stage = 3 or task_stage >= 15)", tid)
  349. num1, err := g.Model(dao.YoungeeTaskInfo.Table).Where(whereStr1).Count()
  350. if err != nil {
  351. return &TalentHttpResult{Code: -1, Msg: "Get account info failed"}
  352. }
  353. num2, err := g.Model(dao.YoungeeTaskInfo.Table).Where(whereStr2).Count()
  354. if err != nil {
  355. return &TalentHttpResult{Code: -1, Msg: "Get account info failed"}
  356. }
  357. num3, err := g.Model(dao.YoungeeTaskInfo.Table).Where(whereStr3).Count()
  358. if err != nil {
  359. return &TalentHttpResult{Code: -1, Msg: "Get account info failed"}
  360. }
  361. num4, err := g.Model(dao.YoungeeTaskInfo.Table).Where(whereStr4).Count()
  362. if err != nil {
  363. return &TalentHttpResult{Code: -1, Msg: "Get account info failed"}
  364. }
  365. TaskNum := &youngee_talent_model.TaskNum{
  366. AllNum: num1,
  367. SignUpNum: num2,
  368. GoingOnNum: num3,
  369. CompletedNum: num4,
  370. }
  371. return &TalentHttpResult{Code: 0, Msg: "success", Data: TaskNum}
  372. }
  373. // 获取任务详情
  374. func GetTaskDetail(r *ghttp.Request) *TalentHttpResult {
  375. taskId := r.GetQueryInt("task_id", -1)
  376. var task *model.YoungeeTaskInfo
  377. err := g.Model(dao.YoungeeTaskInfo.Table).Where("task_id = ?", taskId).Scan(&task)
  378. if err != nil {
  379. return &TalentHttpResult{Code: -1, Msg: "Get task info failed"}
  380. }
  381. var projectDetail *youngee_talent_model.ProjectDetail
  382. err = g.Model(youngee_talent_model.ProjectDetail{}).WithAll().Where("project_id", task.ProjectId).Scan(&projectDetail)
  383. if err != nil {
  384. return &TalentHttpResult{Code: -3, Msg: "data query failed"}
  385. }
  386. var productPhoto *model.YounggeeProductPhoto
  387. err = g.Model(dao.YounggeeProductPhoto.Table).Where("product_id = ? and symbol = 1", projectDetail.ProductId).Scan(&productPhoto)
  388. if err != nil {
  389. return &TalentHttpResult{Code: -3, Msg: "data query failed"}
  390. }
  391. taskDetail := &youngee_talent_model.TaskDetail{}
  392. if projectDetail.ProjectType == 1 {
  393. var strategy *model.RecruitStrategy
  394. err = g.Model(dao.RecruitStrategy.Table).Where("project_id = ? and strategy_id = ?", task.ProjectId, task.StrategyId).Scan(&strategy)
  395. if err != nil {
  396. return &TalentHttpResult{Code: -3, Msg: "data query failed"}
  397. }
  398. taskDetail = &youngee_talent_model.TaskDetail{
  399. TaskInfo: task,
  400. ProjectDetail: projectDetail,
  401. ProductPhoto: productPhoto,
  402. Strategy: strategy,
  403. }
  404. } else {
  405. taskDetail = &youngee_talent_model.TaskDetail{
  406. TaskInfo: task,
  407. ProjectDetail: projectDetail,
  408. ProductPhoto: productPhoto,
  409. }
  410. }
  411. return &TalentHttpResult{Code: 0, Msg: "success", Data: taskDetail}
  412. }