project_pay.go 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. package service
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "github.com/gin-gonic/gin"
  8. "gorm.io/gorm"
  9. "strconv"
  10. "time"
  11. "youngee_m_api/db"
  12. "youngee_m_api/model/gorm_model"
  13. "youngee_m_api/model/http_model"
  14. "github.com/sirupsen/logrus"
  15. )
  16. var ProjectPay *projectPay
  17. type projectPay struct {
  18. }
  19. func (*projectPay) Pay(ctx context.Context, projectPay http_model.ProjectPayRequest, enterpriseId string) (*int64, error) {
  20. // 修改企业账户金额
  21. balance, err := db.UpdateEnterpriseBalance(ctx, enterpriseId, 0, -projectPay.PaySum, projectPay.PaySum)
  22. if err != nil {
  23. logrus.WithContext(ctx).Errorf("[projectPay service] call UpdateEnterpriseBalance error,err:%+v", err)
  24. return nil, err
  25. }
  26. // 修改项目状态为执行中
  27. err = db.UpdateProjectStatus(ctx, projectPay.ProjectID, 9)
  28. if err != nil {
  29. logrus.WithContext(ctx).Errorf("[projectPay service] call UpdateEnterpriseBalance error,err:%+v", err)
  30. return nil, err
  31. }
  32. // 插入支付记录
  33. recordId, err1 := db.CreatePayRecord(ctx, enterpriseId, projectPay.PaySum, *balance, 2, projectPay.ProjectID)
  34. if err1 != nil {
  35. logrus.WithContext(ctx).Errorf("[projectPay service] call CreatePayRecord error,err:%+v", err)
  36. return nil, err1
  37. }
  38. // 支付更新任务状态
  39. _, err2 := db.GetProjectDetail(ctx, projectPay.ProjectID)
  40. if err2 != nil {
  41. logrus.WithContext(ctx).Errorf("[project service] call GetPorjectDetail error,err:%+v", err)
  42. return nil, err2
  43. }
  44. err = db.UpdateTaskSelectAtByProjectId(ctx, projectPay.ProjectID, 2)
  45. if err != nil {
  46. logrus.WithContext(ctx).Errorf("[projectPay service] call UpdateTaskStatusPaying error,err:%+v", err)
  47. return nil, err
  48. }
  49. err = db.UpdateTaskStageByProjectId(ctx, projectPay.ProjectID, 2, 4)
  50. if err != nil {
  51. logrus.WithContext(ctx).Errorf("[projectPay service] call UpdateTaskStatusPaying error,err:%+v", err)
  52. return nil, err
  53. }
  54. // 插入消息-任务申请成功
  55. taskIds, err := db.GetTaskIds(ctx, projectPay.ProjectID) // 获取任务id列表
  56. if err != nil {
  57. logrus.WithContext(ctx).Errorf("[projectPay service] call GetTaskIds error,err:%+v", err)
  58. return nil, err
  59. }
  60. fmt.Printf("taskIds: %+v", taskIds)
  61. for _, taskId := range taskIds {
  62. err = db.CreateMessageByTaskId(ctx, 1, 1, taskId) // 插入消息
  63. if err != nil {
  64. logrus.WithContext(ctx).Errorf("[projectPay service] call CreateMessageByTaskId error,err:%+v", err)
  65. return nil, err
  66. }
  67. }
  68. return recordId, nil
  69. }
  70. func (p *projectPay) SpecialSettlePay(ctx *gin.Context, req *http_model.SpecialSettlePayRequest) error {
  71. DB := db.GetReadDB(ctx)
  72. err := DB.Transaction(func(tx *gorm.DB) error {
  73. projectInfo := gorm_model.ProjectInfo{}
  74. err := tx.Model(&gorm_model.ProjectInfo{}).Where("project_id = ?", req.ProjectID).First(&projectInfo).Error
  75. if err != nil {
  76. logrus.WithContext(ctx).Errorf("[projectPay service] call SpecialSettlePay error,err:%+v", err)
  77. return err
  78. }
  79. task := gorm_model.YoungeeTaskInfo{}
  80. err = tx.Model(&gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", req.TaskId).First(&task).Error
  81. if err != nil {
  82. logrus.WithContext(ctx).Errorf("[projectPay service] call SpecialSettlePay error,err:%+v", err)
  83. return err
  84. }
  85. // 校验账户余额是否充足
  86. var balance float64
  87. err = tx.Model(&gorm_model.Enterprise{}).Select("balance").Where("enterprise_id = ?", req.EnterPriseId).Find(&balance).Error
  88. if err != nil {
  89. logrus.WithContext(ctx).Errorf("[projectPay service] call SpecialSettlePay error,err:%+v", err)
  90. return err
  91. }
  92. realPay := req.Amount * 1.05
  93. if balance < realPay {
  94. return errors.New("余额不足")
  95. }
  96. err = tx.Model(&gorm_model.ProjectInfo{}).Where("project_id = ?", req.ProjectID).
  97. Updates(map[string]interface{}{"payment_amount": gorm.Expr("payment_amount + ?", req.Amount)}).Error
  98. if err != nil {
  99. logrus.WithContext(ctx).Errorf("[projectPay service] call SpecialSettlePay error,err:%+v", err)
  100. return err
  101. }
  102. //err = tx.Model(&gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", req.TaskId).Updates(gorm_model.YoungeeTaskInfo{
  103. // TaskReward: req.Amount,
  104. // SettleAmount: req.Amount,
  105. // AllPayment: req.Amount,
  106. // RealPayment: req.Amount,
  107. // SettleStatus: 2,
  108. //}).Error
  109. //if err != nil {
  110. // logrus.WithContext(ctx).Errorf("[projectPay service] call SpecialSettlePay error,err:%+v", err)
  111. // return err
  112. //}
  113. // 新:创建专项任务收益,更新任务阶段
  114. updateTaskData := gorm_model.YoungeeTaskInfo{
  115. TaskReward: req.Amount,
  116. SettleAmount: req.Amount,
  117. AllPayment: req.Amount,
  118. RealPayment: req.Amount,
  119. TaskId: req.TaskId,
  120. SettleStatus: 2,
  121. }
  122. _, err = db.UpdateTask(ctx, updateTaskData, tx)
  123. if err != nil {
  124. logrus.WithContext(ctx).Errorf("[projectPay service] call SpecialSettlePay error,err:%+v", err)
  125. return err
  126. }
  127. var productInfo gorm_model.YounggeeProduct
  128. if err = json.Unmarshal([]byte(projectInfo.ProductSnap), &productInfo); err != nil {
  129. fmt.Println("Error:", err)
  130. return err
  131. }
  132. t := time.Now()
  133. income := gorm_model.YounggeeTalentIncome{
  134. TalentID: task.TalentId,
  135. ProjectID: task.ProjectId,
  136. SectaskID: task.TaskId,
  137. BrandName: productInfo.BrandName,
  138. TaskName: projectInfo.ProjectName,
  139. Income: strconv.FormatFloat(req.Amount, 'f', 10, 32),
  140. IncomeType: 1,
  141. WithdrawStatus: 1,
  142. IncomeAt: &t,
  143. WithdrawAt: nil,
  144. }
  145. err = db.CreateIncome(ctx, income, tx)
  146. if err != nil {
  147. logrus.WithContext(ctx).Errorf("[projectPay service] call SpecialSettlePay error,err:%+v", err)
  148. return err
  149. }
  150. err = tx.Model(&gorm_model.Enterprise{}).Where("enterprise_id = ?", req.EnterPriseId).
  151. Updates(map[string]interface{}{"balance": gorm.Expr("balance - ?", realPay), "available_balance": gorm.Expr("available_balance - ?", realPay),
  152. "updated_at": time.Now()}).Error
  153. if err != nil {
  154. logrus.WithContext(ctx).Errorf("[projectPay service] call SpecialSettlePay error,err:%+v", err)
  155. return err
  156. }
  157. talentId := ""
  158. err = tx.Model(&gorm_model.YoungeeTaskInfo{}).Select("talent_id").Where("task_id = ?", req.TaskId).Find(&talentId).Error
  159. if err != nil {
  160. logrus.WithContext(ctx).Errorf("[projectPay service] call SpecialSettlePay error,err:%+v", err)
  161. return err
  162. }
  163. err = tx.Model(&gorm_model.YoungeeTalentInfo{}).Where("id = ?", talentId).
  164. Updates(map[string]interface{}{"income": gorm.Expr("income + ?", req.Amount), "canwithdraw": gorm.Expr("canwithdraw + ?", req.Amount)}).Error
  165. if err != nil {
  166. logrus.WithContext(ctx).Errorf("[projectPay service] call SpecialSettlePay error,err:%+v", err)
  167. return err
  168. }
  169. return nil
  170. })
  171. return err
  172. }