project_info.go 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701
  1. package youngee_task_service
  2. import (
  3. "fmt"
  4. "github.com/gogf/gf/os/glog"
  5. "github.com/gogf/gf/os/gtime"
  6. "github.com/gogf/gf/util/gconv"
  7. "math"
  8. "reflect"
  9. "sort"
  10. "youngmini_server/app/dao"
  11. "youngmini_server/app/model/youngee_talent_model"
  12. "youngmini_server/app/service/youngee_talent_service"
  13. "youngmini_server/app/utils"
  14. "github.com/gogf/gf/frame/g"
  15. "github.com/gogf/gf/net/ghttp"
  16. )
  17. type projectStatus int
  18. const (
  19. projectStatusCreating = iota + 1
  20. projectStatusReviewing
  21. projectStatusReviewed
  22. projectStatusRecruiting
  23. projectStatusRecruited
  24. projectStatusPaying
  25. projectStatusPaid
  26. projectStatusInvalid
  27. projectStatusInProgress
  28. projectStatusClosed
  29. )
  30. // 获取项目信息列表service
  31. func GetProjectInfoList(r *ghttp.Request) *TalentHttpResult {
  32. pageIndex := r.GetQueryInt("idx", -1)
  33. cntPerPage := r.GetQueryInt("cnt", -1)
  34. //组合筛选
  35. platform := r.Get("platform", nil) //抖音、快手、红Book、B站、微博
  36. projectForm := r.Get("projectform", nil) //1.商品寄拍、3.虚拟产品评测、2.素材分发
  37. contentType := r.Get("contenttype", nil) //图文形式、视频形式
  38. createTime := r.Get("createTime", nil) //任务上线时间
  39. categoryForm := r.Get("categoryform", nil) ////商品类目 智能家居、食品饮料等20种
  40. //排根据浏览量排序
  41. viewOrder := r.GetQueryInt("pageViewOrder", -1) //根据哪个字段排序
  42. //仅稿费”+“稿费+赠品"。这个在recruit表中,得到列表之后进行排序
  43. feeForm := r.GetInt("feeform", 0)
  44. searchValue := r.Get("searchvalue", nil)
  45. if pageIndex == -1 || cntPerPage == -1 || cntPerPage == 0 {
  46. return &TalentHttpResult{Code: -1, Msg: "参数错误"}
  47. }
  48. // 如果有稿费形式的过滤条件,则将过滤条件保存于taskModeList
  49. //var feeFormList []interface{}
  50. //if feeForm != nil {
  51. // if reflect.TypeOf(feeForm).Kind() != reflect.Slice {
  52. // return &TalentHttpResult{Code: -2, Msg: "搜索条件稿费形式错误"}
  53. // }
  54. //
  55. // feeFormList = make([]interface{}, 0)
  56. // feeFormList = feeForm.([]interface{})
  57. //}
  58. // 如果有任务形式的过滤条件,则将过滤条件保存于taskModeList
  59. var projectFormList []interface{}
  60. if projectForm != nil {
  61. if reflect.TypeOf(projectForm).Kind() != reflect.Slice {
  62. return &TalentHttpResult{Code: -2, Msg: "搜索条件任务形式错误"}
  63. }
  64. projectFormList = make([]interface{}, 0)
  65. projectFormList = projectForm.([]interface{})
  66. }
  67. // 如果有平台的过滤条件,则将平台列表保存于platformList
  68. var platformList []interface{}
  69. if platform != nil {
  70. if reflect.TypeOf(platform).Kind() != reflect.Slice {
  71. return &TalentHttpResult{Code: -2, Msg: "搜索条件平台类型错误"}
  72. }
  73. platformList = make([]interface{}, 0)
  74. platformList = platform.([]interface{})
  75. }
  76. // 如果有内容形式的过滤条件,则将过滤条件保存于taskModeList
  77. var contentTypeList []interface{}
  78. if contentType != nil {
  79. if reflect.TypeOf(projectForm).Kind() != reflect.Slice {
  80. return &TalentHttpResult{Code: -2, Msg: "搜索条件任务形式错误"}
  81. }
  82. contentTypeList = make([]interface{}, 0)
  83. contentTypeList = contentType.([]interface{})
  84. }
  85. // 上线时间
  86. var createTimeList []interface{}
  87. if createTime != nil {
  88. if reflect.TypeOf(createTime).Kind() != reflect.Slice {
  89. return &TalentHttpResult{Code: -2, Msg: "搜索条件任务形式错误"}
  90. }
  91. createTimeList = make([]interface{}, 0)
  92. createTimeList = createTime.([]interface{})
  93. }
  94. // 如果有商品类目的过滤条件,则将过滤条件保存于categoryFormList
  95. var categoryFormList []interface{}
  96. if categoryForm != nil {
  97. if reflect.TypeOf(categoryForm).Kind() != reflect.Slice {
  98. return &TalentHttpResult{Code: -2, Msg: "搜索条件任务形式错误"}
  99. }
  100. categoryFormList = make([]interface{}, 0)
  101. categoryFormList = categoryForm.([]interface{})
  102. }
  103. if len(categoryFormList) > 0 {
  104. // 使用 categoryFormList 进行某些操作
  105. fmt.Println("Filtered categoryFormList:", categoryFormList)
  106. }
  107. // 构造查询的条件
  108. startId := pageIndex * cntPerPage
  109. // whereStr := fmt.Sprintf("(project_status >= %d and project_status <> %d and project_type = 1)", projectStatusRecruiting, projectStatusInvalid)
  110. whereStr := fmt.Sprintf("(project_status >= %d and fail_reason <> 2 and project_type = 1)", projectStatusRecruiting)
  111. if platformList != nil {
  112. whereStr = whereStr + " and project_platform in ("
  113. for _, v := range platformList {
  114. whereStr += v.(string) + ", "
  115. }
  116. whereStr = whereStr[0 : len(whereStr)-2]
  117. whereStr += ")"
  118. }
  119. if contentTypeList != nil {
  120. whereStr = whereStr + " and content_type in ("
  121. for _, v := range contentTypeList {
  122. whereStr += v.(string) + ", "
  123. }
  124. whereStr = whereStr[0 : len(whereStr)-2]
  125. whereStr += ")"
  126. }
  127. // 处理 selectionFormList (创建时间的过滤条件)
  128. if createTimeList != nil {
  129. whereStr += " AND created_at >= (NOW() - INTERVAL "
  130. for _, v := range createTimeList {
  131. switch v.(string) {
  132. case "1": // 近7天
  133. whereStr += "7 DAY"
  134. case "2": // 近30天
  135. whereStr += "30 DAY"
  136. case "3": // 近90天
  137. whereStr += "90 DAY"
  138. default:
  139. continue // 无效的过滤条件,跳过
  140. }
  141. }
  142. whereStr += ")"
  143. }
  144. if platformList != nil {
  145. whereStr = whereStr + " and project_platform in ("
  146. for _, v := range platformList {
  147. whereStr += v.(string) + ", "
  148. }
  149. whereStr = whereStr[0 : len(whereStr)-2]
  150. whereStr += ")"
  151. }
  152. if projectFormList != nil {
  153. whereStr += " and project_form in ("
  154. for _, v := range projectFormList {
  155. whereStr += v.(string) + ", "
  156. }
  157. whereStr = whereStr[0 : len(whereStr)-2]
  158. whereStr += ")"
  159. }
  160. if searchValue != nil {
  161. whereStr += " and project_name like '%" + searchValue.(string) + "%'"
  162. }
  163. fmt.Println("whereStr:-----》 ", whereStr)
  164. // 查询所有project
  165. //var projectList = []model.ProjectInfo{}
  166. //err := g.Model(dao.ProjectInfo.Table).Where(whereStr).Scan(&projectList)
  167. //if err != nil {
  168. // return &TalentHttpResult{Code: -3, Msg: "查询数据库失败"}
  169. //}
  170. // 判断请求页面是否超过最大页面
  171. c, err := g.DB().Model(dao.ProjectInfo.Table).Fields("project_id").Where(whereStr).Count()
  172. if c <= 0 {
  173. return &TalentHttpResult{Code: -4, Msg: "has no fullproject", Data: nil}
  174. }
  175. maxPage := c / cntPerPage
  176. if c%cntPerPage > 0 {
  177. maxPage += 1
  178. }
  179. if pageIndex+1 > maxPage {
  180. return &TalentHttpResult{Code: -5, Msg: "over max page"}
  181. }
  182. var projectInfoList = youngee_talent_model.ProjectInfoList{}
  183. fmt.Println("test")
  184. err = g.DB().Model("project_info").WithAll().Where(whereStr).
  185. Order("project_status ASC,recruit_ddl DESC").Limit(startId, cntPerPage).Scan(&projectInfoList.ProjectInfos)
  186. fmt.Println("test over")
  187. if err != nil {
  188. return &TalentHttpResult{Code: -6, Msg: "查询数据库失败"}
  189. }
  190. for _, project := range projectInfoList.ProjectInfos {
  191. fmt.Println("ids---->", project.ProjectId)
  192. }
  193. // 遍历projectList
  194. for i, project := range projectInfoList.ProjectInfos {
  195. fmt.Println("project.EnterpriseId---", project.EnterpriseId)
  196. //处理浏览量
  197. projectViewKey := "project:view:" + gconv.String(project.ProjectId)
  198. //redis中取浏览量 返回的是gvar.Var类型。 不存咋则为nil。经过viewCount.Int变成0
  199. viewCount, err := g.Redis().DoVar("GET", projectViewKey)
  200. if err != nil {
  201. glog.Error(err)
  202. return &TalentHttpResult{Code: 0, Msg: "Redis error"}
  203. }
  204. projectInfoList.ProjectInfos[i].WatchedNum = viewCount.Int()
  205. // 根据 WatchedNum 从高到低排序
  206. if viewOrder != -1 {
  207. sort.Slice(projectInfoList.ProjectInfos, func(i, j int) bool {
  208. return projectInfoList.ProjectInfos[i].WatchedNum > projectInfoList.ProjectInfos[j].WatchedNum
  209. })
  210. }
  211. // 统计 RecruitStrategys 数组中的最低粉丝量和最高粉丝量
  212. var minFollowers, maxFollowers int
  213. // 初始值可以设为极大/极小值
  214. minFollowers = math.MaxInt32
  215. maxFollowers = math.MinInt32
  216. // 遍历 RecruitStrategys,找出最低粉丝量和最高粉丝量
  217. for _, strategy := range project.RecruitStrategys {
  218. if strategy.FollowersLow < minFollowers {
  219. minFollowers = strategy.FollowersLow
  220. }
  221. if strategy.FollowersUp > maxFollowers {
  222. maxFollowers = strategy.FollowersUp
  223. }
  224. }
  225. // 打印最低粉丝量和最高粉丝量
  226. fmt.Printf("ProjectId: %d, MinFollowers: %d, MaxFollowers: %d\n", project.ProjectId, minFollowers, maxFollowers)
  227. // 如果需要,可以将这些值保存到 ProjectInfo 中,供后续使用
  228. projectInfoList.ProjectInfos[i].MinFollowers = minFollowers
  229. projectInfoList.ProjectInfos[i].MaxFollowers = maxFollowers
  230. //稿费的展示情况
  231. allFeeFormNoFee := true // 假设都是无费置换
  232. var hasSelfPrice bool
  233. var minOffer, maxOffer int
  234. for _, strategy := range project.RecruitStrategys {
  235. if strategy.FeeForm != 1 { // 如果存在非无费置换的策略
  236. allFeeFormNoFee = false
  237. }
  238. if strategy.FeeForm == 3 { // 存在自报价
  239. hasSelfPrice = true
  240. }
  241. if strategy.FeeForm == 2 { // 一口价策略
  242. if strategy.Offer < minOffer || minOffer == 0 {
  243. minOffer = strategy.Offer
  244. }
  245. if strategy.Offer > maxOffer {
  246. maxOffer = strategy.Offer
  247. }
  248. }
  249. }
  250. // 根据判断结果设置 IsShowOffer 和 HaveSelfPrice
  251. if allFeeFormNoFee {
  252. project.IsShowOffer = 2 // 不展示稿费
  253. } else {
  254. project.IsShowOffer = 1 // 展示稿费
  255. if hasSelfPrice {
  256. project.HaveSelfOffer = 1 //存在自报价
  257. } else {
  258. project.HaveSelfOffer = 2 //存在自报价
  259. }
  260. projectInfoList.ProjectInfos[i].MaxOffer = maxOffer
  261. projectInfoList.ProjectInfos[i].MinOffer = minOffer
  262. }
  263. }
  264. projectInfoList.MaxPage = maxPage
  265. var filteredProjects []*youngee_talent_model.ProjectInfo
  266. //筛选出“仅稿费”+“稿费+赠品”任务,
  267. //只要策略中有 无费置换 之外的fee_form就是有稿费,projectform是 商品寄拍 和 虚拟产品测评 ,就是有赠品
  268. if feeForm != 0 {
  269. for _, project := range projectInfoList.ProjectInfos {
  270. // 条件1:筛选出所有 project_form 为 1 或 3 的项目
  271. if project.ProjectForm == 1 || project.ProjectForm == 3 {
  272. filteredProjects = append(filteredProjects, project)
  273. continue // 如果满足条件1,直接跳过后续条件判断
  274. }
  275. // 条件2:RecruitStrategy 中存在 fee_form 不等于 1 的数据
  276. for _, strategy := range project.RecruitStrategys {
  277. if strategy.FeeForm != 1 {
  278. filteredProjects = append(filteredProjects, project)
  279. break // 找到符合条件的策略,跳出当前循环,避免重复添加
  280. }
  281. }
  282. }
  283. projectInfoList.ProjectInfos = filteredProjects
  284. }
  285. return &TalentHttpResult{Code: 0, Msg: "success", Data: projectInfoList}
  286. }
  287. // 获取单个项目详情service
  288. func GetProjectDetail(r *ghttp.Request) *TalentHttpResult {
  289. tid, _ := utils.SessionTalentInfo.GetTalentIdFromSession(r)
  290. //pid := r.GetQueryInt("project_id", 0)
  291. pid := r.GetQueryString("project_id", "")
  292. fmt.Println("project id----", pid)
  293. //通过首页进入的详情页,获取服务商id,younggee_supplier表
  294. enterprise_id := r.GetQueryString("enterprise_id", "")
  295. fmt.Println("enterprise_id:----》", enterprise_id)
  296. //通过扫服务商码进入的详情页,获取服务商id,younggee_supplier表
  297. s_project_id := r.GetQueryInt("s_project_id", 0)
  298. // Redis key
  299. //projectViewKey := "project:view:" + strconv.Itoa(pid)
  300. projectViewKey := "project:view:" + pid
  301. //userViewedKey := "user:viewed:" + tid + ":" + strconv.Itoa(pid)
  302. userViewedKey := "user:viewed:" + tid + ":" + pid
  303. if pid == "" {
  304. return &TalentHttpResult{Code: -2, Msg: "parse param error"}
  305. }
  306. //在redis中增加浏览量
  307. // Check if the user has already viewed the product
  308. //DoVar方便进行类型转化
  309. viewed, err := g.Redis().DoVar("GET", userViewedKey)
  310. if err != nil {
  311. glog.Error(err)
  312. return &TalentHttpResult{Code: 0, Msg: "Redis error"}
  313. }
  314. var ProjectDetail *youngee_talent_model.ProjectDetail
  315. err = g.DB().Model("project_info").WithAll().Where("project_id", pid).Scan(&ProjectDetail)
  316. if err != nil {
  317. return &TalentHttpResult{Code: -3, Msg: err.Error()}
  318. }
  319. //违约在这里
  320. //各阶段扣款比例
  321. one, err := g.DB().Model("info_auto_default_handle").Where("auto_default_id=?", ProjectDetail.AutoDefaultId).One()
  322. if err != nil {
  323. return &TalentHttpResult{Code: -1, Msg: err.Error()}
  324. }
  325. //各阶段扣款时间
  326. one2, err := g.DB().Model("info_auto_task").Where("auto_task_id=?", ProjectDetail.AutoTaskId).One()
  327. if err != nil {
  328. return &TalentHttpResult{Code: -1, Msg: err.Error()}
  329. }
  330. if one != nil {
  331. ProjectDetail.DraftBreakPercent = one["sketch_replace_not_upload"].Int()
  332. ProjectDetail.LinkBreakPercent = one["link_replace_not_upload"].Int()
  333. ProjectDetail.DataBreakPercent = one["data_replace_not_upload"].Int()
  334. } else {
  335. return &TalentHttpResult{Code: 0, Msg: "one is nil"}
  336. }
  337. if one2 != nil {
  338. ProjectDetail.DraftBreakTime = one2["draft_default"].Int()
  339. ProjectDetail.LinkBreakTime = one2["link_breach"].Int()
  340. ProjectDetail.DataBreakTime = one2["case_close_default"].Int()
  341. } else {
  342. return &TalentHttpResult{Code: 0, Msg: "one2 is nil"}
  343. }
  344. if viewed.IsNil() {
  345. // User hasn't viewed this product yet, increase the view count
  346. _, err = g.Redis().Do("INCR", projectViewKey)
  347. if err != nil {
  348. glog.Error(err)
  349. return &TalentHttpResult{Code: 0, Msg: "Redis error"}
  350. }
  351. // Mark the product as viewed by this user
  352. _, err = g.Redis().Do("SET", userViewedKey, true)
  353. if err != nil {
  354. glog.Error(err)
  355. return &TalentHttpResult{Code: 0, Msg: "Redis error"}
  356. }
  357. }
  358. viewNum, err := g.Redis().DoVar("GET", projectViewKey)
  359. if err != nil {
  360. fmt.Println("获取浏览量失败")
  361. }
  362. ProjectDetail.ViewNum = viewNum.Int()
  363. //浏览历史
  364. currentDate := gtime.Now().Format("Ymd")
  365. // 设计 Redis Key
  366. redisBrowseKey := fmt.Sprintf("browseProject:%s:%s", currentDate, tid)
  367. fmt.Println("redis浏览记录的key为——————————", redisBrowseKey)
  368. // 将 project_id:s_project_id 添加到 Redis 中的 SET 中,因为project_id可以对应多个s_project_id(被多个服务商接手)
  369. // 组合 pid 和 s_project_id
  370. browseItem := fmt.Sprintf("%s:%s", pid, s_project_id)
  371. _, err = g.Redis().Do("SADD", redisBrowseKey, browseItem)
  372. if err != nil {
  373. return &TalentHttpResult{Code: 0, Msg: "Redis 存浏览历史数据失败"}
  374. }
  375. // 设置 Key 的过期时间为 7 天
  376. _, err = g.Redis().Do("EXPIRE", redisBrowseKey, 7*24*60*60) // 7 天的秒数
  377. if err != nil {
  378. return &TalentHttpResult{Code: 0, Msg: "Redis 设置过期时间失败"}
  379. }
  380. //填充收藏信息
  381. collectionInfo := []youngee_talent_model.ProjectCollection{}
  382. err = g.DB().Model("younggee_project_collect_info").Where("project_id=? and talent_id = ?", pid, tid).Scan(&collectionInfo)
  383. if err != nil {
  384. return &TalentHttpResult{Code: -1, Msg: err.Error()}
  385. }
  386. //已被收藏
  387. if len(collectionInfo) != 0 && collectionInfo[0].Deleted == 0 { //有数据 且 没取消收藏
  388. ProjectDetail.IsCollected = 1
  389. } else {
  390. ProjectDetail.IsCollected = 0 //没数据 或 有数据但取消了收藏
  391. }
  392. //返回的data作为收藏接口的is_collect字段传入
  393. if err != nil {
  394. return &TalentHttpResult{Code: -3, Msg: err.Error()}
  395. }
  396. // 来自服务商
  397. if s_project_id != 0 {
  398. projectInfoSupplier := youngee_talent_model.ProjectInfoSupplier{}
  399. err := g.DB().Model("younggee_s_project_info").Where("s_project_id=?", s_project_id).Scan(&projectInfoSupplier)
  400. if err != nil {
  401. fmt.Println("projectInfoSupplier err:", err.Error())
  402. }
  403. var younggeeSupplier *youngee_talent_model.YounggeeSupplier
  404. err = g.DB().Model("younggee_supplier").WithAll().Where("supplier_id", projectInfoSupplier.SupplierID).Scan(&younggeeSupplier)
  405. if err != nil {
  406. return &TalentHttpResult{Code: -3, Msg: err.Error()}
  407. }
  408. ProjectDetail.YounggeeSupplier = younggeeSupplier
  409. ProjectDetail.ProjectInfoSupplier = &projectInfoSupplier
  410. } else {
  411. //商家发布的
  412. var enterprise *youngee_talent_model.Enterprise
  413. err = g.DB().Model("enterprise").Where("enterprise_id", enterprise_id).Scan(&enterprise)
  414. if err != nil {
  415. return &TalentHttpResult{Code: -3, Msg: err.Error()}
  416. }
  417. ProjectDetail.Enterprise = enterprise
  418. }
  419. return &TalentHttpResult{Code: 0, Msg: "success", Data: ProjectDetail}
  420. }
  421. func GetProjectDetailFromBrowse(r *ghttp.Request) *TalentHttpResult {
  422. //从redis的 key--》browseProject:currentDate:tid中获取对应的 project_id:s_project_id
  423. pid := r.GetQueryInt("project_id", 0)
  424. enterprise_id := r.GetQueryString("enterprise_id", "") //来自商家
  425. s_project_id := r.GetQueryString("s_project_id", "")
  426. projectInfoSupplier := youngee_talent_model.ProjectInfoSupplier{}
  427. if s_project_id != "" {
  428. // 来自服务商
  429. err := g.DB().Model("younggee_s_project_info").Where("s_project_id=?", s_project_id).Scan(&projectInfoSupplier)
  430. if err != nil {
  431. fmt.Println("projectInfoSupplier err:", err.Error())
  432. }
  433. }
  434. if pid == 0 {
  435. return &TalentHttpResult{Code: -2, Msg: "parse param error"}
  436. }
  437. var ProjectDetail *youngee_talent_model.ProjectDetail
  438. err := g.DB().Model("project_info").WithAll().Where("project_id", pid).Scan(&ProjectDetail)
  439. if err != nil {
  440. return &TalentHttpResult{Code: -3, Msg: err.Error()}
  441. }
  442. //违约
  443. one, err := g.DB().Model("info_auto_default_handle").Where("auto_default_id=?", ProjectDetail.AutoDefaultId).One()
  444. one2, err := g.DB().Model("info_auto_task").Where("auto_task_id=?", ProjectDetail.AutoTaskId).One()
  445. ProjectDetail.DraftBreakPercent = one["sketch_replace_not_upload"].Int()
  446. ProjectDetail.LinkBreakPercent = one["link_replace_not_upload"].Int()
  447. ProjectDetail.DataBreakPercent = one["data_replace_not_upload"].Int()
  448. ProjectDetail.DraftBreakTime = one2["draft_default"].Int()
  449. ProjectDetail.DraftBreakTime = one2["link_breach"].Int()
  450. ProjectDetail.DraftBreakTime = one2["case_close_default"].Int()
  451. if s_project_id != "" { // 来自服务商
  452. var younggeeSupplier *youngee_talent_model.YounggeeSupplier
  453. err = g.DB().Model("younggee_supplier").WithAll().Where("supplier_id", projectInfoSupplier.SupplierID).Scan(&younggeeSupplier)
  454. if err != nil {
  455. return &TalentHttpResult{Code: -3, Msg: err.Error()}
  456. }
  457. ProjectDetail.YounggeeSupplier = younggeeSupplier
  458. ProjectDetail.ProjectInfoSupplier = &projectInfoSupplier
  459. } else { //project来自商家
  460. var enterprise *youngee_talent_model.Enterprise
  461. err = g.DB().Model("enterprise").WithAll().Where("enterprise_id", enterprise_id).Scan(&enterprise)
  462. if err != nil {
  463. return &TalentHttpResult{Code: -3, Msg: err.Error()}
  464. }
  465. ProjectDetail.Enterprise = enterprise
  466. }
  467. return &TalentHttpResult{Code: 0, Msg: "success", Data: ProjectDetail}
  468. }
  469. func SignUpProjKuaishouList(r *ghttp.Request) *TalentHttpResult {
  470. tid, _ := utils.SessionTalentInfo.GetTalentIdFromSession(r)
  471. pid := r.GetQueryString("project_id", 0)
  472. // 定义用于存储查询结果的结构体切片
  473. var results []*youngee_talent_model.KuaishouUserInfo
  474. // 查询此达人下,platform_id 为 8 或 4 的所有数据,并将结果扫描到结构体切片中
  475. err := g.DB().Model(&youngee_talent_model.KuaishouUserInfo{}).
  476. Where("talent_id = ?", tid).
  477. Where("platform_id IN (?, ?)", 4, 8).
  478. Order("open_id ASC, platform_id DESC"). // 按 open_id 排序,确保每组的数据连续,并且 platform_id=4 的数据排在前面
  479. Scan(&results)
  480. if err != nil {
  481. return &TalentHttpResult{Code: 1, Msg: "查询失败", Data: nil}
  482. }
  483. // 创建一个 map,用于记录每个 open_id 对应的记录
  484. //key是openid,value是数组,从而实现一对多
  485. openIdMap := make(map[string][]*youngee_talent_model.KuaishouUserInfo)
  486. // 将查询结果按 open_id 分组
  487. for _, record := range results {
  488. openIdMap[record.OpenId] = append(openIdMap[record.OpenId], record)
  489. }
  490. // 筛选出 open_id 对应两条数据且 platform_id = 4 的记录
  491. var resInfo []*youngee_talent_model.KuaishouUserInfo
  492. for _, records := range openIdMap {
  493. if len(records) == 2 { // 确保有两条数据,排除只有一个 platform_id 的情况
  494. for _, record := range records {
  495. if record.PlatformId == 4 { // 选取 platform_id = 4(电商) 的记录,含有粉丝数就好,因为需要加入橱窗
  496. resInfo = append(resInfo, record)
  497. break
  498. }
  499. }
  500. }
  501. }
  502. // 遍历 resInfo 检查过期和是否报名
  503. for _, record := range resInfo {
  504. // 调用 CheckKuaishouTokenExp 函数,检查 openId 是否过期
  505. expired := youngee_talent_service.CheckKuaishouTokenExp(record.OpenId)
  506. // 将过期检查结果赋值给 expired 属性 ,过期则不能被选中用于加入橱窗
  507. record.Expired = expired
  508. //是否报名
  509. isSignResult, err := g.DB().Model("younggee_task_info").Where("project_id=? AND open_id=? talent_id=?", pid, record.OpenId, tid).One()
  510. // 根据查询结果设置 IsSign 属性
  511. if err != nil || isSignResult.IsEmpty() {
  512. record.IsSign = 0 // 没有查到数据,设置为 0
  513. } else {
  514. record.IsSign = 1 // 查到数据,设置为 1
  515. }
  516. }
  517. return &TalentHttpResult{Code: 0, Msg: "success", Data: resInfo}
  518. }
  519. // 根据project的平台出现对应的社媒账号列表
  520. func SignUpProjAccountList(r *ghttp.Request) *TalentHttpResult {
  521. tid, _ := utils.SessionTalentInfo.GetTalentIdFromSession(r)
  522. pid := r.GetQueryString("project_id", "")
  523. platformId := r.GetInt("platform_id", 0)
  524. if pid == "" || platformId == 0 {
  525. return &TalentHttpResult{Code: -1, Msg: "参数有误", Data: nil}
  526. }
  527. //快手平台
  528. if platformId == 4 {
  529. // 定义用于存储查询结果的结构体切片
  530. var results []*youngee_talent_model.KuaishouUserInfo
  531. // 查询此达人下,platform_id 为 8 或 4 的所有数据,并将结果扫描到结构体切片中
  532. err := g.DB().Model(&youngee_talent_model.KuaishouUserInfo{}).
  533. Where("talent_id = ?", tid).
  534. Where("platform_id IN (?, ?)", 4, 8).
  535. Order("open_id ASC, platform_id DESC"). // 按 open_id 排序,确保每组的数据连续,并且 platform_id=4 的数据排在前面
  536. Scan(&results)
  537. if err != nil {
  538. return &TalentHttpResult{Code: 1, Msg: "查询失败", Data: nil}
  539. }
  540. // 创建一个 map,用于记录每个 open_id 对应的记录
  541. //key是openid,value是数组,从而实现一对多
  542. openIdMap := make(map[string][]*youngee_talent_model.KuaishouUserInfo)
  543. // 将查询结果按 open_id 分组
  544. for _, record := range results {
  545. openIdMap[record.OpenId] = append(openIdMap[record.OpenId], record)
  546. }
  547. // 筛选出 open_id 对应两条数据且 platform_id = 4 的记录
  548. var resInfo []*youngee_talent_model.KuaishouUserInfo
  549. for _, records := range openIdMap {
  550. if len(records) == 2 { // 确保有两条数据,排除只有一个 platform_id 的情况
  551. for _, record := range records {
  552. if record.PlatformId == 4 { // 选取 platform_id = 4(电商) 的记录,含有粉丝数就好,因为需要加入橱窗
  553. resInfo = append(resInfo, record)
  554. break
  555. }
  556. }
  557. }
  558. }
  559. // 遍历 resInfo 检查过期和是否报名
  560. for _, record := range resInfo {
  561. // 调用 CheckKuaishouTokenExp 函数,检查 openId 是否过期
  562. expired := youngee_talent_service.CheckKuaishouTokenExp(record.OpenId)
  563. // 将过期检查结果赋值给 expired 属性 ,过期则不能被选中用于加入橱窗
  564. record.Expired = expired
  565. //是否报名
  566. isSignResult, err := g.DB().Model("younggee_task_info").Where("project_id=? AND open_id=? talent_id=?", pid, record.OpenId, tid).One()
  567. // 根据查询结果设置 IsSign 属性
  568. if err != nil || isSignResult.IsEmpty() {
  569. record.IsSign = 0 // 没有查到数据,设置为 0
  570. } else {
  571. record.IsSign = 1 // 查到数据,设置为 1
  572. }
  573. }
  574. return &TalentHttpResult{Code: 0, Msg: "success", Data: resInfo}
  575. } else if platformId == 2 { //抖音
  576. //获取列表
  577. var results2 []*youngee_talent_model.KuaishouUserInfo
  578. err := g.DB().Model(&youngee_talent_model.KuaishouUserInfo{}).
  579. Where("talent_id = ?", tid).
  580. Where("platform_id = ? ", 2).
  581. Scan(&results2)
  582. if err != nil {
  583. return &TalentHttpResult{Code: 1, Msg: "查询失败", Data: nil}
  584. }
  585. // 遍历 resInfo 检查过期和是否报名
  586. for _, record := range results2 {
  587. // 调用 CheckKuaishouTokenExp 函数,检查 openId 是否过期
  588. expired := youngee_talent_service.CheckDouyinTokenExp(record.OpenId)
  589. // 将过期检查结果赋值给 expired 属性 ,过期则不能被选中用于加入橱窗
  590. record.Expired = expired
  591. //是否报名
  592. isSignResult, err := g.DB().Model("younggee_task_info").Where("project_id=? AND open_id=? talent_id=?", pid, record.OpenId, tid).One()
  593. // 根据查询结果设置 IsSign 属性
  594. if err != nil || isSignResult.IsEmpty() {
  595. record.IsSign = 0 // 没有查到数据,设置为 0
  596. } else {
  597. record.IsSign = 1 // 查到数据,设置为 1
  598. }
  599. }
  600. return &TalentHttpResult{Code: 0, Msg: "success", Data: results2}
  601. } else { //小红书 、 b站 、 微博
  602. //获取列表
  603. var results2 []*youngee_talent_model.KuaishouUserInfo
  604. err := g.DB().Model(&youngee_talent_model.KuaishouUserInfo{}).
  605. Where("talent_id = ?", tid).
  606. Where("platform_id = ? ", platformId).
  607. Scan(&results2)
  608. if err != nil {
  609. return &TalentHttpResult{Code: 1, Msg: "查询失败", Data: nil}
  610. }
  611. // 遍历 resInfo 是否报名
  612. for _, record := range results2 {
  613. //是否报名
  614. isSignResult, err := g.DB().Model("younggee_task_info").Where("project_id=? AND open_id=? talent_id=?", pid, record.OpenId, tid).One()
  615. // 根据查询结果设置 IsSign 属性
  616. if err != nil || isSignResult.IsEmpty() {
  617. record.IsSign = 0 // 没有查到数据,设置为 0
  618. } else {
  619. record.IsSign = 1 // 查到数据,设置为 1
  620. }
  621. }
  622. return &TalentHttpResult{Code: 0, Msg: "success", Data: results2}
  623. }
  624. }