selection_info_service.go 26 KB

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