task_info.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  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: err.Error()}
  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: "data query failed"}
  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. // 生成达人平台账号信息快照
  46. accountSnap, err := gjson.Encode(accountInfo)
  47. if err != nil {
  48. return &TalentHttpResult{Code: -7, Msg: "encode platform snap failed"}
  49. }
  50. // 生成达人信息快照
  51. talentSnap, err := gjson.Encode(talentInfo)
  52. if err != nil {
  53. return &TalentHttpResult{Code: -8, Msg: "encode talent info snap failed"}
  54. }
  55. // 生成收货地址快照
  56. addrSnap, err := gjson.Encode(address)
  57. if err != nil {
  58. return &TalentHttpResult{Code: -9, Msg: "encode delivery address snap failed"}
  59. }
  60. // 计算平台服务费
  61. // 先获取稿费形式
  62. var strategy *youngee_talent_model.RecruitStrategy
  63. err = g.DB().Model("recruit_strategy").WithAll().Where("strategy_id = ? and project_id= ?", signTaskInfo.StrategyId, signTaskInfo.ProjectId).Scan(&strategy)
  64. if err != nil {
  65. return &TalentHttpResult{Code: -5, Msg: err.Error()}
  66. }
  67. // 根据稿费形式、平台、粉丝数查询服务费
  68. 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)
  69. var serviceCharge = 0.0
  70. var serviceRate = 0
  71. var allReward = 0.0
  72. var allPayment = 0.0
  73. switch strategy.FeeForm {
  74. case 1: // 产品置换,服务费固定,在项目生成时确定
  75. serviceCharge = float64(strategy.ServiceCharge)
  76. allPayment = serviceCharge
  77. break
  78. case 2: // 固定稿费,m2 = y2 * r2
  79. allPayment = float64(strategy.Offer)
  80. var pricing *model.InfoPricingStrategy
  81. err = g.DB().Model("info_pricing_strategy").WithAll().Where(whereStr1).Scan(&pricing)
  82. if err != nil {
  83. return &TalentHttpResult{Code: -5, Msg: err.Error()}
  84. }
  85. serviceRate = pricing.ServiceRate
  86. serviceCharge = allPayment * float64(serviceRate) / 1000
  87. allReward = allPayment - serviceCharge
  88. break
  89. case 3: // 自报价,m3 = x3 * r3
  90. allReward = float64(signTaskInfo.Offer)
  91. var pricing *model.InfoPricingStrategy
  92. err = g.DB().Model("info_pricing_strategy").WithAll().Where(whereStr1).Scan(&pricing)
  93. if err != nil {
  94. return &TalentHttpResult{Code: -5, Msg: err.Error()}
  95. }
  96. serviceRate = pricing.ServiceRate
  97. serviceCharge = allReward * float64(serviceRate) / 1000
  98. allPayment = allReward + serviceCharge
  99. break
  100. default:
  101. break
  102. }
  103. err = g.DB().Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
  104. // 在task_info表中插入任务
  105. taskId, err1 := tx.Ctx(ctx).Model(dao.YoungeeTaskInfo.Table).Data(model.YoungeeTaskInfo{
  106. ProjectId: int(signTaskInfo.ProjectId),
  107. TalentId: tid,
  108. AccountId: accountInfo.AccountId,
  109. TalentPlatformInfoSnap: string(accountSnap),
  110. TalentPersonalInfoSnap: string(talentSnap),
  111. TalentPostAddrSnap: string(addrSnap),
  112. StrategyId: signTaskInfo.StrategyId,
  113. TaskReward: allReward,
  114. SettleAmount: allReward,
  115. AllPayment: allPayment,
  116. TaskStage: 1,
  117. RealPayment: allPayment,
  118. Penalty: 0,
  119. FeeForm: strategy.FeeForm,
  120. ServiceCharge: serviceCharge,
  121. ServiceRate: serviceRate,
  122. TaskStatus: 1,
  123. CreateDate: gtime.Now(),
  124. CompleteStatus: 1,
  125. }).InsertAndGetId()
  126. if err1 != nil {
  127. return err1
  128. }
  129. // 对应项目的报名人数自增
  130. _, err1 = tx.Ctx(ctx).Model(dao.ProjectInfo.Table).Where(dao.ProjectInfo.Columns.ProjectId, projectDetail.ProjectId).Increment(dao.ProjectInfo.Columns.ApplyNum, 1)
  131. if err1 != nil {
  132. return err1
  133. }
  134. fmt.Printf("%+v", taskId)
  135. return nil
  136. })
  137. if err != nil {
  138. return &TalentHttpResult{Code: -18, Msg: "add Task data failed"}
  139. }
  140. return &TalentHttpResult{Code: 0, Msg: "success"}
  141. }
  142. // 判断是否已报名任务
  143. func IsSignUpTask(r *ghttp.Request) *TalentHttpResult {
  144. projectId := r.GetQueryInt("project_id", -1)
  145. accountId := r.GetQueryInt("account_id", -1)
  146. fmt.Printf("%+v\n", projectId)
  147. fmt.Printf("%+v\n", accountId)
  148. isSignUp, err := g.Model(dao.YoungeeTaskInfo.Table).Where("project_id = ? and account_id = ?", projectId, accountId).Count()
  149. if err != nil {
  150. return &TalentHttpResult{Code: -1, Msg: err.Error()}
  151. }
  152. return &TalentHttpResult{Code: 0, Msg: "success", Data: isSignUp}
  153. }
  154. // 查询所有任务
  155. func GetTaskBriefList(r *ghttp.Request) *TalentHttpResult {
  156. tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
  157. if err != nil {
  158. return &TalentHttpResult{Code: -1, Msg: "Get talent info failed"}
  159. }
  160. // 构造查询条件
  161. whereStr := fmt.Sprintf("talent_id = '%s'", tid)
  162. fmt.Print(whereStr)
  163. // 获取任务列表
  164. var taskList []*model.YoungeeTaskInfo
  165. err = g.Model(dao.YoungeeTaskInfo.Table).Where(whereStr).Scan(&taskList)
  166. if err != nil {
  167. return &TalentHttpResult{Code: -1, Msg: "Get task list failed"}
  168. }
  169. // 为每个任务根据项目id查询项目名称和主图
  170. taskBriefList := youngee_talent_model.TaskInfoBriefList{}
  171. for _, v := range taskList {
  172. projectInfo, err := g.Model(dao.ProjectInfo.Table).Where("project_id = ?", v.ProjectId).One()
  173. if err != nil {
  174. return &TalentHttpResult{Code: -1, Msg: "Get project info failed"}
  175. }
  176. mainPhoto, err := g.Model(dao.YounggeeProductPhoto.Table).One("product_id = ? and symbol = 1", projectInfo[dao.ProjectInfo.Columns.ProductId])
  177. if err != nil {
  178. return &TalentHttpResult{Code: -1, Msg: "Get product mainphoto failed"}
  179. }
  180. platform, err := g.Model(dao.InfoThirdPlatform.Table).One("platform_id = ?", projectInfo[dao.ProjectInfo.Columns.ProjectPlatform])
  181. if err != nil {
  182. return &TalentHttpResult{Code: -1, Msg: "Get platform failed"}
  183. }
  184. account, err := g.Model(dao.YoungeePlatformAccountInfo.Table).One("platform_id = ? and talent_id = ?", projectInfo[dao.ProjectInfo.Columns.ProjectPlatform], v.TalentId)
  185. if err != nil {
  186. return &TalentHttpResult{Code: -1, Msg: "Get account info failed"}
  187. }
  188. taskInfoBrief := &youngee_talent_model.TaskInfoBrief{
  189. TaskId: uint64(v.TaskId),
  190. PlatformIconUrl: platform[dao.InfoThirdPlatform.Columns.PlatformIcon].String(),
  191. PlatformName: platform[dao.InfoThirdPlatform.Columns.PlatformName].String(),
  192. PlatformNickName: account[dao.YoungeePlatformAccountInfo.Columns.PlatformNickname].String(),
  193. ProjectName: projectInfo[dao.ProjectInfo.Columns.ProjectName].String(),
  194. ProductImgUrl: mainPhoto[dao.YounggeeProductPhoto.Columns.PhotoUrl].String(),
  195. TaskStatus: v.TaskStatus,
  196. TaskStage: v.TaskStage,
  197. }
  198. taskBriefList.AllTaskInfoList = append(taskBriefList.AllTaskInfoList, taskInfoBrief)
  199. if v.TaskStage <= 3 {
  200. taskBriefList.SignUpTaskInfoList = append(taskBriefList.SignUpTaskInfoList, taskInfoBrief)
  201. } else if v.TaskStage <= 9 && v.TaskStage >= 5 {
  202. taskBriefList.GoingOnTaskInfoList = append(taskBriefList.GoingOnTaskInfoList, taskInfoBrief)
  203. } else {
  204. taskBriefList.CompletedTaskInfoList = append(taskBriefList.CompletedTaskInfoList, taskInfoBrief)
  205. }
  206. }
  207. return &TalentHttpResult{Code: 0, Msg: "success", Data: taskBriefList}
  208. }
  209. // 查询所有任务
  210. func GetExeTaskBriefList(r *ghttp.Request) *TalentHttpResult {
  211. tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
  212. if err != nil {
  213. return &TalentHttpResult{Code: -1, Msg: "Get talent info failed"}
  214. }
  215. // 获取任务列表
  216. var taskList []*model.YoungeeTaskInfo
  217. err = g.Model(dao.YoungeeTaskInfo.Table).Where("talent_id = ?", tid).And("task_stage IN(?)", g.Slice{8, 11, 14, 17}).Scan(&taskList)
  218. if err != nil {
  219. return &TalentHttpResult{Code: -1, Msg: "Get task list failed"}
  220. }
  221. // 为每个任务根据项目id查询项目名称和主图
  222. taskBriefList := youngee_talent_model.EXETaskInfoBriefList{}
  223. for _, v := range taskList {
  224. projectInfo, err := g.Model(dao.ProjectInfo.Table).Where("project_id = ?", v.ProjectId).One()
  225. if err != nil {
  226. return &TalentHttpResult{Code: -1, Msg: "Get project info failed"}
  227. }
  228. mainPhoto, err := g.Model(dao.YounggeeProductPhoto.Table).One("product_id = ? and symbol = 1", projectInfo[dao.ProjectInfo.Columns.ProductId])
  229. if err != nil {
  230. return &TalentHttpResult{Code: -1, Msg: "Get product mainphoto failed"}
  231. }
  232. platform, err := g.Model(dao.InfoThirdPlatform.Table).One("platform_id = ?", projectInfo[dao.ProjectInfo.Columns.ProjectPlatform])
  233. if err != nil {
  234. return &TalentHttpResult{Code: -1, Msg: "Get platform failed"}
  235. }
  236. account, err := g.Model(dao.YoungeePlatformAccountInfo.Table).One("platform_id = ? and talent_id = ?", projectInfo[dao.ProjectInfo.Columns.ProjectPlatform], v.TalentId)
  237. if err != nil {
  238. return &TalentHttpResult{Code: -1, Msg: "Get account info failed"}
  239. }
  240. taskInfoBrief := &youngee_talent_model.TaskInfoBrief{
  241. TaskId: uint64(v.TaskId),
  242. PlatformIconUrl: platform[dao.InfoThirdPlatform.Columns.PlatformIcon].String(),
  243. PlatformName: platform[dao.InfoThirdPlatform.Columns.PlatformName].String(),
  244. PlatformNickName: account[dao.YoungeePlatformAccountInfo.Columns.PlatformNickname].String(),
  245. ProjectName: projectInfo[dao.ProjectInfo.Columns.ProjectName].String(),
  246. ProductImgUrl: mainPhoto[dao.YounggeeProductPhoto.Columns.PhotoUrl].String(),
  247. TaskStatus: v.TaskStatus,
  248. TaskStage: v.TaskStage,
  249. }
  250. if v.TaskStage == 8 {
  251. taskBriefList.List1 = append(taskBriefList.List1, taskInfoBrief)
  252. } else if v.TaskStage == 11 {
  253. taskBriefList.List2 = append(taskBriefList.List2, taskInfoBrief)
  254. } else if v.TaskStage == 14 {
  255. taskBriefList.List3 = append(taskBriefList.List3, taskInfoBrief)
  256. } else if v.TaskStage == 17 {
  257. taskBriefList.List4 = append(taskBriefList.List4, taskInfoBrief)
  258. }
  259. }
  260. return &TalentHttpResult{Code: 0, Msg: "success", Data: taskBriefList}
  261. }
  262. func GetTaskNum(r *ghttp.Request) *TalentHttpResult {
  263. tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
  264. if err != nil {
  265. return &TalentHttpResult{Code: -1, Msg: "Get talent info failed"}
  266. }
  267. // 构造查询条件
  268. whereStr1 := fmt.Sprintf("talent_id = '%s'", tid)
  269. whereStr2 := fmt.Sprintf("talent_id = '%s' and task_stage <= 3", tid)
  270. whereStr3 := fmt.Sprintf("talent_id = '%s' and task_stage <= 19 and task_stage >= 5", tid)
  271. whereStr4 := fmt.Sprintf("talent_id = '%s' and (task_stage = 4 or task_stage >= 20)", tid)
  272. num1, err := g.Model(dao.YoungeeTaskInfo.Table).Where(whereStr1).Count()
  273. if err != nil {
  274. return &TalentHttpResult{Code: -1, Msg: "Get account info failed"}
  275. }
  276. num2, err := g.Model(dao.YoungeeTaskInfo.Table).Where(whereStr2).Count()
  277. if err != nil {
  278. return &TalentHttpResult{Code: -1, Msg: "Get account info failed"}
  279. }
  280. num3, err := g.Model(dao.YoungeeTaskInfo.Table).Where(whereStr3).Count()
  281. if err != nil {
  282. return &TalentHttpResult{Code: -1, Msg: "Get account info failed"}
  283. }
  284. num4, err := g.Model(dao.YoungeeTaskInfo.Table).Where(whereStr4).Count()
  285. if err != nil {
  286. return &TalentHttpResult{Code: -1, Msg: "Get account info failed"}
  287. }
  288. TaskNum := &youngee_talent_model.TaskNum{
  289. AllNum: num1,
  290. SignUpNum: num2,
  291. GoingOnNum: num3,
  292. CompletedNum: num4,
  293. }
  294. return &TalentHttpResult{Code: 0, Msg: "success", Data: TaskNum}
  295. }
  296. // 获取任务详情
  297. func GetTaskDetail(r *ghttp.Request) *TalentHttpResult {
  298. taskId := r.GetQueryInt("task_id", -1)
  299. var task *model.YoungeeTaskInfo
  300. err := g.Model(dao.YoungeeTaskInfo.Table).Where("task_id = ?", taskId).Scan(&task)
  301. if err != nil {
  302. return &TalentHttpResult{Code: -1, Msg: "Get task info failed"}
  303. }
  304. var projectDetail *youngee_talent_model.ProjectDetail
  305. err = g.Model(youngee_talent_model.ProjectDetail{}).WithAll().Where("project_id", task.ProjectId).Scan(&projectDetail)
  306. if err != nil {
  307. return &TalentHttpResult{Code: -3, Msg: "data query failed"}
  308. }
  309. var productPhoto *model.YounggeeProductPhoto
  310. err = g.Model(dao.YounggeeProductPhoto.Table).Where("product_id = ? and symbol = 1", projectDetail.ProductId).Scan(&productPhoto)
  311. if err != nil {
  312. return &TalentHttpResult{Code: -3, Msg: "data query failed"}
  313. }
  314. var strategy *model.RecruitStrategy
  315. err = g.Model(dao.RecruitStrategy.Table).Where("project_id = ? and strategy_id = ?", task.ProjectId, task.StrategyId).Scan(&strategy)
  316. if err != nil {
  317. return &TalentHttpResult{Code: -3, Msg: "data query failed"}
  318. }
  319. taskDetail := &youngee_talent_model.TaskDetail{
  320. TaskInfo: task,
  321. ProjectDetail: projectDetail,
  322. ProductPhoto: productPhoto,
  323. Strategy: strategy,
  324. }
  325. return &TalentHttpResult{Code: 0, Msg: "success", Data: taskDetail}
  326. }
  327. // 获取物流信息
  328. func GetTaskLogisticsInfo(r *ghttp.Request) *TalentHttpResult {
  329. taskId := r.GetQueryInt("task_id", -1)
  330. var logistics *model.YoungeeTaskLogistics
  331. err := g.Model(dao.YoungeeTaskLogistics.Table).Where("task_id = ?", taskId).Scan(&logistics)
  332. if err != nil {
  333. return &TalentHttpResult{Code: -1, Msg: "Get logistics info failed"}
  334. }
  335. return &TalentHttpResult{Code: 0, Msg: "success", Data: logistics}
  336. }