s_project.go 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711
  1. package service
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/issue9/conv"
  6. log "github.com/sirupsen/logrus"
  7. "strconv"
  8. "strings"
  9. "time"
  10. "youngee_b_api/db"
  11. "youngee_b_api/model/common_model"
  12. "youngee_b_api/model/gorm_model"
  13. "youngee_b_api/model/http_model"
  14. )
  15. var SProject *sProject
  16. type sProject struct {
  17. }
  18. // CreateSProject 新建服务商加入商单后的公开种草任务
  19. func (*sProject) CreateSProject(ctx context.Context, request http_model.AddToListRequest) error {
  20. // 1. 建立SProject信息
  21. // 1.1. 根据传入的ProjectId去Project表查找信息补全SProject
  22. var operatorType int
  23. if request.SubAccountId == 0 {
  24. operatorType = 1
  25. } else {
  26. operatorType = 2
  27. }
  28. newSProject := gorm_model.SProjectInfo{
  29. EnterpriseId: request.EnterpriseId,
  30. SupplierId: request.SupplierId,
  31. ProjectId: request.ProjectId,
  32. SubAccountId: request.SubAccountId,
  33. OperatorType: operatorType,
  34. SProjectStatus: 2,
  35. StrategyStatus: 1,
  36. }
  37. projectInfo, projectErr := db.GetProjectDetail(ctx, request.ProjectId)
  38. if projectErr != nil {
  39. return projectErr
  40. }
  41. if projectInfo != nil {
  42. var currentTime time.Time
  43. currentTime = time.Now()
  44. newSProject.ProjectStatus = projectInfo.ProjectStatus
  45. newSProject.ProjectForm = projectInfo.ProjectForm
  46. newSProject.ContentType = projectInfo.ContentType
  47. newSProject.ProjectPlatform = projectInfo.ProjectPlatform
  48. newSProject.CreateTime = &currentTime
  49. newSProject.ProjectType = 1
  50. newSProject.ProductId = projectInfo.ProductID
  51. newSProject.ProjectName = projectInfo.ProjectName
  52. }
  53. sProjectId, err := db.CreateSProject(ctx, newSProject)
  54. if err != nil {
  55. log.Infof("[CreateEnterpriseSubUser] fail,err:%+v", err)
  56. return err
  57. }
  58. fmt.Println("创建SProject信息成功")
  59. // 2. 建立新的recruitStrategy
  60. // 2.1. 根据projectId去查找原来的recruitStrategy
  61. recruitStrategys, strategyErr := db.GetRecruitStrategyByProjectId(ctx, request.ProjectId)
  62. if strategyErr != nil {
  63. return strategyErr
  64. }
  65. // 2.2. 设置新的结构体以写入
  66. var currRecruitStrategys []gorm_model.RecruitStrategy
  67. for _, strategy := range recruitStrategys {
  68. var currStrategy gorm_model.RecruitStrategy
  69. currStrategy.StrategyID = strategy.StrategyID
  70. currStrategy.QuoteRecruitStrategyId = int(strategy.RecruitStrategyID)
  71. currStrategy.FeeForm = strategy.FeeForm
  72. currStrategy.FollowersLow = strategy.FollowersLow
  73. currStrategy.FollowersUp = strategy.FollowersUp
  74. currStrategy.RecruitNumber = strategy.RecruitNumber
  75. currStrategy.Offer = strategy.Offer
  76. currStrategy.TOffer = strategy.TOffer
  77. currStrategy.ProjectID = "0"
  78. currStrategy.ServiceCharge = strategy.ServiceCharge
  79. currStrategy.ServiceRate = strategy.ServiceRate
  80. currStrategy.SProjectId = sProjectId
  81. currStrategy.StrategyType = 2
  82. currRecruitStrategys = append(currRecruitStrategys, currStrategy)
  83. }
  84. // 2.3. 写入
  85. createStrategyErr := db.CreateSpecialStrategy(ctx, currRecruitStrategys)
  86. if createStrategyErr != nil {
  87. return createStrategyErr
  88. }
  89. fmt.Println("创建招募策略成功")
  90. return nil
  91. }
  92. // GetSProjectList 查找服务商加入商单的种草任务列表
  93. func (*sProject) GetSProjectList(ctx context.Context, supplierId int, pageSize, pageNum int32, condition *common_model.SProjectCondition) (*http_model.SProjectData, error) {
  94. var SProjectList *http_model.SProjectData
  95. SProjectList = &http_model.SProjectData{}
  96. // 1. 加入商单后的种草任务基本信息
  97. sProjects, total, err := db.GetSProjectList(ctx, supplierId, pageSize, pageNum, condition)
  98. if err != nil {
  99. return nil, err
  100. }
  101. SProjectList.Total = total
  102. // 2. 商品信息填入
  103. for _, sProjectInfo := range sProjects {
  104. var currSProject *http_model.SProjectListReview
  105. currSProject = &http_model.SProjectListReview{}
  106. currSProject.SProjectId = sProjectInfo.SProjectId
  107. currSProject.ProjectId = sProjectInfo.ProjectId
  108. currSProject.ProjectName = sProjectInfo.ProjectName
  109. currSProject.ProjectPlatform = sProjectInfo.ProjectPlatform
  110. currSProject.ContentType = sProjectInfo.ContentType
  111. currSProject.EnterpriseId = sProjectInfo.EnterpriseId
  112. currSProject.ProjectForm = sProjectInfo.ProjectForm
  113. currSProject.ProjectStatus = sProjectInfo.ProjectStatus
  114. currSProject.SupplierId = sProjectInfo.SupplierId
  115. currSProject.SubAccountId = sProjectInfo.SubAccountId
  116. currSProject.OperatorType = sProjectInfo.OperatorType
  117. if sProjectInfo.OperatorType == 1 {
  118. currSProject.AddToListOperator = conv.MustString(sProjectInfo.SupplierId)
  119. } else {
  120. currSProject.AddToListOperator = conv.MustString(sProjectInfo.SubAccountId)
  121. }
  122. currSProject.CreateTime = conv.MustString(sProjectInfo.CreateTime)[0:19]
  123. currSProject.ApplyNum = sProjectInfo.ApplyNum
  124. currSProject.RecruitNum = sProjectInfo.RecruitNum
  125. currSProject.SettleNum = sProjectInfo.SettleNum
  126. currSProject.ServiceChargeActual = sProjectInfo.ServiceChargeActual
  127. currSProject.ServiceCharge = sProjectInfo.ServiceCharge
  128. currSProject.ServiceChargeSettle = sProjectInfo.ServiceChargeSettle
  129. // 2.2. 商品信息
  130. productInfo, productErr := db.GetProductByID(ctx, sProjectInfo.ProductId)
  131. if productErr != nil {
  132. return nil, productErr
  133. }
  134. if productInfo != nil {
  135. currSProject.ProductId = productInfo.ProductID
  136. currSProject.ProductPrice = productInfo.ProductPrice
  137. currSProject.ProductName = productInfo.ProductName
  138. }
  139. // 2.3. 商品图片信息
  140. productPhotoInfo, productPhotoErr := db.GetProductPhotoByProductID(ctx, sProjectInfo.ProductId)
  141. if productPhotoErr != nil {
  142. return nil, productPhotoErr
  143. }
  144. if productPhotoInfo != nil {
  145. for _, photo := range productPhotoInfo {
  146. fmt.Println(photo)
  147. if photo.Symbol == 1 {
  148. currSProject.ProductPhotoSymbol = 1
  149. currSProject.ProductPhotoUrl = photo.PhotoUrl
  150. currSProject.ProductPhotoUid = photo.PhotoUid
  151. }
  152. }
  153. }
  154. SProjectList.SProjectList = append(SProjectList.SProjectList, currSProject)
  155. }
  156. return SProjectList, nil
  157. }
  158. // GetSProjectDetail 查找服务商种草任务详情
  159. func (*sProject) GetSProjectDetail(ctx context.Context, sProjectId int) (*http_model.ShowSProjectData, error) {
  160. var sProjectData *http_model.ShowSProjectData
  161. sProjectData = &http_model.ShowSProjectData{}
  162. // 1. 取出服务商种草表中的信息
  163. sProjectInfo, err := db.GetSProjectDetail(ctx, sProjectId)
  164. if err != nil {
  165. return nil, err
  166. }
  167. if sProjectInfo != nil {
  168. sProjectData.ProjectStatus = sProjectInfo.ProjectStatus
  169. sProjectData.ProjectType = sProjectInfo.ProjectType
  170. sProjectData.SProjectId = sProjectInfo.SProjectId
  171. sProjectData.ProjectName = sProjectInfo.ProjectName
  172. sProjectData.ProjectID = sProjectInfo.ProjectId
  173. sProjectData.ProjectType = sProjectInfo.ProjectType
  174. sProjectData.ProjectPlatform = sProjectInfo.ProjectPlatform
  175. sProjectData.ProjectForm = sProjectInfo.ProjectForm
  176. sProjectData.ContentType = sProjectInfo.ContentType
  177. sProjectData.EnterpriseID = sProjectInfo.EnterpriseId
  178. sProjectData.CreateAt = conv.MustString(sProjectInfo.CreateTime)[0:19]
  179. // 2. 取出商家发布的种草任务表中的信息作为补充
  180. projectInfo, projectErr := db.GetProjectDetail(ctx, sProjectInfo.ProjectId)
  181. if projectErr != nil {
  182. return nil, projectErr
  183. }
  184. if projectInfo != nil {
  185. //sProjectData.TalentType = projectInfo.TalentType
  186. parts := strings.Split(projectInfo.TalentType, ",")
  187. var result []int
  188. for _, part := range parts {
  189. num, strErr := strconv.Atoi(strings.TrimSpace(part))
  190. if strErr != nil {
  191. return nil, strErr
  192. }
  193. result = append(result, num)
  194. }
  195. fmt.Println(result)
  196. talentTypeCategory, talentTypeErr := db.GetTalentCategory(ctx, result)
  197. if talentTypeErr != nil {
  198. return nil, talentTypeErr
  199. }
  200. if talentTypeCategory != nil {
  201. categories := make([]string, 0, len(talentTypeCategory))
  202. for _, talentType := range talentTypeCategory {
  203. categories = append(categories, talentType.Category)
  204. }
  205. sProjectData.TalentType = strings.Join(categories, ",")
  206. }
  207. sProjectData.RecruitDdl = conv.MustString(projectInfo.RecruitDdl)[0:19]
  208. sProjectData.ProjectDetail = projectInfo.ProjectDetail
  209. if projectInfo.PayAt != nil {
  210. sProjectData.PayAt = conv.MustString(projectInfo.PayAt)[0:19]
  211. }
  212. sProjectData.ProjectDetail = projectInfo.ProjectDetail
  213. sProjectData.EstimatedCost = 0.0
  214. sProjectData.ServiceChargeRate = projectInfo.ServiceChargeRate
  215. sProjectData.PassAt = conv.MustString(projectInfo.PassAt)[0:19]
  216. autoTaskInfo, autoTaskErr := db.GetAutoTaskById(ctx, int(projectInfo.AutoTaskID))
  217. if autoTaskErr != nil {
  218. return nil, autoTaskErr
  219. }
  220. if autoTaskInfo != nil {
  221. newTime := projectInfo.PassAt.Add(time.Duration(autoTaskInfo.Invalid) * time.Hour)
  222. sProjectData.AutoFailAt = conv.MustString(newTime)[0:19]
  223. }
  224. // 3. 取出招募策略并聚合达人数量信息
  225. recruitStrategy, recruitErr := db.GetRecruitStrategyBySProjectId(ctx, sProjectData.SProjectId)
  226. if recruitErr != nil {
  227. return nil, recruitErr
  228. }
  229. if recruitStrategy != nil {
  230. for _, strategy := range recruitStrategy {
  231. // fmt.Println("recruitStrategy: ", strategy)
  232. selectedNumber, countTaskErr := db.CountTaskNumByStrategyIdAndSProjectId(ctx, sProjectData.SProjectId, strategy.StrategyID)
  233. if countTaskErr != nil {
  234. return nil, countTaskErr
  235. }
  236. sProjectData.EstimatedCost += strategy.Offer * float64(strategy.RecruitNumber)
  237. showStrategy := http_model.ShowSRecruitStrategy{
  238. StrategyID: strategy.StrategyID,
  239. FeeForm: strategy.FeeForm,
  240. FollowersLow: strategy.FollowersLow,
  241. FollowersUp: strategy.FollowersUp,
  242. RecruitNumber: strategy.RecruitNumber,
  243. ServiceCharge: projectInfo.ServiceChargeRate,
  244. SelectedNumber: selectedNumber,
  245. Offer: strategy.Offer,
  246. }
  247. sProjectData.SRecruitStrategys = append(sProjectData.SRecruitStrategys, showStrategy)
  248. }
  249. }
  250. // 4. 取出种草任务创建者用户信息
  251. if projectInfo.OperatorType == 1 {
  252. // fmt.Println("商家用户")
  253. enterpriseInfo, enterpriseErr := db.GetEnterpriseByEnterpriseID(ctx, projectInfo.EnterpriseID)
  254. if enterpriseErr != nil {
  255. return nil, enterpriseErr
  256. }
  257. sProjectData.CreatorName = enterpriseInfo.BusinessName
  258. sProjectData.CreatorCompany = enterpriseInfo.BusinessName
  259. sProjectData.CreatorType = 1
  260. sProjectData.Phone = enterpriseInfo.BusinessName
  261. } else if projectInfo.OperatorType == 2 {
  262. // fmt.Println("商家子账号")
  263. enterpriseInfo, enterpriseErr := db.GetEnterpriseByEnterpriseID(ctx, projectInfo.EnterpriseID)
  264. if enterpriseErr != nil {
  265. return nil, enterpriseErr
  266. }
  267. sProjectData.CreatorCompany = enterpriseInfo.BusinessName
  268. subAccountInfo, SubAccountErr := db.FindSubAccountById(ctx, projectInfo.SubAccountId)
  269. if SubAccountErr != nil {
  270. return nil, SubAccountErr
  271. }
  272. sProjectData.Phone = subAccountInfo.PhoneNumber
  273. jobInfo, jobErr := db.FindJobByJobId(ctx, subAccountInfo.JobId)
  274. if jobErr != nil {
  275. return nil, jobErr
  276. }
  277. sProjectData.CreatorType = 2
  278. sProjectData.CreatorName = jobInfo.JobName
  279. }
  280. // 5. 商品信息
  281. // 5.1. 取出商品信息并聚合
  282. productInfo, productErr := db.GetProductByID(ctx, projectInfo.ProductID)
  283. if productErr != nil {
  284. return nil, productErr
  285. }
  286. if productInfo != nil {
  287. sProjectData.ProductID = productInfo.ProductID
  288. sProjectData.ProductName = productInfo.ProductName
  289. sProjectData.ProductType = productInfo.ProductType
  290. sProjectData.ProductPrice = productInfo.ProductPrice
  291. sProjectData.ProductCategory = productInfo.ProductCategory
  292. sProjectData.ProductCreateAt = conv.MustString(projectInfo.CreatedAt)[0:19]
  293. }
  294. // 5.2. 聚合商品图片信息
  295. productPhotoInfo, productPhotoErr := db.GetProductPhotoByProductID(ctx, projectInfo.ProductID)
  296. if productPhotoErr != nil {
  297. return nil, productPhotoErr
  298. }
  299. if productPhotoInfo != nil {
  300. for _, p := range productPhotoInfo {
  301. if p.Symbol == 1 {
  302. sProjectData.ProductMainPhotoUrl = p.PhotoUrl
  303. sProjectData.ProductMainPhotoUid = p.PhotoUid
  304. sProjectData.Symbol = 1
  305. }
  306. }
  307. }
  308. // 6. 执行要求Brief和素材
  309. // 6.1. Brief
  310. projectBrief, briefErr := db.FindProjectBriefByProjectId(ctx, sProjectData.ProjectID)
  311. if briefErr != nil {
  312. return nil, briefErr
  313. }
  314. if projectBrief != nil {
  315. sProjectData.ProjectBriefInfo = projectBrief
  316. }
  317. // 6.2. 素材
  318. projectMaterial, materialErr := db.FindProjectMaterialByProjectId(ctx, sProjectData.ProjectID)
  319. if materialErr != nil {
  320. return nil, materialErr
  321. }
  322. if projectMaterial != nil {
  323. sProjectData.ProjectMaterial = projectMaterial
  324. }
  325. }
  326. }
  327. return sProjectData, nil
  328. }
  329. // GetSpecialProjectList 查找服务商加入商单前的定向种草任务列表
  330. func (*sProject) GetSpecialProjectList(ctx context.Context, supplierId int, pageSize, pageNum int32, condition *common_model.SpecialSProjectCondition) (*http_model.SpecialProjectListData, error) {
  331. var specialProjectListData *http_model.SpecialProjectListData
  332. specialProjectListData = &http_model.SpecialProjectListData{}
  333. // 1. 定向种草任务基本信息填入
  334. specialProjects, total, err := db.GetSpecialProjectList(ctx, supplierId, pageSize, pageNum, condition, 1)
  335. if err != nil {
  336. return nil, err
  337. }
  338. if specialProjects != nil {
  339. specialProjectListData.Total = total
  340. for _, specialProject := range specialProjects {
  341. var currSpecialProject *http_model.SpecialProjectResponse
  342. currSpecialProject = &http_model.SpecialProjectResponse{}
  343. currSpecialProject.ProjectId = specialProject.ProjectId
  344. currSpecialProject.ProjectName = specialProject.ProjectName
  345. currSpecialProject.ProjectStatus = int(specialProject.ProjectStatus)
  346. currSpecialProject.SProjectId = specialProject.SProjectId
  347. currSpecialProject.EnterpriseId = specialProject.EnterpriseId
  348. currSpecialProject.ProjectPlatform = specialProject.ProjectPlatform
  349. currSpecialProject.ProjectForm = specialProject.ProjectForm
  350. currSpecialProject.ContentType = specialProject.ContentType
  351. currSpecialProject.SProjectStatus = specialProject.SProjectStatus
  352. if specialProject.SProjectStatus == 2 {
  353. currSpecialProject.AddToListStatus = 1
  354. } else {
  355. currSpecialProject.AddToListStatus = 2
  356. }
  357. // 2. 定向种草任务商品信息填入
  358. // 2.1. 商品信息
  359. productInfo, productErr := db.GetProductByID(ctx, specialProject.ProductId)
  360. if productErr != nil {
  361. return nil, productErr
  362. }
  363. if productInfo != nil {
  364. currSpecialProject.ProductId = productInfo.ProductID
  365. currSpecialProject.ProductName = productInfo.ProductName
  366. currSpecialProject.ProductPrice = productInfo.ProductPrice
  367. }
  368. // 2.2. 商品图片信息
  369. productPhotoInfo, productPhotoErr := db.GetProductPhotoByProductID(ctx, specialProject.ProductId)
  370. if productPhotoErr != nil {
  371. return nil, productPhotoErr
  372. }
  373. if productPhotoInfo != nil {
  374. for _, p := range productPhotoInfo {
  375. if p.Symbol == 1 {
  376. currSpecialProject.ProductPhotoUrl = p.PhotoUrl
  377. currSpecialProject.ProductPhotoUid = p.PhotoUid
  378. currSpecialProject.ProductPhotoSymbol = 1
  379. }
  380. }
  381. }
  382. // 3. 招募策略信息
  383. recruitStrategy, recruitErr := db.GetRecruitStrategyByProjectId(ctx, specialProject.ProjectId)
  384. if recruitErr != nil {
  385. return nil, recruitErr
  386. }
  387. if recruitStrategy != nil {
  388. for _, strategy := range recruitStrategy {
  389. showStrategy := http_model.EasyRecruitStrategy{
  390. FeeForm: strategy.FeeForm,
  391. RecruitNumber: strategy.RecruitNumber,
  392. StrategyId: strategy.StrategyID,
  393. }
  394. currSpecialProject.RecruitStrategy = append(currSpecialProject.RecruitStrategy, showStrategy)
  395. }
  396. }
  397. // 4. 原种草任务信息
  398. projectInfo, projectErr := db.GetProjectDetail(ctx, specialProject.ProjectId)
  399. if projectErr != nil {
  400. return nil, projectErr
  401. }
  402. if projectInfo != nil {
  403. currSpecialProject.Tools = projectInfo.Tools
  404. }
  405. specialProjectListData.SpecialProjectInfo = append(specialProjectListData.SpecialProjectInfo, currSpecialProject)
  406. }
  407. } else {
  408. specialProjectListData.Total = 0
  409. }
  410. return specialProjectListData, nil
  411. }
  412. // GetSpecialSProjectList 查找服务商加入商单后的定向种草任务列表
  413. func (*sProject) GetSpecialSProjectList(ctx context.Context, supplierId int, pageSize, pageNum int32, condition *common_model.SpecialSProjectCondition) (*http_model.SpecialSProjectListData, error) {
  414. var specialProjectListData *http_model.SpecialSProjectListData
  415. specialProjectListData = &http_model.SpecialSProjectListData{}
  416. specialProjects, total, err := db.GetSpecialProjectList(ctx, supplierId, pageSize, pageNum, condition, 2)
  417. if err != nil {
  418. return nil, err
  419. }
  420. if specialProjects != nil {
  421. specialProjectListData.Total = total
  422. // 1. 定向种草任务基本信息填入
  423. for _, specialProject := range specialProjects {
  424. var currSpecialProject *http_model.SpecialSProjectResponse
  425. currSpecialProject = &http_model.SpecialSProjectResponse{}
  426. currSpecialProject.ProjectId = specialProject.ProjectId
  427. currSpecialProject.ProjectName = specialProject.ProjectName
  428. currSpecialProject.ProjectStatus = int(specialProject.ProjectStatus)
  429. currSpecialProject.SProjectId = specialProject.SProjectId
  430. currSpecialProject.ProjectPlatform = specialProject.ProjectPlatform
  431. currSpecialProject.ProjectForm = specialProject.ProjectForm
  432. currSpecialProject.ContentType = specialProject.ContentType
  433. currSpecialProject.EnterpriseId = specialProject.EnterpriseId
  434. currSpecialProject.SProjectStatus = specialProject.SProjectStatus
  435. currSpecialProject.StrategyStatus = specialProject.StrategyStatus
  436. currSpecialProject.ApplyNum = specialProject.ApplyNum
  437. currSpecialProject.RecruitNum = specialProject.RecruitNum
  438. currSpecialProject.SettleNum = specialProject.SettleNum
  439. currSpecialProject.CreateTime = conv.MustString(specialProject.CreateTime)[0:19]
  440. if specialProject.SProjectStatus == 2 {
  441. currSpecialProject.AgreeTime = conv.MustString(specialProject.AgreeTime)[0:19]
  442. }
  443. // 加入商单操作人信息
  444. if specialProject.OperatorType == 1 {
  445. supplierInfo, supplierErr := db.GetSupplierById(ctx, supplierId)
  446. if supplierErr != nil {
  447. return nil, supplierErr
  448. }
  449. if supplierInfo != nil {
  450. currSpecialProject.AddToListOperate = supplierInfo.SupplierName
  451. }
  452. } else if specialProject.OperatorType == 2 {
  453. subAccountInfo, subAccountErr := db.FindSubAccountById(ctx, specialProject.SubAccountId)
  454. if subAccountErr != nil {
  455. return nil, subAccountErr
  456. }
  457. if subAccountInfo != nil {
  458. currSpecialProject.AddToListOperate = subAccountInfo.SubAccountName
  459. }
  460. }
  461. // 2. 定向种草任务商品信息填入
  462. // 2.1. 商品信息
  463. productInfo, productErr := db.GetProductByID(ctx, specialProject.ProductId)
  464. if productErr != nil {
  465. return nil, productErr
  466. }
  467. if productInfo != nil {
  468. currSpecialProject.ProductId = productInfo.ProductID
  469. currSpecialProject.ProductName = productInfo.ProductName
  470. currSpecialProject.ProductPrice = productInfo.ProductPrice
  471. }
  472. // 2.2. 商品图片信息
  473. productPhotoInfo, productPhotoErr := db.GetProductPhotoByProductID(ctx, specialProject.ProductId)
  474. if productPhotoErr != nil {
  475. return nil, productPhotoErr
  476. }
  477. if productPhotoInfo != nil {
  478. for _, p := range productPhotoInfo {
  479. if p.Symbol == 1 {
  480. currSpecialProject.ProductPhotoUrl = p.PhotoUrl
  481. currSpecialProject.ProductPhotoUid = p.PhotoUid
  482. currSpecialProject.ProductPhotoSymbol = 1
  483. }
  484. }
  485. }
  486. // 3. 招募策略信息
  487. // recruitStrategy, recruitErr := db.GetRecruitStrategyByProjectId(ctx, specialProject.ProjectId)
  488. // if recruitErr != nil {
  489. // return nil, recruitErr
  490. // }
  491. // if recruitStrategy != nil {
  492. // for _, strategy := range recruitStrategy {
  493. // showStrategy := http_model.EasyRecruitStrategy{
  494. // FeeForm: strategy.FeeForm,
  495. // RecruitNumber: strategy.RecruitNumber,
  496. // StrategyId: strategy.StrategyID,
  497. // }
  498. // currSpecialProject.RecruitStrategy = append(currSpecialProject.RecruitStrategy, showStrategy)
  499. // }
  500. // }
  501. // 4. 原种草任务信息
  502. projectInfo, projectErr := db.GetProjectDetail(ctx, specialProject.ProjectId)
  503. if projectErr != nil {
  504. return nil, projectErr
  505. }
  506. if projectInfo != nil {
  507. currSpecialProject.Tools = projectInfo.Tools
  508. }
  509. specialProjectListData.SpecialProjectInfo = append(specialProjectListData.SpecialProjectInfo, currSpecialProject)
  510. }
  511. } else {
  512. specialProjectListData.Total = 0
  513. }
  514. return specialProjectListData, nil
  515. }
  516. // UpdateSProject 更新SProject信息
  517. func (*sProject) UpdateSProject(ctx context.Context, request *http_model.SpecialSProjectAddToListRequest) error {
  518. updateSProjectErr := db.UpdateSProjectStatus(ctx, request)
  519. if updateSProjectErr != nil {
  520. return updateSProjectErr
  521. }
  522. return nil
  523. }
  524. // CreateSpecialStrategy 添加服务商招募策略
  525. func (*sProject) CreateSpecialStrategy(ctx context.Context, request *http_model.SpecialAddStrategyRequest) error {
  526. // 1. 添加服务商招募策略
  527. // 1.1. 整理数据
  528. var recruitStrategys []gorm_model.RecruitStrategy
  529. for _, strategy := range request.RecruitStrategys {
  530. var recruitStrategy *gorm_model.RecruitStrategy
  531. recruitStrategy = &gorm_model.RecruitStrategy{}
  532. recruitStrategy.StrategyID = strategy.StrategyID
  533. recruitStrategy.QuoteRecruitStrategyId = strategy.QuoteRecruitStrategyId
  534. recruitStrategy.FeeForm = strategy.FeeForm
  535. recruitStrategy.StrategyID = strategy.StrategyID
  536. recruitStrategy.FollowersLow = strategy.FollowersLow
  537. recruitStrategy.FollowersUp = strategy.FollowersUp
  538. recruitStrategy.RecruitNumber = strategy.RecruitNumber
  539. recruitStrategy.Offer = strategy.Offer
  540. recruitStrategy.ServiceCharge = strategy.ServiceCharge
  541. recruitStrategy.StrategyType = 2
  542. recruitStrategy.QuoteRecruitStrategyId = strategy.QuoteRecruitStrategyId
  543. // 一口价需要计算服务费率和达人所见报价
  544. if strategy.FeeForm == 3 {
  545. recruitStrategy.ServiceRate = strategy.ServiceRate
  546. } else {
  547. recruitStrategy.ServiceRate = int(strategy.ServiceCharge / strategy.Offer)
  548. }
  549. recruitStrategy.TOffer = strategy.Offer - strategy.ServiceCharge
  550. recruitStrategy.ProjectID = "0"
  551. recruitStrategy.SProjectId = request.SProjectId
  552. recruitStrategys = append(recruitStrategys, *recruitStrategy)
  553. }
  554. createErr := db.CreateSpecialStrategy(ctx, recruitStrategys)
  555. if createErr != nil {
  556. return createErr
  557. }
  558. // 2. 修改sProject中的字段
  559. updateErr := db.UpdateSProjectStrategyStatus(ctx, request)
  560. if updateErr != nil {
  561. return updateErr
  562. }
  563. return nil
  564. }
  565. // FullSProjectBillList 种草任务账单列表
  566. func (*sProject) FullSProjectBillList(ctx context.Context, request *http_model.FullSProjectBillListRequest) (*http_model.FullSProjectBillData, error) {
  567. var currSProjectBillData *http_model.FullSProjectBillData
  568. currSProjectBillData = &http_model.FullSProjectBillData{}
  569. // 1. 根据SupplierId和账单状态查询数据
  570. fullSProjectBillData, total, err := db.GetFullSProjectBillList(ctx, request.SupplierId, request.ProjectPlatform, request.ProjectStatus, request.PageSize, request.PageNum)
  571. if err != nil {
  572. return nil, err
  573. }
  574. if fullSProjectBillData != nil {
  575. currSProjectBillData.Total = total
  576. for _, b := range fullSProjectBillData {
  577. var billData *http_model.FullSProjectBillListData
  578. billData = &http_model.FullSProjectBillListData{}
  579. billData.SProjectId = b.SProjectId
  580. billData.ProjectId = b.ProjectId
  581. billData.ProjectPlatform = b.ProjectPlatform
  582. billData.ProjectForm = b.ProjectForm
  583. billData.ContentType = b.ContentType
  584. billData.ProjectStatus = b.ProjectStatus
  585. billData.EnterpriseId = b.EnterpriseId
  586. billData.SupplierId = b.SupplierId
  587. billData.SubAccountId = b.SubAccountId
  588. billData.ServiceChargeActual = b.ServiceChargeActual
  589. billData.ServiceChargeSettle = b.ServiceChargeSettle
  590. // 1.2. 补充商品信息
  591. productInfo, productErr := db.GetProductByID(ctx, b.ProductId)
  592. if productErr != nil {
  593. return nil, productErr
  594. }
  595. if productInfo != nil {
  596. billData.ProductId = productInfo.ProductID
  597. billData.ProductPrice = productInfo.ProductPrice
  598. billData.ProductName = productInfo.ProductName
  599. }
  600. // 1.3. 商品图片信息
  601. productPhotoInfo, productPhotoErr := db.GetProductPhotoByProductID(ctx, b.ProductId)
  602. if productPhotoErr != nil {
  603. return nil, productPhotoErr
  604. }
  605. if productPhotoInfo != nil {
  606. for _, photo := range productPhotoInfo {
  607. //fmt.Println(photo)
  608. if photo.Symbol == 1 {
  609. billData.ProductPhotoSymbol = 1
  610. billData.ProductPhotoUrl = photo.PhotoUrl
  611. billData.ProductPhotoUid = photo.PhotoUid
  612. }
  613. }
  614. }
  615. currSProjectBillData.SProjectList = append(currSProjectBillData.SProjectList, billData)
  616. }
  617. }
  618. return currSProjectBillData, nil
  619. }
  620. // FullSProjectTaskBillList 种草子任务账单列表
  621. func (*sProject) FullSProjectTaskBillList(ctx context.Context, request *http_model.FullSProjectTaskBillListRequest) (*http_model.FullSProjectTaskBillData, error) {
  622. var currSProjectTaskBillData *http_model.FullSProjectTaskBillData
  623. currSProjectTaskBillData = &http_model.FullSProjectTaskBillData{}
  624. currSProjectTaskBillData.DraftFee = 0
  625. currSProjectTaskBillData.DraftFeeSettle = 0
  626. // 1. 查找子任务
  627. taskList, total, taskListErr := db.GetSProjectTaskList(ctx, request.SProjectId, request.TalentId, request.PageSize, request.PageNum)
  628. if taskListErr != nil {
  629. return nil, taskListErr
  630. }
  631. if taskList != nil {
  632. currSProjectTaskBillData.Total = total
  633. for _, task := range taskList {
  634. var curr *http_model.FullSProjectTaskBillListData
  635. curr = &http_model.FullSProjectTaskBillListData{}
  636. curr.TaskId = task.TaskID
  637. curr.ServiceCharge = task.ServiceCharge
  638. curr.ViewNum = 0
  639. curr.VoteNum = 0
  640. curr.CommitNum = 0
  641. curr.CollectNum = 0
  642. curr.ServiceCharge = task.ServiceCharge
  643. curr.DraftFee = task.DraftFee
  644. curr.DelayRate = task.ScriptBreakRate + task.SketchBreakRate + task.LinkBreakRate + task.DataBreakRate
  645. curr.RealServiceCharge = task.RealPayment - task.SettleAmount
  646. curr.SettleAmount = task.SettleAmount
  647. curr.SettleTime = conv.MustString(task.CompleteDate)
  648. currSProjectTaskBillData.DraftFee += curr.DraftFee
  649. currSProjectTaskBillData.DraftFeeSettle += curr.SettleAmount
  650. currSProjectTaskBillData.SProjectTaskList = append(currSProjectTaskBillData.SProjectTaskList, curr)
  651. }
  652. // 2. 补充任务信息
  653. sProjectInfo, sProjectErr := db.GetSProjectDetail(ctx, request.SProjectId)
  654. if sProjectErr != nil {
  655. return nil, sProjectErr
  656. }
  657. if sProjectInfo != nil {
  658. currSProjectTaskBillData.SettleNum = sProjectInfo.SettleNum
  659. currSProjectTaskBillData.ChooseNum = sProjectInfo.ApplyNum
  660. currSProjectTaskBillData.ServiceCharge = sProjectInfo.ServiceCharge
  661. currSProjectTaskBillData.ServiceChargeSettle = sProjectInfo.ServiceChargeSettle
  662. }
  663. }
  664. return currSProjectTaskBillData, nil
  665. }