project_service.go 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803
  1. package service
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "github.com/sirupsen/logrus"
  6. "reflect"
  7. "strings"
  8. "time"
  9. "youngee_b_api/app/dao"
  10. "youngee_b_api/app/entity"
  11. "youngee_b_api/app/service/review_service"
  12. "youngee_b_api/app/util"
  13. "youngee_b_api/app/vo"
  14. )
  15. type ProjectService struct{}
  16. // 创建种草任务
  17. func (s ProjectService) CreateProject(projectCreateParam *vo.ProjectCreateParam) (*string, error) {
  18. // a) 生成种草项目id
  19. projectId := strings.ReplaceAll(util.GenerateUUID(11), "-", "")
  20. // b) 查找关联商品信息
  21. product, err := dao.ProductDAO{}.GetProductByID(projectCreateParam.ProductId)
  22. if err != nil {
  23. return nil, err
  24. }
  25. if product == nil {
  26. return nil, errors.New("未找到关联商品")
  27. }
  28. productPhotos, err := dao.ProductPhotoDAO{}.GetProductPhotoByProductID(projectCreateParam.ProductId)
  29. productInfoToJson, _ := json.Marshal(product)
  30. productPhotosToJson, _ := json.Marshal(productPhotos)
  31. // d) 任务截止时间
  32. recruitDdl := time.Time{} //赋零值
  33. recruitDdl, _ = time.ParseInLocation("2006-01-02 15:04:05", projectCreateParam.RecruitDdl, time.Local)
  34. // d)创建种草任务
  35. var operatorType int64
  36. if projectCreateParam.SubAccountId == 0 {
  37. operatorType = 1
  38. } else {
  39. operatorType = 2
  40. }
  41. // 获取定时任务配置id
  42. infoAutoTask := entity.InfoAutoTask{}
  43. infoAutoTask = dao.InfoAutoTaskDao{}.GetAutoTaskLast(projectCreateParam.EnterpriseId)
  44. infoAutoDefault := entity.InfoAutoDefault{}
  45. infoAutoDefault = dao.InfoAutoDefaultDao{}.GetAutoDefaultLast(projectCreateParam.EnterpriseId)
  46. t := time.Now()
  47. newProject := entity.Project{
  48. ProjectStatus: 1,
  49. ProjectType: projectCreateParam.ProjectType,
  50. ProjectId: projectId,
  51. ProductID: projectCreateParam.ProductId,
  52. ProductCategory: product.ProductCategory,
  53. EnterpriseID: projectCreateParam.EnterpriseId,
  54. SubAccountId: projectCreateParam.SubAccountId,
  55. ProjectPlatform: projectCreateParam.Platform,
  56. OperatorType: operatorType,
  57. ProductSnap: string(productInfoToJson),
  58. ProductPhotoSnap: string(productPhotosToJson),
  59. CreatedAt: t,
  60. AutoTaskID: infoAutoTask.AutoTaskID,
  61. AutoDefaultID: infoAutoDefault.AutoDefaultID,
  62. ProjectName: projectCreateParam.ProjectName,
  63. TalentType: projectCreateParam.TalentType,
  64. RecruitDdl: recruitDdl,
  65. ProjectForm: projectCreateParam.ProjectForm,
  66. ContentType: projectCreateParam.ContentType,
  67. ProjectDetail: projectCreateParam.ProjectDetail,
  68. Tools: projectCreateParam.Tools,
  69. }
  70. if projectCreateParam.ProjectType == 1 {
  71. newProject.ServiceChargeRate = projectCreateParam.ServiceChargeRate
  72. }
  73. err = dao.ProjectDAO{}.CreateProject(newProject)
  74. if err != nil {
  75. return nil, err
  76. }
  77. // 4. 更新选品brief和示例(种草任务补充信息)
  78. if projectCreateParam.ProjectBrief != nil {
  79. // 插入新的brief
  80. for _, v := range projectCreateParam.ProjectBrief {
  81. brief := entity.ProjectBrief{
  82. ProjectID: projectId,
  83. FileUid: v.FileUid,
  84. FileName: v.Name,
  85. FileUrl: v.FileUrl,
  86. CreatedAt: time.Now(),
  87. Type: v.Type,
  88. }
  89. err = dao.ProjectBriefDao{}.CreateProjectBrief(brief)
  90. if err != nil {
  91. return nil, err
  92. }
  93. }
  94. }
  95. if projectCreateParam.ProjectMaterial != nil {
  96. // 插入新的示例
  97. for _, v := range projectCreateParam.ProjectMaterial {
  98. projectMaterial := entity.ProjectMaterial{
  99. ProjectID: projectId,
  100. FileUid: v.FileUid,
  101. FileName: v.Name,
  102. FileUrl: v.FileUrl,
  103. CreatedAt: time.Now(),
  104. Type: v.Type,
  105. }
  106. err = dao.ProjectMaterialDao{}.CreateProjectMaterial(projectMaterial)
  107. if err != nil {
  108. return nil, err
  109. }
  110. }
  111. }
  112. // 更新公开种草任务的招募策略
  113. var totalRecruitNum int64
  114. if projectCreateParam.RecruitStrategys != nil {
  115. // 2. 接收并创建新的招募策略
  116. if len(projectCreateParam.RecruitStrategys) != 0 {
  117. var recruits []entity.RecruitStrategy
  118. for _, strategy := range projectCreateParam.RecruitStrategys {
  119. recruitStrategy := entity.RecruitStrategy{
  120. FeeForm: strategy.FeeForm,
  121. StrategyID: strategy.StrategyID,
  122. FollowersLow: strategy.FollowersLow,
  123. FollowersUp: strategy.FollowersUp,
  124. RecruitNumber: strategy.RecruitNumber,
  125. ProjectID: projectId,
  126. StrategyType: 1,
  127. ServiceRate: projectCreateParam.ServiceChargeRate,
  128. }
  129. totalRecruitNum += strategy.RecruitNumber
  130. if strategy.FeeForm == 2 {
  131. recruitStrategy.Offer = strategy.Offer
  132. recruitStrategy.ServiceCharge = strategy.Offer * projectCreateParam.ServiceChargeRate
  133. recruitStrategy.TOffer = strategy.Offer * (1 - projectCreateParam.ServiceChargeRate)
  134. }
  135. recruits = append(recruits, recruitStrategy)
  136. }
  137. err = dao.RecruitStrategyDao{}.CreateRecruitStrategy(recruits)
  138. if err != nil {
  139. return nil, err
  140. }
  141. }
  142. }
  143. return &projectId, nil
  144. }
  145. // 更新公开种草任务(招募要求、执行要求)
  146. func (s ProjectService) UpdateProject(projectUpdateParam *vo.ProjectUpdateParam) (*string, error) {
  147. // 1. 检查该项目id有无种草任务
  148. projectID := projectUpdateParam.ProjectID
  149. project, err := dao.ProjectDAO{}.GetProjectById(projectID)
  150. if err != nil {
  151. return nil, err
  152. }
  153. if project == nil {
  154. return nil, errors.New("种草项目不存在")
  155. }
  156. // 更新公开种草任务的招募策略
  157. var totalRecruitNum int64
  158. if projectUpdateParam.RecruitStrategys != nil {
  159. // 1. 删除已有的招募策略
  160. err = dao.RecruitStrategyDao{}.DeleteRecruitStrategyByProjectID(projectUpdateParam.ProjectID)
  161. if err != nil {
  162. return nil, err
  163. }
  164. // 2. 接收并创建新的招募策略
  165. if len(projectUpdateParam.RecruitStrategys) != 0 {
  166. var recruits []entity.RecruitStrategy
  167. for _, strategy := range projectUpdateParam.RecruitStrategys {
  168. recruitStrategy := entity.RecruitStrategy{
  169. FeeForm: strategy.FeeForm,
  170. StrategyID: strategy.StrategyID,
  171. FollowersLow: strategy.FollowersLow,
  172. FollowersUp: strategy.FollowersUp,
  173. RecruitNumber: strategy.RecruitNumber,
  174. ProjectID: project.ProjectId,
  175. StrategyType: 1,
  176. ServiceRate: project.ServiceChargeRate,
  177. }
  178. totalRecruitNum += strategy.RecruitNumber
  179. if strategy.FeeForm == 2 {
  180. recruitStrategy.Offer = strategy.Offer
  181. recruitStrategy.ServiceCharge = strategy.Offer * projectUpdateParam.ServiceChargeRate
  182. recruitStrategy.TOffer = strategy.Offer * (1 - projectUpdateParam.ServiceChargeRate)
  183. }
  184. recruits = append(recruits, recruitStrategy)
  185. }
  186. err = dao.RecruitStrategyDao{}.CreateRecruitStrategy(recruits)
  187. if err != nil {
  188. return nil, err
  189. }
  190. }
  191. }
  192. // 2. 数据准备
  193. // a) 查找关联商品信息
  194. product, err := dao.ProductDAO{}.GetProductByID(project.ProductID)
  195. if err != nil {
  196. return nil, err
  197. }
  198. productPhotos, err := dao.ProductPhotoDAO{}.GetProductPhotoByProductID(project.ProductID)
  199. productInfoToJson, _ := json.Marshal(product)
  200. productPhotosToJson, _ := json.Marshal(productPhotos)
  201. // d) 任务截止时间
  202. recruitDdl := time.Time{} //赋零值
  203. recruitDdl, _ = time.ParseInLocation("2006-01-02 15:04:05", projectUpdateParam.RecruitDdl, time.Local)
  204. //// f) 更新选品状态
  205. //if projectUpdateParam.ProjectStatus != 2 && projectUpdateParam.ProjectStatus != 8 {
  206. // projectUpdateParam.ProjectStatus = 1
  207. //}
  208. t := time.Now()
  209. updateProject := entity.Project{
  210. //ProjectStatus: projectUpdateParam.ProjectStatus,
  211. ServiceChargeRate: projectUpdateParam.ServiceChargeRate,
  212. ProjectName: projectUpdateParam.ProjectName,
  213. ProductID: projectUpdateParam.ProductId,
  214. TalentType: projectUpdateParam.TalentType,
  215. RecruitDdl: recruitDdl,
  216. ProductSnap: string(productInfoToJson),
  217. ProductPhotoSnap: string(productPhotosToJson),
  218. UpdatedAt: t,
  219. ProjectForm: projectUpdateParam.ProjectForm,
  220. ContentType: projectUpdateParam.ContentType,
  221. ProjectDetail: projectUpdateParam.ProjectDetail,
  222. }
  223. //if projectUpdateParam.ProjectStatus == 2 {
  224. // updateProject.SubmitAt = t
  225. //}
  226. // 合并传入参数和数据表中原记录,若传入参数字段值为空,则将字段赋值为原记录中值
  227. result := util.MergeStructValue(&updateProject, project)
  228. // 利用反射机制将interface类型转换为结构体类型
  229. v := reflect.ValueOf(&result).Elem()
  230. if v.Kind() == reflect.Struct {
  231. updateProject = v.Interface().(entity.Project)
  232. //fmt.Println(p)
  233. }
  234. // c) 计算预估成本(如果有)
  235. /*
  236. var estimatedCost float64
  237. if conv.MustInt(updateSelection.TaskMode, 0) == 1 {
  238. estimatedCost = conv.MustFloat64(updateSelection.TaskReward, 0) * conv.MustFloat64(updateSelection.SampleNum, 0)
  239. }
  240. estimatedCostToString, _ := conv.String(estimatedCost)
  241. updateSelection.EstimatedCost = estimatedCostToString
  242. */
  243. // 3. 更新选品
  244. err = dao.ProjectDAO{}.UpdateProject(updateProject)
  245. if err != nil {
  246. return nil, err
  247. }
  248. // 4. 更新选品brief和示例(种草任务补充信息)
  249. if projectUpdateParam.ProjectBrief != nil {
  250. // 删除已有brief
  251. err = dao.ProjectBriefDao{}.DeleteSecBriefBySelectionId(project.ProjectId)
  252. if err != nil {
  253. return nil, err
  254. }
  255. // 插入新的brief
  256. for _, v := range projectUpdateParam.ProjectBrief {
  257. brief := entity.ProjectBrief{
  258. ProjectID: project.ProjectId,
  259. FileUid: v.FileUid,
  260. FileName: v.Name,
  261. FileUrl: v.FileUrl,
  262. CreatedAt: time.Now(),
  263. Type: v.Type,
  264. }
  265. err = dao.ProjectBriefDao{}.CreateProjectBrief(brief)
  266. if err != nil {
  267. return nil, err
  268. }
  269. }
  270. }
  271. if projectUpdateParam.ProjectMaterial != nil {
  272. // 删除已有示例
  273. err = dao.ProjectMaterialDao{}.DeleteProjectMaterialByProjectId(project.ProjectId)
  274. if err != nil {
  275. return nil, err
  276. }
  277. // 插入新的示例
  278. for _, v := range projectUpdateParam.ProjectMaterial {
  279. projectMaterial := entity.ProjectMaterial{
  280. ProjectID: project.ProjectId,
  281. FileUid: v.FileUid,
  282. FileName: v.Name,
  283. FileUrl: v.FileUrl,
  284. CreatedAt: time.Now(),
  285. Type: v.Type,
  286. }
  287. err = dao.ProjectMaterialDao{}.CreateProjectMaterial(projectMaterial)
  288. if err != nil {
  289. return nil, err
  290. }
  291. }
  292. }
  293. return &updateProject.ProjectId, nil
  294. }
  295. // 更新定向种草任务(招募要求、执行要求)
  296. func (s ProjectService) UpdateProjectTarget(projectUpdateParam *vo.ProjectUpdateParam) (*string, error) {
  297. // 1. 检查该项目id有无种草任务
  298. projectID := projectUpdateParam.ProjectID
  299. project, err := dao.ProjectDAO{}.GetProjectById(projectID)
  300. if err != nil {
  301. return nil, err
  302. }
  303. if project == nil {
  304. return nil, errors.New("种草项目不存在")
  305. }
  306. println("更新定向种草任务的招募策略")
  307. // 更新定向种草任务的招募策略
  308. var totalRecruitNum int64
  309. if projectUpdateParam.RecruitStrategys != nil {
  310. // 1. 删除已有的招募策略
  311. err = dao.RecruitStrategyDao{}.DeleteRecruitStrategyByProjectID(projectUpdateParam.ProjectID)
  312. if err != nil {
  313. return nil, err
  314. }
  315. // 2. 接收并创建新的招募策略
  316. if len(projectUpdateParam.RecruitStrategys) != 0 {
  317. var recruits []entity.RecruitStrategy
  318. for _, strategy := range projectUpdateParam.RecruitStrategys {
  319. recruitStrategy := entity.RecruitStrategy{
  320. FeeForm: strategy.FeeForm,
  321. StrategyID: strategy.StrategyID,
  322. FollowersLow: strategy.FollowersLow,
  323. FollowersUp: strategy.FollowersUp,
  324. RecruitNumber: strategy.RecruitNumber,
  325. ProjectID: project.ProjectId,
  326. StrategyType: 1,
  327. ServiceRate: project.ServiceChargeRate,
  328. }
  329. totalRecruitNum += strategy.RecruitNumber
  330. if strategy.FeeForm == 2 {
  331. recruitStrategy.Offer = strategy.Offer // 报价
  332. }
  333. recruits = append(recruits, recruitStrategy)
  334. }
  335. err = dao.RecruitStrategyDao{}.CreateRecruitStrategy(recruits)
  336. if err != nil {
  337. return nil, err
  338. }
  339. }
  340. }
  341. // 2. 数据准备
  342. // a) 查找关联商品信息
  343. product, err := dao.ProductDAO{}.GetProductByID(project.ProductID)
  344. if err != nil {
  345. return nil, err
  346. }
  347. productPhotos, err := dao.ProductPhotoDAO{}.GetProductPhotoByProductID(project.ProductID)
  348. productInfoToJson, _ := json.Marshal(product)
  349. productPhotosToJson, _ := json.Marshal(productPhotos)
  350. // d) 任务截止时间
  351. recruitDdl := time.Time{} //赋零值
  352. recruitDdl, _ = time.ParseInLocation("2006-01-02 15:04:05", projectUpdateParam.RecruitDdl, time.Local)
  353. //// f) 更新选品状态
  354. //if projectUpdateParam.ProjectStatus != 2 && projectUpdateParam.ProjectStatus != 8 {
  355. // projectUpdateParam.ProjectStatus = 1
  356. //}
  357. t := time.Now()
  358. updateProject := entity.Project{
  359. //ProjectStatus: projectUpdateParam.ProjectStatus,
  360. ProjectName: projectUpdateParam.ProjectName,
  361. ProductID: projectUpdateParam.ProductId,
  362. TalentType: projectUpdateParam.TalentType,
  363. RecruitDdl: recruitDdl,
  364. ProductSnap: string(productInfoToJson),
  365. ProductPhotoSnap: string(productPhotosToJson),
  366. CreatedAt: project.CreatedAt,
  367. UpdatedAt: t,
  368. ProjectForm: projectUpdateParam.ProjectForm,
  369. ContentType: projectUpdateParam.ContentType,
  370. ProjectDetail: projectUpdateParam.ProjectDetail,
  371. Tools: projectUpdateParam.Tools,
  372. }
  373. //if projectUpdateParam.ProjectStatus == 2 {
  374. // updateProject.SubmitAt = t
  375. //}
  376. // 合并传入参数和数据表中原记录,若传入参数字段值为空,则将字段赋值为原记录中值
  377. result := util.MergeStructValue(&updateProject, project)
  378. // 利用反射机制将interface类型转换为结构体类型
  379. v := reflect.ValueOf(&result).Elem()
  380. if v.Kind() == reflect.Struct {
  381. updateProject = v.Interface().(entity.Project)
  382. //fmt.Println(p)
  383. }
  384. // c) 计算预估成本(如果有)
  385. /*
  386. var estimatedCost float64
  387. if conv.MustInt(updateSelection.TaskMode, 0) == 1 {
  388. estimatedCost = conv.MustFloat64(updateSelection.TaskReward, 0) * conv.MustFloat64(updateSelection.SampleNum, 0)
  389. }
  390. estimatedCostToString, _ := conv.String(estimatedCost)
  391. updateSelection.EstimatedCost = estimatedCostToString
  392. */
  393. // 3. 更新选品
  394. err = dao.ProjectDAO{}.UpdateProject(updateProject)
  395. if err != nil {
  396. return nil, err
  397. }
  398. // 4. 更新选品brief和示例(种草任务补充信息)
  399. if projectUpdateParam.ProjectBrief != nil {
  400. // 删除已有brief
  401. err = dao.ProjectBriefDao{}.DeleteSecBriefBySelectionId(project.ProjectId)
  402. if err != nil {
  403. return nil, err
  404. }
  405. // 插入新的brief
  406. for _, v := range projectUpdateParam.ProjectBrief {
  407. brief := entity.ProjectBrief{
  408. ProjectID: project.ProjectId,
  409. FileUid: v.FileUid,
  410. FileName: v.Name,
  411. FileUrl: v.FileUrl,
  412. CreatedAt: time.Now(),
  413. Type: v.Type,
  414. }
  415. err = dao.ProjectBriefDao{}.CreateProjectBrief(brief)
  416. if err != nil {
  417. return nil, err
  418. }
  419. }
  420. }
  421. if projectUpdateParam.ProjectMaterial != nil {
  422. // 删除已有示例
  423. err = dao.ProjectMaterialDao{}.DeleteProjectMaterialByProjectId(project.ProjectId)
  424. if err != nil {
  425. return nil, err
  426. }
  427. // 插入新的示例
  428. for _, v := range projectUpdateParam.ProjectMaterial {
  429. projectMaterial := entity.ProjectMaterial{
  430. ProjectID: project.ProjectId,
  431. FileUid: v.FileUid,
  432. FileName: v.Name,
  433. FileUrl: v.FileUrl,
  434. CreatedAt: time.Now(),
  435. Type: v.Type,
  436. }
  437. err = dao.ProjectMaterialDao{}.CreateProjectMaterial(projectMaterial)
  438. if err != nil {
  439. return nil, err
  440. }
  441. }
  442. }
  443. return &updateProject.ProjectId, nil
  444. }
  445. // 种草任务预览
  446. func (s ProjectService) GetProjectDetail(projectId string) (*vo.ReProjectDetail, error) {
  447. reProjectDetail := vo.ReProjectDetail{}
  448. project, err := dao.ProjectDAO{}.GetProjectById(projectId)
  449. if err != nil {
  450. logrus.Errorf("[projectDB service] call GetProject error,err:%+v", err)
  451. return nil, err
  452. }
  453. // 系统信息
  454. reProjectDetail.ProjectId = projectId
  455. reProjectDetail.ProjectStatus = project.ProjectStatus
  456. reProjectDetail.ProjectPlatform = project.ProjectPlatform
  457. reProjectDetail.CreatedAt = project.CreatedAt.Format("2006-01-02 15:04:05")
  458. reProjectDetail.EstimatedCost = project.EstimatedCost
  459. reProjectDetail.ServiceChargeRate = project.ServiceChargeRate
  460. var creatorName, phone string
  461. if project.SubAccountId == 0 {
  462. enterprise, err := dao.EnterpriseDao{}.GetEnterprise(project.EnterpriseID)
  463. if err == nil && enterprise != nil {
  464. creatorName = enterprise.BusinessName
  465. phone, err = dao.UserDao{}.GetPhoneByUserId(enterprise.UserId)
  466. }
  467. } else {
  468. subAccount, err := dao.SubAccountDao{}.GetSubAccount(project.SubAccountId)
  469. if err == nil && subAccount != nil {
  470. creatorName = subAccount.SubAccountName
  471. phone, err = dao.UserDao{}.GetPhoneByUserId(subAccount.UserId)
  472. }
  473. }
  474. reProjectDetail.CreatorName = creatorName
  475. reProjectDetail.Phone = phone
  476. // 关联商品
  477. var reProduct vo.ReProductPreview
  478. product, err := dao.ProductDAO{}.GetProductByID(project.ProductID)
  479. if err == nil {
  480. photoUrl, e := dao.ProductPhotoDAO{}.GetMainPhotoByProductID(product.ProductID)
  481. if e != nil {
  482. photoUrl = ""
  483. }
  484. reProduct = vo.ReProductPreview{
  485. ProductID: product.ProductID,
  486. ProductName: product.ProductName,
  487. ProductType: product.ProductType,
  488. ProductCategory: product.ProductCategory,
  489. ProductPrice: product.ProductPrice,
  490. ProductDetail: product.ProductDetail,
  491. CreatedAt: product.CreatedAt.Format("2006-01-02 15:04:05"),
  492. PhotoUrl: photoUrl,
  493. }
  494. }
  495. reProjectDetail.ProductInfo = &reProduct
  496. // 招募要求
  497. reProjectDetail.TalentType = project.TalentType
  498. reProjectDetail.RecruitDdl = project.RecruitDdl.Format("2006-01-02 15:04:05")
  499. reProjectDetail.ProjectForm = project.ProjectForm
  500. reProjectDetail.ContentType = project.ContentType
  501. reProjectDetail.ProjectDetail = project.ProjectDetail
  502. var recruitStrategysPreviews []*vo.RecruitStrategyPreview
  503. recruitStrategys, err := dao.RecruitStrategyDao{}.GetRecruitStrategyByProjectId(projectId)
  504. if err != nil {
  505. logrus.Errorf("[projectDB service] call GetRecruitStrategy error,err:%+v", err)
  506. return nil, err
  507. }
  508. for _, recruitStrategy := range recruitStrategys {
  509. recruitStrategysPreview := &vo.RecruitStrategyPreview{
  510. StrategyId: recruitStrategy.StrategyID,
  511. FeeForm: recruitStrategy.FeeForm,
  512. FollowersLow: recruitStrategy.FollowersLow,
  513. FollowersUp: recruitStrategy.FollowersUp,
  514. RecruitNumber: recruitStrategy.RecruitNumber,
  515. Offer: recruitStrategy.Offer,
  516. TOffer: recruitStrategy.TOffer,
  517. ServiceCharge: recruitStrategy.ServiceCharge,
  518. SelectedNumber: recruitStrategy.SelectedNumber,
  519. TotalOffer: recruitStrategy.TotalOffer,
  520. }
  521. recruitStrategysPreviews = append(recruitStrategysPreviews, recruitStrategysPreview)
  522. }
  523. reProjectDetail.RecruitStrategys = recruitStrategysPreviews
  524. // 执行要求
  525. projectBriefInfos, err := dao.ProjectBriefDao{}.GetProjectBriefInfo(projectId)
  526. if err != nil {
  527. logrus.Errorf("[projectDB service] call GetProjectBriefInfo error,err:%+v", err)
  528. return nil, err
  529. }
  530. projectMaterials, err := dao.ProjectMaterialDao{}.GetProjectMaterialInfo(projectId)
  531. if err != nil {
  532. logrus.Errorf("[projectDB service] call GetprojectMaterialInfo error,err:%+v", err)
  533. return nil, err
  534. }
  535. reProjectDetail.ProjectBriefs = projectBriefInfos
  536. reProjectDetail.ProjectMaterials = projectMaterials
  537. reProjectDetail.Tools = project.Tools
  538. return &reProjectDetail, nil
  539. }
  540. // 种草提交审核
  541. func (s ProjectService) ProjectToReview(projectUpdateParam *vo.ProjectUpdateParam) (*string, error) {
  542. projectId := projectUpdateParam.ProjectID
  543. project, err := dao.ProjectDAO{}.GetProjectById(projectId)
  544. if err != nil {
  545. logrus.Errorf("[projectInfoDB service] call GetProject error,err:%+v", err)
  546. return nil, err
  547. }
  548. projectName := project.ProjectName // 任务标题
  549. projectDetail := project.ProjectDetail // 任务详情
  550. product, err := dao.ProductDAO{}.GetProductByID(project.ProductID)
  551. if err != nil {
  552. return nil, err
  553. }
  554. productName := product.ProductName // 商品标题
  555. productDetail := product.ProductDetail // 卖点总结
  556. mainPhoto, err1 := dao.ProductPhotoDAO{}.GetMainPhotoByProductID(project.ProductID)
  557. if err1 != nil {
  558. return nil, err1
  559. }
  560. var images []string
  561. var videos []string
  562. var videoJobIds []string
  563. var documents []string
  564. var documentJobIds []string
  565. reviewService := review_service.GetConfig()
  566. productPhotos, err2 := dao.ProductPhotoDAO{}.GetProductPhotoByProductID(project.ProductID)
  567. if err2 != nil {
  568. return nil, err2
  569. }
  570. for _, productPhoto := range productPhotos {
  571. if productPhoto.Symbol == 2 || productPhoto.Symbol == 4 {
  572. images = append(images, productPhoto.PhotoUrl)
  573. } else if productPhoto.Symbol == 3 || productPhoto.Symbol == 5 {
  574. var videoJobId *string
  575. var reviewErr error
  576. i := 10
  577. for {
  578. videoJobId, reviewErr = reviewService.CheckVideo(productPhoto.PhotoUrl)
  579. if reviewErr == nil || i == 0 {
  580. break
  581. }
  582. i -= 1
  583. }
  584. if reviewErr != nil {
  585. return nil, reviewErr
  586. }
  587. videos = append(videos, productPhoto.PhotoUrl)
  588. videoJobIds = append(videoJobIds, *videoJobId)
  589. }
  590. }
  591. projectBriefInfos, err := dao.ProjectBriefDao{}.GetProjectBriefInfo(projectId)
  592. if err != nil {
  593. return nil, err
  594. }
  595. for _, projectBriefInfo := range projectBriefInfos {
  596. if projectBriefInfo.Type == 1 {
  597. images = append(images, projectBriefInfo.FileUrl)
  598. } else if projectBriefInfo.Type == 2 {
  599. var documentJobId *string
  600. var reviewErr error
  601. i := 10
  602. fileType := "pdf"
  603. parts := strings.Split(projectBriefInfo.FileName, ".")
  604. if len(parts) > 1 {
  605. fileType = parts[len(parts)-1]
  606. }
  607. for {
  608. documentJobId, reviewErr = reviewService.CheckDocument(projectBriefInfo.FileUrl, fileType)
  609. if reviewErr == nil || i == 0 {
  610. break
  611. }
  612. i -= 1
  613. }
  614. if reviewErr != nil {
  615. return nil, reviewErr
  616. }
  617. documents = append(documents, projectBriefInfo.FileUrl)
  618. documentJobIds = append(documentJobIds, *documentJobId)
  619. }
  620. }
  621. projectMaterials, err := dao.ProjectMaterialDao{}.GetProjectMaterialInfo(projectId)
  622. if err != nil {
  623. return nil, err
  624. }
  625. for _, projectMaterial := range projectMaterials {
  626. if projectMaterial.Type == 1 {
  627. images = append(images, projectMaterial.FileUrl)
  628. } else if projectMaterial.Type == 2 {
  629. var videoJobId *string
  630. var reviewErr error
  631. i := 10
  632. for {
  633. videoJobId, reviewErr = reviewService.CheckVideo(projectMaterial.FileUrl)
  634. if reviewErr == nil || i == 0 {
  635. break
  636. }
  637. i -= 1
  638. }
  639. if reviewErr != nil {
  640. return nil, reviewErr
  641. }
  642. videos = append(videos, projectMaterial.FileUrl)
  643. videoJobIds = append(videoJobIds, *videoJobId)
  644. }
  645. }
  646. newReviewProject := &entity.ReviewProject{
  647. ProjectID: projectId,
  648. TaskName: projectName,
  649. TaskDetail: projectDetail,
  650. ProductName: productName,
  651. ProductDetail: productDetail,
  652. MainPhoto: mainPhoto,
  653. Images: strings.Join(images, ","),
  654. Videos: strings.Join(videos, ","),
  655. Documents: strings.Join(documents, ","),
  656. VideoJobIds: strings.Join(videoJobIds, ","),
  657. DocumentJobIds: strings.Join(documentJobIds, ","),
  658. Status: 1,
  659. }
  660. err5 := dao.ProjectReviewDao{}.Create(newReviewProject)
  661. if err5 != nil {
  662. return nil, err5
  663. }
  664. t := time.Now()
  665. updateProject := entity.Project{
  666. ProjectId: projectId,
  667. ProjectStatus: 2,
  668. UpdatedAt: t,
  669. }
  670. err6 := dao.ProjectDAO{}.UpdateProject(updateProject)
  671. if err6 != nil {
  672. return nil, err
  673. }
  674. return &projectId, nil
  675. }
  676. // 种草任务列表
  677. func (s ProjectService) GetProjectTaskList(param *vo.ProjectSearchParam) (vo.ResultVO, error) {
  678. if param.Page == 0 {
  679. param.Page = 1
  680. }
  681. if param.PageSize == 0 {
  682. param.PageSize = 10
  683. }
  684. var result vo.ResultVO
  685. reProjectTaskPreviews, total, err := (&dao.ProjectDAO{}).GetProjectPreviews(param)
  686. if err != nil {
  687. return result, err
  688. }
  689. for i := range reProjectTaskPreviews {
  690. var creatorName string
  691. var productName string
  692. var productPrice float64
  693. var mainImage string
  694. if reProjectTaskPreviews[i].SubAccountId == 0 {
  695. enterprise, err := dao.EnterpriseDao{}.GetEnterprise(reProjectTaskPreviews[i].EnterpriseId)
  696. if err == nil && enterprise != nil {
  697. creatorName = enterprise.BusinessName
  698. }
  699. } else {
  700. subAccount, err := dao.SubAccountDao{}.GetSubAccount(reProjectTaskPreviews[i].SubAccountId)
  701. if err == nil && subAccount != nil {
  702. creatorName = subAccount.SubAccountName
  703. }
  704. }
  705. product, err := dao.ProductDAO{}.GetProductByID(reProjectTaskPreviews[i].ProductId)
  706. if err == nil && product != nil {
  707. productName = product.ProductName
  708. productPrice = product.ProductPrice
  709. }
  710. mainImage, err = dao.ProductPhotoDAO{}.GetMainPhotoByProductID(reProjectTaskPreviews[i].ProductId)
  711. reProjectTaskPreviews[i].CreatorName = creatorName
  712. reProjectTaskPreviews[i].ProductName = productName
  713. reProjectTaskPreviews[i].ProductPrice = productPrice
  714. reProjectTaskPreviews[i].MainImage = mainImage
  715. }
  716. result = vo.ResultVO{
  717. Page: param.Page,
  718. PageSize: param.PageSize,
  719. Total: total,
  720. Data: reProjectTaskPreviews,
  721. }
  722. return result, nil
  723. }
  724. // 删除种草任务
  725. func (s ProjectService) DeleteProject(projectId string) (*string, error) {
  726. res, err := dao.ProjectDAO{}.DeleteProject(projectId)
  727. if err != nil {
  728. logrus.Errorf("[projectDB service] call DeleteProject error,err:%+v", err)
  729. return res, err
  730. }
  731. return res, nil
  732. }
  733. // 草稿箱——品牌种草
  734. func (s ProjectService) GetProjectDraftList(param *vo.ProjectDraftParam) (vo.ResultVO, error) {
  735. if param.Page == 0 {
  736. param.Page = 1
  737. }
  738. if param.PageSize == 0 {
  739. param.PageSize = 10
  740. }
  741. var result vo.ResultVO
  742. reProjectTaskPreviews, total, err := (&dao.ProjectDAO{}).GetProjectDraftList(param)
  743. if err != nil {
  744. return result, err
  745. }
  746. for i := range reProjectTaskPreviews {
  747. var creatorName string
  748. var productName string
  749. var productPrice float64
  750. var mainImage string
  751. if reProjectTaskPreviews[i].SubAccountId == 0 {
  752. enterprise, err := dao.EnterpriseDao{}.GetEnterprise(reProjectTaskPreviews[i].EnterpriseId)
  753. if err == nil && enterprise != nil {
  754. creatorName = enterprise.BusinessName
  755. }
  756. } else {
  757. subAccount, err := dao.SubAccountDao{}.GetSubAccount(reProjectTaskPreviews[i].SubAccountId)
  758. if err == nil && subAccount != nil {
  759. creatorName = subAccount.SubAccountName
  760. }
  761. }
  762. product, err := dao.ProductDAO{}.GetProductByID(reProjectTaskPreviews[i].ProductId)
  763. if err == nil && product != nil {
  764. productName = product.ProductName
  765. productPrice = product.ProductPrice
  766. }
  767. mainImage, err = dao.ProductPhotoDAO{}.GetMainPhotoByProductID(reProjectTaskPreviews[i].ProductId)
  768. reProjectTaskPreviews[i].CreatorName = creatorName
  769. reProjectTaskPreviews[i].ProductName = productName
  770. reProjectTaskPreviews[i].ProductPrice = productPrice
  771. reProjectTaskPreviews[i].MainImage = mainImage
  772. }
  773. result = vo.ResultVO{
  774. Page: param.Page,
  775. PageSize: param.PageSize,
  776. Total: total,
  777. Data: reProjectTaskPreviews,
  778. }
  779. return result, nil
  780. }