selection_info_service.go 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764
  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 SelectionInfoService struct{}
  16. //func (s *SelectionInfoService) GetSelectionInfo(ctx *gin.Context, selectionId string) (*http_model.SelectionDetail, error) {
  17. // selectionDetail := http_model.SelectionDetail{}
  18. // selectionInfo, err := db.GetSelectionById(ctx, selectionId)
  19. //
  20. // if err != nil {
  21. // logrus.WithContext(ctx).Errorf("[selectionDB service] call GetSelectionInfo error,err:%+v", err)
  22. // return nil, err
  23. // }
  24. // selectionBriefInfo, err := db.GetSelectionBriefInfo(ctx, selectionId)
  25. // if err != nil {
  26. // logrus.WithContext(ctx).Errorf("[selectionDB service] call GetSelectionBriefInfo error,err:%+v", err)
  27. // return nil, err
  28. // }
  29. // selectionExampleInfo, err := db.GetSelectionExampleInfo(ctx, selectionId)
  30. // if err != nil {
  31. // logrus.WithContext(ctx).Errorf("[selectionDB service] call GetSelectionExampleInfo error,err:%+v", err)
  32. // return nil, err
  33. // }
  34. // productInfo, err := db.GetProductInfoBySelectionId(ctx, selectionId)
  35. // if err != nil {
  36. // logrus.WithContext(ctx).Errorf("[selectionDB service] call GetProductInfo error,err:%+v", err)
  37. // return nil, err
  38. // }
  39. // productPhotoInfo, err := db.GetProductPhotoInfoBySelectionId(ctx, selectionId)
  40. // if err != nil {
  41. // logrus.WithContext(ctx).Errorf("[selectionDB service] call GetProductPhotoInfo error,err:%+v", err)
  42. // return nil, err
  43. // }
  44. // selectionDetail.SelectionBrief = selectionBriefInfo
  45. // selectionDetail.SelectionInfo = selectionInfo
  46. // selectionDetail.SelectionExample = selectionExampleInfo
  47. // selectionDetail.ProductInfo = productInfo
  48. // selectionDetail.ProductPhotoInfo = productPhotoInfo
  49. // return &selectionDetail, nil
  50. //}
  51. // 创建带货任务
  52. func (s SelectionInfoService) CreateSelectionInfo(selectionCreateParam *vo.SelectionInfoCreateParam) (*string, error) {
  53. // 1. 生成选品id
  54. selectionId := strings.ReplaceAll(util.GenerateUUID(11), "-", "")
  55. // 2. 数据准备
  56. // 查找关联商品信息
  57. product, err := dao.ProductDAO{}.GetProductByID(selectionCreateParam.ProductId)
  58. if err != nil {
  59. return nil, err
  60. }
  61. if product == nil {
  62. return nil, errors.New("未找到关联商品")
  63. }
  64. productPhotos, err := dao.ProductPhotoDAO{}.GetProductPhotoByProductID(selectionCreateParam.ProductId)
  65. productInfoToJson, _ := json.Marshal(product)
  66. productPhotosToJson, _ := json.Marshal(productPhotos)
  67. // 任务截止时间
  68. taskDdl := time.Time{} //赋零值
  69. taskDdl, _ = time.ParseInLocation("2006-01-02 15:04:05", selectionCreateParam.TaskDdl, time.Local)
  70. // 创建选品
  71. // 获取定时任务配置
  72. infoAutoTask := entity.InfoAutoTask{}
  73. infoAutoTask = dao.InfoAutoTaskDao{}.GetAutoTaskLast(selectionCreateParam.EnterpriseId)
  74. t := time.Now()
  75. var sampleMode, taskMode int64
  76. if len(selectionCreateParam.FreeStrategys) > 0 {
  77. sampleMode = 1
  78. } else {
  79. sampleMode = 3
  80. }
  81. if len(selectionCreateParam.RewardStrategys) > 0 {
  82. taskMode = 1
  83. } else {
  84. taskMode = 2
  85. }
  86. newSelection := entity.SelectionInfo{
  87. SelectionStatus: 1,
  88. SelectionID: selectionId,
  89. ProductID: selectionCreateParam.ProductId,
  90. ProductCategory: product.ProductCategory,
  91. EnterpriseID: selectionCreateParam.EnterpriseId,
  92. SubAccountId: selectionCreateParam.SubAccountId,
  93. Platform: selectionCreateParam.Platform,
  94. ProductSnap: string(productInfoToJson),
  95. ProductPhotoSnap: string(productPhotosToJson),
  96. SelectionName: selectionCreateParam.SelectionName,
  97. TaskDdl: taskDdl,
  98. SampleNum: selectionCreateParam.SampleNum,
  99. SampleMode: sampleMode,
  100. TaskMode: taskMode,
  101. CreatedAt: t,
  102. AutoTaskID: infoAutoTask.AutoTaskID,
  103. }
  104. err = dao.SelectionInfoDAO{}.CreateSelectionInfo(newSelection)
  105. if err != nil {
  106. return nil, err
  107. }
  108. // 4. 更新选品brief和示例(带货任务补充信息)
  109. if selectionCreateParam.SecBrief != nil {
  110. // 插入新的brief
  111. for _, v := range selectionCreateParam.SecBrief {
  112. brief := entity.SecBrief{
  113. SelectionID: selectionId,
  114. FileUid: v.FileUid,
  115. FileName: v.Name,
  116. FileUrl: v.FileUrl,
  117. CreatedAt: time.Now(),
  118. Type: v.Type,
  119. }
  120. err = dao.SecBriefDao{}.CreateSecBrief(brief)
  121. if err != nil {
  122. return nil, err
  123. }
  124. }
  125. }
  126. if selectionCreateParam.SecMaterial != nil {
  127. // 插入新的示例
  128. for _, v := range selectionCreateParam.SecMaterial {
  129. secMaterial := entity.SecMaterial{
  130. SelectionID: selectionId,
  131. FileUid: v.FileUid,
  132. FileName: v.Name,
  133. FileUrl: v.FileUrl,
  134. CreatedAt: time.Now(),
  135. Type: v.Type,
  136. }
  137. err = dao.SecMaterialDao{}.CreateSecMaterial(secMaterial)
  138. if err != nil {
  139. return nil, err
  140. }
  141. }
  142. }
  143. // 更新带货任务的免费领样策略
  144. if selectionCreateParam.FreeStrategys != nil {
  145. // 2. 接收并创建新的免费领样策略
  146. if sampleMode == 1 {
  147. var frees []entity.FreeStrategy
  148. for _, v := range selectionCreateParam.FreeStrategys {
  149. free := entity.FreeStrategy{
  150. SelectionId: selectionId,
  151. StrategyId: v.StrategyId,
  152. FollowersLow: v.FollowersLow,
  153. FollowersUp: v.FollowersUp,
  154. SaleNum: v.SaleNum,
  155. StrategyStatus: 1,
  156. EnrollNum: 0,
  157. ChooseNum: 0,
  158. }
  159. frees = append(frees, free)
  160. }
  161. err = dao.FreeStrategyDao{}.CreateFreeStrategy(frees)
  162. if err != nil {
  163. return nil, err
  164. }
  165. }
  166. }
  167. // 更新带货任务的悬赏策略
  168. if selectionCreateParam.RewardStrategys != nil {
  169. if taskMode == 1 {
  170. var rewards []entity.RewardStrategy
  171. for _, v := range selectionCreateParam.RewardStrategys {
  172. reward := entity.RewardStrategy{
  173. SelectionId: selectionId,
  174. Reward: v.Reward,
  175. SaleActual: v.SaleActual,
  176. PerReward: v.PerReward,
  177. StrategyStatus: 1,
  178. }
  179. rewards = append(rewards, reward)
  180. }
  181. err = dao.RewardStrategyDao{}.CreateRewardStrategy(rewards)
  182. if err != nil {
  183. return nil, err
  184. }
  185. }
  186. }
  187. return &selectionId, nil
  188. }
  189. // 更新带货任务(样品奖励、补充信息)
  190. func (s SelectionInfoService) UpdateSelectionInfo(selectionUpdateParam *vo.SelectionInfoUpdateParam) (*string, error) {
  191. // 1. 检查该企业id和商品id有无选品
  192. selectionID := selectionUpdateParam.SelectionID
  193. selectionInfo, err := dao.SelectionInfoDAO{}.GetSelectionInfoById(selectionID)
  194. if err != nil {
  195. return nil, err
  196. }
  197. if selectionInfo == nil {
  198. return nil, errors.New("选品不存在")
  199. }
  200. // 2. 数据准备
  201. // a) 查找关联商品信息
  202. product, err := dao.ProductDAO{}.GetProductByID(selectionInfo.ProductID)
  203. if err != nil {
  204. return nil, err
  205. }
  206. if product == nil {
  207. return nil, errors.New("未找到关联商品")
  208. }
  209. productPhotos, err := dao.ProductPhotoDAO{}.GetProductPhotoByProductID(selectionInfo.ProductID)
  210. productInfoToJson, _ := json.Marshal(product)
  211. productPhotosToJson, _ := json.Marshal(productPhotos)
  212. // d) 任务截止时间
  213. taskDdl := time.Time{} //赋零值
  214. taskDdl, _ = time.ParseInLocation("2006-01-02 15:04:05", selectionUpdateParam.TaskDdl, time.Local)
  215. //// f) 更新选品状态
  216. //if selectionUpdateParam.SelectionStatus != 2 && selectionUpdateParam.SelectionStatus != 7 {
  217. // selectionUpdateParam.SelectionStatus = 1
  218. //}
  219. t := time.Now()
  220. var sampleMode, taskMode int64
  221. if len(selectionUpdateParam.FreeStrategys) > 0 {
  222. sampleMode = 1
  223. } else {
  224. sampleMode = 3
  225. }
  226. if len(selectionUpdateParam.RewardStrategys) > 0 {
  227. taskMode = 1
  228. } else {
  229. taskMode = 2
  230. }
  231. updateSelection := entity.SelectionInfo{
  232. SelectionID: selectionUpdateParam.SelectionID,
  233. //SelectionStatus: selectionUpdateParam.SelectionStatus,
  234. SelectionName: selectionUpdateParam.SelectionName,
  235. EnterpriseID: selectionUpdateParam.EnterpriseId,
  236. SubAccountId: selectionUpdateParam.SubAccountId,
  237. ProductID: selectionUpdateParam.ProductId,
  238. //ProductUrl: selectionUpdateParam.ProductUrl,
  239. TaskMode: taskMode,
  240. SampleMode: sampleMode,
  241. SampleNum: selectionUpdateParam.SampleNum,
  242. RemainNum: selectionUpdateParam.SampleNum,
  243. //CommissionRate: selectionUpdateParam.CommissionRate,
  244. //TaskReward: selectionUpdateParam.TaskReward,
  245. //SettlementAmount: selectionUpdateParam.SettlementAmount,
  246. EstimatedCost: selectionInfo.EstimatedCost,
  247. //SampleCondition: selectionUpdateParam.SampleCondition,
  248. //RewardCondition: selectionUpdateParam.RewardCondition,
  249. TaskDdl: taskDdl,
  250. //Detail: selectionUpdateParam.Detail,
  251. ProductSnap: string(productInfoToJson),
  252. ProductPhotoSnap: string(productPhotosToJson),
  253. CreatedAt: selectionInfo.CreatedAt,
  254. UpdatedAt: t,
  255. }
  256. //if selectionUpdateParam.SelectionStatus == 2 {
  257. // updateSelection.SubmitAt = t
  258. //}
  259. //if selectionUpdateParam.Status == 1 {
  260. // updateSelection.Status = 1
  261. //}
  262. // 合并传入参数和数据表中原记录,若传入参数字段值为空,则将字段赋值为原记录中值
  263. result := util.MergeStructValue(&updateSelection, selectionInfo)
  264. // 利用反射机制将interface类型转换为结构体类型
  265. v := reflect.ValueOf(&result).Elem()
  266. if v.Kind() == reflect.Struct {
  267. updateSelection = v.Interface().(entity.SelectionInfo)
  268. //fmt.Println(p)
  269. }
  270. // c) 计算预估成本(如果有)
  271. /*
  272. var estimatedCost float64
  273. if conv.MustInt(updateSelection.TaskMode, 0) == 1 {
  274. estimatedCost = conv.MustFloat64(updateSelection.TaskReward, 0) * conv.MustFloat64(updateSelection.SampleNum, 0)
  275. }
  276. estimatedCostToString, _ := conv.String(estimatedCost)
  277. updateSelection.EstimatedCost = estimatedCostToString
  278. */
  279. // 3. 更新选品
  280. err = dao.SelectionInfoDAO{}.UpdateSelectionInfo(updateSelection)
  281. if err != nil {
  282. return nil, err
  283. }
  284. // 4. 更新选品brief和示例(带货任务补充信息)
  285. if selectionUpdateParam.SecBrief != nil {
  286. // 删除已有brief
  287. err = dao.SecBriefDao{}.DeleteSecBriefBySelectionId(selectionInfo.SelectionID)
  288. if err != nil {
  289. return nil, err
  290. }
  291. // 插入新的brief
  292. for _, v := range selectionUpdateParam.SecBrief {
  293. brief := entity.SecBrief{
  294. SelectionID: selectionInfo.SelectionID,
  295. FileUid: v.FileUid,
  296. FileName: v.Name,
  297. FileUrl: v.FileUrl,
  298. CreatedAt: time.Now(),
  299. Type: v.Type,
  300. }
  301. err = dao.SecBriefDao{}.CreateSecBrief(brief)
  302. if err != nil {
  303. return nil, err
  304. }
  305. }
  306. }
  307. if selectionUpdateParam.SecMaterial != nil {
  308. // 删除已有示例
  309. err = dao.SecMaterialDao{}.DeleteSecMaterialBySelectionId(selectionInfo.SelectionID)
  310. if err != nil {
  311. return nil, err
  312. }
  313. // 插入新的示例
  314. for _, v := range selectionUpdateParam.SecMaterial {
  315. secMaterial := entity.SecMaterial{
  316. SelectionID: selectionInfo.SelectionID,
  317. FileUid: v.FileUid,
  318. FileName: v.Name,
  319. FileUrl: v.FileUrl,
  320. CreatedAt: time.Now(),
  321. Type: v.Type,
  322. }
  323. err = dao.SecMaterialDao{}.CreateSecMaterial(secMaterial)
  324. if err != nil {
  325. return nil, err
  326. }
  327. }
  328. }
  329. println("更新带货任务的免费领样策略")
  330. // 更新带货任务的免费领样策略
  331. if selectionUpdateParam.FreeStrategys != nil {
  332. // 1. 删除已有的免费领样策略
  333. err = dao.FreeStrategyDao{}.DeleteFreeStrategyBySelectionId(selectionUpdateParam.SelectionID)
  334. if err != nil {
  335. return nil, err
  336. }
  337. // 2. 接收并创建新的免费领样策略
  338. if sampleMode == 1 {
  339. var frees []entity.FreeStrategy
  340. for _, v := range selectionUpdateParam.FreeStrategys {
  341. free := entity.FreeStrategy{
  342. SelectionId: selectionInfo.SelectionID,
  343. StrategyId: v.StrategyId,
  344. FollowersLow: v.FollowersLow,
  345. FollowersUp: v.FollowersUp,
  346. SaleNum: v.SaleNum,
  347. StrategyStatus: 1,
  348. EnrollNum: 0,
  349. ChooseNum: 0,
  350. }
  351. frees = append(frees, free)
  352. }
  353. err = dao.FreeStrategyDao{}.CreateFreeStrategy(frees)
  354. if err != nil {
  355. return nil, err
  356. }
  357. }
  358. }
  359. println("更新带货任务的悬赏策略")
  360. // 更新带货任务的悬赏策略
  361. if selectionUpdateParam.RewardStrategys != nil {
  362. // 1. 删除已有的悬赏策略
  363. err = dao.RewardStrategyDao{}.DeleteRewardStrategyBySelectionId(selectionUpdateParam.SelectionID)
  364. if err != nil {
  365. return nil, err
  366. }
  367. if taskMode == 1 {
  368. var rewards []entity.RewardStrategy
  369. for _, v := range selectionUpdateParam.RewardStrategys {
  370. reward := entity.RewardStrategy{
  371. SelectionId: selectionInfo.SelectionID,
  372. Reward: v.Reward,
  373. SaleActual: v.SaleActual,
  374. PerReward: v.PerReward,
  375. StrategyStatus: 1,
  376. }
  377. rewards = append(rewards, reward)
  378. }
  379. err = dao.RewardStrategyDao{}.CreateRewardStrategy(rewards)
  380. if err != nil {
  381. return nil, err
  382. }
  383. }
  384. }
  385. return &updateSelection.SelectionID, nil
  386. }
  387. // 电商带货任务预览
  388. func (s SelectionInfoService) GetSelectionDetail(selectionId string) (*vo.ReSelectionDetail, error) {
  389. reSelectionDetail := vo.ReSelectionDetail{}
  390. selection, err := dao.SelectionInfoDAO{}.GetSelectionInfoById(selectionId)
  391. if err != nil {
  392. logrus.Errorf("[selectionInfoDB service] call GetSelection error,err:%+v", err)
  393. return nil, err
  394. }
  395. reSelectionDetail.SelectionName = selection.SelectionName
  396. // 系统信息
  397. reSelectionDetail.SelectionId = selectionId
  398. reSelectionDetail.SelectionStatus = selection.SelectionStatus
  399. reSelectionDetail.SelectionPlatform = selection.Platform
  400. reSelectionDetail.CreatedAt = selection.CreatedAt.Format("2006-01-02 15:04:05")
  401. reSelectionDetail.SubmitAt = selection.SubmitAt.Format("2006-01-02 15:04:05")
  402. var creatorName, phone string
  403. var rewardSum float64
  404. if selection.SubAccountId == 0 {
  405. enterprise, err := dao.EnterpriseDao{}.GetEnterprise(selection.EnterpriseID)
  406. if err == nil && enterprise != nil {
  407. creatorName = enterprise.BusinessName
  408. phone, err = dao.UserDao{}.GetPhoneByUserId(enterprise.UserId)
  409. }
  410. } else {
  411. subAccount, err := dao.SubAccountDao{}.GetSubAccount(selection.SubAccountId)
  412. if err == nil && subAccount != nil {
  413. creatorName = subAccount.SubAccountName
  414. phone, err = dao.UserDao{}.GetPhoneByUserId(subAccount.UserId)
  415. }
  416. }
  417. reSelectionDetail.CreatorName = creatorName
  418. reSelectionDetail.Phone = phone
  419. // 关联商品
  420. var reProduct vo.ReProductPreview
  421. product, err := dao.ProductDAO{}.GetProductByID(selection.ProductID)
  422. if err == nil {
  423. photoUrl, e := dao.ProductPhotoDAO{}.GetMainPhotoByProductID(product.ProductID)
  424. if e != nil {
  425. photoUrl = ""
  426. }
  427. reProduct = vo.ReProductPreview{
  428. ProductID: product.ProductID,
  429. ProductName: product.ProductName,
  430. ProductType: product.ProductType,
  431. ProductCategory: product.ProductCategory,
  432. ProductPrice: product.ProductPrice,
  433. ProductDetail: product.ProductDetail,
  434. CreatedAt: product.CreatedAt.Format("2006-01-02 15:04:05"),
  435. PhotoUrl: photoUrl,
  436. }
  437. }
  438. reSelectionDetail.ProductInfo = &reProduct
  439. // 样品奖励
  440. reSelectionDetail.TaskDdl = selection.TaskDdl.Format("2006-01-02 15:04:05")
  441. reSelectionDetail.SampleNum = selection.SampleNum
  442. var freeStrategyPreviews []*vo.FreeStrategyPreview // 领样策略
  443. freeStrategys, err := dao.FreeStrategyDao{}.GetFreeStrategyBySelectionId(selectionId)
  444. if err != nil {
  445. logrus.Errorf("[selectionInfoDB service] call GetFreeStrategy error,err:%+v", err)
  446. return nil, err
  447. }
  448. for _, freeStrategy := range freeStrategys {
  449. freeStrategyPreview := &vo.FreeStrategyPreview{
  450. StrategyId: freeStrategy.StrategyId,
  451. FollowersLow: freeStrategy.FollowersLow,
  452. FollowersUp: freeStrategy.FollowersUp,
  453. SaleNum: freeStrategy.SaleNum,
  454. StrategyStatus: freeStrategy.StrategyStatus,
  455. }
  456. freeStrategyPreviews = append(freeStrategyPreviews, freeStrategyPreview)
  457. }
  458. reSelectionDetail.FreeStrategys = freeStrategyPreviews
  459. var rewardStrategyPreviews []*vo.RewardStrategyPreview // 悬赏策略
  460. rewardStrategys, err := dao.RewardStrategyDao{}.GetRewardStrategyBySelectionId(selectionId)
  461. if err != nil {
  462. logrus.Errorf("[selectionInfoDB service] call GetRewardStrategy error,err:%+v", err)
  463. return nil, err
  464. }
  465. for _, rewardStrategy := range rewardStrategys {
  466. rewardStrategyPreview := &vo.RewardStrategyPreview{
  467. Reward: rewardStrategy.Reward,
  468. SaleActual: rewardStrategy.SaleActual,
  469. PerReward: rewardStrategy.PerReward,
  470. StrategyStatus: rewardStrategy.StrategyStatus,
  471. }
  472. rewardStrategyPreviews = append(rewardStrategyPreviews, rewardStrategyPreview)
  473. }
  474. reSelectionDetail.FreeStrategys = freeStrategyPreviews
  475. reSelectionDetail.RewardStrategys = rewardStrategyPreviews
  476. for _, rewardStrategy := range rewardStrategys {
  477. rewardSum += rewardStrategy.Reward
  478. }
  479. reSelectionDetail.RewardSum = rewardSum
  480. // 补充信息
  481. selectionBriefInfos, err := dao.SecBriefDao{}.GetSelectionBriefInfo(selectionId)
  482. if err != nil {
  483. logrus.Errorf("[selectionInfoDB service] call GetSelectionBriefInfo error,err:%+v", err)
  484. return nil, err
  485. }
  486. selectionMaterials, err := dao.SecMaterialDao{}.GetSelectionMaterialInfo(selectionId)
  487. if err != nil {
  488. logrus.Errorf("[selectionInfoDB service] call GetSelectionMaterialInfo error,err:%+v", err)
  489. return nil, err
  490. }
  491. reSelectionDetail.SelectionBriefs = selectionBriefInfos
  492. reSelectionDetail.SelectionMaterials = selectionMaterials
  493. return &reSelectionDetail, nil
  494. }
  495. // 电商带货提交审核
  496. func (s SelectionInfoService) SelectionToReview(param *vo.SelectionInfoUpdateParam) (*string, error) {
  497. selectionId := param.SelectionID
  498. selection, err := dao.SelectionInfoDAO{}.GetSelectionInfoById(selectionId)
  499. if err != nil {
  500. logrus.Errorf("[selectionInfoDB service] call GetSelection error,err:%+v", err)
  501. return nil, err
  502. }
  503. selectionName := selection.SelectionName // 任务标题
  504. product, err := dao.ProductDAO{}.GetProductByID(selection.ProductID)
  505. if err != nil {
  506. return nil, err
  507. }
  508. productName := product.ProductName // 商品标题
  509. productDetail := product.ProductDetail // 卖点总结
  510. mainPhoto, err1 := dao.ProductPhotoDAO{}.GetMainPhotoByProductID(selection.ProductID)
  511. if err1 != nil {
  512. return nil, err1
  513. }
  514. var images []string
  515. var videos []string
  516. var videoJobIds []string
  517. var documents []string
  518. var documentJobIds []string
  519. reviewService := review_service.GetConfig()
  520. productPhotos, err2 := dao.ProductPhotoDAO{}.GetProductPhotoByProductID(selection.ProductID)
  521. if err2 != nil {
  522. return nil, err2
  523. }
  524. for _, productPhoto := range productPhotos {
  525. if productPhoto.Symbol == 2 || productPhoto.Symbol == 4 {
  526. images = append(images, productPhoto.PhotoUrl)
  527. } else if productPhoto.Symbol == 3 || productPhoto.Symbol == 5 {
  528. var videoJobId *string
  529. var reviewErr error
  530. i := 10
  531. for {
  532. videoJobId, reviewErr = reviewService.CheckVideo(productPhoto.PhotoUrl)
  533. if reviewErr == nil || i == 0 {
  534. break
  535. }
  536. i -= 1
  537. }
  538. if reviewErr != nil {
  539. return nil, reviewErr
  540. }
  541. videos = append(videos, productPhoto.PhotoUrl)
  542. videoJobIds = append(videoJobIds, *videoJobId)
  543. }
  544. }
  545. selectionBriefInfos, err := dao.SecBriefDao{}.GetSelectionBriefInfo(selectionId)
  546. if err != nil {
  547. return nil, err
  548. }
  549. for _, selectionBriefInfo := range selectionBriefInfos {
  550. if selectionBriefInfo.Type == 1 {
  551. images = append(images, selectionBriefInfo.FileUrl)
  552. } else if selectionBriefInfo.Type == 2 {
  553. var documentJobId *string
  554. var reviewErr error
  555. i := 10
  556. fileType := "pdf"
  557. parts := strings.Split(selectionBriefInfo.FileName, ".")
  558. if len(parts) > 1 {
  559. fileType = parts[len(parts)-1]
  560. }
  561. for {
  562. documentJobId, reviewErr = reviewService.CheckDocument(selectionBriefInfo.FileUrl, fileType)
  563. if reviewErr == nil || i == 0 {
  564. break
  565. }
  566. i -= 1
  567. }
  568. if reviewErr != nil {
  569. return nil, reviewErr
  570. }
  571. documents = append(documents, selectionBriefInfo.FileUrl)
  572. documentJobIds = append(documentJobIds, *documentJobId)
  573. }
  574. }
  575. selectionMaterials, err := dao.SecMaterialDao{}.GetSelectionMaterialInfo(selectionId)
  576. if err != nil {
  577. return nil, err
  578. }
  579. for _, selectionMaterial := range selectionMaterials {
  580. if selectionMaterial.Type == 1 {
  581. images = append(images, selectionMaterial.FileUrl)
  582. } else if selectionMaterial.Type == 2 {
  583. var videoJobId *string
  584. var reviewErr error
  585. i := 10
  586. for {
  587. videoJobId, reviewErr = reviewService.CheckVideo(selectionMaterial.FileUrl)
  588. if reviewErr == nil || i == 0 {
  589. break
  590. }
  591. i -= 1
  592. }
  593. if reviewErr != nil {
  594. return nil, reviewErr
  595. }
  596. videos = append(videos, selectionMaterial.FileUrl)
  597. videoJobIds = append(videoJobIds, *videoJobId)
  598. }
  599. }
  600. newReviewSelection := &entity.ReviewSelection{
  601. SelectionID: selectionId,
  602. TaskName: selectionName,
  603. ProductName: productName,
  604. ProductDetail: productDetail,
  605. MainPhoto: mainPhoto,
  606. Images: strings.Join(images, ","),
  607. Videos: strings.Join(videos, ","),
  608. Documents: strings.Join(documents, ","),
  609. VideoJobIds: strings.Join(videoJobIds, ","),
  610. DocumentJobIds: strings.Join(documentJobIds, ","),
  611. Status: 1,
  612. }
  613. err5 := dao.SelectionReviewDao{}.Create(newReviewSelection)
  614. if err5 != nil {
  615. return nil, err5
  616. }
  617. t := time.Now()
  618. updateSelection := entity.SelectionInfo{
  619. SelectionID: selectionId,
  620. SelectionStatus: 2,
  621. UpdatedAt: t,
  622. }
  623. err6 := dao.SelectionInfoDAO{}.UpdateSelectionInfo(updateSelection)
  624. if err6 != nil {
  625. return nil, err
  626. }
  627. return &selectionId, nil
  628. }
  629. // 电商带货任务列表
  630. func (s SelectionInfoService) GetSelectionTaskList(param *vo.SelectionSearchParam) (vo.ResultVO, error) {
  631. if param.Page == 0 {
  632. param.Page = 1
  633. }
  634. if param.PageSize == 0 {
  635. param.PageSize = 10
  636. }
  637. var result vo.ResultVO
  638. reSelectionTaskPreviews, total, err := (&dao.SelectionInfoDAO{}).GetSelectionPreviews(param)
  639. if err != nil {
  640. return result, err
  641. }
  642. for i := range reSelectionTaskPreviews {
  643. var creatorName string
  644. var productName string
  645. var productPrice float64
  646. var mainImage string
  647. var reward float64
  648. if reSelectionTaskPreviews[i].SubAccountId == 0 {
  649. enterprise, err := dao.EnterpriseDao{}.GetEnterprise(reSelectionTaskPreviews[i].EnterpriseId)
  650. if err == nil && enterprise != nil {
  651. creatorName = enterprise.BusinessName
  652. }
  653. } else {
  654. subAccount, err := dao.SubAccountDao{}.GetSubAccount(reSelectionTaskPreviews[i].SubAccountId)
  655. if err == nil && subAccount != nil {
  656. creatorName = subAccount.SubAccountName
  657. }
  658. }
  659. product, err := dao.ProductDAO{}.GetProductByID(reSelectionTaskPreviews[i].ProductId)
  660. if err == nil && product != nil {
  661. productName = product.ProductName
  662. productPrice = product.ProductPrice
  663. }
  664. mainImage, err = dao.ProductPhotoDAO{}.GetMainPhotoByProductID(reSelectionTaskPreviews[i].ProductId)
  665. rewardStrategys, err := dao.RewardStrategyDao{}.GetRewardStrategyBySelectionId(reSelectionTaskPreviews[i].SelectionId)
  666. for _, rewardStrategy := range rewardStrategys {
  667. reward += rewardStrategy.Reward
  668. }
  669. reSelectionTaskPreviews[i].CreatorName = creatorName
  670. reSelectionTaskPreviews[i].ProductName = productName
  671. reSelectionTaskPreviews[i].ProductPrice = productPrice
  672. reSelectionTaskPreviews[i].MainImage = mainImage
  673. reSelectionTaskPreviews[i].Reward = reward
  674. }
  675. result = vo.ResultVO{
  676. Page: param.Page,
  677. PageSize: param.PageSize,
  678. Total: total,
  679. Data: reSelectionTaskPreviews,
  680. }
  681. return result, nil
  682. }
  683. // 删除带货任务
  684. func (s SelectionInfoService) DeleteSelection(selectionId string) (*string, error) {
  685. res, err := dao.SelectionInfoDAO{}.DeleteSelection(selectionId)
  686. if err != nil {
  687. logrus.Errorf("[projectDB service] call DeleteSelection error,err:%+v", err)
  688. return res, err
  689. }
  690. return res, nil
  691. }
  692. // 草稿箱——电商带货
  693. func (s SelectionInfoService) GetSelectionDraftList(param *vo.SelectionDraftParam) (vo.ResultVO, error) {
  694. if param.Page == 0 {
  695. param.Page = 1
  696. }
  697. if param.PageSize == 0 {
  698. param.PageSize = 10
  699. }
  700. var result vo.ResultVO
  701. reSelectionTaskPreviews, total, err := (&dao.SelectionInfoDAO{}).GetSelectionDraftList(param)
  702. if err != nil {
  703. return result, err
  704. }
  705. for i := range reSelectionTaskPreviews {
  706. var creatorName string
  707. var productName string
  708. var productPrice float64
  709. var mainImage string
  710. if reSelectionTaskPreviews[i].SubAccountId == 0 {
  711. enterprise, err := dao.EnterpriseDao{}.GetEnterprise(reSelectionTaskPreviews[i].EnterpriseId)
  712. if err == nil && enterprise != nil {
  713. creatorName = enterprise.BusinessName
  714. }
  715. } else {
  716. subAccount, err := dao.SubAccountDao{}.GetSubAccount(reSelectionTaskPreviews[i].SubAccountId)
  717. if err == nil && subAccount != nil {
  718. creatorName = subAccount.SubAccountName
  719. }
  720. }
  721. product, err := dao.ProductDAO{}.GetProductByID(reSelectionTaskPreviews[i].ProductId)
  722. if err == nil && product != nil {
  723. productName = product.ProductName
  724. productPrice = product.ProductPrice
  725. }
  726. mainImage, err = dao.ProductPhotoDAO{}.GetMainPhotoByProductID(reSelectionTaskPreviews[i].ProductId)
  727. reSelectionTaskPreviews[i].CreatorName = creatorName
  728. reSelectionTaskPreviews[i].ProductName = productName
  729. reSelectionTaskPreviews[i].ProductPrice = productPrice
  730. reSelectionTaskPreviews[i].MainImage = mainImage
  731. }
  732. result = vo.ResultVO{
  733. Page: param.Page,
  734. PageSize: param.PageSize,
  735. Total: total,
  736. Data: reSelectionTaskPreviews,
  737. }
  738. return result, nil
  739. }