deductionlogic.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package logic
  2. import (
  3. "context"
  4. "fmt"
  5. "time"
  6. . "app.yhyue.com/moapp/jybase/date"
  7. . "bp.jydev.jianyu360.cn/BaseService/resourceCenter/rpc/internal/entity"
  8. "bp.jydev.jianyu360.cn/BaseService/resourceCenter/rpc/internal/svc"
  9. "bp.jydev.jianyu360.cn/BaseService/resourceCenter/rpc/pb"
  10. "github.com/zeromicro/go-zero/core/logx"
  11. )
  12. type DeductionLogic struct {
  13. ctx context.Context
  14. svcCtx *svc.ServiceContext
  15. logx.Logger
  16. }
  17. func NewDeductionLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DeductionLogic {
  18. return &DeductionLogic{
  19. ctx: ctx,
  20. svcCtx: svcCtx,
  21. Logger: logx.WithContext(ctx),
  22. }
  23. }
  24. //资源扣减
  25. func (l *DeductionLogic) Deduction(in *pb.DeductionReq) (*pb.Resp, error) {
  26. resp := &pb.Resp{}
  27. if in.Appid == "" {
  28. l.Error(fmt.Sprintf("%+v", in), "无效的参数appid")
  29. return resp, nil
  30. } else if in.FunctionCode == "" {
  31. l.Error(fmt.Sprintf("%+v", in), "无效的参数function_code")
  32. return resp, nil
  33. } else if in.Count <= 0 {
  34. l.Error(fmt.Sprintf("%+v", in), "无效的参数count")
  35. return resp, nil
  36. } else if in.UserId == 0 && in.EntId == 0 {
  37. l.Error(fmt.Sprintf("%+v", in), "无效的参数user_id、ent_id")
  38. return resp, nil
  39. }
  40. function := Base_function.FindByCode(in.Appid, in.FunctionCode)
  41. if function == nil {
  42. l.Error(fmt.Sprintf("%+v", in), "功能原始表中没有找到该功能")
  43. return resp, nil
  44. }
  45. myPowers := Base_power.FindMyPower(in.Appid, in.FunctionCode, in.UserId, in.EntId)
  46. if myPowers == nil || len(*myPowers) == 0 {
  47. resp.Status = -1
  48. l.Error(fmt.Sprintf("%+v", in), "功能权益表中没有找到权益记录")
  49. return resp, nil
  50. }
  51. use_values, detail_values := []interface{}{}, [][]interface{}{}
  52. update := [][]interface{}{}
  53. surplus_count := int64(-1)
  54. deduct_count := in.Count
  55. user_id, ent_id := int64(0), int64(0)
  56. if function.Power_rule == 2 { //周期+数量
  57. my_surplus_count := int64(0)
  58. for _, v := range *myPowers {
  59. if v.Surplus_count <= 0 {
  60. continue
  61. }
  62. if deduct_count > 0 {
  63. if v.Power_type == 1 {
  64. user_id = v.Power_ofid
  65. } else if v.Power_type == 2 {
  66. ent_id = v.Power_ofid
  67. } else {
  68. continue
  69. }
  70. this_deduct_count := deduct_count
  71. if v.Surplus_count >= deduct_count { //本次记录的数据足够扣减
  72. v.Surplus_count -= deduct_count
  73. deduct_count = 0
  74. } else { //本次不够扣减,把本次的扣完,进入下次扣减
  75. v.Surplus_count = 0
  76. this_deduct_count = v.Surplus_count
  77. deduct_count -= v.Surplus_count
  78. }
  79. update = append(update, []interface{}{v.Id, v.Surplus_count, NowFormat(Date_Full_Layout)})
  80. detail_values = append(detail_values, []interface{}{in.Appid, v.Id, v.Surplus_count, this_deduct_count, NowFormat(Date_Full_Layout)})
  81. }
  82. my_surplus_count += v.Surplus_count
  83. }
  84. //剩余的总数成功完成了本次的扣减
  85. if deduct_count == 0 {
  86. surplus_count = my_surplus_count
  87. }
  88. } else if function.Power_rule == 3 { //周期+频率+数量
  89. for _, v := range *myPowers {
  90. use, err := Base_resource_use.FindLastOne(in.Appid, in.FunctionCode, in.UserId, in.EntId, v.Power_type)
  91. if err != nil {
  92. l.Error(fmt.Sprintf("%+v", in), "查询资源使用记录失败", err)
  93. continue
  94. }
  95. if use != nil {
  96. create_time, err := time.ParseInLocation(Date_Full_Layout, use.Create_time, time.Local)
  97. if err != nil {
  98. l.Error(fmt.Sprintf("%+v", in), "资源充值/消耗表创建时间错误", create_time, err)
  99. continue
  100. }
  101. now := time.Now()
  102. if v.Limit_strategy == "1d" {
  103. if create_time.Year() == now.Year() && create_time.Month() == now.Month() && create_time.Day() == now.Day() {
  104. surplus_count = use.Surplus_count - in.Count
  105. } else {
  106. surplus_count = v.Strategy_count - in.Count
  107. }
  108. } else if v.Limit_strategy == "1m" {
  109. if create_time.Year() == now.Year() && create_time.Month() == now.Month() {
  110. surplus_count = use.Surplus_count - in.Count
  111. } else {
  112. surplus_count = v.Strategy_count - in.Count
  113. }
  114. } else {
  115. l.Error(fmt.Sprintf("%+v", in), "limit_strategy格式错误", v.Limit_strategy)
  116. continue
  117. }
  118. } else {
  119. surplus_count = v.Strategy_count - in.Count
  120. }
  121. if v.Power_type == 1 {
  122. user_id = v.Power_ofid
  123. } else if v.Power_type == 2 {
  124. ent_id = v.Power_ofid
  125. } else {
  126. continue
  127. }
  128. if surplus_count >= 0 {
  129. detail_values = append(detail_values, []interface{}{in.Appid, v.Id, surplus_count, in.Count, NowFormat(Date_Full_Layout)})
  130. break
  131. }
  132. }
  133. }
  134. if surplus_count < 0 {
  135. resp.Status = -2
  136. return resp, nil
  137. } else {
  138. use_values = append(use_values, in.Appid, ent_id, user_id, in.FunctionCode, 0, surplus_count, in.Count, NowFormat(Date_Full_Layout))
  139. }
  140. if len(use_values) > 0 && len(detail_values) > 0 && Base_resource_use.Deduction(use_values, detail_values, update) {
  141. resp.Status = 1
  142. return resp, nil
  143. }
  144. return resp, nil
  145. }