project_pay.go 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. package service
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "strconv"
  8. "time"
  9. "youngee_b_api/db"
  10. "youngee_b_api/model/gorm_model"
  11. "youngee_b_api/model/http_model"
  12. "github.com/gin-gonic/gin"
  13. "gorm.io/gorm"
  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. //if project.ProjectForm != 4 {
  55. // err = db.UpdateTaskStageByProjectId(ctx, projectPay.ProjectID, 2, 4)
  56. // if err != nil {
  57. // logrus.WithContext(ctx).Errorf("[projectPay service] call UpdateTaskStatusPaying error,err:%+v", err)
  58. // return nil, err
  59. // }
  60. //} else {
  61. // if project.ContentType == 1 {
  62. // err = db.UpdateTaskStageByProjectId(ctx, projectPay.ProjectID, 2, 9) //修改为待传初稿
  63. // if err != nil {
  64. // logrus.WithContext(ctx).Errorf("[projectPay service] call UpdateTaskStatusPaying error,err:%+v", err)
  65. // return nil, err
  66. // }
  67. // } else {
  68. // err = db.UpdateTaskStageByProjectId(ctx, projectPay.ProjectID, 2, 7) //修改为待传脚本
  69. // if err != nil {
  70. // logrus.WithContext(ctx).Errorf("[projectPay service] call UpdateTaskStatusPaying error,err:%+v", err)
  71. // return nil, err
  72. // }
  73. // }
  74. //}
  75. // 插入消息-任务申请成功
  76. taskIds, err := db.GetTaskIds(ctx, projectPay.ProjectID) // 获取任务id列表
  77. if err != nil {
  78. logrus.WithContext(ctx).Errorf("[projectPay service] call GetTaskIds error,err:%+v", err)
  79. return nil, err
  80. }
  81. fmt.Printf("taskIds: %+v", taskIds)
  82. for _, taskId := range taskIds {
  83. err = db.CreateMessageByTaskId(ctx, 1, 1, taskId) // 插入消息
  84. if err != nil {
  85. logrus.WithContext(ctx).Errorf("[projectPay service] call CreateMessageByTaskId error,err:%+v", err)
  86. return nil, err
  87. }
  88. }
  89. return recordId, nil
  90. }
  91. func (p *projectPay) SpecialSettlePay(ctx *gin.Context, req *http_model.SpecialSettlePayRequest) error {
  92. DB := db.GetReadDB(ctx)
  93. err := DB.Transaction(func(tx *gorm.DB) error {
  94. projectInfo := gorm_model.ProjectInfo{}
  95. err := tx.Model(&gorm_model.ProjectInfo{}).Where("project_id = ?", req.ProjectID).First(&projectInfo).Error
  96. if err != nil {
  97. logrus.WithContext(ctx).Errorf("[projectPay service] call SpecialSettlePay error,err:%+v", err)
  98. return err
  99. }
  100. task := gorm_model.YoungeeTaskInfo{}
  101. err = tx.Model(&gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", req.TaskId).First(&task).Error
  102. if err != nil {
  103. logrus.WithContext(ctx).Errorf("[projectPay service] call SpecialSettlePay error,err:%+v", err)
  104. return err
  105. }
  106. // 校验账户余额是否充足
  107. var balance float64
  108. err = tx.Model(&gorm_model.Enterprise{}).Select("balance").Where("enterprise_id = ?", req.EnterPriseId).Find(&balance).Error
  109. if err != nil {
  110. logrus.WithContext(ctx).Errorf("[projectPay service] call SpecialSettlePay error,err:%+v", err)
  111. return err
  112. }
  113. realPay := req.Amount * 1.05
  114. if balance < realPay {
  115. return errors.New("余额不足")
  116. }
  117. // 增加项目支付金额
  118. err = tx.Model(&gorm_model.ProjectInfo{}).Where("project_id = ?", req.ProjectID).
  119. Updates(map[string]interface{}{"payment_amount": gorm.Expr("payment_amount + ?", req.Amount)}).Error
  120. if err != nil {
  121. logrus.WithContext(ctx).Errorf("[projectPay service] call SpecialSettlePay error,err:%+v", err)
  122. return err
  123. }
  124. // 旧:更新专项任务收益
  125. // err = tx.Model(&gorm_model.YoungeeTaskInfo{}).Where("task_id = ?", req.TaskId).Updates(gorm_model.YoungeeTaskInfo{
  126. // TaskReward: req.Amount,
  127. // SettleAmount: req.Amount,
  128. // AllPayment: req.Amount,
  129. // RealPayment: req.Amount,
  130. // SettleStatus: 2,
  131. // WithdrawStatus: 2,
  132. // }).Error
  133. // if err != nil {
  134. // logrus.WithContext(ctx).Errorf("[projectPay service] call SpecialSettlePay error,err:%+v", err)
  135. // return err
  136. // }
  137. // 新:创建专项任务收益,更新任务阶段
  138. updateTaskData := gorm_model.YoungeeTaskInfo{
  139. TaskReward: req.Amount,
  140. SettleAmount: req.Amount,
  141. AllPayment: req.Amount,
  142. RealPayment: req.Amount,
  143. TaskID: req.TaskId,
  144. SettleStatus: 2,
  145. }
  146. _, err = db.UpdateTask(ctx, updateTaskData, tx)
  147. if err != nil {
  148. logrus.WithContext(ctx).Errorf("[projectPay service] call SpecialSettlePay error,err:%+v", err)
  149. return err
  150. }
  151. var productInfo gorm_model.YounggeeProduct
  152. if err = json.Unmarshal([]byte(projectInfo.ProductSnap), &productInfo); err != nil {
  153. fmt.Println("Error:", err)
  154. return err
  155. }
  156. income := gorm_model.YounggeeTalentIncome{
  157. TalentID: task.TalentID,
  158. ProjectID: task.ProjectID,
  159. SectaskID: task.TaskID,
  160. BrandName: productInfo.BrandName,
  161. TaskName: projectInfo.ProjectName,
  162. Income: strconv.FormatFloat(req.Amount, 'f', 10, 32),
  163. IncomeType: 1,
  164. WithdrawStatus: 1,
  165. IncomeAt: time.Now(),
  166. }
  167. err = db.CreateIncome(ctx, income, tx)
  168. if err != nil {
  169. logrus.WithContext(ctx).Errorf("[projectPay service] call SpecialSettlePay error,err:%+v", err)
  170. return err
  171. }
  172. // 扣除企业账户余额
  173. err = tx.Model(&gorm_model.Enterprise{}).Where("enterprise_id = ?", req.EnterPriseId).
  174. Updates(map[string]interface{}{"balance": gorm.Expr("balance - ?", realPay), "available_balance": gorm.Expr("available_balance - ?", realPay),
  175. "updated_at": time.Now()}).Error
  176. if err != nil {
  177. logrus.WithContext(ctx).Errorf("[projectPay service] call SpecialSettlePay error,err:%+v", err)
  178. return err
  179. }
  180. talentId := ""
  181. err = tx.Model(&gorm_model.YoungeeTaskInfo{}).Select("talent_id").Where("task_id = ?", req.TaskId).Find(&talentId).Error
  182. if err != nil {
  183. logrus.WithContext(ctx).Errorf("[projectPay service] call SpecialSettlePay error,err:%+v", err)
  184. return err
  185. }
  186. // 增加达人收益
  187. err = tx.Model(&gorm_model.YoungeeTalentInfo{}).Where("id = ?", talentId).
  188. Updates(map[string]interface{}{"income": gorm.Expr("income + ?", req.Amount), "canwithdraw": gorm.Expr("canwithdraw + ?", req.Amount)}).Error
  189. if err != nil {
  190. logrus.WithContext(ctx).Errorf("[projectPay service] call SpecialSettlePay error,err:%+v", err)
  191. return err
  192. }
  193. return nil
  194. })
  195. return err
  196. }