deduction.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package service
  2. import (
  3. "errors"
  4. "strings"
  5. "time"
  6. . "app.yhyue.com/moapp/jybase/date"
  7. . "bp.jydev.jianyu360.cn/BaseService/resourceCenter/public/entity"
  8. )
  9. /*
  10. * 资源扣减
  11. * @param appid
  12. * @param function_code 功能代码
  13. * @param userId 用户id
  14. * @param entId 企业id
  15. * @param count 扣减数量
  16. * @param ids 业务id
  17. * @return 状态 0:失败 1:成功 -1:不在有效期内 -2:数量不足 -3:没有授权
  18. */
  19. func Deduction(appid, function_code string, user_id, ent_id int64, count int64, ids []string) (int64, error) {
  20. function := Base_function.FindByCode(appid, function_code)
  21. if function == nil {
  22. return 0, errors.New("功能原始表中没有找到该功能")
  23. }
  24. myPowers := Base_power.FindMyPower(appid, function_code, user_id, ent_id)
  25. if myPowers == nil || len(*myPowers) == 0 {
  26. return -1, errors.New("功能权益表中没有找到权益记录")
  27. }
  28. use_values, detail_values := []interface{}{}, [][]interface{}{}
  29. update := [][]interface{}{}
  30. surplus_count := int64(-1)
  31. deduct_count := count
  32. userId, entId := int64(0), int64(0)
  33. if function.Power_rule == 2 { //周期+数量
  34. my_surplus_count := int64(0)
  35. for _, v := range *myPowers {
  36. if v.Surplus_count <= 0 {
  37. continue
  38. }
  39. if deduct_count > 0 {
  40. if v.Power_type == 1 {
  41. userId = v.Power_ofid
  42. } else if v.Power_type == 2 {
  43. entId = v.Power_ofid
  44. } else {
  45. continue
  46. }
  47. this_deduct_count := deduct_count
  48. if v.Surplus_count >= deduct_count { //本次记录的数据足够扣减
  49. v.Surplus_count -= deduct_count
  50. deduct_count = 0
  51. } else { //本次不够扣减,把本次的扣完,进入下次扣减
  52. v.Surplus_count = 0
  53. this_deduct_count = v.Surplus_count
  54. deduct_count -= v.Surplus_count
  55. }
  56. update = append(update, []interface{}{v.Id, v.Surplus_count, NowFormat(Date_Full_Layout)})
  57. detail_values = append(detail_values, []interface{}{appid, v.Id, v.Surplus_count, this_deduct_count, NowFormat(Date_Full_Layout)})
  58. }
  59. my_surplus_count += v.Surplus_count
  60. }
  61. //剩余的总数成功完成了本次的扣减
  62. if deduct_count == 0 {
  63. surplus_count = my_surplus_count
  64. }
  65. } else if function.Power_rule == 3 { //周期+频率+数量
  66. for _, v := range *myPowers {
  67. use, err := Base_resource_use.FindLastOne(appid, function_code, user_id, ent_id, v.Power_type)
  68. if err != nil {
  69. return 0, errors.New("查询资源使用记录失败," + err.Error())
  70. }
  71. if use != nil {
  72. create_time, err := time.ParseInLocation(Date_Full_Layout, use.Create_time, time.Local)
  73. if err != nil {
  74. return 0, errors.New("资源充值/消耗表创建时间错误," + use.Create_time + "," + err.Error())
  75. }
  76. now := time.Now()
  77. if v.Limit_strategy == "1d" {
  78. if create_time.Year() == now.Year() && create_time.Month() == now.Month() && create_time.Day() == now.Day() {
  79. surplus_count = use.Surplus_count - count
  80. } else {
  81. surplus_count = v.Strategy_count - count
  82. }
  83. } else if v.Limit_strategy == "1m" {
  84. if create_time.Year() == now.Year() && create_time.Month() == now.Month() {
  85. surplus_count = use.Surplus_count - count
  86. } else {
  87. surplus_count = v.Strategy_count - count
  88. }
  89. } else {
  90. return 0, errors.New("limit_strategy格式错误," + v.Limit_strategy)
  91. }
  92. } else {
  93. surplus_count = v.Strategy_count - count
  94. }
  95. if v.Power_type == 1 {
  96. userId = v.Power_ofid
  97. } else if v.Power_type == 2 {
  98. entId = v.Power_ofid
  99. } else {
  100. continue
  101. }
  102. if surplus_count >= 0 {
  103. detail_values = append(detail_values, []interface{}{appid, v.Id, surplus_count, count, NowFormat(Date_Full_Layout)})
  104. break
  105. }
  106. }
  107. }
  108. if surplus_count < 0 {
  109. return -2, nil
  110. } else {
  111. use_values = append(use_values, appid, entId, userId, function_code, 0, surplus_count, count, strings.Join(ids, ","), NowFormat(Date_Full_Layout))
  112. }
  113. if len(use_values) > 0 && len(detail_values) > 0 && Base_resource_use.Deduction(use_values, detail_values, update) {
  114. return 1, nil
  115. }
  116. return 0, nil
  117. }