CustomScore.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <?php namespace App\Models;
  2. use App\Models\Score\Record;
  3. use Illuminate\Support\Facades\DB;
  4. use Illuminate\Database\Eloquent\Factories\HasFactory;
  5. use Illuminate\Database\Eloquent\Model;
  6. /**
  7. * 客户积分
  8. *
  9. */
  10. class CustomScore extends Model
  11. {
  12. use HasFactory;
  13. // 与模型关联的表名
  14. protected $table = 'custom_score';
  15. // 是否主动维护时间戳
  16. public $timestamps = false;
  17. // 定义时间戳字段名
  18. // const CREATED_AT = 'insert_time';
  19. // const UPDATED_AT = 'update_time';
  20. /**
  21. * 积分交易
  22. *
  23. *
  24. * @param int $uid 交易用户ID
  25. * @param int $orderId 订单ID
  26. * @param int $score 积分数量
  27. * @param int $buyType 交易类型
  28. * @param int $payType 支付方式
  29. * @param string $desc 支付描述
  30. *
  31. * @see App\Models\Traits\Score\BuyType
  32. *
  33. * */
  34. public function trade($uid,$orderId,$score,$buyType=1,$payType=1,$desc=''){
  35. // 返回支付ID 0 表示 无需支付
  36. if( !$score ) return 0;
  37. // 查询余额
  38. $balance = $this->getBalanceByUid($uid);
  39. // 判断是不是增减
  40. $scoreUpdate = ['score'=>DB::raw('score+'.$score),'update_time'=>time()];
  41. // 如果是扣减(因为扣减是负数,所以需要转成正数处理)
  42. if( $score < 0 ) {
  43. // 判断余额
  44. if( $balance < ($score*-1) ) return ['error'=>'积分不足'];
  45. // 结果
  46. $scoreUpdate['use_score'] = DB::raw('use_score+'.($score*-1));
  47. }
  48. // 积分记录
  49. $Record = (new Record());
  50. // 记录数据组合
  51. $payData['custom_uid'] = $uid;
  52. $payData['order_id'] = $orderId;
  53. $payData['status'] = 1;
  54. $payData['score'] = $score;
  55. $payData['balance'] = $balance + $score;
  56. $payData['buy_type'] = $buyType;
  57. $payData['description'] = $desc ? $desc :((string) $Record->getBuyType($buyType,'name'));
  58. $payData['pay_type'] = $payType;
  59. $payData['pay_time'] = time();
  60. // 减少用户的余额,增加用户余额支出
  61. $result = $this->updateCustomScore($uid,$scoreUpdate);
  62. // 如果支付失败
  63. if( !$result ) return ['error'=>'积分增减失败'];
  64. // 写入余额记录
  65. $payId = $Record->add($payData);
  66. // 如果支付失败
  67. if( !$payId ) ['error'=>'积分记录失败'];
  68. // 告知成功
  69. return $payId;
  70. }
  71. /**
  72. * 获取用户积分余额缓存key
  73. *
  74. * @param int $uid 用户ID
  75. *
  76. */
  77. private function getScoreCacheKey($uid){
  78. // 查询数据库获取数据
  79. $key = "custom:score:uid:".$uid;
  80. // 返回配置数据
  81. return $key;
  82. }
  83. /**
  84. * 获取用户积分余额信息
  85. *
  86. * @param int $uid 用户ID
  87. *
  88. */
  89. public function getBalanceByUid($uid){
  90. // 查询数据库获取数据
  91. $balance = $this->getCustomScore($uid);
  92. // 返回配置数据
  93. return isset($balance['score']) ? $balance['score'] : 0;
  94. }
  95. /**
  96. * 获取用户积分账户余额信息
  97. * 如果没有余额账户,将创建对应的账户
  98. *
  99. * @param int $uid 用户ID
  100. *
  101. * @return array 积分信息
  102. *
  103. */
  104. public function getCustomScore($uid){
  105. // 缓存key
  106. $key = $this->getScoreCacheKey($uid);
  107. // 从缓存读取
  108. $cash = cache($key,[]);
  109. // 如果缓存有值的话
  110. if( $cash ) return $cash;
  111. // 查询数据
  112. $cash = $this->query()->where([['custom_uid','=',$uid]])->first(['score','use_score']);
  113. // 如果没有数据,创建账号
  114. $cash = $cash ? $cash->toArray() : $this->createCustomScore($uid);
  115. // 存入缓存6小时
  116. cache([$key=>$cash],now()->addHours(6));
  117. // 返回查询结果
  118. return $cash;
  119. }
  120. /**
  121. * 修改用户积分账户数据
  122. *
  123. * @param int $uid 用户ID
  124. * @param array $editData 需要修改的数据
  125. *
  126. * @return mixed 修改结果
  127. *
  128. */
  129. public function updateCustomScore($uid,$editData=[]){
  130. // 尝试执行
  131. try {
  132. // 执行修改后返回数据
  133. $result = $this->query()->where([['custom_uid','=',$uid]])->update($editData);
  134. // 修改成功后,删除缓存
  135. if( $result ) cache([$this->getScoreCacheKey($uid)=>null],-5);
  136. // 返回结果
  137. return $result;
  138. } catch (\Throwable $th) {
  139. // 如果失败的话,返回默认数据
  140. return 0;
  141. }
  142. }
  143. /**
  144. * 创建账号
  145. *
  146. * @param int $uid 用户ID
  147. * @param array $values 需要修改的数据
  148. *
  149. */
  150. public function createCustomScore($uid){
  151. // 如果没有余额信息的话,需要新增账户,默认数据
  152. $cash = ['score'=>0,'use_score'=>0];
  153. // 尝试执行
  154. try {
  155. $result = $this->query()->insert(['custom_uid'=>$uid,'insert_time'=>time(),'update_time'=>time()]);
  156. // 如果成功
  157. if( $result ) return $cash;
  158. } catch (\Throwable $th) {
  159. // 如果失败的话,返回默认数据
  160. return $cash;
  161. }
  162. // 返回用户积分数据,默认都是账户积分为0
  163. return $cash;
  164. }
  165. }