task_info.go 17 KB

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