sec_task.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625
  1. package service
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "github.com/issue9/conv"
  8. "github.com/lin-jim-leon/kuaishou"
  9. "github.com/sirupsen/logrus"
  10. "strconv"
  11. "time"
  12. "youngee_m_api/db"
  13. "youngee_m_api/model/gorm_model"
  14. "youngee_m_api/model/http_model"
  15. )
  16. var SelectionTask *selectionTask
  17. type selectionTask struct {
  18. }
  19. func (*selectionTask) GetList(ctx context.Context, request http_model.GetSecTaskListRequest) (*http_model.GetSecTaskListData, error) {
  20. // sec_task:任务id、帐号昵称、粉丝数、收货地址、主页截图、主页链接、确认时间、申请时间、结算时间
  21. // youngee_task_logistics: 物流公司、物流单号、发货时间、探店时间
  22. // younggee_assignment_info:数据截图、作业链接
  23. // selection_info: 返现金额、悬赏金额
  24. // 1. 根据选品任务阶段、账号昵称or任务id查询任务基本信息(包括任务id、账号昵称、粉丝数、主页截图、主页链接、申请时间)
  25. fmt.Println("查找信息:", request.SelectionId, request.TaskStage)
  26. secTaskList, total, err := db.GetSecTaskList(ctx, request.SelectionId, request.TaskStage, request.SearchValue, request.PageSize, request.PageNum)
  27. fmt.Println("查找报错信息:", err)
  28. if err != nil {
  29. logrus.WithContext(ctx).Errorf("[sectask_service service] call GetSecTaskList error,err:%+v", err)
  30. return nil, err
  31. }
  32. fmt.Println("查找完成:", total)
  33. // 2. 根据不同查询类型查询补充信息
  34. switch request.Type {
  35. case 1: // 确定达人查询
  36. // 确定达人不需要额外信息
  37. break
  38. case 2: // 发货管理查询 youngee_task_logistics
  39. // 发货管理根据任务阶段和商品类型查询物流信息
  40. // 查询商品类型
  41. product, err := db.GetProductType(ctx, request.SelectionId)
  42. fmt.Println("product: ", product)
  43. if err != nil {
  44. logrus.WithContext(ctx).Errorf("[sectask_service service] call GetAllSelection error,err:%+v", err)
  45. return nil, err
  46. }
  47. secTaskList, err = db.GetSecTaskLogisticsList(ctx, secTaskList, request.TaskStage, *product)
  48. if err != nil {
  49. logrus.WithContext(ctx).Errorf("[sectask_service service] call GetSecTaskLogisticsList error,err:%+v", err)
  50. return nil, err
  51. }
  52. break
  53. case 3: // 结算管理查询 younggee_assignment_info
  54. secTaskList, err = db.GetSecTaskSettleList(ctx, secTaskList, request.SelectionId, request.SecTaskStatus)
  55. if err != nil {
  56. logrus.WithContext(ctx).Errorf("[sectask_service service] call GetSecTaskSettleList error,err:%+v", err)
  57. return nil, err
  58. }
  59. break
  60. default: // 参数有误
  61. break
  62. }
  63. selectionListData := http_model.GetSecTaskListData{
  64. Total: conv.MustString(total, ""),
  65. SecTaskList: secTaskList,
  66. }
  67. return &selectionListData, nil
  68. }
  69. func (*selectionTask) PassCoop(ctx context.Context, request http_model.PassSecTaskCoopRequest) (*http_model.PassSecTaskCoopData, error) {
  70. _, err := db.PassSecTaskCoop(ctx, request.SelectionId, request.TaskIds)
  71. if err != nil {
  72. logrus.WithContext(ctx).Errorf("[sectask_service service] call PassCoop error,err:%+v", err)
  73. return nil, err
  74. }
  75. selectionListData := http_model.PassSecTaskCoopData{}
  76. return &selectionListData, nil
  77. }
  78. func (*selectionTask) RefuseCoop(ctx context.Context, request http_model.RefuseSecTaskCoopRequest) (*http_model.RefuseSecTaskCoopData, error) {
  79. _, err := db.RefuseSecTaskCoop(ctx, request.TaskIds)
  80. if err != nil {
  81. logrus.WithContext(ctx).Errorf("[sectask_service service] call RefuseCoop error,err:%+v", err)
  82. return nil, err
  83. }
  84. selectionListData := http_model.RefuseSecTaskCoopData{}
  85. return &selectionListData, nil
  86. }
  87. /*
  88. func (*selectionTask) Settle(ctx context.Context, entersizeId string, request http_model.SettleSecTaskRequest) (*http_model.SettleSecTaskData, error) {
  89. // 1. 解析request data
  90. var returnMoney float64 = 0.0
  91. var rewardMoney float64 = 0.0
  92. payMoney, err := strconv.ParseFloat(request.TotalPayMoney, 64)
  93. if err != nil {
  94. logrus.WithContext(ctx).Errorf("[sectask_service service] call strconv.ParseFloat() error,err:%+v", err)
  95. return nil, err
  96. }
  97. // 2. 校验:任务是否正常(处于待结算阶段);企业账户可用余额是否充足;若返现则校验达人是否垫付买样;若有悬赏金额则校验是否为悬赏任务
  98. // 1) 校验企业账户余额是否充足
  99. entersize, err := db.GetEnterpriseByEnterpriseID(ctx, entersizeId)
  100. if err != nil {
  101. logrus.WithContext(ctx).Errorf("[sectask_service service] call GetEnterpriseByEnterpriseID error,err:%+v", err)
  102. return nil, err
  103. }
  104. if entersize.AvailableBalance < payMoney {
  105. return nil, errors.New("账户余额不足")
  106. }
  107. // 2) 若返现则校验达人是否垫付买样;若有悬赏金额则校验是否为悬赏任务
  108. selection, err := db.GetSelectionById(ctx, request.SelectionID)
  109. if err != nil {
  110. logrus.WithContext(ctx).Errorf("[sectask_service service] call GetSelectionById error,err:%+v", err)
  111. return nil, err
  112. }
  113. if selection.SampleMode != 2 && request.IsReturnMoney == 1 {
  114. return nil, errors.New("免费领养任务不能返样品钱")
  115. }
  116. if selection.TaskMode != 1 && request.IsPayReward == 1 {
  117. return nil, errors.New("非悬赏任务不能支付悬赏")
  118. }
  119. // 3) 校验任务是否处于待结算阶段
  120. secTask, err := db.GetSecTaskById(ctx, request.TaskID)
  121. if err != nil {
  122. logrus.WithContext(ctx).Errorf("[sectask_service service] call GetSecTaskById error,err:%+v", err)
  123. return nil, err
  124. }
  125. if secTask.TaskStage != 9 && secTask.TaskStatus != 2 {
  126. return nil, errors.New("该任务暂不可结算")
  127. }
  128. var product gorm_model.YounggeeProduct
  129. if err = json.Unmarshal([]byte(selection.ProductSnap), &product); err != nil {
  130. fmt.Println("Error:", err)
  131. return nil, err
  132. }
  133. // 4) 校验结算金额计算是否正确
  134. if request.IsReturnMoney == 1 {
  135. returnMoney = product.ProductPrice
  136. }
  137. if request.IsPayReward == 1 {
  138. rewardMoney, err = strconv.ParseFloat(selection.TaskReward, 64)
  139. if err != nil {
  140. logrus.WithContext(ctx).Errorf("[sectask_service service] call strconv.ParseFloat() error,err:%+v", err)
  141. return nil, err
  142. }
  143. }
  144. println("payMoney: ", payMoney)
  145. println("rewardMoney+returnMoney: ", rewardMoney+returnMoney)
  146. // 3. 更新选品结算金额
  147. _, err = db.UpdateSelectionSettleMoney(ctx, selection.SelectionID, payMoney)
  148. if err != nil {
  149. logrus.WithContext(ctx).Errorf("[sectask_service service] call UpdateSelectionSettleMoney error,err:%+v", err)
  150. return nil, err
  151. }
  152. // 4. 更新选品任务阶段
  153. updateSecTaskData := gorm_model.YounggeeSecTaskInfo{
  154. TaskID: request.TaskID,
  155. TaskStage: 10,
  156. AssignmentStatus: 5,
  157. IsPayReward: request.IsPayReward,
  158. IsPayPayment: request.IsReturnMoney,
  159. CompleteDate: time.Now(),
  160. }
  161. _, err = db.UpdateSecTask(ctx, updateSecTaskData)
  162. if err != nil {
  163. logrus.WithContext(ctx).Errorf("[sectask_service service] call UpdateSecTask error,err:%+v", err)
  164. return nil, err
  165. }
  166. // 5. 添加任务日志和达人消息
  167. err = db.CreateTaskLog(ctx, request.TaskID, "结算时间")
  168. if err != nil {
  169. logrus.WithContext(ctx).Errorf("[sectask_service service] call CreateTaskLog error,err:%+v", err)
  170. return nil, err
  171. }
  172. err = db.CreateMessageBySecTaskId(ctx, 5, 1, request.TaskID)
  173. if err != nil {
  174. logrus.WithContext(ctx).Errorf("[sectask_service service] call CreateMessageBySecTaskId error,err:%+v", err)
  175. return nil, err
  176. }
  177. // 6. 创建选品收益记录
  178. // 返现收益
  179. t := time.Now()
  180. if request.IsReturnMoney == 1 {
  181. income := gorm_model.YounggeeTalentIncome{
  182. TalentID: secTask.TalentID,
  183. SelectionID: secTask.SelectionID,
  184. SectaskID: secTask.TaskID,
  185. BrandName: product.BrandName,
  186. TaskName: selection.SelectionName,
  187. Income: strconv.FormatFloat(returnMoney, 'f', 10, 32),
  188. IncomeType: 1,
  189. WithdrawStatus: 1,
  190. IncomeAt: &t,
  191. WithdrawAt: nil,
  192. }
  193. err = db.CreateIncome(ctx, income, nil)
  194. if err != nil {
  195. logrus.WithContext(ctx).Errorf("[sectask_service service] call CreateIncome error,err:%+v", err)
  196. return nil, err
  197. }
  198. }
  199. // 悬赏收益
  200. if request.IsPayReward == 1 {
  201. income := gorm_model.YounggeeTalentIncome{
  202. TalentID: secTask.TalentID,
  203. SelectionID: secTask.SelectionID,
  204. SectaskID: secTask.TaskID,
  205. BrandName: product.BrandName,
  206. TaskName: selection.SelectionName,
  207. Income: strconv.FormatFloat(rewardMoney, 'f', 10, 32),
  208. IncomeType: 1,
  209. WithdrawStatus: 1,
  210. IncomeAt: &t,
  211. WithdrawAt: nil,
  212. }
  213. err = db.CreateIncome(ctx, income, nil)
  214. if err != nil {
  215. logrus.WithContext(ctx).Errorf("[sectask_service service] call CreateIncome error,err:%+v", err)
  216. return nil, err
  217. }
  218. }
  219. // 7. 若有young之团存在,则为young之团创建收益
  220. settleSecTaskData := http_model.SettleSecTaskData{}
  221. return &settleSecTaskData, nil
  222. }
  223. */
  224. // UpdateStrategyId 为带货子任务匹配满足要求的免费领样策略
  225. func (*selectionTask) UpdateStrategyId(ctx context.Context, selectionId string) error {
  226. var taskStage int = 11
  227. var SearchValue = ""
  228. var PageSize = int64(0)
  229. var PageNum = int64(0)
  230. secTaskList, total, err := db.GetSecTaskList(ctx, selectionId, taskStage, SearchValue, PageSize, PageNum)
  231. fmt.Println("此选品的带货子任务数量: ", total)
  232. FreeStrategys, err := db.GetFreeStrategyBySelectionId(ctx, selectionId)
  233. for i, _ := range FreeStrategys {
  234. var strate_id = FreeStrategys[i].StrategyId
  235. var fans_num = FreeStrategys[i].FansNum
  236. var sale_num = FreeStrategys[i].SaleNum
  237. var interval []int
  238. switch fans_num {
  239. case 1:
  240. interval = []int{0, 100000000}
  241. break
  242. case 2:
  243. interval = []int{0, 10000}
  244. break
  245. case 3:
  246. interval = []int{10001, 100000}
  247. break
  248. case 4:
  249. interval = []int{100001, 1000000}
  250. break
  251. case 5:
  252. interval = []int{1000000, 5000000}
  253. break
  254. case 6:
  255. interval = []int{5000000, 10000000}
  256. break
  257. case 7:
  258. interval = []int{10000000, 100000000}
  259. break
  260. }
  261. for j, _ := range secTaskList {
  262. var fans int
  263. fans, err = strconv.Atoi(secTaskList[j].FansCount)
  264. var sale int64
  265. sale = int64(secTaskList[j].SaleNum)
  266. if fans <= interval[1] && fans >= interval[0] && sale >= sale_num {
  267. secTaskList[j].FreeStrategyId = int(strate_id)
  268. err := db.UpdataFreeStratrgyId(ctx, secTaskList[j].SecTaskId, secTaskList[j].FreeStrategyId)
  269. println("Update: ", err)
  270. }
  271. }
  272. }
  273. return err
  274. }
  275. // UpdateStrategyNumBySelectionId 统计满足某一条FreeStrategy的带货子任务数量
  276. func (*selectionTask) UpdateStrategyNumBySelectionId(ctx context.Context, selectionId string) error {
  277. FreeStrategys, err := db.GetFreeStrategyBySelectionId(ctx, selectionId)
  278. fmt.Println(err)
  279. for i, _ := range FreeStrategys {
  280. var id = FreeStrategys[i].StrategyId
  281. var selection_id = FreeStrategys[i].SelectionId
  282. // 报名且符合策略的数量
  283. var stage = 3
  284. enroll_num, err := db.GetSecTaskCountByStrategyId(ctx, selection_id, int(id), stage)
  285. fmt.Println(err)
  286. fmt.Println("已申请免费领样且符合策略的数量: ", enroll_num)
  287. // 申请成功且符合策略的数量
  288. stage = 4
  289. choose_num, err := db.GetSecTaskCountByStrategyId(ctx, selection_id, int(id), stage)
  290. fmt.Println(err)
  291. fmt.Println("申请免费领样成功且符合策略的数量: ", choose_num)
  292. // 待发货且符合策略的数量
  293. stage = 6
  294. before_delivery_num, err := db.GetSecTaskCountByStrategyId(ctx, selection_id, int(id), stage)
  295. fmt.Println(err)
  296. fmt.Println("待发货且符合策略的数量: ", before_delivery_num)
  297. // 已发货且符合策略的数量
  298. stage = 7
  299. delivery_num, err := db.GetSecTaskCountByStrategyId(ctx, selection_id, int(id), stage)
  300. fmt.Println(err)
  301. fmt.Println("已发货且符合策略的数量: ", delivery_num)
  302. // 已收货且符合策略的数量
  303. stage = 8
  304. after_delivery_num, err := db.GetSecTaskCountByStrategyId(ctx, selection_id, int(id), stage)
  305. fmt.Println(err)
  306. fmt.Println("已收货且符合策略的数量: ", after_delivery_num)
  307. // 把要更新的参数初始化为结构体
  308. updatestrategy := gorm_model.FreeStrategy{
  309. SelectionId: selection_id,
  310. StrategyId: id,
  311. EnrollNum: enroll_num,
  312. ChooseNum: choose_num,
  313. BeforeDeliveryNum: before_delivery_num,
  314. DeliveryNum: delivery_num,
  315. AfterDeliveryNum: after_delivery_num,
  316. }
  317. // 更新
  318. err = db.UpdateFreeStrategyNum(ctx, updatestrategy)
  319. }
  320. return err
  321. }
  322. // UpdateActualNumBySelectionId 根据带货任务ID更新达人实际带货量
  323. func (*selectionTask) UpdateActualNumBySelectionId(ctx context.Context, selectionId string) error {
  324. // 1. 预处理
  325. // 1.1. 根据selectionID和task_stage筛选出所有满足条件的子任务
  326. var SecTaskStatus = 11
  327. var SearchValue = ""
  328. var PageSize = int64(0)
  329. var PageNum = int64(0)
  330. var AppKey string = "ks651333097154138217"
  331. var SignSecret string = "bf6393dce0a2b669ee348bebb837b0da"
  332. var cpsOrderStatus int = 0
  333. var pageSize int = 100
  334. var endTime int64 = time.Now().Unix() * 1000
  335. var beginTime int64 = endTime - 432000000
  336. var pcursor = ""
  337. // var sale_num_all = 0
  338. secTaskList, total, err := db.GetSecTaskList(ctx, selectionId, SecTaskStatus, SearchValue, PageSize, PageNum)
  339. if err != nil {
  340. return err
  341. }
  342. fmt.Println("待更新达人实际带货量的子任务数量: ", total)
  343. // 1.2. 筛选出Selection的开始时间和结束时间
  344. selectionInfo, err := db.GetSelectionById(ctx, selectionId)
  345. if err != nil {
  346. return err
  347. }
  348. selectionPassTime := selectionInfo.PassAt
  349. selectionFinishTime := selectionInfo.FinishAt
  350. fmt.Println("带货任务开始时间和结束时间: ", selectionPassTime, selectionFinishTime)
  351. // 2. 在筛选出的secTaskList中调用SDK查询实际带货量
  352. for i, _ := range secTaskList {
  353. // 通过talentID取出AccessToken和快手商品ID
  354. var talentID string = "223329990"
  355. KuaishouProductID, _ := db.GetProductByID(ctx, int64(secTaskList[i].ProductId))
  356. fmt.Println("KuaishouProductID", KuaishouProductID)
  357. KuaishouProductId := KuaishouProductID.KuaishouProductId
  358. var actual_num int = 0
  359. // var sale_num_all = 0
  360. AccessToken := db.GetKuaishouUserInfoByTalentId(ctx, talentID).AccessToken
  361. fmt.Println("AccessToken: ", AccessToken)
  362. // 根据AccessToken去查实际带货量
  363. // 递归
  364. for k := 1; k < 18; k++ {
  365. corderlist, err := kuaishou.Corderlist(AppKey, SignSecret, AccessToken, cpsOrderStatus, pageSize, beginTime, endTime, pcursor)
  366. fmt.Println("error: ", err)
  367. if err != nil {
  368. return err
  369. }
  370. var orderList = corderlist.Data.OrderViews
  371. pcursor = corderlist.Data.Cursor
  372. fmt.Println("pcursor: ", pcursor)
  373. // 在orderList中统计符合要求的商品销量
  374. for j := range orderList {
  375. if KuaishouProductId == orderList[j].CPSOrderProductViews[0].ItemID {
  376. actual_num += orderList[j].CPSOrderProductViews[0].Num
  377. }
  378. }
  379. fmt.Println("len of orderList: ", len(orderList))
  380. // 游标方式遍历100条后的订单
  381. for {
  382. if pcursor == "nomore" || len(orderList) == 0 {
  383. println("nomore")
  384. break
  385. }
  386. corderlist_cursor, err1 := kuaishou.Corderlist(AppKey, SignSecret, AccessToken, cpsOrderStatus, pageSize, beginTime, endTime, pcursor)
  387. fmt.Println("error: ", err1)
  388. if err1 != nil {
  389. return err1
  390. }
  391. var orderList_cursor = corderlist_cursor.Data.OrderViews
  392. pcursor = corderlist_cursor.Data.Cursor
  393. if KuaishouProductId == orderList_cursor[99].CPSOrderProductViews[0].ItemID {
  394. actual_num += orderList_cursor[99].CPSOrderProductViews[0].Num
  395. }
  396. }
  397. endTime = beginTime
  398. beginTime -= 432000000
  399. println("k= ", k)
  400. }
  401. updateData := gorm_model.YounggeeSecTaskInfo{
  402. TaskID: secTaskList[i].SecTaskId,
  403. SaleActual: actual_num,
  404. SaleNumAll: actual_num,
  405. }
  406. _, err = db.UpdateSecTask(ctx, updateData)
  407. fmt.Println(err)
  408. }
  409. return err
  410. }
  411. // Settle 结算
  412. func (*selectionTask) Settle(ctx context.Context, entersizeId string, request http_model.SettleSecTaskRequest) (*http_model.SettleSecTaskData, error) {
  413. // 1. 解析request data
  414. //var returnMoney float64 = 0.0
  415. //var rewardMoney float64 = 0.0
  416. payMoney, err := strconv.ParseFloat(request.TotalPayMoney, 64)
  417. fmt.Println("待支付金额: ", payMoney)
  418. if err != nil {
  419. logrus.WithContext(ctx).Errorf("[sectask_service service] call strconv.ParseFloat() error,err:%+v", err)
  420. return nil, err
  421. }
  422. // 2. 校验:任务是否正常(处于待结算阶段);企业账户可用余额是否充足;若返现则校验达人是否垫付买样;若有悬赏金额则校验是否为悬赏任务
  423. // 1) 校验企业账户余额是否充足
  424. entersize, err := db.GetEnterpriseByEnterpriseID(ctx, entersizeId)
  425. if err != nil {
  426. logrus.WithContext(ctx).Errorf("[sectask_service service] call GetEnterpriseByEnterpriseID error,err:%+v", err)
  427. return nil, err
  428. }
  429. if entersize.AvailableBalance < payMoney {
  430. return nil, errors.New("账户余额不足")
  431. }
  432. fmt.Println("余额充足")
  433. // 2) 若返现则校验达人是否垫付买样;若有悬赏金额则校验是否为悬赏任务
  434. selection, err := db.GetSelectionById(ctx, request.SelectionID)
  435. if err != nil {
  436. logrus.WithContext(ctx).Errorf("[sectask_service service] call GetSelectionById error,err:%+v", err)
  437. return nil, err
  438. }
  439. /*
  440. if selection.SampleMode != 2 && request.IsReturnMoney == 1 {
  441. return nil, errors.New("免费领养任务不能返样品钱")
  442. }
  443. */
  444. if selection.TaskMode != 1 && request.IsPayReward == 1 {
  445. return nil, errors.New("非悬赏任务不能支付悬赏")
  446. }
  447. fmt.Println("是悬赏任务")
  448. // 3) 校验任务是否处于待结算阶段
  449. secTask, err := db.GetSecTaskById(ctx, request.TaskID)
  450. if err != nil {
  451. logrus.WithContext(ctx).Errorf("[sectask_service service] call GetSecTaskById error,err:%+v", err)
  452. return nil, err
  453. }
  454. /*
  455. if secTask.TaskStage != 9 && secTask.TaskStatus != 2 {
  456. return nil, errors.New("该任务暂不可结算")
  457. }
  458. */
  459. if secTask.RewardStage != 1 && secTask.TaskStatus != 2 {
  460. return nil, errors.New("该任务暂不可结算")
  461. }
  462. fmt.Println("可结算")
  463. var product gorm_model.YounggeeProduct
  464. if err = json.Unmarshal([]byte(selection.ProductSnap), &product); err != nil {
  465. fmt.Println("Error:", err)
  466. return nil, err
  467. }
  468. // 4) 校验结算金额计算是否正确
  469. /*
  470. if request.IsReturnMoney == 1 {
  471. returnMoney = product.ProductPrice
  472. }
  473. if request.IsPayReward == 1 {
  474. rewardMoney, err = strconv.ParseFloat(selection.TaskReward, 64)
  475. if err != nil {
  476. logrus.WithContext(ctx).Errorf("[sectask_service service] call strconv.ParseFloat() error,err:%+v", err)
  477. return nil, err
  478. }
  479. }
  480. println("payMoney: ", payMoney)
  481. println("rewardMoney+returnMoney: ", rewardMoney+returnMoney)
  482. if rewardMoney+returnMoney != payMoney {
  483. return nil, errors.New("结算金额有误")
  484. }
  485. */
  486. // 3. 更新选品结算金额
  487. _, err = db.UpdateSelectionSettleMoney(ctx, selection.SelectionID, payMoney)
  488. if err != nil {
  489. logrus.WithContext(ctx).Errorf("[sectask_service service] call UpdateSelectionSettleMoney error,err:%+v", err)
  490. return nil, err
  491. }
  492. fmt.Println("已结算")
  493. // 4. 更新选品任务阶段
  494. updateSecTaskData := gorm_model.YounggeeSecTaskInfo{
  495. TaskID: request.TaskID,
  496. TaskStage: 10,
  497. RewardStage: 2,
  498. AssignmentStatus: 5,
  499. IsPayReward: request.IsPayReward,
  500. IsPayPayment: request.IsReturnMoney,
  501. CompleteDate: time.Now(),
  502. }
  503. _, err = db.UpdateSecTask(ctx, updateSecTaskData)
  504. if err != nil {
  505. logrus.WithContext(ctx).Errorf("[sectask_service service] call UpdateSecTask error,err:%+v", err)
  506. return nil, err
  507. }
  508. // 5. 添加任务日志和达人消息
  509. err = db.CreateTaskLog(ctx, request.TaskID, "结算时间")
  510. if err != nil {
  511. logrus.WithContext(ctx).Errorf("[sectask_service service] call CreateTaskLog error,err:%+v", err)
  512. return nil, err
  513. }
  514. err = db.CreateMessageBySecTaskId(ctx, 5, 1, request.TaskID)
  515. if err != nil {
  516. logrus.WithContext(ctx).Errorf("[sectask_service service] call CreateMessageBySecTaskId error,err:%+v", err)
  517. return nil, err
  518. }
  519. // 6. 创建选品收益记录
  520. // 返现收益
  521. /*
  522. t := time.Now()
  523. if request.IsReturnMoney == 1 {
  524. income := gorm_model.YounggeeTalentIncome{
  525. TalentID: secTask.TalentID,
  526. SelectionID: secTask.SelectionID,
  527. SectaskID: secTask.TaskID,
  528. BrandName: product.BrandName,
  529. TaskName: selection.SelectionName,
  530. Income: strconv.FormatFloat(returnMoney, 'f', 10, 32),
  531. IncomeType: 1,
  532. WithdrawStatus: 1,
  533. IncomeAt: &t,
  534. WithdrawAt: nil,
  535. }
  536. err = db.CreateIncome(ctx, income, nil)
  537. if err != nil {
  538. logrus.WithContext(ctx).Errorf("[sectask_service service] call CreateIncome error,err:%+v", err)
  539. return nil, err
  540. }
  541. }
  542. */
  543. // 悬赏收益
  544. t := time.Now()
  545. if request.IsPayReward == 1 {
  546. income := gorm_model.YounggeeTalentIncome{
  547. TalentID: secTask.TalentID,
  548. SelectionID: secTask.SelectionID,
  549. SectaskID: secTask.TaskID,
  550. BrandName: product.BrandName,
  551. TaskName: selection.SelectionName,
  552. Income: strconv.FormatFloat(payMoney, 'f', 10, 32),
  553. IncomeType: 1,
  554. WithdrawStatus: 1,
  555. IncomeAt: &t,
  556. WithdrawAt: nil,
  557. }
  558. err = db.CreateIncome(ctx, income, nil)
  559. if err != nil {
  560. logrus.WithContext(ctx).Errorf("[sectask_service service] call CreateIncome error,err:%+v", err)
  561. return nil, err
  562. }
  563. }
  564. fmt.Println("成功写入达人信息")
  565. // 7. 若有young之团存在,则为young之团创建收益
  566. settleSecTaskData := http_model.SettleSecTaskData{}
  567. // 8. 统计
  568. println("开始为每个带货子任务绑定免费领样策略")
  569. err1 := SelectionTask.UpdateStrategyId(ctx, request.SelectionID)
  570. nerr := SelectionTask.UpdateStrategyNumBySelectionId(ctx, request.SelectionID)
  571. fmt.Println(nerr, err1)
  572. println("完成为每个带货子任务绑定免费领样策略")
  573. return &settleSecTaskData, nil
  574. }