CashTradeOrder.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  1. <?php
  2. namespace app\models\trade;
  3. use app\models\user\User;
  4. use app\models\user\UserBill;
  5. use app\models\user\UserMoney;
  6. use app\models\user\UserMoneyOrder;
  7. use crmeb\traits\ModelTrait;
  8. use crmeb\basic\BaseModel;
  9. use think\db\exception\DataNotFoundException;
  10. use think\db\exception\DbException;
  11. use think\db\exception\ModelNotFoundException;
  12. use think\Exception;
  13. use think\Model;
  14. class CashTradeOrder extends BaseModel
  15. {
  16. /**
  17. * 数据表主键
  18. * @var string
  19. */
  20. protected $pk = 'id';
  21. /**
  22. * 模型名称
  23. * @var string
  24. */
  25. protected $name = 'cash_trade_order';
  26. use ModelTrait;
  27. /**
  28. * @param $money_type
  29. * @return int|string|null
  30. */
  31. public static function averagePrice($money_type)
  32. {
  33. $all_money = self::whereTime('trade_time', 'yesterday')->where('status', 2)->where('money_type', $money_type)->sum('money_num');
  34. $all_cash = self::whereTime('trade_time', 'yesterday')->where('status', 2)->where('money_type', $money_type)->sum('all_price');
  35. if ($all_money > 0)
  36. return bcdiv($all_cash, $all_money, 8);
  37. else
  38. return "0";
  39. }
  40. /**
  41. * @param $where
  42. * @return self
  43. */
  44. public static function setStatus($where)
  45. {
  46. if (is_array($where)) {
  47. if (isset($where['status'])) {
  48. $status = $where['status'];
  49. } else {
  50. return new self();
  51. }
  52. } else {
  53. $status = $where;
  54. }
  55. switch ($status) {
  56. case 1://挂出中
  57. return self::where('status', 'in', [0, -1])->where('end_time', '>', time())->where('trade_uid', null);
  58. case 2://已完成
  59. return self::where('status', 1);
  60. case 3://挂出时间结束
  61. return self::where('status', 'in', [0, -1, 2])->where('end_time', '<', time());
  62. case 4://挂出时间结束,未领回
  63. return self::where('status', 'in', [0, -1])->where('end_time', '<', time())->where('close_time', '<', time());
  64. case 5://已领回
  65. return self::where('status', 2);
  66. case 6://交易中,已上传凭证
  67. return self::where('status', 3);
  68. case 7://未结束 但是关闭
  69. return self::where('status', 'in', [0, -1])->where('end_time', '>', time())->where('close_time', '<', time());
  70. default:
  71. return new self();
  72. }
  73. }
  74. /**
  75. * @param $where
  76. * @return array
  77. */
  78. public static function getList($where)
  79. {
  80. $model = self::setStatus($where);
  81. // if (isset($where['uid']) && $where['uid']) {
  82. // $model = $model->where('uid|trade_uid', $where['uid']);
  83. // }
  84. if (isset($where['trade_type']) && $where['trade_type'] != '') {
  85. if (isset($where['uid']) && $where['uid']) {
  86. $model = $model->where(function ($query) use ($where) {
  87. $query->where('trade_uid', $where['uid'])
  88. ->where('trade_type', $where['trade_type']);
  89. })->whereOr(function ($query) use ($where) {
  90. $query->where('uid', $where['uid'])
  91. ->where('trade_type', '<>', $where['trade_type']);
  92. });
  93. } else {
  94. $model = $model->where('trade_type', $where['trade_type']);
  95. }
  96. }
  97. if (isset($where['money_type']) && $where['money_type'] != '') {
  98. $model = $model->where('money_type', $where['money_type']);
  99. }
  100. $count = $model->count();
  101. $list = $model->page((int)$where['page'], (int)$where['limit'])->select()
  102. // var_dump(self::getLastSql());
  103. ->each(function ($item) {
  104. $item['user'] = User::getUserInfo($item['uid']);
  105. $item['trade_user'] = User::getUserInfo($item['trade_uid']);
  106. $item['_add_time'] = time_format($item['add_time']);
  107. $item['_end_time'] = time_format($item['end_time']);
  108. $item['_trade_time'] = time_format($item['trade_time']);
  109. });
  110. return compact('count', 'list');
  111. }
  112. public static function hangSale($uid, $money_type, $money_num, $price, $hang_time)
  113. {
  114. $money = UserMoney::initialUserMoney($uid, $money_type);
  115. if ($money['money'] < $money_num) return self::setErrorInfo('账户不足!');
  116. $sum = bcmul($money_num, $price, 2);
  117. BaseModel::beginTrans();
  118. try {
  119. $res = UserMoney::expendMoney($uid, $money_type, $money_num, 'hang_sale', '挂卖', '挂卖' . $money_num);
  120. if (!$res) {
  121. return self::setErrorInfo(UserMoney::getErrorInfo('支付失败'), true);
  122. }
  123. $res = self::create([
  124. 'order_id' => self::getOrderId(),
  125. 'uid' => $uid,
  126. 'money_type' => $money_type,
  127. 'money_num' => $money_num,
  128. 'price' => $price,
  129. 'all_price' => $sum,
  130. 'trade_type' => 1,
  131. 'add_time' => time(),
  132. 'hang_time' => $hang_time,
  133. 'end_time' => bcadd(time(), bcmul($hang_time, 3600)),
  134. ]);
  135. if ($res) {
  136. BaseModel::commitTrans();
  137. return $res;
  138. } else {
  139. return self::setErrorInfo('挂卖失败', true);
  140. }
  141. } catch (Exception $e) {
  142. return self::setErrorInfo($e->getMessage(), true);
  143. }
  144. }
  145. public static function hangBuy2($uid, $money_type, $money_num, $price, $hang_time)
  146. {
  147. $sum = bcmul($money_num, $price, 2);
  148. BaseModel::beginTrans();
  149. try {
  150. // $res = UserMoney::expendMoney($uid, $money_type, $money_num, 'hang_sale', '挂卖', '挂卖' . $money_num);
  151. // if (!$res) {
  152. // return self::setErrorInfo(UserMoney::getErrorInfo('支付失败'), true);
  153. // }
  154. $res = self::create([
  155. 'order_id' => self::getOrderId(),
  156. 'uid' => $uid,
  157. 'money_type' => $money_type,
  158. 'money_num' => $money_num,
  159. 'price' => $price,
  160. 'all_price' => $sum,
  161. 'trade_type' => 2,
  162. 'add_time' => time(),
  163. 'hang_time' => $hang_time,
  164. 'status' => -1,//未支付虚拟货币
  165. 'end_time' => bcadd(time(), bcmul($hang_time, 3600)),
  166. ]);
  167. if ($res) {
  168. BaseModel::commitTrans();
  169. return $res;
  170. } else {
  171. return self::setErrorInfo('挂买失败', true);
  172. }
  173. } catch (Exception $e) {
  174. return self::setErrorInfo($e->getMessage(), true);
  175. }
  176. }
  177. public static function hangBuy($uid, $money_type, $money_num, $price, $hang_time)
  178. {
  179. $sum = bcmul($money_num, $price, 2);
  180. BaseModel::beginTrans();
  181. try {
  182. $res = CashTradeOrderPayment::create([
  183. 'uid' => $uid,
  184. 'order_id' => CashTradeOrderPayment::getOrderId(),
  185. 'order_type' => 1,
  186. 'pay_money' => $sum,
  187. 'add_time' => time(),
  188. 'order_info' => json_encode([
  189. 'uid' => $uid,
  190. 'money_type' => $money_type,
  191. 'money_num' => $money_num,
  192. 'price' => $price,
  193. 'all_price' => $sum,
  194. 'trade_type' => 2,
  195. 'hang_time' => $hang_time,]),
  196. ]);
  197. if ($res) {
  198. BaseModel::commitTrans();
  199. return $res;
  200. } else {
  201. return self::setErrorInfo('订单生成失败', true);
  202. }
  203. } catch (Exception $e) {
  204. return self::setErrorInfo($e->getMessage(), true);
  205. }
  206. }
  207. public static function getOrderId()
  208. {
  209. list($msec, $sec) = explode(' ', microtime());
  210. $msectime = number_format((floatval($msec) + floatval($sec)) * 1000, 0, '', '');
  211. do {
  212. $str = 'ct' . $msectime . mt_rand(10000, 99999);
  213. } while (self::be(['order_id' => $str]));
  214. return $str;
  215. }
  216. public static function sale($uid, $id)
  217. {
  218. $order = self::setStatus(1)->where('id', $id)->find();
  219. if (!$order) {
  220. return self::setErrorInfo('订单不存在或已结束挂出');
  221. }
  222. $money = UserMoney::initialUserMoney($uid, $order['money_type']);
  223. if ($money['money'] < $order['money_num']) return self::setErrorInfo('账户不足!');
  224. BaseModel::beginTrans();
  225. try {
  226. $res = UserMoney::expendMoney($uid, $order['money_type'], $order['money_num'], 'sale', '售币成功', '售币成功,购买方:' . $order['uid']);
  227. if (!$res) {
  228. return self::setErrorInfo(UserMoney::getErrorInfo('支付失败'), true);
  229. }
  230. $res = self::where('id', $id)->update([
  231. 'status' => 0,
  232. 'trade_uid' => $uid,
  233. //'trade_way' => $order['pay_type'],
  234. // 'trade_time' => time(),
  235. ]);
  236. // $userInfo = User::getUserInfo($uid);
  237. // $res = $res && UserMoney::incomeMoney($order['uid'], $order['money_type'], $order['money_num'], 'buy_success', '购币成功', '购币成功,出售方:' . $uid);
  238. // $res = $res && (false !== User::bcInc($userInfo['uid'], 'now_money', $order['all_price'], 'uid'));
  239. // $res = $res && UserBill::income('售币成功', $userInfo['uid'], 'now_money', 'sale_success', $order['all_price'], $order['id'], $userInfo['now_money'] + $order['all_price'], '售币成功,购买方:' . $order['uid']);
  240. if ($res) {
  241. BaseModel::commitTrans();
  242. return $res;
  243. } else {
  244. return self::setErrorInfo('出售失败', true);
  245. }
  246. } catch (Exception $e) {
  247. return self::setErrorInfo($e->getMessage(), true);
  248. }
  249. }
  250. public static function buy($uid, $id)
  251. {
  252. $order = self::setStatus(1)->where('id', $id)->find();
  253. if (!$order) {
  254. return self::setErrorInfo('订单不存在或已结束挂出');
  255. }
  256. BaseModel::beginTrans();
  257. try {
  258. $res = CashTradeOrderPayment::create([
  259. 'uid' => $uid,
  260. 'order_id' => CashTradeOrderPayment::getOrderId(),
  261. 'bind_order' => $id,
  262. 'order_type' => 2,
  263. 'pay_money' => $order['all_price'],
  264. 'add_time' => time()
  265. ]);
  266. if ($res) {
  267. BaseModel::commitTrans();
  268. return $res;
  269. } else {
  270. return self::setErrorInfo('订单生成失败', true);
  271. }
  272. } catch (Exception $e) {
  273. return self::setErrorInfo($e->getMessage(), true);
  274. }
  275. }
  276. public static function buy2($uid, $id)
  277. {
  278. $order = self::setStatus(1)->where('id', $id)->find();
  279. if (!$order) {
  280. return self::setErrorInfo('订单不存在或已结束挂出');
  281. }
  282. $money = UserMoney::initialUserMoney($uid, $order['money_type']);
  283. if ($money['money'] < $order['money_num']) return self::setErrorInfo('账户不足!');
  284. BaseModel::beginTrans();
  285. try {
  286. $res = UserMoney::expendMoney($uid, $order['money_type'], $order['money_num'], 'sale', '售币成功', '售币成功,购买方:' . $order['uid']);
  287. if (!$res) {
  288. return self::setErrorInfo(UserMoney::getErrorInfo('支付失败'), true);
  289. }
  290. $res = self::where('id', $id)->update([
  291. 'status' => -1,
  292. 'trade_uid' => $uid,
  293. // 'trade_time' => time(),
  294. ]);
  295. if ($res) {
  296. BaseModel::commitTrans();
  297. return $res;
  298. } else {
  299. return self::setErrorInfo('申请购买失败', true);
  300. }
  301. } catch (Exception $e) {
  302. return self::setErrorInfo($e->getMessage(), true);
  303. }
  304. }
  305. public static function getBack()
  306. {
  307. $list = self::setStatus(4)->select();
  308. BaseModel::beginTrans();
  309. $res = true;
  310. foreach ($list as $v) {
  311. switch ($v['trade_type']) {
  312. case 1:
  313. //退回币
  314. $res = $res && UserMoney::incomeMoney($v['uid'], $v['money_type'], $v['money_num'], 'hang_sale_send_back', '挂卖退回', '挂卖时间结束,退回钱包');
  315. $res = $res && self::where('id', $v['id'])->update(['status' => 2]);
  316. break;
  317. case 2:
  318. // $userInfo = User::getUserInfo($v['uid']);
  319. // $res = $res && (false !== User::bcInc($v['uid'], 'now_money', $v['all_price'], 'uid'));
  320. // $res = $res && UserBill::income('售币成功', $v['uid'], 'now_money', 'hang_buy_send_back', $v['all_price'], $v['id'], $userInfo['now_money'] + $v['all_price'], '挂买时间结束,退回余额');
  321. // $res = $res && self::where('id', $v['id'])->update(['status' => 2]);
  322. if ($v['trade_uid'])
  323. $res = $res && UserMoney::incomeMoney($v['trade_uid'], $v['money_type'], $v['money_num'], 'hang_buy_send_back', '挂买退回', '挂买时间结束,退回钱包');
  324. $res = $res && self::where('id', $v['id'])->update(['status' => 2]);
  325. break;
  326. default:
  327. break;
  328. }
  329. }
  330. BaseModel::checkTrans($res);
  331. return $res;
  332. }
  333. public static function orderClose()
  334. {
  335. $list = self::setStatus(7)->select();
  336. BaseModel::beginTrans();
  337. $res = true;
  338. foreach ($list as $v) {
  339. switch ($v['trade_type']) {
  340. case 1:
  341. //退回币
  342. // $res = $res && UserMoney::incomeMoney($v['uid'], $v['money_type'], $v['money_num'], 'hang_sale_send_back', '挂卖退回', '挂卖时间结束,退回钱包');
  343. $res = $res && self::where('id', $v['id'])->update(['trade_uid' => null, 'status' => 0, 'close_time' => null]);
  344. break;
  345. case 2:
  346. // $userInfo = User::getUserInfo($v['uid']);
  347. // $res = $res && (false !== User::bcInc($v['uid'], 'now_money', $v['all_price'], 'uid'));
  348. // $res = $res && UserBill::income('售币成功', $v['uid'], 'now_money', 'hang_buy_send_back', $v['all_price'], $v['id'], $userInfo['now_money'] + $v['all_price'], '挂买时间结束,退回余额');
  349. // $res = $res && self::where('id', $v['id'])->update(['status' => 2]);
  350. if ($v['trade_uid'])
  351. $res = $res && UserMoney::incomeMoney($v['trade_uid'], $v['money_type'], $v['money_num'], 'hang_sale_send_back', '挂卖退回', '挂卖时间结束,退回钱包');
  352. $res = $res && self::where('id', $v['id'])->update(['trade_uid' => null, 'status' => -1, 'close_time' => null]);
  353. break;
  354. default:
  355. break;
  356. }
  357. }
  358. BaseModel::checkTrans($res);
  359. return $res;
  360. }
  361. }