selection.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487
  1. package service
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "reflect"
  8. "time"
  9. "youngee_m_api/db"
  10. "youngee_m_api/model/common_model"
  11. "youngee_m_api/model/gorm_model"
  12. "youngee_m_api/model/http_model"
  13. "youngee_m_api/pack"
  14. "youngee_m_api/util"
  15. "github.com/gin-gonic/gin"
  16. "github.com/sirupsen/logrus"
  17. "github.com/caixw/lib.go/conv"
  18. )
  19. var Selection *selection
  20. type selection struct {
  21. }
  22. func (*selection) Create(ctx context.Context, request http_model.CreateSelectionRequest) (*http_model.CreateSelectionData, error) {
  23. enterpriseId := request.EnterpriseId
  24. // 1. 检查该企业id和商品id有无选品
  25. //selectionInfo, err := db.GetSelectionByEnterpiseIdAndProductId(ctx, enterpriseId, conv.MustInt(request.ProductId, 0))
  26. //if err != nil {
  27. // return nil, err
  28. //}
  29. //if selectionInfo != nil {
  30. // return nil, errors.New("该商品下选品已存在")
  31. //}
  32. // 2. 数据准备
  33. // a) 生成选品id
  34. selectionId := util.GetSelectionID()
  35. // b) 查找关联商品信息
  36. product, err := db.GetProductByID(ctx, conv.MustInt64(request.ProductId, 0))
  37. if err != nil {
  38. return nil, err
  39. }
  40. productPhotos, err := db.GetProductPhotoByProductID(ctx, conv.MustInt64(request.ProductId, 0))
  41. productInfoToJson, _ := json.Marshal(product)
  42. productPhotosToJson, _ := json.Marshal(productPhotos)
  43. // c) 选品名称
  44. selectionName := product.BrandName + "-" + product.ProductName
  45. // 3. 创建选品
  46. //taskDdl := time.Time{} //赋零值
  47. //taskDdl, _ = time.ParseInLocation("2006-01-02 15:04:05", "2026-01-01 08:00:00", time.Local)
  48. t := time.Now()
  49. newSelection := gorm_model.YounggeeSelectionInfo{
  50. SelectionStatus: 1,
  51. SelectionID: selectionId,
  52. SelectionName: selectionName,
  53. ProductID: conv.MustInt(request.ProductId, 0),
  54. EnterpriseID: enterpriseId,
  55. Platform: conv.MustInt(request.Platform, 0),
  56. ProductSnap: string(productInfoToJson),
  57. ProductPhotoSnap: string(productPhotosToJson),
  58. CreatedAt: &t,
  59. UpdatedAt: &t,
  60. CommissionRate: "0",
  61. EstimatedCost: "0",
  62. TaskReward: "0",
  63. SettlementAmount: "0",
  64. }
  65. //Selection := gorm_model.YounggeeSelectionInfo{}
  66. err = db.CreateSelection(ctx, newSelection)
  67. if err != nil {
  68. return nil, err
  69. }
  70. res := &http_model.CreateSelectionData{
  71. SelectionId: selectionId,
  72. }
  73. return res, nil
  74. }
  75. func (*selection) Update(ctx context.Context, request http_model.UpdateSelectionRequest, enterpriseId string) (*http_model.UpdateSelectionData, error) {
  76. // 1. 检查该企业id和商品id有无选品
  77. // println("awdawdawdawdwad", request.EnterpriseId)
  78. fmt.Println("更新的选品信息")
  79. selectionInfo, err := db.GetSelectionById(ctx, request.SelectionID)
  80. if err != nil {
  81. return nil, err
  82. }
  83. if selectionInfo == nil {
  84. return nil, errors.New("选品不存在")
  85. }
  86. // 2. 数据准备
  87. // a) 查找关联商品信息
  88. product, err := db.GetProductByID(ctx, conv.MustInt64(request.ProductId, 0))
  89. if err != nil {
  90. return nil, err
  91. }
  92. productPhotos, err := db.GetProductPhotoByProductID(ctx, conv.MustInt64(request.ProductId, 0))
  93. productInfoToJson, _ := json.Marshal(product)
  94. productPhotosToJson, _ := json.Marshal(productPhotos)
  95. // b) 选品名称
  96. selectionName := product.BrandName + "-" + product.ProductName
  97. // d) 任务截止时间
  98. fmt.Println("taskDdl:", request.TaskDdl)
  99. taskDdl := time.Time{} //赋零值
  100. taskDdl, _ = time.ParseInLocation("2006-01-02 15:04:05", request.TaskDdl, time.Local)
  101. // f) 更新选品状态
  102. if request.SelectionStatus != 2 && request.SelectionStatus != 7 {
  103. request.SelectionStatus = 1
  104. }
  105. t := time.Now()
  106. println("taskDDl: ", &taskDdl)
  107. updateSelection := gorm_model.YounggeeSelectionInfo{
  108. SelectionID: request.SelectionID,
  109. SelectionStatus: request.SelectionStatus,
  110. SelectionName: selectionName,
  111. EnterpriseID: enterpriseId,
  112. ProductID: conv.MustInt(request.ProductId, 0),
  113. ContentType: conv.MustInt(request.ContentType, 0),
  114. TaskMode: conv.MustInt(request.TaskMode, 0),
  115. Platform: conv.MustInt(request.Platform, 0),
  116. SampleMode: conv.MustInt(request.SampleMode, 0),
  117. ProductUrl: request.ProductUrl,
  118. SampleNum: conv.MustInt(request.SampleNum, 0),
  119. RemainNum: conv.MustInt(request.SampleNum, 0),
  120. CommissionRate: conv.MustString(request.CommissionRate, "0"),
  121. TaskReward: conv.MustString(request.TaskReward, "0"),
  122. SettlementAmount: conv.MustString(request.SettlementAmount, "0"),
  123. EstimatedCost: selectionInfo.EstimatedCost,
  124. SampleCondition: request.SampleCondition,
  125. RewardCondition: request.RewardCondition,
  126. TaskDdl: &taskDdl,
  127. Detail: request.Detail,
  128. ProductSnap: string(productInfoToJson),
  129. ProductPhotoSnap: string(productPhotosToJson),
  130. CreatedAt: selectionInfo.CreatedAt,
  131. UpdatedAt: &t,
  132. }
  133. if request.SelectionStatus == 2 {
  134. updateSelection.SubmitAt = &t
  135. }
  136. if request.Status == 1 {
  137. updateSelection.Status = 1
  138. }
  139. // 合并传入参数和数据表中原记录,若传入参数字段值为空,则将字段赋值为原记录中值
  140. result := util.MergeStructValue(&updateSelection, selectionInfo)
  141. // 利用反射机制将interface类型转换为结构体类型
  142. v := reflect.ValueOf(&result).Elem()
  143. if v.Kind() == reflect.Struct {
  144. updateSelection = v.Interface().(gorm_model.YounggeeSelectionInfo)
  145. //fmt.Println(p)
  146. }
  147. // c) 计算预估成本(如果有)
  148. /*
  149. var estimatedCost float64
  150. if conv.MustInt(updateSelection.TaskMode, 0) == 1 {
  151. estimatedCost = conv.MustFloat64(updateSelection.TaskReward, 0) * conv.MustFloat64(updateSelection.SampleNum, 0)
  152. }
  153. estimatedCostToString, _ := conv.String(estimatedCost)
  154. updateSelection.EstimatedCost = estimatedCostToString
  155. */
  156. // 3. 更新选品
  157. err = db.UpdateSelection(ctx, updateSelection)
  158. if err != nil {
  159. return nil, err
  160. }
  161. println("brief")
  162. // 4. 更新选品brief和示例
  163. if request.SecBrief != nil {
  164. // 删除已有brief
  165. err = db.DeleteSecBriefBySelectionId(ctx, selectionInfo.SelectionID)
  166. if err != nil {
  167. return nil, err
  168. }
  169. // 插入新的brief
  170. for _, v := range request.SecBrief {
  171. brief := gorm_model.YounggeeSecBrief{
  172. SelectionID: selectionInfo.SelectionID,
  173. FileUid: v.PhotoUid,
  174. FileName: v.Name,
  175. FileUrl: v.PhotoUrl,
  176. CreatedAt: time.Now(),
  177. }
  178. err = db.CreateSecBrief(ctx, brief)
  179. if err != nil {
  180. return nil, err
  181. }
  182. }
  183. }
  184. if request.SecExample != nil {
  185. // 删除已有示例
  186. err = db.DeleteSecExampleBySelectionId(ctx, selectionInfo.SelectionID)
  187. if err != nil {
  188. return nil, err
  189. }
  190. // 插入新的示例
  191. for _, v := range request.SecExample {
  192. Example := gorm_model.YounggeeSecExample{
  193. SelectionID: selectionInfo.SelectionID,
  194. FileUid: v.PhotoUid,
  195. FileName: v.Name,
  196. FileUrl: v.PhotoUrl,
  197. CreatedAt: time.Now(),
  198. }
  199. err = db.CreateSecExample(ctx, Example)
  200. if err != nil {
  201. return nil, err
  202. }
  203. }
  204. }
  205. println("更新带货任务的免费领样策略")
  206. fmt.Println("SampleMode: ", request.SampleMode)
  207. // 更新带货任务的免费领样策略
  208. if request.FreeStrategys != nil {
  209. // 1. 删除已有的免费领样策略
  210. err = db.DeleteFreeStrategyBySelectionId(ctx, request.SelectionID)
  211. if err != nil {
  212. return nil, err
  213. }
  214. // 2. 接收并创建新的免费领样策略
  215. if request.SampleMode == 1 {
  216. var Frees []gorm_model.FreeStrategy
  217. for _, v := range request.FreeStrategys {
  218. Free := gorm_model.FreeStrategy{
  219. SelectionId: selectionInfo.SelectionID,
  220. StrategyId: v.StrategyId,
  221. FansNum: v.FansNum,
  222. SaleNum: v.SaleNum,
  223. StrategyStatus: 1,
  224. EnrollNum: 0,
  225. ChooseNum: 0,
  226. }
  227. Frees = append(Frees, Free)
  228. }
  229. err = db.CreateFreeStrategy(ctx, Frees)
  230. if err != nil {
  231. return nil, err
  232. }
  233. }
  234. }
  235. println("更新带货任务的悬赏策略")
  236. fmt.Println("TaskMode: ", request.TaskMode)
  237. // 更新带货任务的悬赏策略
  238. if request.RewardStrategys != nil {
  239. // 1. 删除已有的悬赏策略
  240. err = db.DeleteRewardStrategyBySelectionId(ctx, request.SelectionID)
  241. if err != nil {
  242. return nil, err
  243. }
  244. if request.TaskMode == 1 {
  245. var Rewards []gorm_model.RewardStrategy
  246. for _, v := range request.RewardStrategys {
  247. Reward := gorm_model.RewardStrategy{
  248. SelectionId: selectionInfo.SelectionID,
  249. Reward: v.Reward,
  250. SaleActual: v.SaleActual,
  251. PerReward: v.PerReward,
  252. StrategyStatus: 1,
  253. }
  254. Rewards = append(Rewards, Reward)
  255. }
  256. err = db.CreateRewardStrategy(ctx, Rewards)
  257. if err != nil {
  258. return nil, err
  259. }
  260. }
  261. }
  262. res := &http_model.UpdateSelectionData{
  263. SelectionId: updateSelection.SelectionID,
  264. }
  265. return res, nil
  266. }
  267. func (*selection) Pay(ctx context.Context, request http_model.PaySelectionRequest, enterpriseId string) (*http_model.PaySelectionData, error) {
  268. // 校验
  269. // 1. 账户余额是否足够
  270. enterprise, err := db.GetEnterpriseByEnterpriseID(ctx, enterpriseId)
  271. if err != nil {
  272. return nil, err
  273. }
  274. if enterprise.AvailableBalance < request.PayMoney {
  275. return nil, errors.New("账户余额不足")
  276. }
  277. // 2. 选品项目状态是否正确
  278. selectionInfo, err := db.GetSelectionById(ctx, request.SelectionId)
  279. if err != nil {
  280. return nil, err
  281. }
  282. if selectionInfo == nil {
  283. return nil, errors.New("选品不存在")
  284. }
  285. if selectionInfo.SelectionStatus != 4 {
  286. return nil, errors.New("选品状态有误")
  287. }
  288. // 支付
  289. err = db.PaySelection(ctx, enterpriseId, request.PayMoney, request.SelectionId)
  290. if err != nil {
  291. return nil, err
  292. }
  293. res := &http_model.PaySelectionData{
  294. SelectionId: request.SelectionId,
  295. }
  296. return res, nil
  297. }
  298. func (*selection) Submit(ctx context.Context, request http_model.SubmitSelectionRequest) (*http_model.SubmitSelectionData, error) {
  299. t := time.Now()
  300. updateSelection := gorm_model.YounggeeSelectionInfo{
  301. SelectionID: request.SelectionId,
  302. SelectionStatus: request.SelectionStatus,
  303. SubmitAt: &t,
  304. }
  305. err := db.UpdateSelection(ctx, updateSelection)
  306. if err != nil {
  307. return nil, err
  308. }
  309. res := &http_model.SubmitSelectionData{}
  310. return res, nil
  311. }
  312. func (s *selection) GetAllSelection(ctx context.Context, enterpriseID string, pageSize, pageNum int64, conditions *common_model.SelectionConditions) (*http_model.SelectionData, error) {
  313. SelectionList, total, err := db.GetSelectionList(ctx, enterpriseID, pageSize, pageNum, conditions)
  314. if err != nil {
  315. logrus.WithContext(ctx).Errorf("[selectionDB service] call GetAllSelection error,err:%+v", err)
  316. return nil, err
  317. }
  318. SelectionListData := new(http_model.SelectionData)
  319. SelectionListData.SelectionInfo = pack.MGormSelectionToHttpSelectionPreview(SelectionList)
  320. SelectionListData.Total = conv.MustString(total, "")
  321. return SelectionListData, nil
  322. }
  323. func (s *selection) GetSelectionDetail(ctx *gin.Context, selectionId string, enterpriseId string) (*http_model.SelectionDetail, error) {
  324. selectionDetail := http_model.SelectionDetail{}
  325. selectionInfo, err := db.GetSelectionById(ctx, selectionId)
  326. if err != nil {
  327. logrus.WithContext(ctx).Errorf("[selectionDB service] call GetSelectionInfo error,err:%+v", err)
  328. return nil, err
  329. }
  330. selectionBriefInfo, err := db.GetSelectionBriefInfo(ctx, selectionId)
  331. if err != nil {
  332. logrus.WithContext(ctx).Errorf("[selectionDB service] call GetSelectionBriefInfo error,err:%+v", err)
  333. return nil, err
  334. }
  335. selectionExampleInfo, err := db.GetSelectionExampleInfo(ctx, selectionId)
  336. if err != nil {
  337. logrus.WithContext(ctx).Errorf("[selectionDB service] call GetSelectionExampleInfo error,err:%+v", err)
  338. return nil, err
  339. }
  340. productInfo, err := db.GetProductInfoBySelectionId(ctx, selectionId)
  341. if err != nil {
  342. logrus.WithContext(ctx).Errorf("[selectionDB service] call GetProductInfo error,err:%+v", err)
  343. return nil, err
  344. }
  345. productPhotoInfo, err := db.GetProductPhotoInfoBySelectionId(ctx, selectionId)
  346. if err != nil {
  347. logrus.WithContext(ctx).Errorf("[selectionDB service] call GetProductPhotoInfo error,err:%+v", err)
  348. return nil, err
  349. }
  350. // 查找免费领样策略
  351. freeStrategy, err := db.GetFreeStrategyBySelectionId(ctx, selectionId)
  352. if err != nil {
  353. logrus.WithContext(ctx).Errorf("[selectionDB service] call GetFreeStrategy error,err:%+v", err)
  354. return nil, err
  355. }
  356. // 查找悬赏策略
  357. rewardStrategy, err := db.GetRewardStrategyBySelectionId(ctx, selectionId)
  358. if err != nil {
  359. logrus.WithContext(ctx).Errorf("[selectionDB service] call GetRewardStrategy error,err:%+v", err)
  360. return nil, err
  361. }
  362. selectionDetail.SelectionBrief = selectionBriefInfo
  363. selectionDetail.SelectionInfo = selectionInfo
  364. selectionDetail.SelectionExample = selectionExampleInfo
  365. selectionDetail.ProductInfo = productInfo
  366. selectionDetail.ProductPhotoInfo = productPhotoInfo
  367. selectionDetail.FreeStrategy = freeStrategy
  368. selectionDetail.RewardStrategy = rewardStrategy
  369. return &selectionDetail, nil
  370. }
  371. func (*selection) Review(ctx context.Context, request http_model.ReviewSelectionRequest) (*http_model.ReviewSelectionData, error) {
  372. // 根据选品id查询选品信息
  373. selectionInfo, err := db.GetSelectionById(ctx, request.SelectionId)
  374. if err != nil {
  375. logrus.WithContext(ctx).Errorf("[selectionDB service] call GetSelectionById error,err:%+v", err)
  376. return nil, err
  377. }
  378. // 计算预估成本
  379. var estimatedCost float64 = 0.0
  380. var estimatedCostToString string = ""
  381. selection1, _ := db.GetRewardStrategyBySelectionId(ctx, request.SelectionId)
  382. if conv.MustInt(selectionInfo.TaskMode, 0) == 1 {
  383. // estimatedCost = conv.MustFloat64(selectionInfo.TaskReward, 0) * conv.MustFloat64(selectionInfo.SampleNum, 0)
  384. estimatedCost = conv.MustFloat64(selection1[0].Reward, 0)
  385. estimatedCostToString, _ = conv.String(estimatedCost)
  386. }
  387. // 若审核通过则更新选品阶段为待支付,否则更新为失效并赋值失效原因
  388. t := time.Now()
  389. AutoTaskID, err := db.GetLastAutoTaskID()
  390. updateSelection := gorm_model.YounggeeSelectionInfo{}
  391. if request.IsPass == 1 {
  392. if conv.MustInt(selectionInfo.TaskMode, 0) == 1 {
  393. //悬赏任务
  394. updateSelection = gorm_model.YounggeeSelectionInfo{
  395. SelectionID: request.SelectionId,
  396. SelectionStatus: 4,
  397. PassAt: &t,
  398. EstimatedCost: estimatedCostToString,
  399. AutoTaskID: int(AutoTaskID),
  400. }
  401. } else {
  402. // 纯佣带货
  403. updateSelection = gorm_model.YounggeeSelectionInfo{
  404. SelectionID: request.SelectionId,
  405. SelectionStatus: 6,
  406. PassAt: &t,
  407. EstimatedCost: estimatedCostToString,
  408. }
  409. }
  410. } else {
  411. updateSelection = gorm_model.YounggeeSelectionInfo{
  412. SelectionID: request.SelectionId,
  413. SelectionStatus: 7,
  414. FailReason: 2,
  415. FinishAt: &t,
  416. EstimatedCost: estimatedCostToString,
  417. }
  418. }
  419. err = db.UpdateSelection(ctx, updateSelection)
  420. if err != nil {
  421. logrus.WithContext(ctx).Errorf("[selectionDB service] call UpdateSelection error,err:%+v", err)
  422. return nil, err
  423. }
  424. res := &http_model.ReviewSelectionData{}
  425. return res, nil
  426. }
  427. func (*selection) End(ctx context.Context, request http_model.EndSelectionRequest) (*http_model.EndSelectionData, error) {
  428. selectionInfo, err := db.GetSelectionById(ctx, request.SelectionId)
  429. if err != nil {
  430. logrus.WithContext(ctx).Errorf("[selectionDB service] call GetSelectionById error,err:%+v", err)
  431. return nil, err
  432. }
  433. selectionstatus := conv.MustInt(selectionInfo.SelectionStatus, 0)
  434. sampleMode := conv.MustInt(selectionInfo.SampleMode, 0)
  435. beforedeliverynum := conv.MustInt(selectionInfo.BeforeDeliveryNum, 0)
  436. t := time.Now()
  437. updateSelection := gorm_model.YounggeeSelectionInfo{}
  438. if selectionstatus == 4 || (selectionstatus == 6 && sampleMode == 1 && beforedeliverynum == 0) || (selectionstatus == 6 && sampleMode == 2) {
  439. updateSelection = gorm_model.YounggeeSelectionInfo{
  440. SelectionID: request.SelectionId,
  441. SelectionStatus: 8,
  442. FinishAt: &t,
  443. }
  444. }
  445. err = db.UpdateSelection(ctx, updateSelection)
  446. if err != nil {
  447. logrus.WithContext(ctx).Errorf("[selectionDB service] call UpdateSelection error,err:%+v", err)
  448. return nil, err
  449. }
  450. res := &http_model.EndSelectionData{}
  451. return res, nil
  452. }