Wallet.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <?php
  2. namespace app\common\model;
  3. use com\Pay\Pay;
  4. use think\Model;
  5. use think\Db;
  6. /**
  7. * 货币模型
  8. */
  9. class Wallet extends Model
  10. {
  11. /**
  12. * 获取交易类型配置
  13. * @return mixed
  14. */
  15. public function getlogtype($type = '')
  16. {
  17. $conf = config('wallet.logtype');
  18. if($type){
  19. return $conf[$type] ?: $type;
  20. }
  21. return $conf;
  22. }
  23. //获取钱包名称
  24. public function getwalletname($name = ''){
  25. $conf = config('wallet.moneyname');
  26. if($name){
  27. return $conf[$name] ?: $name;
  28. }
  29. return $conf;
  30. }
  31. /**
  32. * 获取钱包余额
  33. * @param string $username 用户编号
  34. * @param string $wallet_name 指定钱包名
  35. * @return array|float
  36. */
  37. public function getWallet($user_id = '', $wallet_name = '')
  38. {
  39. //所有钱包余额
  40. $wallet = Db::name('user_wallet')->lock(true)->where(['user_id' => $user_id])->find();
  41. if(!$wallet) {
  42. abort(500,'钱包余额获取失败');
  43. }
  44. if($wallet_name) { //返回指定钱包
  45. return isset($wallet[$wallet_name]) ? $wallet[$wallet_name] : 0;
  46. } else { //返回所有钱包
  47. return $wallet;
  48. }
  49. }
  50. /**
  51. *
  52. * @param floatval $number 金额(正数进账,负数出账)
  53. * @param $accountType 货币类型,money,score
  54. * @param $logtype 日志的类型
  55. * @param $remark 备注
  56. * @param $user_id 用户id
  57. * @param $table 来源表
  58. * @param $data_id 表id
  59. * @param $isAdmin 是否是管理员处理
  60. * @return array
  61. * @return array[status]
  62. * @return array[msg]
  63. * @return array[log_table]
  64. * @return array[log_id]
  65. */
  66. public function lockChangeAccountRemain($user_id,$accountType='money',$number,$logtype='',$remark='',$table='',$table_id=0,$isAdmin=false)
  67. {
  68. //初始化
  69. $result = array(
  70. 'status'=>false,
  71. 'msg'=>'',
  72. 'log_table' => '',
  73. 'log_id' => '',
  74. );
  75. //获取小数点
  76. $point = $accountType == 'money' ? 2 : 0;
  77. bcscale($point);
  78. //钱包名称
  79. $wallet_name = $this->getwalletname($accountType);
  80. //检测
  81. $number = floatval( $number );
  82. if( $number == 0 )
  83. {
  84. $result['msg'] = '交易金额:0';
  85. return $result;
  86. }
  87. if(0 === bccomp($number, 0)){
  88. $result['msg'] = '交易金额:0';
  89. return $result;
  90. }
  91. //检测
  92. $wallet = Db::name('user_wallet')->lock(true)->where(['user_id'=>$user_id])->find();
  93. if(!$wallet)
  94. {
  95. $result['msg'] = '不存在的用户';
  96. return $result;
  97. }
  98. if(bccomp(bcadd($wallet[$accountType], $number), 0) === -1)
  99. {
  100. $result['msg'] = $wallet_name.'余额不足!';
  101. return $result;
  102. }
  103. else
  104. {
  105. if(0 !== bccomp($number, 0))
  106. {
  107. //钱币记录
  108. $data = array();
  109. $data['user_id'] = $user_id;
  110. $data['log_type'] = $logtype;
  111. $data['money_type'] = $accountType;
  112. $data['change_value'] = $number;
  113. $data['remain'] = bcadd($wallet[$accountType], $number);
  114. $data['table'] = $table;
  115. $data['table_id'] = $table_id;
  116. $data['remark'] = $remark;
  117. $data['createtime'] = time();
  118. $data['updatetime'] = time();
  119. //新的方式
  120. if(bccomp($number, 0) === 1){
  121. $rs1 = Db::name('user_wallet')->where(['user_id'=>$user_id])->setInc($accountType,$number);
  122. }else{
  123. $rs1 = Db::name('user_wallet')->where(['user_id'=>$user_id])->setDec($accountType,abs($number));
  124. }
  125. /////////////
  126. $rs2_id = Db::name('user_wallet_log')->insertGetId($data);
  127. if( $rs1 && $rs2_id )
  128. {
  129. //金额变动
  130. /*$params = [
  131. 'msg' => '您的钱包['.$wallet_name.']有变化,请注意查看',
  132. 'description' => '您的钱包['.$wallet_name.']有变化:'.$number.'剩余:'.$data['remain'],
  133. 'content' => '您的钱包['.$wallet_name.']有变化:'.$number.',剩余:'.$data['remain'].',备注:'.$remark,
  134. 'user_id' => $user_id,
  135. 'status' => 1,
  136. 'comefrom' => '系统',
  137. 'type' => '钱包',
  138. 'createtime' => time(),
  139. 'important' => 3,
  140. ];
  141. Db::name('system_msg')->insertGetId($params);*/
  142. $result['status'] = true;
  143. $result['msg'] = '账户余额已更新!';
  144. $result['log_table'] = $accountType.'_log';
  145. $result['log_id'] = $rs2_id;
  146. return $result;
  147. }
  148. else
  149. {
  150. $result['msg'] = '更新财务记录失败!';
  151. return $result;
  152. }
  153. } else {
  154. $result['msg'] = '金额不足0.01';
  155. return $result;
  156. }
  157. }
  158. }
  159. }