sectask.go 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. package sectask_service
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "github.com/issue9/conv"
  8. "github.com/sirupsen/logrus"
  9. "strconv"
  10. "time"
  11. "youngee_b_api/db"
  12. "youngee_b_api/model/gorm_model"
  13. "youngee_b_api/model/http_model"
  14. )
  15. var SelectionTask *selectionTask
  16. type selectionTask struct {
  17. }
  18. func (*selectionTask) GetList(ctx context.Context, request http_model.GetSecTaskListRequest) (*http_model.GetSecTaskListData, error) {
  19. // sec_task:任务id、帐号昵称、粉丝数、收货地址、主页截图、主页链接、确认时间、申请时间、结算时间
  20. // youngee_task_logistics: 物流公司、物流单号、发货时间、探店时间
  21. // younggee_assignment_info:数据截图、作业链接
  22. // selection_info: 返现金额、悬赏金额
  23. // 1. 根据选品任务阶段、账号昵称or任务id查询任务基本信息(包括任务id、账号昵称、粉丝数、主页截图、主页链接、申请时间)
  24. secTaskList, total, err := db.GetSecTaskList(ctx, request.SelectionId, request.SecTaskStatus, request.SearchValue, request.SaleNumMin, request.SaleNumMax, request.PageSize, request.PageNum, request.OrderBy, request.OrderDesc)
  25. if err != nil {
  26. logrus.WithContext(ctx).Errorf("[sectask_service service] call GetSecTaskList error,err:%+v", err)
  27. return nil, err
  28. }
  29. // 2. 根据不同查询类型查询补充信息
  30. switch request.Type {
  31. case 1: // 确定达人查询
  32. // 确定达人不需要额外信息
  33. break
  34. case 2: // 发货管理查询 youngee_task_logistics
  35. //发货管理根据任务阶段和商品类型查询物流信息
  36. // 查询商品类型
  37. product, err := db.GetProductType(ctx, request.SelectionId)
  38. if err != nil {
  39. logrus.WithContext(ctx).Errorf("[sectask_service service] call GetAllSelection error,err:%+v", err)
  40. return nil, err
  41. }
  42. secTaskList, err = db.GetSecTaskLogisticsList(ctx, secTaskList, request.SecTaskStatus, *product)
  43. if err != nil {
  44. logrus.WithContext(ctx).Errorf("[sectask_service service] call GetSecTaskLogisticsList error,err:%+v", err)
  45. return nil, err
  46. }
  47. break
  48. case 3: // 结算管理查询 younggee_assignment_info
  49. secTaskList, err = db.GetSecTaskSettleList(ctx, secTaskList, request.SelectionId, request.SecTaskStatus)
  50. if err != nil {
  51. logrus.WithContext(ctx).Errorf("[sectask_service service] call GetSecTaskSettleList error,err:%+v", err)
  52. return nil, err
  53. }
  54. break
  55. default: // 参数有误
  56. break
  57. }
  58. selectionListData := http_model.GetSecTaskListData{
  59. Total: conv.MustString(total, ""),
  60. SecTaskList: secTaskList,
  61. }
  62. return &selectionListData, nil
  63. }
  64. func (*selectionTask) PassCoop(ctx context.Context, request http_model.PassSecTaskCoopRequest) (*http_model.PassSecTaskCoopData, int, error) {
  65. tag, err := db.PassSecTaskCoop(ctx, request.SelectionId, request.TaskIds, request.EnterpriseId, request.SubAccountId)
  66. if err != nil {
  67. logrus.WithContext(ctx).Errorf("[sectask_service service] call PassCoop error,err:%+v", err)
  68. if tag == true {
  69. return nil, 1, err
  70. }
  71. return nil, 2, err
  72. }
  73. selectionListData := http_model.PassSecTaskCoopData{}
  74. return &selectionListData, 0, nil
  75. }
  76. func (*selectionTask) RefuseCoop(ctx context.Context, request http_model.RefuseSecTaskCoopRequest) (*http_model.RefuseSecTaskCoopData, error) {
  77. _, err := db.RefuseSecTaskCoop(ctx, request.TaskIds, request.EnterpriseId, request.SubAccountId)
  78. if err != nil {
  79. logrus.WithContext(ctx).Errorf("[sectask_service service] call RefuseCoop error,err:%+v", err)
  80. return nil, err
  81. }
  82. selectionListData := http_model.RefuseSecTaskCoopData{}
  83. return &selectionListData, nil
  84. }
  85. func (*selectionTask) Settle(ctx context.Context, entersizeId string, request http_model.SettleSecTaskRequest) (*http_model.SettleSecTaskData, error) {
  86. // 1. 解析request data
  87. var returnMoney float64 = 0.0
  88. var rewardMoney float64 = 0.0
  89. payMoney, err := strconv.ParseFloat(request.TotalPayMoney, 64)
  90. if err != nil {
  91. logrus.WithContext(ctx).Errorf("[sectask_service service] call strconv.ParseFloat() error,err:%+v", err)
  92. return nil, err
  93. }
  94. // 2. 校验:任务是否正常(处于待结算阶段);企业账户可用余额是否充足;若返现则校验达人是否垫付买样;若有悬赏金额则校验是否为悬赏任务
  95. // 1) 校验企业账户余额是否充足
  96. entersize, err := db.GetEnterpriseByEnterpriseID(ctx, entersizeId)
  97. if err != nil {
  98. logrus.WithContext(ctx).Errorf("[sectask_service service] call GetEnterpriseByEnterpriseID error,err:%+v", err)
  99. return nil, err
  100. }
  101. if entersize.AvailableBalance < payMoney {
  102. return nil, errors.New("账户余额不足")
  103. }
  104. // 2) 若返现则校验达人是否垫付买样;若有悬赏金额则校验是否为悬赏任务
  105. selection, err := db.GetSelectionById(ctx, request.SelectionID)
  106. if err != nil {
  107. logrus.WithContext(ctx).Errorf("[sectask_service service] call GetSelectionById error,err:%+v", err)
  108. return nil, err
  109. }
  110. if selection.SampleMode != 2 && request.IsReturnMoney == 1 {
  111. return nil, errors.New("免费领养任务不能返样品钱")
  112. }
  113. if selection.TaskMode != 1 && request.IsPayReward == 1 {
  114. return nil, errors.New("非悬赏任务不能支付悬赏")
  115. }
  116. // 3) 校验任务是否处于待结算阶段
  117. secTask, err := db.GetSecTaskById(ctx, request.TaskID)
  118. if err != nil {
  119. logrus.WithContext(ctx).Errorf("[sectask_service service] call GetSecTaskById error,err:%+v", err)
  120. return nil, err
  121. }
  122. if secTask.TaskStage != 9 && secTask.TaskStatus != 2 {
  123. return nil, errors.New("该任务暂不可结算")
  124. }
  125. var product gorm_model.YounggeeProduct
  126. if err = json.Unmarshal([]byte(selection.ProductSnap), &product); err != nil {
  127. fmt.Println("Error:", err)
  128. return nil, err
  129. }
  130. // 4) 校验结算金额计算是否正确
  131. if request.IsReturnMoney == 1 {
  132. returnMoney = product.ProductPrice
  133. }
  134. if request.IsPayReward == 1 {
  135. rewardMoney, err = strconv.ParseFloat(selection.TaskReward, 64)
  136. if err != nil {
  137. logrus.WithContext(ctx).Errorf("[sectask_service service] call strconv.ParseFloat() error,err:%+v", err)
  138. return nil, err
  139. }
  140. }
  141. if rewardMoney+returnMoney != payMoney {
  142. return nil, errors.New("结算金额有误")
  143. }
  144. // 3. 更新选品结算金额
  145. _, err = db.UpdateSelectionSettleMoney(ctx, selection.SelectionID, payMoney)
  146. if err != nil {
  147. logrus.WithContext(ctx).Errorf("[sectask_service service] call UpdateSelectionSettleMoney error,err:%+v", err)
  148. return nil, err
  149. }
  150. // 4. 更新选品任务阶段
  151. updateSecTaskData := gorm_model.YounggeeSecTaskInfo{
  152. TaskID: request.TaskID,
  153. TaskStage: 10,
  154. AssignmentStatus: 5,
  155. IsPayReward: request.IsPayReward,
  156. IsPayPayment: request.IsReturnMoney,
  157. CompleteDate: time.Now(),
  158. }
  159. _, err = db.UpdateSecTask(ctx, updateSecTaskData)
  160. if err != nil {
  161. logrus.WithContext(ctx).Errorf("[sectask_service service] call UpdateSecTask error,err:%+v", err)
  162. return nil, err
  163. }
  164. // 5. 添加任务日志和达人消息
  165. err = db.CreateTaskLog(ctx, request.TaskID, "结算时间")
  166. if err != nil {
  167. logrus.WithContext(ctx).Errorf("[sectask_service service] call CreateTaskLog error,err:%+v", err)
  168. return nil, err
  169. }
  170. err = db.CreateMessageBySecTaskId(ctx, 5, 1, request.TaskID)
  171. if err != nil {
  172. logrus.WithContext(ctx).Errorf("[sectask_service service] call CreateMessageBySecTaskId error,err:%+v", err)
  173. return nil, err
  174. }
  175. // 6. 创建选品收益记录
  176. // 返现收益
  177. var productPhotoStruct []gorm_model.YounggeeProductPhoto
  178. if err = json.Unmarshal([]byte(selection.ProductPhotoSnap), &productPhotoStruct); err != nil {
  179. fmt.Println("Error:", err)
  180. return nil, err
  181. }
  182. var mainPhoto = ""
  183. for _, w := range productPhotoStruct {
  184. if w.Symbol == 1 {
  185. mainPhoto = w.PhotoUrl
  186. }
  187. }
  188. t := time.Now()
  189. if request.IsReturnMoney == 1 {
  190. income := gorm_model.YounggeeTalentIncome{
  191. TalentID: secTask.TalentID,
  192. SelectionID: secTask.SelectionID,
  193. SectaskID: secTask.TaskID,
  194. Type: 2,
  195. BrandName: product.BrandName,
  196. TaskName: selection.SelectionName,
  197. PhotoUrl: mainPhoto,
  198. Income: strconv.FormatFloat(returnMoney, 'f', 10, 32),
  199. IncomeType: 3,
  200. WithdrawStatus: 1,
  201. IncomeAt: &t,
  202. WithdrawAt: nil,
  203. }
  204. err = db.CreateIncome(ctx, income, nil)
  205. if err != nil {
  206. logrus.WithContext(ctx).Errorf("[sectask_service service] call CreateIncome error,err:%+v", err)
  207. return nil, err
  208. }
  209. }
  210. // 悬赏收益
  211. if request.IsPayReward == 1 {
  212. income := gorm_model.YounggeeTalentIncome{
  213. TalentID: secTask.TalentID,
  214. SelectionID: secTask.SelectionID,
  215. SectaskID: secTask.TaskID,
  216. Type: 2,
  217. BrandName: product.BrandName,
  218. TaskName: selection.SelectionName,
  219. PhotoUrl: mainPhoto,
  220. Income: strconv.FormatFloat(rewardMoney, 'f', 10, 32),
  221. IncomeType: 4,
  222. WithdrawStatus: 1,
  223. IncomeAt: &t,
  224. WithdrawAt: nil,
  225. }
  226. err = db.CreateIncome(ctx, income, nil)
  227. if err != nil {
  228. logrus.WithContext(ctx).Errorf("[sectask_service service] call CreateIncome error,err:%+v", err)
  229. return nil, err
  230. }
  231. }
  232. // 7. 若有young之团存在,则为young之团创建收益
  233. settleSecTaskData := http_model.SettleSecTaskData{}
  234. return &settleSecTaskData, nil
  235. }