ScoreLogic.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. <?php
  2. namespace common\logic\user;
  3. use common\enums\StatusEnum;
  4. use common\enums\UserWalletEnum;
  5. use common\models\common\CapitalLog;
  6. use common\models\common\ScoreLog;
  7. use common\models\user\UserWallet;
  8. use common\traits\ErrorTrait;
  9. use Yii;
  10. use Exception;
  11. /**
  12. *
  13. */
  14. class ScoreLogic
  15. {
  16. use ErrorTrait;
  17. public static function userTodayCanCashNum($mall_id,$user_id): array
  18. {
  19. try{
  20. $setting = \Yii::$app->services->setting->mall->get($mall_id, 'score');
  21. $user_score_info = UserWallet::getOne([['user_id' => $user_id, 'status' => StatusEnum::ENABLED]], true, [], false, 'score');
  22. $user_score = $user_score_info['score'] ?? 0;
  23. if(!$setting['score_cash_radio']) throw new Exception('积分提现比例未设置');
  24. //查询用户今天0点时有多少
  25. $last_log = ScoreLog::find()->where(['user_id' => $user_id,'mall_id'=>$mall_id])->andWhere(['<=', 'created_at', strtotime(date('Y-m-d'))])->orderBy('id desc')->asArray()->one();
  26. $last_num = 0;
  27. if($last_log){
  28. if($last_log['change_type'] == 'add'){
  29. $last_num = bcadd($last_log['change_num'],$last_log['current_num'],2);
  30. }else{
  31. $last_num = bcsub($last_log['current_num'],$last_log['change_num'],2);
  32. }
  33. $last_num = max(0,$last_num);
  34. }
  35. $score_cash_today_limit = $setting['score_cash_today_limit'] ?? 0;
  36. if($score_cash_today_limit > 0){
  37. //今天的最大提现数量
  38. $max_num = bcmul($last_num,$score_cash_today_limit/100,2);
  39. }else{
  40. //设置为0,不限制每天可提现的积分不超过当天00:00所持有积分的
  41. $max_num = $user_score;
  42. }
  43. //每日提现上限:单位[元]
  44. $today_cash_num = 0;
  45. $score_cash_day_max_money = $setting['score_cash_day_max_money'] ?? 0;
  46. if($score_cash_day_max_money > 0){
  47. //换算成积分
  48. $cash_day_max = bcmul($score_cash_day_max_money,$setting['score_cash_radio'],2);
  49. $max_num = min($max_num,$cash_day_max,$user_score);
  50. //查看用户今天提现了多少
  51. $today_cash_num = ScoreLog::find()->where([
  52. 'user_id' => $user_id,
  53. 'mall_id'=>$mall_id,
  54. 'change_type'=> CapitalLog::CHANGE_TYPE_SUB,
  55. 'from_type' => UserWalletEnum::WITHDRAWAL,
  56. ])->andWhere(['>=', 'created_at', strtotime(date('Y-m-d'))])->sum('change_num') ?? 0;
  57. $today_cash_fail_num = ScoreLog::find()->where([
  58. 'user_id' => $user_id,
  59. 'mall_id'=>$mall_id,
  60. 'change_type'=> CapitalLog::CHANGE_TYPE_ADD,
  61. 'from_type' => UserWalletEnum::WITHDRAWAL,
  62. 'capital_type' => UserWalletEnum::WITHDRAWAL_REFUND,
  63. ])->andWhere(['>=', 'created_at', strtotime(date('Y-m-d'))])->sum('change_num') ?? 0;
  64. $today_cash_num = bcsub($today_cash_num,$today_cash_fail_num,2);
  65. }
  66. $can_cash_num = bcsub($max_num,$today_cash_num,2);
  67. $can_cash_num = max(0,$can_cash_num);
  68. //转换成金额
  69. $can_cash_price = bcdiv($can_cash_num,$setting['score_cash_radio'],2);
  70. return [
  71. 'can_cash_num' => $can_cash_num,
  72. 'can_cash_price' => $can_cash_price,
  73. ];
  74. }catch (Exception $e){
  75. //echo $e->getMessage();exit;
  76. return [
  77. 'can_cash_num' => 0,
  78. 'can_cash_price' => 0
  79. ];
  80. }
  81. }
  82. public static function checkUserCash($mall_id,$user_id,$score_num)
  83. {
  84. $can = self::userTodayCanCashNum($mall_id,$user_id);
  85. if($score_num > $can['can_cash_num']){
  86. self::$static_error = '今日可提现积分不足';
  87. return false;
  88. }
  89. $setting = \Yii::$app->services->setting->mall->get($mall_id, 'score');
  90. return bcdiv($score_num,$setting['score_cash_radio'],2);
  91. }
  92. }