UserMoney.php 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. <?php
  2. namespace app\models\user;
  3. use crmeb\traits\ModelTrait;
  4. use crmeb\basic\BaseModel;
  5. use think\db\exception\DataNotFoundException;
  6. use think\db\exception\DbException;
  7. use think\db\exception\ModelNotFoundException;
  8. use think\Model;
  9. class UserMoney extends BaseModel
  10. {
  11. /**
  12. * 数据表主键
  13. * @var string
  14. */
  15. protected $pk = 'id';
  16. /**
  17. * 模型名称
  18. * @var string
  19. */
  20. protected $name = 'user_money';
  21. use ModelTrait;
  22. /**
  23. * @param $uid
  24. * @param $money_type
  25. * @param int $money
  26. * @return array|Model|null
  27. * @throws DataNotFoundException
  28. * @throws DbException
  29. * @throws ModelNotFoundException
  30. */
  31. public static function initialUserMoney($uid, $money_type, $money = 0)
  32. {
  33. $where = compact('uid', 'money_type');
  34. if (self::where($where)->find()) return self::where($where)->find();
  35. else return self::create(array_merge($where, ['money' => $money]));
  36. }
  37. /**
  38. * @param $uid
  39. * @param $to_uid
  40. * @param $money_type
  41. * @param $money
  42. * @return bool
  43. * @throws DataNotFoundException
  44. * @throws DbException
  45. * @throws ModelNotFoundException
  46. */
  47. public static function tradeMoney($uid, $to_uid, $money_type, $money)
  48. {
  49. $user = self::initialUserMoney($uid, $money_type);
  50. $user_info = User::getUserInfo($uid);
  51. $to_user = self::initialUserMoney($to_uid, $money_type);
  52. $to_user_info = User::getUserInfo($to_uid);
  53. if (!$to_user_info) {
  54. return self::setErrorInfo('用户不存在');
  55. }
  56. if ($user['money'] < $money) {
  57. return self::setErrorInfo('余额不足');
  58. }
  59. $balance = bcsub($user['money'], $money, 8);
  60. $to_balance = bcadd($to_user['money'], $money, 8);
  61. $mark = '付款给' . $to_user_info['nickname'] . "({$to_user_info['uid']})" . $money . ' ' . $money_type;
  62. $to_mark = '收到' . $user_info['nickname'] . "({$user_info['uid']})支付" . $money . ' ' . $money_type;
  63. self::beginTrans();
  64. try {
  65. $res1 = UserMoneyOrder::create(['uid' => $uid, 'to_uid' => $to_uid, 'money_type' => $money_type, 'money' => $money, 'add_time' => time()]);
  66. $res2 = UserBill::expend('用户付款', $uid, $money_type, 'expend', $money, $res1->id, $balance, $mark, 1);
  67. $res3 = UserBill::income('用户收款', $to_uid, $money_type, 'income', $money, $res1->id, $to_balance, $to_mark, 1);
  68. $res4 = self::where('uid', $uid)->where('money_type', $money_type)->update(['money' => $balance]);
  69. $res5 = self::where('uid', $to_uid)->where('money_type', $money_type)->update(['money' => $to_balance]);
  70. $res1 = UserMoneyOrder::where('id', $res1->id)->update(['status' => 1]);
  71. $res = $res1 && $res2 && $res3 && $res4 && $res5;
  72. if ($res) {
  73. self::commitTrans();
  74. return true;
  75. } else {
  76. self::rollbackTrans();
  77. return self::setErrorInfo('交易失败');
  78. }
  79. } catch (\Exception $e) {
  80. self::rollbackTrans();
  81. return self::setErrorInfo($e->getMessage());
  82. }
  83. }
  84. /**
  85. * @param $uid
  86. * @param $money_type
  87. * @param $money
  88. * @param $type
  89. * @param string $title
  90. * @param string $mark
  91. * @param int $from_vote
  92. * @param int $from_sub_vote
  93. * @return bool
  94. * @throws DataNotFoundException
  95. * @throws DbException
  96. * @throws ModelNotFoundException
  97. */
  98. public static function expendMoney($uid, $money_type, $money, $type, $title = '用户付款', $mark = '', $from_vote = 0, $from_sub_vote = 0)
  99. {
  100. $user = self::initialUserMoney($uid, $money_type);
  101. if ($user['money'] < $money) {
  102. return self::setErrorInfo('余额不足');
  103. }
  104. $balance = bcsub($user['money'], $money, 8);
  105. try {
  106. $res1 = UserMoneyOrder::create(['uid' => $uid, 'to_uid' => 0, 'money_type' => $money_type, 'money' => $money, 'add_time' => time(), 'from_vote' => $from_vote, 'from_sub_vote' => $from_sub_vote]);
  107. $res2 = UserBill::expend($title, $uid, $money_type, $type, $money, $res1->id, $balance, $mark, 1);
  108. $res4 = self::where('uid', $uid)->where('money_type', $money_type)->update(['money' => $balance]);
  109. $res1 = UserMoneyOrder::where('id', $res1->id)->update(['status' => 1]);
  110. $res = $res1 && $res2 && $res4;
  111. if ($res) {
  112. return true;
  113. } else {
  114. return self::setErrorInfo('交易失败');
  115. }
  116. } catch (\Exception $e) {
  117. return self::setErrorInfo($e->getMessage());
  118. }
  119. }
  120. /**
  121. * @param $uid
  122. * @param $money_type
  123. * @param $money
  124. * @param $type
  125. * @param string $title
  126. * @param string $mark
  127. * @param int $from_vote
  128. * @param int $from_sub_vote
  129. * @return bool
  130. * @throws DataNotFoundException
  131. * @throws DbException
  132. * @throws ModelNotFoundException
  133. */
  134. public static function incomeMoney($uid, $money_type, $money, $type, $title = '用户获得', $mark = '', $from_vote = 0, $from_sub_vote = 0)
  135. {
  136. $user = self::initialUserMoney($uid, $money_type);
  137. $balance = bcadd($user['money'], $money, 8);
  138. try {
  139. $res1 = UserMoneyOrder::create(['uid' => 0, 'to_uid' => $uid, 'money_type' => $money_type, 'money' => $money, 'add_time' => time(), 'from_vote' => $from_vote, 'from_sub_vote' => $from_sub_vote]);
  140. $res2 = UserBill::income($title, $uid, $money_type, $type, $money, $res1->id, $balance, $mark, 1);
  141. $res4 = self::where('uid', $uid)->where('money_type', $money_type)->update(['money' => $balance]);
  142. $res1 = UserMoneyOrder::where('id', $res1->id)->update(['status' => 1]);
  143. $res = $res1 && $res2 && $res4;
  144. if ($res) {
  145. return true;
  146. } else {
  147. return self::setErrorInfo('交易失败');
  148. }
  149. } catch (\Exception $e) {
  150. return self::setErrorInfo($e->getMessage());
  151. }
  152. }
  153. public static function getComission($uid, $money_type, $vote = 0, $date = '')
  154. {
  155. if (!$date) {
  156. $model = new UserMoneyOrder();
  157. } else {
  158. $model = UserMoneyOrder::whereTime('add_time', $date);
  159. }
  160. if ($vote > 0) {
  161. $model = $model->where('from_vote', $vote);
  162. } else {
  163. $model = $model->where('from_vote', '>', 0);
  164. }
  165. $a = $model->where('uid', 0)->where('to_uid', $uid)->where('money_type', $money_type)->where('status', 1)->sum('money');
  166. // var_dump(UserMoneyOrder::getLastSql());
  167. if (!$date) {
  168. $model = new UserMoneyOrder();
  169. } else {
  170. $model = UserMoneyOrder::whereTime('add_time', $date);
  171. }
  172. if ($vote > 0) {
  173. $model = $model->where('from_vote', $vote);
  174. } else {
  175. $model = $model->where('from_vote', '>', 0);
  176. }
  177. $b = $model->where('uid', $uid)->where('to_uid', 0)->where('money_type', $money_type)->where('status', 1)->sum('money');
  178. // var_dump(UserMoneyOrder::getLastSql());
  179. return $a - $b;
  180. }
  181. }