locallife_task.go 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440
  1. package db
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "github.com/issue9/conv"
  7. "github.com/sirupsen/logrus"
  8. "gorm.io/gorm"
  9. "strconv"
  10. "strings"
  11. "time"
  12. "youngee_b_api/model/gorm_model"
  13. "youngee_b_api/model/http_model"
  14. )
  15. func GetLocalRecruittime(ctx context.Context, request http_model.GetLocalRecruitTimeRequest) (*http_model.GetLocalRecruitTimeResponse, error) {
  16. db := GetReadDB(ctx)
  17. var localinfo gorm_model.YounggeeLocalLifeInfo
  18. err := db.Model(&gorm_model.YounggeeLocalLifeInfo{}).Where("local_id = ?", request.ProjectId).Find(&localinfo).Error
  19. var result http_model.GetLocalRecruitTimeResponse
  20. if err != nil {
  21. return &result, err
  22. }
  23. result.RecruitTime = localinfo.RecruitDdl.Format("2006-01-02 15:04:05")
  24. return &result, nil
  25. }
  26. func GetLocalTalentstatusCount(db *gorm.DB, request http_model.GetLocalTalentstatusNumRequest, status int) (int64, error) {
  27. query := db.Model(&gorm_model.YoungeeLocalTaskInfo{}).Where("local_id = ? AND task_status = ?", request.ProjectId, status)
  28. // 计算总数
  29. var total int64
  30. if err := query.Count(&total).Error; err != nil {
  31. return 0, err
  32. }
  33. return total, nil
  34. }
  35. func GetLocalTalentstatusNumCount(ctx context.Context, request http_model.GetLocalTalentstatusNumRequest) (*http_model.GetLocalTalentstatusNumResponse, error) {
  36. db := GetReadDB(ctx)
  37. var unoperatenum, agreetalentnum, refusetalentnum int64
  38. unoperatenum, _ = GetLocalTalentstatusCount(db, request, 1)
  39. agreetalentnum, _ = GetLocalTalentstatusCount(db, request, 2)
  40. refusetalentnum, _ = GetLocalTalentstatusCount(db, request, 3)
  41. count := &http_model.GetLocalTalentstatusNumResponse{
  42. UnoperateTalentnum: unoperatenum,
  43. AgreeTalentnum: agreetalentnum,
  44. RefuseTalentnum: refusetalentnum,
  45. }
  46. return count, nil
  47. }
  48. func GetLocalTalentstatusNum(db *gorm.DB, request http_model.GetLocalTalentstatusCountRequest, status int) (int64, error) {
  49. query := db.Model(&gorm_model.YoungeeLocalTaskInfo{}).Where("local_id = ? AND task_stage = ?", request.ProjectId, status)
  50. var total int64
  51. if err := query.Count(&total).Error; err != nil {
  52. return 0, err
  53. }
  54. return total, nil
  55. }
  56. func GetLocalTalentstatusCountNum(ctx context.Context, request http_model.GetLocalTalentstatusCountRequest) (*http_model.GetLocalTalentstatusCountResponse, error) {
  57. db := GetReadDB(ctx)
  58. var unoperatenum, agreetalentnum, refusetalentnum int64
  59. unoperatenum, _ = GetLocalTalentstatusNum(db, request, request.TaskStage)
  60. agreetalentnum, _ = GetLocalTalentstatusNum(db, request, request.TaskStage+1)
  61. refusetalentnum, _ = GetLocalTalentstatusNum(db, request, request.TaskStage+2)
  62. count := &http_model.GetLocalTalentstatusCountResponse{
  63. UnoperateTalentnum: unoperatenum,
  64. AgreeTalentnum: agreetalentnum,
  65. RefuseTalentnum: refusetalentnum,
  66. }
  67. return count, nil
  68. }
  69. func GetLocallifetaskList(ctx context.Context, request http_model.GetLocalTaskListRequest) (*http_model.GetLocalTaskListData, error) {
  70. db := GetReadDB(ctx)
  71. var projecrtaskinfo []gorm_model.YoungeeLocalTaskInfo
  72. query := db.Model(&gorm_model.YoungeeLocalTaskInfo{}).Where("local_id = ? AND task_status = ?", request.ProjectId, request.CoopType)
  73. var localinfo gorm_model.YounggeeLocalLifeInfo
  74. err := db.Model(&gorm_model.YounggeeLocalLifeInfo{}).Where("local_id = ?", request.ProjectId).First(&localinfo).Error
  75. if err != nil {
  76. return &http_model.GetLocalTaskListData{}, err
  77. }
  78. // 构建查询条件
  79. if request.FeeFrom != nil {
  80. query = query.Where("fee_form = ?", request.FeeFrom)
  81. }
  82. if request.Type != nil {
  83. switch *request.Type {
  84. case 1:
  85. query = query.Where("supplier_id = 0 AND supplier_status = 0")
  86. case 2:
  87. query = query.Where("supplier_id !=0 AND supplier_status = 2")
  88. }
  89. } else {
  90. query = query.Where("(supplier_id = 0 AND supplier_status = 0) OR (supplier_id != 0 AND supplier_status = 2)")
  91. }
  92. if request.Others != "" {
  93. query = query.Where("talent_name LIKE ? OR s_operate_name LIKE ?", "%"+request.Others+"%", "%"+request.Others+"%")
  94. }
  95. if request.TalentFromList != "" {
  96. provinceList := strings.Split(request.TalentFromList, ",") // 解析传入的省份列表
  97. query = query.Where("SUBSTRING_INDEX(city, ' ', 1) IN (?)", provinceList) // 提取城市字段中的省份并进行匹配
  98. }
  99. // 计算总数
  100. var total int64
  101. if err := query.Count(&total).Error; err != nil {
  102. return nil, err
  103. }
  104. // 添加分页逻辑
  105. pageSize := request.PageSize
  106. if pageSize == 0 {
  107. pageSize = 10
  108. }
  109. pageNum := request.PageNum
  110. if pageNum == 0 {
  111. pageNum = 1
  112. }
  113. offset := (pageNum - 1) * pageSize
  114. // 处理多字段排序逻辑
  115. if len(request.SortField) > 0 && len(request.SortOrder) > 0 && len(request.SortField) == len(request.SortOrder) {
  116. for i := 0; i < len(request.SortField); i++ {
  117. field := request.SortField[i]
  118. order := request.SortOrder[i]
  119. switch field {
  120. case "fansnum":
  121. if order == "asc" {
  122. query = query.Order("fans_num asc")
  123. } else {
  124. query = query.Order("fans_num desc")
  125. }
  126. case "voteavg":
  127. if order == "asc" {
  128. query = query.Order("vote_avg asc")
  129. } else {
  130. query = query.Order("vote_avg desc")
  131. }
  132. case "commentavg":
  133. if order == "asc" {
  134. query = query.Order("commit_avg asc")
  135. } else {
  136. query = query.Order("commit_avg desc")
  137. }
  138. case "collectnum":
  139. if order == "asc" {
  140. query = query.Order("collect_num asc")
  141. } else {
  142. query = query.Order("collect_num desc")
  143. }
  144. }
  145. }
  146. } else {
  147. // Default sorting if no valid sort parameters
  148. query = query.Order("task_status asc").Order("task_stage asc")
  149. }
  150. // 执行分页查询
  151. if err := query.Offset(offset).Limit(pageSize).Find(&projecrtaskinfo).Error; err != nil {
  152. return nil, err
  153. }
  154. taskInfoPointers := make([]*http_model.LocaLTaskInfo, 0, len(projecrtaskinfo))
  155. for _, task := range projecrtaskinfo {
  156. var Time time.Time
  157. switch request.CoopType {
  158. case 1:
  159. Time = task.CreateDate
  160. case 2:
  161. Time = task.SelectDate //2 signedtime
  162. case 3:
  163. Time = task.CompleteDate
  164. }
  165. var listtime, stageintro string
  166. switch task.TaskStage {
  167. case 4:
  168. {
  169. listtime = task.SelectDate.Format("2006-01-02 15:04:05")
  170. stageintro = "执行开始时间"
  171. }
  172. case 5:
  173. {
  174. listtime = task.ReserveTime.Format("2006-01-02 15:04:05")
  175. stageintro = "达人探店时间预约申请时间"
  176. }
  177. case 6:
  178. {
  179. listtime = task.ExploreTime.Format("2006-01-02 15:04:05")
  180. stageintro = "达人探店时间预约申请时间"
  181. }
  182. case 9:
  183. {
  184. listtime = task.CurBreakAt.Format("2006-01-02 15:04:05")
  185. stageintro = "初稿上传截止时间"
  186. }
  187. case 10:
  188. {
  189. var sketchinfo gorm_model.YounggeeSketchInfo
  190. err := db.Model(&gorm_model.YounggeeSketchInfo{}).Where("task_id = ? and is_review = 0", task.TaskId).First(&sketchinfo).Error
  191. if err != nil {
  192. return nil, err
  193. }
  194. listtime = sketchinfo.CreateAt.Format("2006-01-02 15:04:05")
  195. stageintro = "达人上传初稿时间" //
  196. }
  197. case 11:
  198. {
  199. listtime = task.CurBreakAt.Format("2006-01-02 15:04:05")
  200. stageintro = " 链接上传截止时间"
  201. }
  202. case 12:
  203. {
  204. var linkinfo gorm_model.YounggeeLinkInfo
  205. err := db.Model(&gorm_model.YounggeeLinkInfo{}).Where("task_id = ? and is_review = 0", task.TaskId).First(&linkinfo).Error
  206. if err != nil {
  207. return nil, err
  208. }
  209. listtime = linkinfo.CreateAt.Format("2006-01-02 15:04:05")
  210. stageintro = "达人上传链接时间"
  211. }
  212. case 13:
  213. {
  214. listtime = task.CurBreakAt.Format("2006-01-02 15:04:05")
  215. stageintro = "数据待传截止时间"
  216. }
  217. case 14:
  218. {
  219. var datainfo gorm_model.YounggeeDataInfo
  220. err := db.Model(&gorm_model.YounggeeDataInfo{}).Where("task_id = ? and is_review = 0", task.TaskId).First(&datainfo).Error
  221. if err != nil {
  222. return nil, err
  223. }
  224. var auto_task_finish gorm_model.InfoAutoTask
  225. db.Model(&gorm_model.InfoAutoTask{}).Where("enterprise_id = ?", request.EnterPriseId).First(&auto_task_finish)
  226. // 将小时数转换为 Duration 后相加
  227. resultTime := datainfo.CreateAt.Add(time.Duration(auto_task_finish.TaskFinishAuto) * time.Hour)
  228. listtime = resultTime.Format("2006-01-02 15:04:05")
  229. stageintro = "品牌最晚结算时间"
  230. }
  231. case 15:
  232. {
  233. listtime = task.CompleteDate.Format("2006-01-02 15:04:05")
  234. stageintro = "品牌结算时间"
  235. }
  236. case 16:
  237. {
  238. listtime = task.CancelTime.Format("2006-01-02 15:04:05")
  239. stageintro = "解约时间"
  240. }
  241. }
  242. boperator := getBOperator(db, task.BOperator, task.BOperatorType)
  243. nickname, headurl, gender, fans, voteavg := getTalentinfo(db, task.OpenId)
  244. Iscoop := getIscoop(db, task.TalentId, request.EnterPriseId)
  245. s_type, s_name := stype(db, task.SupplierId, task.SupplierStatus, localinfo.LocalType)
  246. response := &http_model.LocaLTaskInfo{
  247. TaskId: task.TaskId,
  248. ProjectId: task.LocalId,
  249. TalentId: task.TalentId,
  250. FansNum: fans,
  251. DraftFee: task.DraftFee,
  252. Voteavg: voteavg,
  253. FeeFrom: task.FeeForm,
  254. TaskStage: task.TaskStage,
  255. Commentavg: 0,
  256. CollectNum: 0,
  257. CurrentDefaultType: task.CurDefaultType,
  258. From: determineFrom(task.SupplierId, task.SupplierStatus),
  259. SType: s_type,
  260. SName: s_name,
  261. Boperator: boperator,
  262. CreateAt: Time.Format("2006-01-02 15:04:05"),
  263. NickName: nickname,
  264. HeadUrl: headurl,
  265. ISCoop: Iscoop,
  266. Gender: gender,
  267. Sprojectid: task.SLocalLifeId,
  268. City: task.City,
  269. StageIntro: stageintro,
  270. ListTime: listtime,
  271. }
  272. taskInfoPointers = append(taskInfoPointers, response)
  273. }
  274. return &http_model.GetLocalTaskListData{
  275. TaskList: taskInfoPointers,
  276. Total: conv.MustString(total, ""),
  277. }, nil
  278. }
  279. func PassLocalTaskCoop(ctx context.Context, req http_model.PasslocalTaskCoopRequest) (bool, error) {
  280. db := GetReadDB(ctx)
  281. var count int64
  282. err := db.Model(gorm_model.YoungeeLocalTaskInfo{}).Where("task_id IN ? AND task_stage = 1", req.TaskIds).Count(&count).Error
  283. if err != nil {
  284. return false, err
  285. }
  286. if int64(len(req.TaskIds)) == 0 || count != int64(len(req.TaskIds)) {
  287. return false, errors.New("任务id有误")
  288. }
  289. // 2. 查询任务对应达人id(用于生成达人消息)
  290. var talentIds []string
  291. err = db.Model(gorm_model.YoungeeLocalTaskInfo{}).Where("task_id IN ?", req.TaskIds).Select("talent_id").Find(&talentIds).Error
  292. if err != nil {
  293. return false, err
  294. }
  295. // 3. 查询任务对应project名称(用于生成达人消息)
  296. var project gorm_model.YounggeeLocalLifeInfo
  297. err = db.Model(gorm_model.YounggeeLocalLifeInfo{}).Where("local_id = ?", req.ProjectId).Find(&project).Error
  298. if err != nil {
  299. return false, err
  300. }
  301. var taskstages int
  302. if project.TaskForm == 1 {
  303. taskstages = 4
  304. } else {
  305. taskstages = 9
  306. }
  307. nextstage := [6]int{0, 0, 0, 0, 0, 0} // 数组长度为6,表示6种工具 4,9,11,13
  308. if req.IsSpecial == 1 {
  309. toolList := strings.Split(project.Tools, ",")
  310. for _, tool := range toolList {
  311. // 将 tool 转换为整数
  312. if t, err := strconv.Atoi(tool); err == nil && t >= 0 && t <= len(nextstage) {
  313. nextstage[t-1] = 1
  314. }
  315. }
  316. fmt.Println(nextstage)
  317. for i := 1; i < len(nextstage); i++ { // 从位置1开始
  318. if nextstage[i] == 1 {
  319. switch i {
  320. case 1:
  321. taskstages = 4
  322. case 2:
  323. taskstages = 9
  324. case 3:
  325. taskstages = 11
  326. case 4:
  327. taskstages = 13
  328. case 5:
  329. taskstages = 15
  330. }
  331. break
  332. }
  333. }
  334. }
  335. var opid string
  336. var optype int
  337. switch req.OperateType {
  338. case 3:
  339. {
  340. opid = req.EnterpriseId
  341. optype = 1
  342. }
  343. case 4:
  344. {
  345. opid = req.OperatorId
  346. optype = 2
  347. }
  348. }
  349. //4.根据达人来源改变状态、阶段、数目
  350. var tasks []gorm_model.YoungeeLocalTaskInfo
  351. err = db.Model(gorm_model.YoungeeLocalTaskInfo{}).Where("task_id IN ? AND task_stage = 1", req.TaskIds).Find(&tasks).Error
  352. if err != nil {
  353. return false, err
  354. }
  355. err = db.Transaction(func(tx *gorm.DB) error {
  356. // 2. 修改任务状态和任务阶段
  357. for _, taskInfo := range tasks {
  358. if taskInfo.SupplierId != 0 && taskInfo.SupplierStatus == 2 { //服务商招募数量+1
  359. updateData := gorm_model.YoungeeLocalTaskInfo{
  360. TaskStage: taskstages,
  361. TaskStatus: 2,
  362. UpdateAt: time.Now(),
  363. BOperator: opid,
  364. BOperatorType: optype,
  365. SelectDate: time.Now(),
  366. }
  367. err = tx.Model(gorm_model.YoungeeLocalTaskInfo{}).Where("task_id = ? AND task_stage = 1", taskInfo.TaskId).Updates(updateData).Error
  368. if err != nil {
  369. return err
  370. }
  371. //project招募数+1,预估成本+服务商价格
  372. var projectinfo gorm_model.YounggeeLocalLifeInfo
  373. err = db.Model(gorm_model.YounggeeLocalLifeInfo{}).Where("local_id = ?", req.ProjectId).Find(&projectinfo).Error
  374. if err != nil {
  375. return err
  376. }
  377. projectinfo.RecruitNum += 1
  378. projectinfo.NeedPay += taskInfo.SupportFee
  379. err = tx.Model(gorm_model.YounggeeLocalLifeInfo{}).Where("local_id = ? ", req.ProjectId).Updates(projectinfo).Error
  380. if err != nil {
  381. return err
  382. }
  383. //recruit_strategy total_offer
  384. err = db.Model(gorm_model.RecruitStrategy{}).Where("strategy_id = ? AND project_id = ?", taskInfo.StrategyId, taskInfo.LocalId).Update("total_offer", gorm.Expr("total_offer + ?", taskInfo.DraftFee+taskInfo.ServiceCharge)).Error
  385. if err != nil {
  386. return nil
  387. }
  388. //服务商s_project已招募人数+1改成s_locallife
  389. var sprojectinfo gorm_model.YounggeeSProjectInfo
  390. err = db.Model(gorm_model.YounggeeSProjectInfo{}).Where(" s_project_id =?", taskInfo.SLocalLifeId).Find(&sprojectinfo).Error
  391. if err != nil {
  392. return err
  393. }
  394. sprojectinfo.RecruitNum += 1
  395. fmt.Println("......", projectinfo.RecruitNum)
  396. err = tx.Model(gorm_model.YounggeeSProjectInfo{}).Where(" s_project_id =?", taskInfo.SLocalLifeId).Updates(sprojectinfo).Error
  397. if err != nil {
  398. return err
  399. } //
  400. }
  401. //if project.TaskForm != 1 { //素材分发
  402. // var draft_default gorm_model.InfoAutoTask
  403. // err = db.Model(gorm_model.InfoAutoTask{}).Where("auto_task_id = ?", project.AutoTaskId).Find(&draft_default).Error
  404. // if err != nil {
  405. // return err
  406. // }
  407. // duration := time.Duration(draft_default.DraftDefault) * time.Hour
  408. // upbreakdate := gorm_model.YoungeeLocalTaskInfo{
  409. // CurBreakAt: time.Now().Add(duration),
  410. // }
  411. // err = tx.Model(gorm_model.YoungeeLocalTaskInfo{}).Where("task_id = ? ", taskInfo.TaskId).Updates(upbreakdate).Error
  412. // if err != nil {
  413. // return err
  414. // }
  415. //}
  416. if taskInfo.SupplierId == 0 && taskInfo.SupplierStatus == 0 { //来源于公海
  417. updateData := gorm_model.YoungeeLocalTaskInfo{
  418. TaskStage: taskstages,
  419. TaskStatus: 2,
  420. UpdateAt: time.Now(),
  421. BOperator: opid,
  422. BOperatorType: optype,
  423. SelectDate: time.Now(),
  424. }
  425. err = tx.Model(gorm_model.YoungeeLocalTaskInfo{}).Where("task_id = ? AND task_stage = 1", taskInfo.TaskId).Updates(updateData).Error
  426. if err != nil {
  427. return err
  428. }
  429. //project招募数+1
  430. var projectinfo gorm_model.YounggeeLocalLifeInfo
  431. err = db.Model(gorm_model.YounggeeLocalLifeInfo{}).Where("local_id = ?", req.ProjectId).Find(&projectinfo).Error
  432. if err != nil {
  433. return err
  434. }
  435. projectinfo.RecruitNum += 1
  436. projectinfo.NeedPay += taskInfo.SupportFee
  437. err = tx.Model(gorm_model.YounggeeLocalLifeInfo{}).Where("local_id = ? ", req.ProjectId).Updates(projectinfo).Error
  438. if err != nil {
  439. return err
  440. }
  441. //recruit_strategy total_offer
  442. err = db.Model(gorm_model.RecruitStrategy{}).Where("strategy_id = ? AND project_id = ?", taskInfo.StrategyId, taskInfo.LocalId).Update("total_offer", gorm.Expr("total_offer + ?", taskInfo.DraftFee+taskInfo.ServiceCharge)).Error
  443. if err != nil {
  444. return err
  445. }
  446. }
  447. }
  448. // 4. 生成达人消息
  449. for _, talendId := range talentIds {
  450. err = CreateMessage(ctx, 1, 1, talendId, project.LocalName)
  451. if err != nil {
  452. return err
  453. }
  454. }
  455. for _, taskid := range req.TaskIds {
  456. err = CreateTaskLog(ctx, taskid, "已确认合作")
  457. if err != nil {
  458. return err
  459. }
  460. }
  461. // 返回 nil 提交事务
  462. return nil
  463. })
  464. if err != nil {
  465. return false, err
  466. }
  467. return true, nil
  468. }
  469. func RefuseLocalTaskCoop(ctx context.Context, req http_model.RefuselocalTaskCoopRequest) (bool, error) {
  470. db := GetWriteDB(ctx)
  471. // 1. 校验
  472. var count int64
  473. err := db.Model(gorm_model.YoungeeLocalTaskInfo{}).Where("task_id IN ? AND task_stage = 1", req.TaskIds).Count(&count).Error
  474. if err != nil {
  475. return false, err
  476. }
  477. if count != int64(len(req.TaskIds)) {
  478. return false, errors.New("任务id有误")
  479. }
  480. var opid string
  481. var optype int
  482. switch req.OperateType {
  483. case 3:
  484. {
  485. opid = req.EnterpriseId
  486. optype = 1
  487. }
  488. case 4:
  489. {
  490. opid = req.OperatorId
  491. optype = 2
  492. }
  493. }
  494. // 2. 查询任务对应达人id(用于生成达人消息)
  495. var talentIds []string
  496. err = db.Model(gorm_model.YoungeeLocalTaskInfo{}).Where("task_id IN ?", req.TaskIds).Select("talent_id").Find(&talentIds).Error
  497. if err != nil {
  498. return false, err
  499. }
  500. var tasks []gorm_model.YoungeeLocalTaskInfo
  501. err = db.Model(gorm_model.YoungeeLocalTaskInfo{}).Where("task_id IN ? AND task_stage = 1", req.TaskIds).Find(&tasks).Error
  502. err = db.Transaction(func(tx *gorm.DB) error {
  503. // 2. 修改任务状态和任务阶段
  504. for _, taskInfo := range tasks {
  505. updateData := gorm_model.YoungeeLocalTaskInfo{
  506. TaskStage: 3,
  507. TaskStatus: 3,
  508. UpdateAt: time.Now(),
  509. BOperator: opid,
  510. BOperatorType: optype,
  511. CompleteDate: time.Now(),
  512. }
  513. err = tx.Model(gorm_model.YoungeeLocalTaskInfo{}).Where("task_id = ? AND task_stage = 1", taskInfo.TaskId).Updates(updateData).Error
  514. }
  515. if err != nil {
  516. return err
  517. }
  518. for _, taskid := range req.TaskIds {
  519. err = CreateTaskLog(ctx, taskid, "已拒绝合作")
  520. if err != nil {
  521. return err
  522. }
  523. }
  524. // 返回 nil 提交事务
  525. return nil
  526. })
  527. if err != nil {
  528. return false, err
  529. }
  530. return true, nil
  531. }
  532. func GetLocallifeData(ctx context.Context, req http_model.LocallifeDataRequest) (http_model.LocallifeDataResponse, error) {
  533. db := GetReadDB(ctx)
  534. var projectInfo gorm_model.YounggeeLocalLifeInfo
  535. // 查询项目基本信息
  536. if err := db.Where("local_id = ?", req.LocallifeId).First(&projectInfo).Error; err != nil {
  537. logrus.WithContext(ctx).Errorf("[Locallife db] GetLocallifeData error, err: %+v", err)
  538. return http_model.LocallifeDataResponse{}, err
  539. }
  540. fmt.Println("projectInfo---", projectInfo.LocalId)
  541. var projectTasks []gorm_model.YoungeeLocalTaskInfo
  542. if err := db.Where("local_id = ? AND task_status = ?", req.LocallifeId, 2).Find(&projectTasks).Error; err != nil {
  543. return http_model.LocallifeDataResponse{}, err
  544. }
  545. var totalTasks int64
  546. if err := db.Model(&gorm_model.YoungeeLocalTaskInfo{}).Where("local_id = ? AND task_status = ?", req.LocallifeId, 2).Count(&totalTasks).Error; err != nil {
  547. return http_model.LocallifeDataResponse{}, err
  548. }
  549. // 初始化统计数据
  550. dateStats := make(map[string]int)
  551. fansCounts := map[int64]int{0: 0, 1: 0, 2: 0, 3: 0}
  552. feeCounts := map[int]int{1: 0, 2: 0, 3: 0}
  553. startDate := *projectInfo.CreatedAt
  554. endDate := time.Now()
  555. // 填充日期统计
  556. for d := startDate; d.Before(endDate) || d.Equal(endDate); d = d.Add(24 * time.Hour) {
  557. dateStats[d.Format("2006-01-02")] = 0
  558. }
  559. var totalCost float64
  560. var totalFans int
  561. var serverTaskCount float64
  562. var maleCount int64
  563. // 处理每个任务
  564. for _, task := range projectTasks {
  565. totalCost += task.DraftFee
  566. var talentInfo gorm_model.YoungeeTalentInfo
  567. // 查询达人信息
  568. if err := db.Where("id = ?", task.TalentId).First(&talentInfo).Error; err != nil {
  569. logrus.WithContext(ctx).Errorf("[Locallife db] GetLocallifeData error, err: %+v", err)
  570. return http_model.LocallifeDataResponse{}, err
  571. }
  572. // 统计性别
  573. if talentInfo.Sex == 1 {
  574. maleCount++
  575. }
  576. totalFans += task.FansNum
  577. // 统计来自服务商的任务
  578. if task.SupplierId != 0 && task.SupplierStatus == 2 {
  579. serverTaskCount++
  580. }
  581. // 稿费形式统计
  582. feeCounts[task.FeeForm]++
  583. // 统计粉丝数
  584. switch {
  585. case task.FansNum < 10000:
  586. fansCounts[0]++
  587. case task.FansNum < 100000:
  588. fansCounts[1]++
  589. case task.FansNum < 1000000:
  590. fansCounts[2]++
  591. default:
  592. fansCounts[3]++
  593. }
  594. SelectDate := task.SelectDate.Format("2006-01-02")
  595. if _, exists := dateStats[SelectDate]; exists {
  596. dateStats[SelectDate]++
  597. }
  598. }
  599. // 计算平均值
  600. var avgFansNum int
  601. if totalTasks > 0 {
  602. avgFansNum = totalFans / int(totalTasks)
  603. } else {
  604. avgFansNum = 0
  605. }
  606. var fromType float64
  607. if totalTasks > 0 {
  608. fromType = serverTaskCount / float64(totalTasks)
  609. } else {
  610. fromType = 0
  611. }
  612. var manRatio float64
  613. if totalTasks > 0 {
  614. manRatio = float64(maleCount) / float64(totalTasks)
  615. } else {
  616. manRatio = 0
  617. }
  618. // 构建响应
  619. res := http_model.LocallifeDataResponse{
  620. Recruittime: *projectInfo.PassAt,
  621. RecruitDDl: *projectInfo.RecruitDdl,
  622. AgreeNum: projectInfo.RecruitNum,
  623. ApplyNum: projectInfo.ApplyNum,
  624. DraftFee: totalCost,
  625. AvgFansNum: avgFansNum,
  626. FromType: fromType,
  627. ManRatio: manRatio,
  628. DateStats: dateStats,
  629. FeeMap: feeCounts,
  630. FansMap: fansCounts,
  631. }
  632. return res, nil
  633. }
  634. func GetLocalPreSketchList(ctx context.Context, request http_model.LocalPreSketchListRequest) (*http_model.GetLocalSketchTaskListData, error) {
  635. db := GetReadDB(ctx)
  636. var localinfo gorm_model.YounggeeLocalLifeInfo
  637. err := db.Model(&gorm_model.YounggeeLocalLifeInfo{}).Where("local_id = ?", request.ProjectId).First(&localinfo).Error
  638. if err != nil {
  639. return &http_model.GetLocalSketchTaskListData{}, err
  640. }
  641. var projecrtaskinfo []gorm_model.YoungeeLocalTaskInfo
  642. query := db.Model(&gorm_model.YoungeeLocalTaskInfo{}).Where("local_id = ? AND task_stage = ?", request.ProjectId, request.ScriptStatus)
  643. if request.Others != "" {
  644. query = query.Where("talent_name LIKE ? OR s_operate_name LIKE ?", "%"+request.Others+"%", "%"+request.Others+"%")
  645. }
  646. // 计算总数
  647. var total int64
  648. if err := query.Count(&total).Error; err != nil {
  649. return nil, err
  650. }
  651. // 添加分页逻辑
  652. pageSize := request.PageSize
  653. if pageSize == 0 {
  654. pageSize = 10
  655. }
  656. pageNum := request.PageNum
  657. if pageNum == 0 {
  658. pageNum = 1
  659. }
  660. offset := (pageNum - 1) * pageSize
  661. // 执行分页查询
  662. // 处理多字段排序逻辑
  663. if len(request.SortField) > 0 && len(request.SortOrder) > 0 && len(request.SortField) == len(request.SortOrder) {
  664. for i := 0; i < len(request.SortField); i++ {
  665. field := request.SortField[i]
  666. order := request.SortOrder[i]
  667. switch field {
  668. case "fansnum":
  669. if order == "asc" {
  670. query = query.Order("fans_num asc")
  671. } else {
  672. query = query.Order("fans_num desc")
  673. }
  674. case "voteavg":
  675. if order == "asc" {
  676. query = query.Order("vote_avg asc")
  677. } else {
  678. query = query.Order("vote_avg desc")
  679. }
  680. case "commentavg":
  681. if order == "asc" {
  682. query = query.Order("commit_avg asc")
  683. } else {
  684. query = query.Order("commit_avg desc")
  685. }
  686. case "collectnum":
  687. if order == "asc" {
  688. query = query.Order("view_num asc")
  689. } else {
  690. query = query.Order("view_num desc")
  691. }
  692. }
  693. }
  694. } else {
  695. // Default sorting if no valid sort parameters
  696. query = query.Order("task_status asc").Order("task_stage asc")
  697. }
  698. if err := query.Offset(offset).Limit(pageSize).Find(&projecrtaskinfo).Error; err != nil {
  699. return nil, err
  700. }
  701. taskInfoPointers := make([]*http_model.LocalTasksketchInfo, 0, len(projecrtaskinfo))
  702. for _, task := range projecrtaskinfo {
  703. nickname, headurl, gender, fans, voteavg := getTalentinfo(db, task.OpenId)
  704. Iscoop := getIscoop(db, task.TalentId, request.EnterpriseId)
  705. s_type, s_name := stype(db, task.SupplierId, task.SupplierStatus, localinfo.LocalType)
  706. taskinfo := &http_model.LocaLTaskInfo{
  707. TaskId: task.TaskId,
  708. ProjectId: task.LocalId,
  709. TalentId: task.TalentId,
  710. FansNum: fans,
  711. DraftFee: task.DraftFee,
  712. Voteavg: voteavg,
  713. FeeFrom: task.FeeForm,
  714. TaskStage: task.TaskStage,
  715. Commentavg: 0,
  716. CurrentDefaultType: task.CurDefaultType,
  717. From: determineFrom(task.SupplierId, task.SupplierStatus),
  718. SType: s_type,
  719. SName: s_name,
  720. NickName: nickname,
  721. HeadUrl: headurl,
  722. Gender: gender,
  723. CollectNum: 0,
  724. ISCoop: Iscoop,
  725. City: task.City,
  726. }
  727. response := &http_model.LocalTasksketchInfo{
  728. Task: taskinfo,
  729. DDl: task.CurBreakAt.Format("2006-01-02 15:04:05"),
  730. }
  731. taskInfoPointers = append(taskInfoPointers, response)
  732. }
  733. return &http_model.GetLocalSketchTaskListData{
  734. TasksketchList: taskInfoPointers,
  735. Total: conv.MustString(total, ""),
  736. }, nil
  737. }
  738. func GetLocalSketchList(ctx context.Context, request http_model.LocalTasksketchlistRequest) (*http_model.GetsketchlocaltaskListData, error) {
  739. db := GetReadDB(ctx)
  740. var localinfo gorm_model.YounggeeLocalLifeInfo
  741. err := db.Model(&gorm_model.YounggeeLocalLifeInfo{}).Where("local_id = ?", request.ProjectId).First(&localinfo).Error
  742. if err != nil {
  743. return &http_model.GetsketchlocaltaskListData{}, err
  744. }
  745. var projecrtaskinfo []gorm_model.YoungeeLocalTaskInfo
  746. query := db.Model(&gorm_model.YoungeeLocalTaskInfo{}).Where("local_id = ? ", request.ProjectId)
  747. switch request.ScriptStatus {
  748. case 10:
  749. query = query.Where("task_stage = 10")
  750. case 11:
  751. query = query.Where(" task_stage >= 11")
  752. }
  753. if request.Others != "" {
  754. query = query.Where("talent_name LIKE ? OR s_operate_name LIKE ?", "%"+request.Others+"%", "%"+request.Others+"%")
  755. }
  756. // 计算总数
  757. var total int64
  758. if err := query.Count(&total).Error; err != nil {
  759. return nil, err
  760. }
  761. // 添加分页逻辑
  762. pageSize := request.PageSize
  763. if pageSize == 0 {
  764. pageSize = 10
  765. }
  766. pageNum := request.PageNum
  767. if pageNum == 0 {
  768. pageNum = 1
  769. }
  770. offset := (pageNum - 1) * pageSize
  771. // 执行分页查询
  772. // 处理多字段排序逻辑
  773. if len(request.SortField) > 0 && len(request.SortOrder) > 0 && len(request.SortField) == len(request.SortOrder) {
  774. for i := 0; i < len(request.SortField); i++ {
  775. field := request.SortField[i]
  776. order := request.SortOrder[i]
  777. switch field {
  778. case "fansnum":
  779. if order == "asc" {
  780. query = query.Order("fans_num asc")
  781. } else {
  782. query = query.Order("fans_num desc")
  783. }
  784. case "voteavg":
  785. if order == "asc" {
  786. query = query.Order("vote_avg asc")
  787. } else {
  788. query = query.Order("vote_avg desc")
  789. }
  790. case "commentavg":
  791. if order == "asc" {
  792. query = query.Order("commit_avg asc")
  793. } else {
  794. query = query.Order("commit_avg desc")
  795. }
  796. case "collectnum":
  797. if order == "asc" {
  798. query = query.Order("view_num asc")
  799. } else {
  800. query = query.Order("view_num desc")
  801. }
  802. }
  803. }
  804. } else {
  805. // Default sorting if no valid sort parameters
  806. query = query.Order("task_status asc").Order("task_stage asc")
  807. }
  808. if err := query.Offset(offset).Limit(pageSize).Find(&projecrtaskinfo).Error; err != nil {
  809. return nil, err
  810. }
  811. taskInfoPointers := make([]*http_model.LocalTasksketchinfo, 0, len(projecrtaskinfo))
  812. for _, task := range projecrtaskinfo {
  813. nickname, headurl, gender, fans, voteavg := getTalentinfo(db, task.OpenId)
  814. s_type, s_name := stype(db, task.SupplierId, task.SupplierStatus, localinfo.LocalType)
  815. taskinfo := &http_model.LocaLTaskInfo{
  816. TaskId: task.TaskId,
  817. ProjectId: task.LocalId,
  818. TalentId: task.TalentId,
  819. FansNum: fans,
  820. DraftFee: task.DraftFee,
  821. Voteavg: voteavg,
  822. FeeFrom: task.FeeForm,
  823. TaskStage: task.TaskStage,
  824. Commentavg: 0,
  825. CollectNum: 0,
  826. CurrentDefaultType: task.CurDefaultType,
  827. SType: s_type,
  828. SName: s_name,
  829. From: determineFrom(task.SupplierId, task.SupplierStatus),
  830. NickName: nickname,
  831. Gender: gender,
  832. HeadUrl: headurl,
  833. City: task.City,
  834. }
  835. var sketchinfo gorm_model.YounggeeSketchInfo
  836. switch request.ScriptStatus {
  837. case 10:
  838. err := db.Model(&gorm_model.YounggeeSketchInfo{}).Where("task_id = ? and is_review = 0 ", task.TaskId).First(&sketchinfo).Error
  839. if err != nil {
  840. return nil, err
  841. }
  842. case 11:
  843. err := db.Model(&gorm_model.YounggeeSketchInfo{}).Where("task_id = ? and is_ok = 1", task.TaskId).First(&sketchinfo).Error
  844. if err != nil {
  845. return nil, err
  846. }
  847. }
  848. boperator := getBOperator(db, task.BOperator, task.BOperatorType)
  849. response := &http_model.LocalTasksketchinfo{
  850. Task: taskinfo,
  851. SketchId: sketchinfo.SketchID,
  852. SubmitAt: sketchinfo.CreateAt.Format("2006-01-02 15:04:05"),
  853. AgreeAt: sketchinfo.AgreeAt.Format("2006-01-02 15:04:05"),
  854. SketchType: sketchinfo.Type,
  855. Operator: boperator,
  856. }
  857. taskInfoPointers = append(taskInfoPointers, response)
  858. }
  859. return &http_model.GetsketchlocaltaskListData{
  860. LocalTasksketchList: taskInfoPointers,
  861. Total: conv.MustString(total, ""),
  862. }, nil
  863. }
  864. func GetLocalPreLinkList(ctx context.Context, request http_model.LocalPreLinkListRequest) (*http_model.GetLocalPreLinkListData, error) {
  865. db := GetReadDB(ctx)
  866. var localinfo gorm_model.YounggeeLocalLifeInfo
  867. err := db.Model(&gorm_model.YounggeeLocalLifeInfo{}).Where("local_id = ?", request.ProjectId).First(&localinfo).Error
  868. if err != nil {
  869. return &http_model.GetLocalPreLinkListData{}, err
  870. }
  871. var projecrtaskinfo []gorm_model.YoungeeLocalTaskInfo
  872. query := db.Model(&gorm_model.YoungeeLocalTaskInfo{}).Where("local_id = ? AND task_stage = ?", request.ProjectId, request.LinkStatus)
  873. if request.Others != "" {
  874. query = query.Where("talent_name LIKE ? OR s_operate_name LIKE ?", "%"+request.Others+"%", "%"+request.Others+"%")
  875. }
  876. // 计算总数
  877. var total int64
  878. if err := query.Count(&total).Error; err != nil {
  879. return nil, err
  880. }
  881. // 添加分页逻辑
  882. pageSize := request.PageSize
  883. if pageSize == 0 {
  884. pageSize = 10
  885. }
  886. pageNum := request.PageNum
  887. if pageNum == 0 {
  888. pageNum = 1
  889. }
  890. offset := (pageNum - 1) * pageSize
  891. // 执行分页查询
  892. // 处理多字段排序逻辑
  893. if len(request.SortField) > 0 && len(request.SortOrder) > 0 && len(request.SortField) == len(request.SortOrder) {
  894. for i := 0; i < len(request.SortField); i++ {
  895. field := request.SortField[i]
  896. order := request.SortOrder[i]
  897. switch field {
  898. case "fansnum":
  899. if order == "asc" {
  900. query = query.Order("fans_num asc")
  901. } else {
  902. query = query.Order("fans_num desc")
  903. }
  904. case "voteavg":
  905. if order == "asc" {
  906. query = query.Order("vote_avg asc")
  907. } else {
  908. query = query.Order("vote_avg desc")
  909. }
  910. case "commentavg":
  911. if order == "asc" {
  912. query = query.Order("commit_avg asc")
  913. } else {
  914. query = query.Order("commit_avg desc")
  915. }
  916. case "collectnum":
  917. if order == "asc" {
  918. query = query.Order("view_num asc")
  919. } else {
  920. query = query.Order("view_num desc")
  921. }
  922. }
  923. }
  924. } else {
  925. // Default sorting if no valid sort parameters
  926. query = query.Order("task_status asc").Order("task_stage asc")
  927. }
  928. if err := query.Offset(offset).Limit(pageSize).Find(&projecrtaskinfo).Error; err != nil {
  929. return nil, err
  930. }
  931. taskInfoPointers := make([]*http_model.LocalTasklinkinfo, 0, len(projecrtaskinfo))
  932. for _, task := range projecrtaskinfo {
  933. nickname, headurl, gender, fans, voteavg := getTalentinfo(db, task.OpenId)
  934. Iscoop := getIscoop(db, task.TalentId, request.EnterpriseId)
  935. s_type, s_name := stype(db, task.SupplierId, task.SupplierStatus, localinfo.LocalType)
  936. taskinfo := &http_model.LocaLTaskInfo{
  937. TaskId: task.TaskId,
  938. ProjectId: task.LocalId,
  939. TalentId: task.TalentId,
  940. FansNum: fans,
  941. DraftFee: task.DraftFee,
  942. Voteavg: voteavg,
  943. FeeFrom: task.FeeForm,
  944. TaskStage: task.TaskStage,
  945. Commentavg: 0,
  946. CollectNum: 0,
  947. CurrentDefaultType: task.CurDefaultType,
  948. From: determineFrom(task.SupplierId, task.SupplierStatus),
  949. SType: s_type,
  950. SName: s_name,
  951. NickName: nickname,
  952. HeadUrl: headurl,
  953. Gender: gender,
  954. ISCoop: Iscoop,
  955. City: task.City,
  956. }
  957. response := &http_model.LocalTasklinkinfo{
  958. Task: taskinfo,
  959. DDl: task.CurBreakAt.Format("2006-01-02 15:04:05"),
  960. }
  961. taskInfoPointers = append(taskInfoPointers, response)
  962. }
  963. return &http_model.GetLocalPreLinkListData{
  964. TasklinkList: taskInfoPointers,
  965. Total: conv.MustString(total, ""),
  966. }, nil
  967. }
  968. func GetLocalLinkList(ctx context.Context, request http_model.LocalTaskLinklistRequest) (*http_model.GetLocalTaskLinkListData, error) {
  969. db := GetReadDB(ctx)
  970. var localinfo gorm_model.YounggeeLocalLifeInfo
  971. err := db.Model(&gorm_model.YounggeeLocalLifeInfo{}).Where("local_id = ?", request.ProjectId).First(&localinfo).Error
  972. if err != nil {
  973. return &http_model.GetLocalTaskLinkListData{}, err
  974. }
  975. var projecrtaskinfo []gorm_model.YoungeeLocalTaskInfo
  976. query := db.Model(&gorm_model.YoungeeLocalTaskInfo{}).Where("local_id = ? ", request.ProjectId)
  977. switch request.LinkStatus {
  978. case "12":
  979. query = query.Where("task_stage = 12")
  980. case "13":
  981. query = query.Where(" task_stage >= 13")
  982. }
  983. if request.Others != "" {
  984. query = query.Where("talent_name LIKE ? OR s_operate_name LIKE ?", "%"+request.Others+"%", "%"+request.Others+"%")
  985. }
  986. // 计算总数
  987. var total int64
  988. if err := query.Count(&total).Error; err != nil {
  989. return nil, err
  990. }
  991. // 添加分页逻辑
  992. pageSize := request.PageSize
  993. if pageSize == 0 {
  994. pageSize = 10
  995. }
  996. pageNum := request.PageNum
  997. if pageNum == 0 {
  998. pageNum = 1
  999. }
  1000. offset := (pageNum - 1) * pageSize
  1001. // 执行分页查询
  1002. // 处理多字段排序逻辑
  1003. if len(request.SortField) > 0 && len(request.SortOrder) > 0 && len(request.SortField) == len(request.SortOrder) {
  1004. for i := 0; i < len(request.SortField); i++ {
  1005. field := request.SortField[i]
  1006. order := request.SortOrder[i]
  1007. switch field {
  1008. case "fansnum":
  1009. if order == "asc" {
  1010. query = query.Order("fans_num asc")
  1011. } else {
  1012. query = query.Order("fans_num desc")
  1013. }
  1014. case "voteavg":
  1015. if order == "asc" {
  1016. query = query.Order("vote_avg asc")
  1017. } else {
  1018. query = query.Order("vote_avg desc")
  1019. }
  1020. case "commentavg":
  1021. if order == "asc" {
  1022. query = query.Order("commit_avg asc")
  1023. } else {
  1024. query = query.Order("commit_avg desc")
  1025. }
  1026. case "collectnum":
  1027. if order == "asc" {
  1028. query = query.Order("view_num asc")
  1029. } else {
  1030. query = query.Order("view_num desc")
  1031. }
  1032. }
  1033. }
  1034. } else {
  1035. // Default sorting if no valid sort parameters
  1036. query = query.Order("task_status asc").Order("task_stage asc")
  1037. }
  1038. if err := query.Offset(offset).Limit(pageSize).Find(&projecrtaskinfo).Error; err != nil {
  1039. return nil, err
  1040. }
  1041. taskInfoPointers := make([]*http_model.LocalTaskLinkinfo, 0, len(projecrtaskinfo))
  1042. for _, task := range projecrtaskinfo {
  1043. nickname, headurl, gender, fans, voteavg := getTalentinfo(db, task.OpenId)
  1044. Iscoop := getIscoop(db, task.TalentId, request.EnterpriseId)
  1045. s_type, s_name := stype(db, task.SupplierId, task.SupplierStatus, localinfo.LocalType)
  1046. taskinfo := &http_model.LocaLTaskInfo{
  1047. TaskId: task.TaskId,
  1048. ProjectId: task.LocalId,
  1049. TalentId: task.TalentId,
  1050. FansNum: fans,
  1051. DraftFee: task.DraftFee,
  1052. Voteavg: voteavg,
  1053. FeeFrom: task.FeeForm,
  1054. TaskStage: task.TaskStage,
  1055. Commentavg: 0,
  1056. CollectNum: 0,
  1057. CurrentDefaultType: task.CurDefaultType,
  1058. From: determineFrom(task.SupplierId, task.SupplierStatus),
  1059. SType: s_type,
  1060. SName: s_name,
  1061. NickName: nickname,
  1062. HeadUrl: headurl,
  1063. Gender: gender,
  1064. ISCoop: Iscoop,
  1065. City: task.City,
  1066. }
  1067. var linkinfo gorm_model.YounggeeLinkInfo
  1068. switch request.LinkStatus {
  1069. case "12":
  1070. err := db.Model(&gorm_model.YounggeeLinkInfo{}).Where("task_id = ? and is_review = 0 ", task.TaskId).First(&linkinfo).Error
  1071. if err != nil {
  1072. return nil, err
  1073. }
  1074. case "13":
  1075. err := db.Model(&gorm_model.YounggeeLinkInfo{}).Where("task_id = ? and is_ok = 1", task.TaskId).First(&linkinfo).Error
  1076. if err != nil {
  1077. return nil, err
  1078. }
  1079. }
  1080. boperator := getBOperator(db, task.BOperator, task.BOperatorType)
  1081. response := &http_model.LocalTaskLinkinfo{
  1082. Task: taskinfo,
  1083. LinkId: linkinfo.LinkID,
  1084. SubmitAt: linkinfo.CreateAt.Format("2006-01-02 15:04:05"),
  1085. AgreeAt: linkinfo.AgreeAt.Format("2006-01-02 15:04:05"),
  1086. LinkUrl: linkinfo.LinkUrl,
  1087. PhotoUrl: linkinfo.PhotoUrl,
  1088. Operator: boperator,
  1089. }
  1090. taskInfoPointers = append(taskInfoPointers, response)
  1091. }
  1092. return &http_model.GetLocalTaskLinkListData{
  1093. LocalTaskLinklist: taskInfoPointers,
  1094. Total: conv.MustString(total, ""),
  1095. }, nil
  1096. }
  1097. func GetLocalPreDataList(ctx context.Context, request http_model.LocalPreDataListRequest) (*http_model.GetLocalPreDataListData, error) {
  1098. db := GetReadDB(ctx)
  1099. var localinfo gorm_model.YounggeeLocalLifeInfo
  1100. err := db.Model(&gorm_model.YounggeeLocalLifeInfo{}).Where("local_id = ?", request.ProjectId).First(&localinfo).Error
  1101. if err != nil {
  1102. return &http_model.GetLocalPreDataListData{}, err
  1103. }
  1104. var projecrtaskinfo []gorm_model.YoungeeLocalTaskInfo
  1105. query := db.Model(&gorm_model.YoungeeLocalTaskInfo{}).Where("local_id = ? AND task_stage = ?", request.ProjectId, request.DataStatus)
  1106. if request.Others != "" {
  1107. query = query.Where("talent_name LIKE ? OR s_operate_name LIKE ?", "%"+request.Others+"%", "%"+request.Others+"%")
  1108. }
  1109. // 计算总数
  1110. var total int64
  1111. if err := query.Count(&total).Error; err != nil {
  1112. return nil, err
  1113. }
  1114. // 添加分页逻辑
  1115. pageSize := request.PageSize
  1116. if pageSize == 0 {
  1117. pageSize = 10
  1118. }
  1119. pageNum := request.PageNum
  1120. if pageNum == 0 {
  1121. pageNum = 1
  1122. }
  1123. offset := (pageNum - 1) * pageSize
  1124. // 执行分页查询
  1125. // 处理多字段排序逻辑
  1126. if len(request.SortField) > 0 && len(request.SortOrder) > 0 && len(request.SortField) == len(request.SortOrder) {
  1127. for i := 0; i < len(request.SortField); i++ {
  1128. field := request.SortField[i]
  1129. order := request.SortOrder[i]
  1130. switch field {
  1131. case "fansnum":
  1132. if order == "asc" {
  1133. query = query.Order("fans_num asc")
  1134. } else {
  1135. query = query.Order("fans_num desc")
  1136. }
  1137. case "voteavg":
  1138. if order == "asc" {
  1139. query = query.Order("vote_avg asc")
  1140. } else {
  1141. query = query.Order("vote_avg desc")
  1142. }
  1143. case "commentavg":
  1144. if order == "asc" {
  1145. query = query.Order("commit_avg asc")
  1146. } else {
  1147. query = query.Order("commit_avg desc")
  1148. }
  1149. case "collectnum":
  1150. if order == "asc" {
  1151. query = query.Order("view_num asc")
  1152. } else {
  1153. query = query.Order("view_num desc")
  1154. }
  1155. }
  1156. }
  1157. } else {
  1158. // Default sorting if no valid sort parameters
  1159. query = query.Order("task_status asc").Order("task_stage asc")
  1160. }
  1161. if err := query.Offset(offset).Limit(pageSize).Find(&projecrtaskinfo).Error; err != nil {
  1162. return nil, err
  1163. }
  1164. taskInfoPointers := make([]*http_model.LocalTaskdatainfo, 0, len(projecrtaskinfo))
  1165. for _, task := range projecrtaskinfo {
  1166. nickname, headurl, gender, fans, voteavg := getTalentinfo(db, task.OpenId)
  1167. Iscoop := getIscoop(db, task.TalentId, request.EnterpriseId)
  1168. s_type, s_name := stype(db, task.SupplierId, task.SupplierStatus, localinfo.LocalType)
  1169. taskinfo := &http_model.LocaLTaskInfo{
  1170. TaskId: task.TaskId,
  1171. ProjectId: task.LocalId,
  1172. TalentId: task.TalentId,
  1173. FansNum: fans,
  1174. DraftFee: task.DraftFee,
  1175. Voteavg: voteavg,
  1176. FeeFrom: task.FeeForm,
  1177. TaskStage: task.TaskStage,
  1178. Commentavg: 0,
  1179. CollectNum: 0,
  1180. CurrentDefaultType: task.CurDefaultType,
  1181. From: determineFrom(task.SupplierId, task.SupplierStatus),
  1182. SType: s_type,
  1183. SName: s_name,
  1184. NickName: nickname,
  1185. HeadUrl: headurl,
  1186. Gender: gender,
  1187. ISCoop: Iscoop,
  1188. City: task.City,
  1189. }
  1190. response := &http_model.LocalTaskdatainfo{
  1191. Task: taskinfo,
  1192. DDl: task.CurBreakAt.Format("2006-01-02 15:04:05"),
  1193. }
  1194. taskInfoPointers = append(taskInfoPointers, response)
  1195. }
  1196. return &http_model.GetLocalPreDataListData{
  1197. TaskdataList: taskInfoPointers,
  1198. Total: conv.MustString(total, ""),
  1199. }, nil
  1200. }
  1201. func GetLocalDataList(ctx context.Context, request http_model.LocalTaskDatalistRequest) (*http_model.GetLocalTaskDatalistData, error) {
  1202. db := GetReadDB(ctx)
  1203. var localinfo gorm_model.YounggeeLocalLifeInfo
  1204. err := db.Model(&gorm_model.YounggeeLocalLifeInfo{}).Where("local_id = ?", request.ProjectId).First(&localinfo).Error
  1205. if err != nil {
  1206. return &http_model.GetLocalTaskDatalistData{}, err
  1207. }
  1208. var projecrtaskinfo []gorm_model.YoungeeLocalTaskInfo
  1209. query := db.Model(&gorm_model.YoungeeLocalTaskInfo{}).Where("local_id = ? AND task_stage = ?", request.ProjectId, request.DataStatus)
  1210. if request.Others != "" {
  1211. query = query.Where("talent_name LIKE ? OR s_operate_name LIKE ?", "%"+request.Others+"%", "%"+request.Others+"%")
  1212. }
  1213. // 计算总数
  1214. var total int64
  1215. if err := query.Count(&total).Error; err != nil {
  1216. return nil, err
  1217. }
  1218. // 添加分页逻辑
  1219. pageSize := request.PageSize
  1220. if pageSize == 0 {
  1221. pageSize = 10
  1222. }
  1223. pageNum := request.PageNum
  1224. if pageNum == 0 {
  1225. pageNum = 1
  1226. }
  1227. offset := (pageNum - 1) * pageSize
  1228. // 执行分页查询
  1229. // 处理多字段排序逻辑
  1230. if len(request.SortField) > 0 && len(request.SortOrder) > 0 && len(request.SortField) == len(request.SortOrder) {
  1231. for i := 0; i < len(request.SortField); i++ {
  1232. field := request.SortField[i]
  1233. order := request.SortOrder[i]
  1234. switch field {
  1235. case "fansnum":
  1236. if order == "asc" {
  1237. query = query.Order("fans_num asc")
  1238. } else {
  1239. query = query.Order("fans_num desc")
  1240. }
  1241. case "voteavg":
  1242. if order == "asc" {
  1243. query = query.Order("vote_avg asc")
  1244. } else {
  1245. query = query.Order("vote_avg desc")
  1246. }
  1247. case "commentavg":
  1248. if order == "asc" {
  1249. query = query.Order("commit_avg asc")
  1250. } else {
  1251. query = query.Order("commit_avg desc")
  1252. }
  1253. case "collectnum":
  1254. if order == "asc" {
  1255. query = query.Order("view_num asc")
  1256. } else {
  1257. query = query.Order("view_num desc")
  1258. }
  1259. }
  1260. }
  1261. } else {
  1262. // Default sorting if no valid sort parameters
  1263. query = query.Order("task_status asc").Order("task_stage asc")
  1264. }
  1265. if err := query.Offset(offset).Limit(pageSize).Find(&projecrtaskinfo).Error; err != nil {
  1266. return nil, err
  1267. }
  1268. taskInfoPointers := make([]*http_model.LocalTaskDatainfo, 0, len(projecrtaskinfo))
  1269. for _, task := range projecrtaskinfo {
  1270. nickname, headurl, gender, fans, voteavg := getTalentinfo(db, task.OpenId)
  1271. Iscoop := getIscoop(db, task.TalentId, request.EnterpriseId)
  1272. s_type, s_name := stype(db, task.SupplierId, task.SupplierStatus, localinfo.LocalType)
  1273. taskinfo := &http_model.LocaLTaskInfo{
  1274. TaskId: task.TaskId,
  1275. ProjectId: task.LocalId,
  1276. TalentId: task.TalentId,
  1277. FansNum: fans,
  1278. DraftFee: task.DraftFee,
  1279. Voteavg: voteavg,
  1280. FeeFrom: task.FeeForm,
  1281. TaskStage: task.TaskStage,
  1282. Commentavg: 0,
  1283. CollectNum: 0,
  1284. CurrentDefaultType: task.CurDefaultType,
  1285. From: determineFrom(task.SupplierId, task.SupplierStatus),
  1286. SType: s_type,
  1287. SName: s_name,
  1288. NickName: nickname,
  1289. HeadUrl: headurl,
  1290. Gender: gender,
  1291. ISCoop: Iscoop,
  1292. City: task.City,
  1293. }
  1294. var datainfo gorm_model.YounggeeDataInfo
  1295. switch request.DataStatus {
  1296. case "14":
  1297. err := db.Model(&gorm_model.YounggeeDataInfo{}).Where("task_id = ? and is_review = 0 ", task.TaskId).First(&datainfo).Error
  1298. if err != nil {
  1299. return nil, err
  1300. }
  1301. case "15":
  1302. err := db.Model(&gorm_model.YounggeeDataInfo{}).Where("task_id = ? and is_ok = 1", task.TaskId).First(&datainfo).Error
  1303. if err != nil {
  1304. return nil, err
  1305. }
  1306. }
  1307. boperator := getBOperator(db, task.BOperator, task.BOperatorType)
  1308. response := &http_model.LocalTaskDatainfo{
  1309. Task: taskinfo,
  1310. DataId: datainfo.DataID,
  1311. SubmitAt: datainfo.CreateAt.Format("2006-01-02 15:04:05"),
  1312. AgreeAt: datainfo.AgreeAt.Format("2006-01-02 15:04:05"),
  1313. PhotoUrl: datainfo.PhotoUrl,
  1314. PlayNumber: datainfo.PlayNumber,
  1315. LikeNumber: datainfo.LikeNumber,
  1316. CollectNumber: datainfo.CollectNumber,
  1317. CommentNumber: datainfo.CommentNumber,
  1318. SettleAmount: task.SettleAmount,
  1319. Breakrate: task.SketchBreakRate + task.LinkBreakRate + task.DataBreakRate,
  1320. Operator: boperator,
  1321. }
  1322. taskInfoPointers = append(taskInfoPointers, response)
  1323. }
  1324. return &http_model.GetLocalTaskDatalistData{
  1325. LocalTaskDatalist: taskInfoPointers,
  1326. Total: conv.MustString(total, ""),
  1327. }, nil
  1328. }
  1329. // GetLocalTaskIdList 子任务ID列表
  1330. func GetLocalTaskIdList(ctx context.Context, localId string) ([]string, int64, error) {
  1331. db := GetReadDB(ctx)
  1332. // Get count first
  1333. var total int64
  1334. if err := db.Model(gorm_model.YounggeeLocalLifeInfo{}).
  1335. Where("link_status = ? and local_id = ?", 5, localId).
  1336. Count(&total).
  1337. Error; err != nil {
  1338. logrus.WithContext(ctx).Errorf("[GetLocalTaskIdList] error counting task, err:%+v", err)
  1339. return nil, 0, err
  1340. }
  1341. // Query only project_id with the given status
  1342. var taskIds []string
  1343. err := db.Debug().
  1344. Model(gorm_model.YounggeeLocalLifeInfo{}).
  1345. Where("link_status = ? and local_id = ?", 5, localId).
  1346. Order("update_at desc").
  1347. Pluck("task_id", &taskIds).
  1348. Error
  1349. if err != nil {
  1350. logrus.WithContext(ctx).Errorf("[GetLocalTaskIdList] error querying taskIDs, err:%+v", err)
  1351. return nil, 0, err
  1352. }
  1353. return taskIds, total, nil
  1354. }