123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- <?php namespace App\Models;
- use App\Models\Score\Record;
- use Illuminate\Support\Facades\DB;
- use Illuminate\Database\Eloquent\Factories\HasFactory;
- use Illuminate\Database\Eloquent\Model;
- /**
- * 客户积分
- *
- */
- class CustomScore extends Model
- {
- use HasFactory;
- // 与模型关联的表名
- protected $table = 'custom_score';
- // 是否主动维护时间戳
- public $timestamps = false;
- // 定义时间戳字段名
- // const CREATED_AT = 'insert_time';
- // const UPDATED_AT = 'update_time';
- /**
- * 积分交易
- *
- *
- * @param int $uid 交易用户ID
- * @param int $orderId 订单ID
- * @param int $score 积分数量
- * @param int $buyType 交易类型
- * @param int $payType 支付方式
- * @param string $desc 支付描述
- *
- * @see App\Models\Traits\Score\BuyType
- *
- * */
- public function trade($uid,$orderId,$score,$buyType=1,$payType=1,$desc=''){
- // 返回支付ID 0 表示 无需支付
- if( !$score ) return 0;
- // 查询余额
- $balance = $this->getBalanceByUid($uid);
- // 判断是不是增减
- $scoreUpdate = ['score'=>DB::raw('score+'.$score),'update_time'=>time()];
- // 如果是扣减(因为扣减是负数,所以需要转成正数处理)
- if( $score < 0 ) {
- // 判断余额
- if( $balance < ($score*-1) ) return ['error'=>'积分不足'];
- // 结果
- $scoreUpdate['use_score'] = DB::raw('use_score+'.($score*-1));
- }
- // 积分记录
- $Record = (new Record());
- // 记录数据组合
- $payData['custom_uid'] = $uid;
- $payData['order_id'] = $orderId;
- $payData['status'] = 1;
- $payData['score'] = $score;
- $payData['balance'] = $balance + $score;
- $payData['buy_type'] = $buyType;
- $payData['description'] = $desc ? $desc :((string) $Record->getBuyType($buyType,'name'));
- $payData['pay_type'] = $payType;
- $payData['pay_time'] = time();
- // 减少用户的余额,增加用户余额支出
- $result = $this->updateCustomScore($uid,$scoreUpdate);
- // 如果支付失败
- if( !$result ) return ['error'=>'积分增减失败'];
- // 写入余额记录
- $payId = $Record->add($payData);
- // 如果支付失败
- if( !$payId ) ['error'=>'积分记录失败'];
- // 告知成功
- return $payId;
- }
- /**
- * 获取用户积分余额缓存key
- *
- * @param int $uid 用户ID
- *
- */
- private function getScoreCacheKey($uid){
- // 查询数据库获取数据
- $key = "custom:score:uid:".$uid;
- // 返回配置数据
- return $key;
- }
- /**
- * 获取用户积分余额信息
- *
- * @param int $uid 用户ID
- *
- */
- public function getBalanceByUid($uid){
- // 查询数据库获取数据
- $balance = $this->getCustomScore($uid);
- // 返回配置数据
- return isset($balance['score']) ? $balance['score'] : 0;
- }
- /**
- * 获取用户积分账户余额信息
- * 如果没有余额账户,将创建对应的账户
- *
- * @param int $uid 用户ID
- *
- * @return array 积分信息
- *
- */
- public function getCustomScore($uid){
- // 缓存key
- $key = $this->getScoreCacheKey($uid);
- // 从缓存读取
- $cash = cache($key,[]);
- // 如果缓存有值的话
- if( $cash ) return $cash;
- // 查询数据
- $cash = $this->query()->where([['custom_uid','=',$uid]])->first(['score','use_score']);
- // 如果没有数据,创建账号
- $cash = $cash ? $cash->toArray() : $this->createCustomScore($uid);
- // 存入缓存6小时
- cache([$key=>$cash],now()->addHours(6));
- // 返回查询结果
- return $cash;
- }
- /**
- * 修改用户积分账户数据
- *
- * @param int $uid 用户ID
- * @param array $editData 需要修改的数据
- *
- * @return mixed 修改结果
- *
- */
- public function updateCustomScore($uid,$editData=[]){
- // 尝试执行
- try {
- // 执行修改后返回数据
- $result = $this->query()->where([['custom_uid','=',$uid]])->update($editData);
- // 修改成功后,删除缓存
- if( $result ) cache([$this->getScoreCacheKey($uid)=>null],-5);
- // 返回结果
- return $result;
- } catch (\Throwable $th) {
- // 如果失败的话,返回默认数据
- return 0;
- }
- }
- /**
- * 创建账号
- *
- * @param int $uid 用户ID
- * @param array $values 需要修改的数据
- *
- */
- public function createCustomScore($uid){
- // 如果没有余额信息的话,需要新增账户,默认数据
- $cash = ['score'=>0,'use_score'=>0];
- // 尝试执行
- try {
- $result = $this->query()->insert(['custom_uid'=>$uid,'insert_time'=>time(),'update_time'=>time()]);
- // 如果成功
- if( $result ) return $cash;
- } catch (\Throwable $th) {
- // 如果失败的话,返回默认数据
- return $cash;
- }
- // 返回用户积分数据,默认都是账户积分为0
- return $cash;
- }
- }
|