project_task.go 43 KB

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