project_service.go 28 KB

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