operate_credit_balance_logic.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. package credit_balance
  2. import (
  3. "context"
  4. "github.com/suyuan32/simple-admin-common/msg/errormsg"
  5. "github.com/suyuan32/simple-admin-core/rpc/types/core"
  6. "github.com/zeromicro/go-zero/core/errorx"
  7. "math"
  8. "wechat-api/ent"
  9. "wechat-api/ent/creditbalance"
  10. "wechat-api/internal/svc"
  11. "wechat-api/internal/types"
  12. "github.com/zeromicro/go-zero/core/logx"
  13. )
  14. type OperateCreditBalanceLogic struct {
  15. logx.Logger
  16. ctx context.Context
  17. svcCtx *svc.ServiceContext
  18. }
  19. func NewOperateCreditBalanceLogic(ctx context.Context, svcCtx *svc.ServiceContext) *OperateCreditBalanceLogic {
  20. return &OperateCreditBalanceLogic{
  21. Logger: logx.WithContext(ctx),
  22. ctx: ctx,
  23. svcCtx: svcCtx}
  24. }
  25. func (l *OperateCreditBalanceLogic) OperateCreditBalance(req *types.CreditBalanceOperateReq) (*types.BaseMsgResp, error) {
  26. isAdmin := l.ctx.Value("isAdmin").(bool)
  27. if !isAdmin {
  28. return nil, errorx.NewInvalidArgumentError("权限不足")
  29. }
  30. if req.Number == nil || *req.Number == 0 {
  31. return nil, errorx.NewInvalidArgumentError("Number参数非法")
  32. }
  33. _, err := l.svcCtx.CoreRpc.GetDepartmentById(l.ctx, &core.IDReq{Id: *req.OrganizationId})
  34. if err != nil {
  35. return nil, errorx.NewAlreadyExistsError("租户不存在")
  36. }
  37. creditBalance, err := l.svcCtx.DB.CreditBalance.Query().Where(creditbalance.OrganizationID(*req.OrganizationId)).Only(l.ctx)
  38. if err != nil && ent.IsNotFound(err) {
  39. creditBalance, err = l.svcCtx.DB.CreditBalance.Create().
  40. SetOrganizationID(*req.OrganizationId).
  41. SetBalance(0).
  42. Save(l.ctx)
  43. }
  44. var ntype int
  45. if *req.Number > 0 {
  46. ntype = 2
  47. } else {
  48. ntype = 1
  49. }
  50. userId := l.ctx.Value("userId").(string)
  51. tx, err := l.svcCtx.DB.Tx(context.Background())
  52. var beforeNumber, afterNumber float64
  53. if creditBalance == nil {
  54. beforeNumber = 0
  55. afterNumber = roundTo(*req.Number, 6)
  56. } else {
  57. beforeNumber = roundTo(creditBalance.Balance, 6)
  58. afterNumber = roundTo(beforeNumber, 6) + roundTo(*req.Number, 6)
  59. }
  60. l.Logger.Infof("number=%v beforeNumber=%v afterNumber=%v payNumber=%v\n",
  61. roundTo(*req.Number, 6),
  62. roundTo(beforeNumber, 6),
  63. roundTo(afterNumber, 6),
  64. roundTo(*req.PayNumber, 2),
  65. )
  66. _, err = tx.CreditUsage.Create().
  67. SetNumber(roundTo(*req.Number, 6)).
  68. SetNotNilPayMethod(req.PayMethod). //支付方式
  69. SetPayNumber(roundTo(*req.PayNumber, 2)). //支付金额
  70. SetNtype(ntype).
  71. SetNid(0).
  72. SetTable("").
  73. SetNotNilReason(req.Reason).
  74. SetNotNilOrganizationID(req.OrganizationId).
  75. SetOperator(userId).
  76. SetBeforeNumber(beforeNumber).
  77. SetAfterNumber(afterNumber).
  78. Save(l.ctx)
  79. if err != nil {
  80. l.Logger.Errorf("create credit_usage error:%v\n", err)
  81. _ = tx.Rollback()
  82. return nil, errorx.NewInvalidArgumentError("创建租户积分明细失败,请重试")
  83. }
  84. if *req.Number > 0 {
  85. if creditBalance == nil {
  86. _, err = l.svcCtx.DB.CreditBalance.Create().
  87. SetOrganizationID(*req.OrganizationId).
  88. SetBalance(roundTo(*req.Number, 6)).
  89. Save(l.ctx)
  90. if err != nil {
  91. l.Logger.Errorf("create credit_balance error:%v\n", err)
  92. _ = tx.Rollback()
  93. return nil, errorx.NewInvalidArgumentError("创建租户积分余额失败,请重试")
  94. }
  95. } else {
  96. _, err = l.svcCtx.DB.CreditBalance.Update().Where(creditbalance.OrganizationID(*req.OrganizationId)).SetBalance(creditBalance.Balance + roundTo(*req.Number, 6)).Save(l.ctx)
  97. if err != nil {
  98. l.Logger.Errorf("update credit_balance error:%v\n", err)
  99. _ = tx.Rollback()
  100. return nil, errorx.NewInvalidArgumentError("修改租户积分余额失败,请重试.")
  101. }
  102. }
  103. } else {
  104. _, err := l.svcCtx.DB.CreditBalance.Update().Where(creditbalance.OrganizationID(*req.OrganizationId)).SetBalance(creditBalance.Balance + *req.Number).Save(l.ctx)
  105. if err != nil {
  106. l.Logger.Errorf("update credit_balance error:%v\n", err)
  107. _ = tx.Rollback()
  108. return nil, errorx.NewInvalidArgumentError("修改租户积分余额失败,请重试...")
  109. }
  110. }
  111. _ = tx.Commit()
  112. return &types.BaseMsgResp{
  113. Code: 0,
  114. Msg: errormsg.Success,
  115. }, nil
  116. }
  117. func roundTo(num float64, precision int) float64 {
  118. scale := math.Pow(10, float64(precision))
  119. result := math.Round(num*scale) / scale
  120. return result
  121. }