CashTradeOrder.php 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613
  1. <?php
  2. namespace app\models\trade;
  3. use app\models\user\User;
  4. use app\models\user\UserBanks;
  5. use app\models\user\UserBill;
  6. use app\models\user\UserMoney;
  7. use app\models\user\UserMoneyOrder;
  8. use crmeb\repositories\ShortLetterRepositories;
  9. use crmeb\traits\ModelTrait;
  10. use crmeb\basic\BaseModel;
  11. use think\db\exception\DataNotFoundException;
  12. use think\db\exception\DbException;
  13. use think\db\exception\ModelNotFoundException;
  14. use think\Exception;
  15. use think\Model;
  16. class CashTradeOrder extends BaseModel
  17. {
  18. /**
  19. * 数据表主键
  20. * @var string
  21. */
  22. protected $pk = 'id';
  23. /**
  24. * 模型名称
  25. * @var string
  26. */
  27. protected $name = 'cash_trade_order';
  28. use ModelTrait;
  29. /**
  30. * @param $money_type
  31. * @return int|string|null
  32. */
  33. public static function averagePrice($money_type)
  34. {
  35. $all_money = self::whereTime('trade_time', 'yesterday')->where('status', 2)->where('money_type', $money_type)->sum('money_num');
  36. $all_cash = self::whereTime('trade_time', 'yesterday')->where('status', 2)->where('money_type', $money_type)->sum('all_price');
  37. if ($all_money > 0)
  38. return bcdiv($all_cash, $all_money, 8);
  39. else
  40. return "0";
  41. }
  42. /**
  43. * @param $where
  44. * @return self
  45. */
  46. public static function setStatus($where)
  47. {
  48. if (is_array($where)) {
  49. if (isset($where['status'])) {
  50. $status = $where['status'];
  51. } else {
  52. return new self();
  53. }
  54. } else {
  55. $status = $where;
  56. }
  57. switch ($status) {
  58. case 1://挂出中
  59. return self::where('status', 'in', [0, -1])->where('end_time', '>', time())->where('trade_uid', null);
  60. case 2://已完成
  61. return self::where('status', 1);
  62. case 3://挂出时间结束
  63. return self::where('status', 'in', [0, -1, 2])->where('end_time', '<', time());
  64. case 4://挂出时间结束,未领回
  65. return self::where('status', 'in', [0, -1])->where('end_time', '<', time());
  66. case 5://已领回
  67. return self::where('status', 2);
  68. case 6://交易中,已上传凭证
  69. return self::where('status', 3);
  70. case 7://未结束 但是关闭
  71. return self::where('status', 'in', [0, -1])->where('end_time', '>', time())->where('close_time', '<', time());
  72. default:
  73. return new self();
  74. }
  75. }
  76. /**
  77. * @param $where
  78. * @return array
  79. */
  80. public static function getList($where)
  81. {
  82. $model = self::setStatus($where);
  83. // if (isset($where['uid']) && $where['uid']) {
  84. // $model = $model->where('uid|trade_uid', $where['uid']);
  85. // }
  86. if (isset($where['trade_type']) && $where['trade_type'] != '') {
  87. if (isset($where['uid']) && $where['uid']) {
  88. $model = $model->where(function ($query) use ($where) {
  89. $query->where('trade_uid', $where['uid'])
  90. ->where('trade_type', $where['trade_type']);
  91. })->whereOr(function ($query) use ($where) {
  92. $query->where('uid', $where['uid'])
  93. ->where('trade_type', '<>', $where['trade_type']);
  94. });
  95. } else {
  96. $model = $model->where('trade_type', $where['trade_type']);
  97. }
  98. }
  99. if (isset($where['money_type']) && $where['money_type'] != '') {
  100. $model = $model->where('money_type', $where['money_type']);
  101. }
  102. if (isset($where['trade_uid']) && $where['trade_uid'] != '') {
  103. $model = $model->where('trade_uid', $where['trade_uid']);
  104. }
  105. $count = $model->count();
  106. // var_dump(self::getLastSql());
  107. $list = $model->order('add_time', 'desc')->page((int)$where['page'], (int)$where['limit'])->select()
  108. // var_dump(self::getLastSql());
  109. ->each(function ($item) {
  110. $item['user'] = User::getUserInfo($item['uid']);
  111. $item['_trade_user'] = $item['trade_uid'] === 0 ? '系统/0' : ($item['trade_uid'] ? User::getUserInfo($item['trade_uid'])['nickname'] . '/' . $item['trade_uid'] : '--');
  112. $item['trade_user'] = $item['trade_uid'] === 0 ? [] : User::getUserInfo($item['trade_uid']);
  113. // $item['_add_time'] = time_format($item['add_time']);
  114. // $item['_end_time'] = time_format($item['end_time']);
  115. // $item['_trade_time'] = time_format($item['trade_time']);
  116. $money_type = init_money_type();
  117. $item['_user'] = User::getUserInfo($item['uid'])['nickname'] . '/' . $item['uid'];
  118. $item['bank'] = json_decode($item['bank_info'], true);
  119. $item['_name_text'] = '--';
  120. $item['_account_text'] = '--';
  121. $item['_code_text'] = '--';
  122. $item['_name'] = '--';
  123. $item['_account'] = '--';
  124. $item['_code'] = '--';
  125. if ($item['bank']) {
  126. if ($item['bank']['type'] == 1) {
  127. $item['_name_text'] = '支付宝用户';
  128. $item['_account_text'] = '支付宝账号';
  129. $item['_code_text'] = '支付宝二维码';
  130. $item['_name'] = $item['bank']['name'];
  131. $item['_account'] = $item['bank']['account'];
  132. $item['_code'] = "<img src='" . $item['bank']['code'] . "'>";
  133. } else if ($item['bank']['type'] == 2) {
  134. $item['_name_text'] = '微信用户';
  135. $item['_account_text'] = '微信账号';
  136. $item['_code_text'] = '微信二维码';
  137. $item['_name'] = $item['bank']['name'];
  138. $item['_account'] = $item['bank']['account'];
  139. $item['_code'] = "<img src='" . $item['bank']['code'] . "'>";
  140. } else {
  141. $item['_name_text'] = '开户人';
  142. $item['_account_text'] = '银行卡号';
  143. $item['_code_text'] = '开户行';
  144. $item['_name'] = $item['bank']['name'];
  145. $item['_account'] = $item['bank']['account'];
  146. $item['_code'] = $item['bank']['code'];
  147. }
  148. }
  149. $item['_add_time'] = time_format($item['add_time']);
  150. $item['_end_time'] = $item['end_time'] ? time_format($item['end_time']) : '--';
  151. $item['_trade_time'] = $item['trade_time'] ? time_format($item['trade_time']) : '--';
  152. $item['_money_type'] = $money_type[$item['money_type']];
  153. $item['_trade_type'] = $item['trade_type'] == 2 ? '挂买' : '挂卖';
  154. $item['_proof'] = $item['proof'] ? "<img src='" . $item['proof'] . "'>" : '--';
  155. switch ($item['status']) {
  156. case -1:
  157. $item['_status'] = '未支付';
  158. break;
  159. case 0:
  160. $item['_status'] = '未完成';
  161. break;
  162. case 1:
  163. $item['_status'] = '已完成';
  164. break;
  165. case 2:
  166. $item['_status'] = '已收回';
  167. break;
  168. case 3:
  169. $item['_status'] = '交易中【‘已提交交易凭证’】';
  170. break;
  171. default:
  172. $item['_status'] = '未知';
  173. break;
  174. }
  175. });
  176. // var_dump($list);
  177. return compact('count', 'list');
  178. }
  179. public static function getOneUserList($where)
  180. {
  181. $model = self::setStatus($where);
  182. $model = $model->where('uid|trade_uid', $where['uid']);
  183. // if (isset($where['trade_type']) && $where['trade_type'] != '') {
  184. // if (isset($where['uid']) && $where['uid']) {
  185. // $model = $model->where(function ($query) use ($where) {
  186. // $query->where('trade_uid', $where['uid'])
  187. // ->where('trade_type', $where['trade_type']);
  188. // })->whereOr(function ($query) use ($where) {
  189. // $query->where('uid', $where['uid'])
  190. // ->where('trade_type', '<>', $where['trade_type']);
  191. // });
  192. // } else {
  193. // $model = $model->where('trade_type', $where['trade_type']);
  194. // }
  195. // }
  196. // if (isset($where['money_type']) && $where['money_type'] != '') {
  197. // $model = $model->where('money_type', $where['money_type']);
  198. // }
  199. // $count = $model->count();
  200. // var_dump(self::getLastSql());
  201. $list = $model->page((int)$where['page'], (int)$where['limit'])->select()
  202. // var_dump(self::getLastSql());
  203. ->each(function ($item) use ($where) {
  204. $money_type = init_money_type();
  205. $item['_user'] = User::getUserInfo($item['uid'])['nickname'] . '/' . $item['uid'];
  206. $item['_trade_user'] = $item['trade_uid'] ? User::getUserInfo($item['trade_uid'])['nickname'] . '/' . $item['trade_uid'] : '--';
  207. $item['_add_time'] = time_format($item['add_time']);
  208. $item['_end_time'] = $item['_end_time'] ? time_format($item['end_time']) : '--';
  209. $item['_trade_time'] = $item['trade_time'] ? time_format($item['trade_time']) : '--';
  210. $item['_money_type'] = $money_type[$item['money_type']];
  211. $item['_trade_type'] = $item['trade_type'] == 2 ? '挂买' : '挂卖';
  212. $item['_proof'] = $item['proof'] ? "<img src='" . $item['proof'] . "'>" : '--';
  213. switch ($item['status']) {
  214. case -1:
  215. $item['_status'] = '未支付';
  216. break;
  217. case 0:
  218. $item['_status'] = '未完成';
  219. break;
  220. case 1:
  221. $item['_status'] = '已完成';
  222. break;
  223. case 2:
  224. $item['_status'] = '已收回';
  225. break;
  226. case 3:
  227. $item['_status'] = '交易中【‘已提交交易凭证’】';
  228. break;
  229. default:
  230. $item['_status'] = '未知';
  231. break;
  232. }
  233. });
  234. return $list;
  235. }
  236. public static function hangSale($uid, $money_type, $money_num, $price, $hang_time, $bank_id)
  237. {
  238. $user = User::getUserInfo($uid);
  239. if (!$user['sale_switch']) {
  240. return self::setErrorInfo('当前用户不可挂卖!');
  241. }
  242. if (!$bank_id) {
  243. return self::setErrorInfo('请选择收款方式!');
  244. }
  245. $bank = UserBanks::get($bank_id);
  246. if (!$bank || $bank['uid'] != $uid) {
  247. return self::setErrorInfo('收款方式错误!');
  248. }
  249. $money = UserMoney::initialUserMoney($uid, $money_type);
  250. if ($money['money'] < $money_num) return self::setErrorInfo('账户不足!');
  251. $sum = bcmul($money_num, $price, 2);
  252. BaseModel::beginTrans();
  253. try {
  254. $res = UserMoney::expendMoney($uid, $money_type, $money_num, 'hang_sale', '挂卖', '挂卖' . $money_num);
  255. if (!$res) {
  256. return self::setErrorInfo(UserMoney::getErrorInfo('支付失败'), true);
  257. }
  258. $res = self::create([
  259. 'order_id' => self::getOrderId(),
  260. 'uid' => $uid,
  261. 'money_type' => $money_type,
  262. 'money_num' => $money_num,
  263. 'price' => $price,
  264. 'all_price' => $sum,
  265. 'trade_type' => 1,
  266. 'add_time' => time(),
  267. 'hang_time' => $hang_time,
  268. 'end_time' => bcadd(time(), bcmul($hang_time, 3600)),
  269. 'bank_info' => json_encode($bank)
  270. ]);
  271. if ($res) {
  272. BaseModel::commitTrans();
  273. return $res;
  274. } else {
  275. return self::setErrorInfo('挂卖失败', true);
  276. }
  277. } catch (Exception $e) {
  278. return self::setErrorInfo($e->getMessage(), true);
  279. }
  280. }
  281. public static function fastSale($uid, $money_type, $money_num, $price, $bank_id)
  282. {
  283. // $user = User::getUserInfo($uid);
  284. // if (!$user['bank_code'] && !$user['alipay_code'] && !$user['alipay_account'] && !$user['wechat_code'] && !$user['wechat_account']) {
  285. // return self::setErrorInfo('请先设置收款方式!');
  286. // }
  287. if (!$bank_id) {
  288. return self::setErrorInfo('请选择收款方式!');
  289. }
  290. $bank = UserBanks::get($bank_id);
  291. if (!$bank || $bank['uid'] != $uid) {
  292. return self::setErrorInfo('收款方式错误!');
  293. }
  294. $money = UserMoney::initialUserMoney($uid, $money_type);
  295. if ($money['money'] < $money_num) return self::setErrorInfo('账户不足!');
  296. $sum = bcmul($money_num, $price, 2);
  297. BaseModel::beginTrans();
  298. try {
  299. $res = UserMoney::expendMoney($uid, $money_type, $money_num, 'hang_sale', '挂卖', '挂卖' . $money_num);
  300. if (!$res) {
  301. return self::setErrorInfo(UserMoney::getErrorInfo('支付失败'), true);
  302. }
  303. $res = self::create([
  304. 'order_id' => self::getOrderId(),
  305. 'uid' => $uid,
  306. 'money_type' => $money_type,
  307. 'money_num' => $money_num,
  308. 'price' => $price,
  309. 'all_price' => $sum,
  310. 'trade_type' => 1,
  311. 'add_time' => time(),
  312. 'hang_time' => 0,
  313. 'trade_uid' => 0,
  314. 'status' => -1,
  315. 'end_time' => PHP_INT_MAX,
  316. 'bank_info' => json_encode($bank)
  317. ]);
  318. if ($res) {
  319. self::commitTrans();
  320. return true;
  321. } else {
  322. return self::setErrorInfo('挂卖失败', true);
  323. }
  324. } catch (Exception $e) {
  325. return self::setErrorInfo($e->getMessage(), true);
  326. }
  327. }
  328. public static function hangBuy2($uid, $money_type, $money_num, $price, $hang_time)
  329. {
  330. $sum = bcmul($money_num, $price, 2);
  331. BaseModel::beginTrans();
  332. try {
  333. // $res = UserMoney::expendMoney($uid, $money_type, $money_num, 'hang_sale', '挂卖', '挂卖' . $money_num);
  334. // if (!$res) {
  335. // return self::setErrorInfo(UserMoney::getErrorInfo('支付失败'), true);
  336. // }
  337. $res = self::create([
  338. 'order_id' => self::getOrderId(),
  339. 'uid' => $uid,
  340. 'money_type' => $money_type,
  341. 'money_num' => $money_num,
  342. 'price' => $price,
  343. 'all_price' => $sum,
  344. 'trade_type' => 2,
  345. 'add_time' => time(),
  346. 'hang_time' => $hang_time,
  347. 'status' => -1,//未支付虚拟货币
  348. 'end_time' => bcadd(time(), bcmul($hang_time, 3600)),
  349. ]);
  350. if ($res) {
  351. BaseModel::commitTrans();
  352. return $res;
  353. } else {
  354. return self::setErrorInfo('挂买失败', true);
  355. }
  356. } catch (Exception $e) {
  357. return self::setErrorInfo($e->getMessage(), true);
  358. }
  359. }
  360. public static function hangBuy($uid, $money_type, $money_num, $price, $hang_time)
  361. {
  362. $sum = bcmul($money_num, $price, 2);
  363. BaseModel::beginTrans();
  364. try {
  365. $res = CashTradeOrderPayment::create([
  366. 'uid' => $uid,
  367. 'order_id' => CashTradeOrderPayment::getOrderId(),
  368. 'order_type' => 1,
  369. 'pay_money' => $sum,
  370. 'add_time' => time(),
  371. 'order_info' => json_encode([
  372. 'uid' => $uid,
  373. 'money_type' => $money_type,
  374. 'money_num' => $money_num,
  375. 'price' => $price,
  376. 'all_price' => $sum,
  377. 'trade_type' => 2,
  378. 'hang_time' => $hang_time,]),
  379. ]);
  380. if ($res) {
  381. BaseModel::commitTrans();
  382. return $res;
  383. } else {
  384. return self::setErrorInfo('订单生成失败', true);
  385. }
  386. } catch (Exception $e) {
  387. return self::setErrorInfo($e->getMessage(), true);
  388. }
  389. }
  390. public static function getOrderId()
  391. {
  392. list($msec, $sec) = explode(' ', microtime());
  393. $msectime = number_format((floatval($msec) + floatval($sec)) * 1000, 0, '', '');
  394. do {
  395. $str = 'ct' . $msectime . mt_rand(10000, 99999);
  396. } while (self::be(['order_id' => $str]));
  397. return $str;
  398. }
  399. public static function sale($uid, $id, $bank_id)
  400. {
  401. if (!$bank_id) {
  402. return self::setErrorInfo('请选择收款方式!');
  403. }
  404. $bank = UserBanks::get($bank_id);
  405. if (!$bank || $bank['uid'] != $uid) {
  406. return self::setErrorInfo('收款方式错误!');
  407. }
  408. $order = self::setStatus(1)->where('id', $id)->find();
  409. if (!$order) {
  410. return self::setErrorInfo('订单不存在或已结束挂出');
  411. }
  412. // $user = User::getUserInfo($uid);
  413. // if (!$user['bank_code'] && !$user['alipay_code'] && !$user['alipay_account'] && !$user['wechat_code'] && !$user['wechat_account']) {
  414. // return self::setErrorInfo('请先设置收款方式!');
  415. // }
  416. $money = UserMoney::initialUserMoney($uid, $order['money_type']);
  417. if ($money['money'] < $order['money_num']) return self::setErrorInfo('账户不足!');
  418. BaseModel::beginTrans();
  419. try {
  420. $res = UserMoney::expendMoney($uid, $order['money_type'], $order['money_num'], 'sale', '售币成功', '售币成功,购买方:' . $order['uid']);
  421. if (!$res) {
  422. return self::setErrorInfo(UserMoney::getErrorInfo('支付失败'), true);
  423. }
  424. $res = self::where('id', $id)->update([
  425. 'status' => 0,
  426. 'trade_uid' => $uid,
  427. 'bank_info' => json_encode($bank),
  428. //'trade_way' => $order['pay_type'],
  429. // 'trade_time' => time(),
  430. ]);
  431. // $userInfo = User::getUserInfo($uid);
  432. // $res = $res && UserMoney::incomeMoney($order['uid'], $order['money_type'], $order['money_num'], 'buy_success', '购币成功', '购币成功,出售方:' . $uid);
  433. // $res = $res && (false !== User::bcInc($userInfo['uid'], 'now_money', $order['all_price'], 'uid'));
  434. // $res = $res && UserBill::income('售币成功', $userInfo['uid'], 'now_money', 'sale_success', $order['all_price'], $order['id'], $userInfo['now_money'] + $order['all_price'], '售币成功,购买方:' . $order['uid']);
  435. if ($res) {
  436. BaseModel::commitTrans();
  437. $user = User::getUserInfo($order['uid']);
  438. ShortLetterRepositories::SMSSend($user['phone'], ['code' => 0], 'START_TRADE');
  439. return $res;
  440. } else {
  441. return self::setErrorInfo('出售失败', true);
  442. }
  443. } catch (Exception $e) {
  444. return self::setErrorInfo($e->getMessage(), true);
  445. }
  446. }
  447. public static function buy($uid, $id)
  448. {
  449. $order = self::setStatus(1)->where('id', $id)->find();
  450. if (!$order) {
  451. return self::setErrorInfo('订单不存在或已结束挂出');
  452. }
  453. BaseModel::beginTrans();
  454. try {
  455. $res = CashTradeOrderPayment::create([
  456. 'uid' => $uid,
  457. 'order_id' => CashTradeOrderPayment::getOrderId(),
  458. 'bind_order' => $id,
  459. 'order_type' => 2,
  460. 'pay_money' => $order['all_price'],
  461. 'add_time' => time()
  462. ]);
  463. if ($res) {
  464. BaseModel::commitTrans();
  465. return $res;
  466. } else {
  467. return self::setErrorInfo('订单生成失败', true);
  468. }
  469. } catch (Exception $e) {
  470. return self::setErrorInfo($e->getMessage(), true);
  471. }
  472. }
  473. public static function buy2($uid, $id)
  474. {
  475. $order = self::setStatus(1)->where('id', $id)->find();
  476. if (!$order) {
  477. return self::setErrorInfo('订单不存在或已结束挂出');
  478. }
  479. // $money = UserMoney::initialUserMoney($uid, $order['money_type']);
  480. // if ($money['money'] < $order['money_num']) return self::setErrorInfo('账户不足!');
  481. BaseModel::beginTrans();
  482. try {
  483. // $res = UserMoney::expendMoney($uid, $order['money_type'], $order['money_num'], 'sale', '售币成功', '售币成功,购买方:' . $order['uid']);
  484. // if (!$res) {
  485. // return self::setErrorInfo(UserMoney::getErrorInfo('支付失败'), true);
  486. // }
  487. $res = self::where('id', $id)->update([
  488. 'status' => -1,
  489. 'trade_uid' => $uid,
  490. 'close_time' => time() + 15 * 60,
  491. ]);
  492. if ($res) {
  493. BaseModel::commitTrans();
  494. return $res;
  495. } else {
  496. return self::setErrorInfo('申请购买失败', true);
  497. }
  498. } catch (Exception $e) {
  499. return self::setErrorInfo($e->getMessage(), true);
  500. }
  501. }
  502. public static function getBack()
  503. {
  504. $list = self::setStatus(4)->select();
  505. BaseModel::beginTrans();
  506. $res = true;
  507. foreach ($list as $v) {
  508. switch ($v['trade_type']) {
  509. case 1:
  510. //退回币
  511. $res = $res && UserMoney::incomeMoney($v['uid'], $v['money_type'], $v['money_num'], 'hang_sale_send_back', '挂卖退回', '挂卖时间结束,退回钱包');
  512. $res = $res && self::where('id', $v['id'])->update(['status' => 2]);
  513. break;
  514. case 2:
  515. // $userInfo = User::getUserInfo($v['uid']);
  516. // $res = $res && (false !== User::bcInc($v['uid'], 'now_money', $v['all_price'], 'uid'));
  517. // $res = $res && UserBill::income('售币成功', $v['uid'], 'now_money', 'hang_buy_send_back', $v['all_price'], $v['id'], $userInfo['now_money'] + $v['all_price'], '挂买时间结束,退回余额');
  518. // $res = $res && self::where('id', $v['id'])->update(['status' => 2]);
  519. if ($v['trade_uid'])
  520. $res = $res && UserMoney::incomeMoney($v['trade_uid'], $v['money_type'], $v['money_num'], 'hang_buy_send_back', '挂买退回', '挂买时间结束,退回钱包');
  521. $res = $res && self::where('id', $v['id'])->update(['status' => 2]);
  522. break;
  523. default:
  524. break;
  525. }
  526. }
  527. BaseModel::checkTrans($res);
  528. return $res;
  529. }
  530. public static function orderClose()
  531. {
  532. $list = self::setStatus(7)->select();
  533. // var_dump($list);
  534. BaseModel::beginTrans();
  535. $res = true;
  536. foreach ($list as $v) {
  537. switch ($v['trade_type']) {
  538. case 1:
  539. //退回币
  540. // $res = $res && UserMoney::incomeMoney($v['uid'], $v['money_type'], $v['money_num'], 'hang_sale_send_back', '挂卖退回', '挂卖时间结束,退回钱包');
  541. $res = $res && self::where('id', $v['id'])->update(['trade_uid' => null, 'status' => 0, 'close_time' => null]);
  542. break;
  543. case 2:
  544. // $userInfo = User::getUserInfo($v['uid']);
  545. // $res = $res && (false !== User::bcInc($v['uid'], 'now_money', $v['all_price'], 'uid'));
  546. // $res = $res && UserBill::income('售币成功', $v['uid'], 'now_money', 'hang_buy_send_back', $v['all_price'], $v['id'], $userInfo['now_money'] + $v['all_price'], '挂买时间结束,退回余额');
  547. // $res = $res && self::where('id', $v['id'])->update(['status' => 2]);
  548. if ($v['trade_uid'])
  549. $res = $res && UserMoney::incomeMoney($v['trade_uid'], $v['money_type'], $v['money_num'], 'hang_sale_send_back', '挂卖退回', '挂卖时间结束,退回钱包');
  550. $res = $res && self::where('id', $v['id'])->update(['trade_uid' => null, 'status' => -1, 'close_time' => null]);
  551. break;
  552. default:
  553. break;
  554. }
  555. }
  556. BaseModel::checkTrans($res);
  557. return $res;
  558. }
  559. public static function brokerage($id)
  560. {
  561. $info = self::get($id);
  562. if ($info['trade_uid'] !== 0) return true;
  563. if ($info['trade_type'] == 2)
  564. $user = User::getUserInfo($info['trade_uid']);
  565. else
  566. $user = User::getUserInfo($info['uid']);
  567. $uper = User::getUserInfo($user['spread_uid']);
  568. // var_dump($info);
  569. // var_dump($user['uid']);
  570. // var_dump($user['spread_uid']);
  571. // exit;
  572. $send = 0;
  573. $res = true;
  574. while ($uper) {
  575. $ratio = bcdiv($uper['return_uper'], 100, 2);
  576. if ($ratio > 0) {
  577. $brokerage = bcmul($ratio, $info['money_num'], 8);
  578. if ($brokerage > $send) {
  579. $brokerage = bcsub($brokerage, $send, 8);
  580. $res = $res && UserMoney::incomeMoney($uper['uid'], $info['money_type'], $brokerage, 'return_uper', '佣金', $user['nickname'] . '发生交易,获得佣金');
  581. $send = bcadd($brokerage, $send, 8);
  582. }
  583. }
  584. $uper = User::getUserInfo($uper['spread_uid']);
  585. }
  586. return $res;
  587. }
  588. }