CustomAmount.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. <?php namespace App\Models;
  2. use App\Models\CustomAmountRecord as 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 CustomAmount extends Model
  11. {
  12. use HasFactory;
  13. // 与模型关联的表名
  14. protected $table = 'custom_amount';
  15. // 是否主动维护时间戳
  16. public $timestamps = false;
  17. // 定义时间戳字段名
  18. // const CREATED_AT = 'insert_time';
  19. // const UPDATED_AT = 'update_time';
  20. /**
  21. * 获取用户余额信息
  22. *
  23. * @param int $uid 用户ID
  24. *
  25. */
  26. public function getBalanceByUid($uid){
  27. // 查询数据库获取数据
  28. $balance = $this->getCustomAmount($uid);
  29. // 返回配置数据
  30. return isset($balance['amount']) ? $balance['amount'] : 0;
  31. }
  32. /**
  33. * 获取用户账户余额信息
  34. * 如果没有余额账户,将创建对应的账户
  35. *
  36. * @param int $uid 用户ID
  37. *
  38. * @return array 余额信息
  39. *
  40. */
  41. public function getCustomAmount($uid){
  42. // 查询数据
  43. $cash = $this->query()->where([['custom_uid','=',$uid]])->first(['amount','use_amount']);
  44. // 如果没有数据,创建账号
  45. $cash = $cash ? $cash->toArray() : $this->createCustomAmount($uid);
  46. // 返回查询结果
  47. return $cash;
  48. }
  49. /**
  50. * 创建账号
  51. *
  52. * @param int $uid 用户ID
  53. * @param array $values 需要修改的数据
  54. *
  55. */
  56. public function createCustomAmount($uid){
  57. // 如果没有余额信息的话,需要新增账户,默认数据
  58. $cash = ['amount'=>0,'use_amount'=>0];
  59. // 尝试执行
  60. try {
  61. $result = $this->query()->insert(['custom_uid'=>$uid,'insert_time'=>time(),'update_time'=>time()]);
  62. // 如果成功
  63. if( $result ) return $cash;
  64. } catch (\Throwable $th) {
  65. // 如果失败的话,返回默认数据
  66. return $cash;
  67. }
  68. // 返回用户余额数据,默认都是账户余额为0
  69. return $cash;
  70. }
  71. /**
  72. * 余额交易
  73. *
  74. * @param int $uid 用户ID
  75. * @param int $amount 金额
  76. * @param int $buyType 交易类型
  77. * @param int $payType 支付方式
  78. * @param string $desc 支付描述
  79. *
  80. *
  81. * */
  82. public function trade($uid,$transfer_bill_no,$amount,$buyType=1,$payType=1,$desc=''){
  83. // 返回支付ID 0 表示 无需支付
  84. if( !$amount ) return 0;
  85. // 查询余额
  86. $balance = $this->getBalanceByUid($uid);
  87. // 判断是不是增减
  88. $update = ['amount'=>DB::raw('amount+'.$amount),'update_time'=>time()];
  89. // 如果是扣减(因为扣减是负数,所以需要转成正数处理)
  90. if( $amount < 0 ) {
  91. // 判断余额
  92. if( $balance < ($amount*-1) ) return ['error'=>'余额不足'];
  93. // 结果
  94. $update['use_amount'] = DB::raw('use_amount+'.($amount*-1));
  95. }
  96. // 余额记录
  97. $Record = (new Record());
  98. // 记录数据组合
  99. $payData['custom_uid'] = $uid;
  100. $payData['transfer_bill_no']= $transfer_bill_no;
  101. $payData['prefix'] = 1;
  102. $payData['amount'] = $amount;
  103. $payData['balance'] = $balance + $amount;
  104. $payData['buy_type'] = $buyType;
  105. $payData['description'] = $desc ? $desc :((string) $Record->getBuyType($buyType,'name'));
  106. $payData['pay_type'] = $payType;
  107. $payData['pay_time'] = time();
  108. // 减少用户的余额,增加用户余额支出
  109. $result = $this->query()->where(['custom_uid'=>$uid])->update($update);
  110. // 如果支付失败
  111. if( !$result ) return ['error'=>'积分增减失败'];
  112. // 写入余额记录
  113. $payId = $Record->add($payData);
  114. // 如果失败
  115. if( !$payId ) ['error'=>'积分记录失败'];
  116. // 告知成功
  117. return $payId;
  118. }
  119. }