CashTradeOrder.php 26 KB

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