TradeModel.class.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. <?php
  2. namespace Common\Model;
  3. class TradeModel extends \Think\Model
  4. {
  5. protected $keyS = 'Trade';
  6. public function hangqing($market = NULL)
  7. {
  8. if (empty($market)) {
  9. return null;
  10. }
  11. $timearr = array(1, 3, 5, 10, 15, 30, 60, 120, 240, 360, 720, 1440, 10080);
  12. foreach ($timearr as $k => $v) {
  13. $tradeJson = M('TradeJson')->where(array('market' => $market, 'type' => $v))->order('id desc')->find();
  14. if ($tradeJson) {
  15. $addtime = $tradeJson['addtime'];
  16. } else {
  17. $addtime = M('TradeLog')->where(array('market' => $market))->order('id asc')->getField('addtime');
  18. }
  19. if ($addtime) {
  20. $youtradelog = M('TradeLog')->where('addtime >=' . $addtime . ' and market =\'' . $market . '\'')->sum('num');
  21. }
  22. if ($youtradelog) {
  23. if ($v == 1) {
  24. $start_time = $addtime;
  25. } else {
  26. $start_time = mktime(date('H', $addtime), floor(date('i', $addtime) / $v) * $v, 0, date('m', $addtime), date('d', $addtime), date('Y', $addtime));
  27. }
  28. $x = 0;
  29. for (; $x <= 20; $x++) {
  30. $na = $start_time + (60 * $v * $x);
  31. $nb = $start_time + (60 * $v * ($x + 1));
  32. if (time() < $na) {
  33. break;
  34. }
  35. $sum = M('TradeLog')->where('addtime >=' . $na . ' and addtime <' . $nb . ' and market =\'' . $market . '\'')->sum('num');
  36. if ($sum) {
  37. $sta = M('TradeLog')->where('addtime >=' . $na . ' and addtime <' . $nb . ' and market =\'' . $market . '\'')->order('id asc')->getField('price');
  38. $max = M('TradeLog')->where('addtime >=' . $na . ' and addtime <' . $nb . ' and market =\'' . $market . '\'')->max('price');
  39. $min = M('TradeLog')->where('addtime >=' . $na . ' and addtime <' . $nb . ' and market =\'' . $market . '\'')->min('price');
  40. $end = M('TradeLog')->where('addtime >=' . $na . ' and addtime <' . $nb . ' and market =\'' . $market . '\'')->order('id desc')->getField('price');
  41. $d = array($na, $sum, $sta, $max, $min, $end);
  42. if (M('TradeJson')->where(array('market' => $market, 'addtime' => $na, 'type' => $v))->find()) {
  43. M('TradeJson')->where(array('market' => $market, 'addtime' => $na, 'type' => $v))->save(array('data' => json_encode($d)));
  44. M('TradeJson')->execute('commit');
  45. } else {
  46. M('TradeJson')->add(array('market' => $market, 'data' => json_encode($d), 'addtime' => $na, 'type' => $v));
  47. M('TradeJson')->execute('commit');
  48. M('TradeJson')->where(array('market' => $market, 'data' => '', 'type' => $v))->delete();
  49. M('TradeJson')->execute('commit');
  50. }
  51. } else {
  52. M('TradeJson')->add(array('market' => $market, 'data' => '', 'addtime' => $na, 'type' => $v));
  53. M('TradeJson')->execute('commit');
  54. }
  55. }
  56. }
  57. }
  58. }
  59. public function chexiao($id = NULL)
  60. {
  61. if (!check($id, 'd')) {
  62. return array('0', '参数错误');
  63. }
  64. $trade = M('Trade')->where(array('id' => $id))->find();
  65. if (!$trade) {
  66. return array('0', '订单不存在');
  67. }
  68. if ($trade['status'] != 0) {
  69. return array('0', '订单不能撤销');
  70. }
  71. $xnb = explode('_', $trade['market'])[0];
  72. $rmb = explode('_', $trade['market'])[1];
  73. if (!$xnb) {
  74. return array('0', '卖出市场错误');
  75. }
  76. if (!$rmb) {
  77. return array('0', '买入市场错误');
  78. }
  79. $fee_buy = C('market')[$trade['market']]['fee_buy'];
  80. $fee_sell = C('market')[$trade['market']]['fee_sell'];
  81. if ($fee_buy < 0) {
  82. return array('0', '买入手续费错误');
  83. }
  84. if ($fee_sell < 0) {
  85. return array('0', '卖出手续费错误');
  86. }
  87. try{
  88. $user_coin = M('UserCoin')->where(array('userid' => $trade['userid']))->find();
  89. $mo = M();
  90. $mo->execute('set autocommit=0');
  91. // $mo->execute('lock tables tw_user_coin write , tw_trade write ,tw_finance write');
  92. $mo->execute('lock tables tw_user_coin write , tw_trade write ,tw_finance write,tw_finance_log write,tw_user write,tw_auth_group_access write,tw_admin write');//处理资金变更日志
  93. $rs = array();
  94. $user_coin = $mo->table('tw_user_coin')->where(array('userid' => $trade['userid']))->find();
  95. if ($trade['type'] == 1) {
  96. $user_buy = $mo->table('tw_user_coin')->where(array('userid' => $trade['userid']))->find();
  97. $buyuser = $mo->table('tw_user')->where(array('id' => $trade['userid']))->find();
  98. if($buyuser['lv']==1){
  99. $fee_buy=0;
  100. }
  101. $mun = round(((($trade['num'] - $trade['deal']) * $trade['price']) / 100) * (100 + $fee_buy), 8);
  102. if ($mun <= round($user_buy[$rmb . 'd'], 8)) {
  103. $save_buy_rmb = $mun;
  104. } else if ($mun <= round($user_buy[$rmb . 'd'], 8) + 1) {
  105. $save_buy_rmb = $user_buy[$rmb . 'd'];
  106. } else {
  107. throw new \Think\Exception('撤销失败1');
  108. }
  109. $finance = $mo->table('tw_finance')->where(array('userid' => $trade['userid']))->order('id desc')->find();
  110. $finance_num_user_coin = $mo->table('tw_user_coin')->where(array('userid' => $trade['userid']))->find();
  111. $rs[] = $mo->table('tw_user_coin')->where(array('userid' => $trade['userid']))->setInc($rmb, $save_buy_rmb);
  112. $rs[] = $mo->table('tw_user_coin')->where(array('userid' => $trade['userid']))->setDec($rmb . 'd', $save_buy_rmb);
  113. $finance_nameid = $trade['id'];
  114. $finance_mum_user_coin = $mo->table('tw_user_coin')->where(array('userid' => $trade['userid']))->find();
  115. // 处理资金变更日志--------买入类型---------S
  116. $user_2_info = $mo->table('tw_user')->where(array('id' => $trade['userid']))->find();
  117. if (session('userId') > 0) {
  118. $position = 1;
  119. // 获取用户信息
  120. $user_info = $mo->table('tw_user')->where(array('id' => session('userId')))->find();
  121. $uu_name = $user_2_info['username'];
  122. $aa_name = $user_info['username'];
  123. $uu_id = $trade['userid'];
  124. $aa_id = session('userId');
  125. } elseif (session('admin_id') > 0) {
  126. $position = 0;
  127. $uu_name = $user_2_info['username'];
  128. $aa_name = session('admin_username');
  129. $uu_id = $trade['userid'];
  130. $aa_id = session('admin_id');
  131. } else {
  132. $admin_group = $mo->table('tw_auth_group_access')->where(array('group_id' => '3'))->find();
  133. $admin_info = $mo->table('tw_admin')->where(array('id' => $admin_group['uid']))->find();
  134. $position = 0;
  135. $uu_name = $user_2_info['username'];
  136. $aa_name = $admin_info['username'];
  137. $uu_id = $trade['userid'];
  138. $aa_id = $admin_info['id'];
  139. }
  140. // optype 10 买入-动作类型 'cointype' => 资金类型 'plusminus' => 1增加类型
  141. $rs[] = $mo->table('tw_finance_log')->add(array('username' => $uu_name, 'adminname' => $aa_name, 'addtime' => time(), 'plusminus' => 1, 'amount' => $save_buy_rmb, 'optype' => 16, 'cointype' => 1, 'old_amount' => $finance_num_user_coin[$rmb], 'new_amount' => $finance_mum_user_coin[$rmb], 'userid' => $uu_id, 'adminid' => $aa_id,'addip'=>get_client_ip(),'position'=>$position));
  142. // 处理资金变更日志---------买入类型--------E
  143. $finance_hash = md5($trade['userid'] . $finance_num_user_coin[$rmb] . $finance_num_user_coin[$rmb . 'd'] . $save_buy_rmb . $finance_mum_user_coin[$rmb] . $finance_mum_user_coin[$rmb . 'd'] . MSCODE . 'tp3.net.cn');
  144. $finance_num = $finance_num_user_coin[$rmb] + $finance_num_user_coin[$rmb . 'd'];
  145. if ($finance['mum'] < $finance_num) {
  146. $finance_status = (1 < ($finance_num - $finance['mum']) ? 0 : 1);
  147. } else {
  148. $finance_status = (1 < ($finance['mum'] - $finance_num) ? 0 : 1);
  149. }
  150. $rs[] = $mo->table('tw_finance')->add(array('userid' => $trade['userid'], 'coinname' => $rmb, 'num_a' => $finance_num_user_coin[$rmb], 'num_b' => $finance_num_user_coin[$rmb . 'd'], 'num' => $finance_num_user_coin[$rmb] + $finance_num_user_coin[$rmb . 'd'], 'fee' => $save_buy_rmb, 'type' => 1, 'name' => 'trade', 'nameid' => $finance_nameid, 'remark' => '交易中心-交易撤销' . $trade['market'], 'mum_a' => $finance_mum_user_coin[$rmb], 'mum_b' => $finance_mum_user_coin[$rmb . 'd'], 'mum' => $finance_mum_user_coin[$rmb] + $finance_mum_user_coin[$rmb . 'd'], 'move' => $finance_hash, 'addtime' => time(), 'status' => $finance_status));
  151. $rs[] = $mo->table('tw_trade')->where(array('id' => $trade['id']))->setField('status', 2);
  152. $you_buy = $mo->table('tw_trade')->where(array(
  153. 'market' => array('eq', $trade['market']),
  154. 'status' => 0,
  155. 'userid' => $trade['userid']
  156. ))->find();
  157. if (!$you_buy) {
  158. $you_user_buy = $mo->table('tw_user_coin')->where(array('userid' => $trade['userid']))->find();
  159. if (0 < $you_user_buy[$rmb . 'd']) {
  160. $rs[] = $mo->table('tw_user_coin')->where(array('userid' => $trade['userid']))->setField($rmb . 'd', 0);
  161. // 处理资金变更日志-----------------S
  162. $user_2_info = $mo->table('tw_user')->where(array('id' => $trade['userid']))->find();
  163. if (session('userId') > 0) {
  164. $position = 1;
  165. $uu_name = $user_2_info['username'];
  166. $uu_id = $trade['userid'];
  167. } else {
  168. $position = 0;
  169. $uu_name = $user_2_info['username'];
  170. $uu_id = $trade['userid'];
  171. }
  172. // optype动作类型 'cointype' => 资金类型 'plusminus' => 1增加类型
  173. $rs[] = $mo->table('tw_finance_log')->add(array('username' => $uu_name, 'adminname' => '系统', 'addtime' => time(), 'plusminus' => 0, 'amount' => $you_user_buy[$rmb . 'd'], 'optype' => 17, 'cointype' => 1, 'old_amount' => $you_user_buy[$rmb . 'd'], 'new_amount' => '0', 'userid' => $uu_id,'addip'=>get_client_ip(),'position'=>$position));
  174. // 处理资金变更日志-----------------E
  175. }
  176. }
  177. } else if ($trade['type'] == 2) {
  178. $mun = round($trade['num'] - $trade['deal'], 8);
  179. $user_sell = $mo->table('tw_user_coin')->where(array('userid' => $trade['userid']))->find();
  180. if ($mun <= round($user_sell[$xnb . 'd'], 8)) {
  181. $save_sell_xnb = $mun;
  182. } else if ($mun <= round($user_sell[$xnb . 'd'], 8) + 1) {
  183. $save_sell_xnb = $user_sell[$xnb . 'd'];
  184. } else {
  185. throw new \Think\Exception('撤销失败2');
  186. }
  187. if (0 < $save_sell_xnb) {
  188. $rs[] = $mo->table('tw_user_coin')->where(array('userid' => $trade['userid']))->setInc($xnb, $save_sell_xnb);
  189. $rs[] = $mo->table('tw_user_coin')->where(array('userid' => $trade['userid']))->setDec($xnb . 'd', $save_sell_xnb);
  190. $user_sell_f = $mo->table('tw_user_coin')->where(array('userid' => $trade['userid']))->find();
  191. // 处理资金变更日志-----------------S
  192. switch ($xnb) {
  193. case 'hyjf':
  194. $cointype = 2;
  195. break;
  196. default:
  197. $cointype = 3;
  198. break;
  199. }
  200. $user_2_info = $mo->table('tw_user')->where(array('id' => $trade['userid']))->find();
  201. if (session('userId') > 0) {
  202. $position = 1;
  203. // 获取用户信息
  204. $user_info = $mo->table('tw_user')->where(array('id' => session('userId')))->find();
  205. $uu_name = $user_2_info['username'];
  206. $aa_name = $user_info['username'];
  207. $uu_id = $trade['userid'];
  208. $aa_id = session('userId');
  209. } elseif(session('admin_id') > 0) {
  210. $position = 0;
  211. $uu_name = $user_2_info['username'];
  212. $aa_name = session('admin_username');
  213. $uu_id = $trade['userid'];
  214. $aa_id = session('admin_id');
  215. } else {
  216. $admin_group = $mo->table('tw_auth_group_access')->where(array('group_id' => '3'))->find();
  217. $admin_info = $mo->table('tw_admin')->where(array('id' => $admin_group['uid']))->find();
  218. $position = 0;
  219. $uu_name = $user_2_info['username'];
  220. $aa_name = $admin_info['username'];
  221. $uu_id = $trade['userid'];
  222. $aa_id = $admin_info['id'];
  223. }
  224. // optype动作类型 'cointype' => 资金类型 'plusminus' => 1增加类型
  225. $rs[] = $mo->table('tw_finance_log')->add(array('username' => $uu_name, 'adminname' => $aa_name, 'addtime' => time(), 'plusminus' => 1, 'amount' => $save_sell_xnb, 'optype' => 17, 'cointype' => $cointype, 'old_amount' => $user_sell[$xnb], 'new_amount' => $user_sell_f[$xnb], 'userid' => $uu_id, 'adminid' => $aa_id,'addip'=>get_client_ip(),'position'=>$position));
  226. // 处理资金变更日志-----------------E
  227. }
  228. $rs[] = $mo->table('tw_trade')->where(array('id' => $trade['id']))->setField('status', 2);
  229. $you_sell = $mo->table('tw_trade')->where(array(
  230. 'market' => array('eq', $trade['market']),
  231. 'status' => 0,
  232. 'userid' => $trade['userid']
  233. ))->find();
  234. if (!$you_sell) {
  235. $you_user_sell = $mo->table('tw_user_coin')->where(array('userid' => $trade['userid']))->find();
  236. if (0 < $you_user_sell[$xnb . 'd']) {
  237. $mo->table('tw_user_coin')->where(array('userid' => $trade['userid']))->setField($xnb . 'd', 0);
  238. // 处理资金变更日志-----------------S
  239. switch ($xnb) {
  240. case 'hyjf':
  241. $cointype = 2;
  242. break;
  243. default:
  244. $cointype = 3;
  245. break;
  246. }
  247. $user_2_info = $mo->table('tw_user')->where(array('id' => $trade['userid']))->find();
  248. if (session('userId') > 0) {
  249. $position = 1;
  250. $uu_name = $user_2_info['username'];
  251. $uu_id = $trade['userid'];
  252. } else {
  253. $position = 0;
  254. $uu_name = $user_2_info['username'];
  255. $uu_id = $trade['userid'];
  256. }
  257. // optype动作类型 'cointype' => 资金类型 'plusminus' => 1增加类型
  258. $rs[] = $mo->table('tw_finance_log')->add(array('username' => $uu_name, 'adminname' => '系统', 'addtime' => time(), 'plusminus' => 0, 'amount' => $you_user_sell[$xnb . 'd'], 'optype' => 17, 'cointype' => $cointype, 'old_amount' => $you_user_sell[$xnb . 'd'], 'new_amount' => '0', 'userid' => $uu_id,'addip'=>get_client_ip(),'position'=>$position));
  259. // 处理资金变更日志-----------------E
  260. }
  261. }
  262. } else {
  263. throw new \Think\Exception('撤销失败3');
  264. }
  265. } catch(\Think\Exception $e) {
  266. if ($e == '撤销失败3') {
  267. $mo->execute('rollback');
  268. $mo->execute('unlock tables');
  269. return array('0', '撤销失败3');
  270. } else {
  271. $mo->execute('rollback');
  272. $mo->execute('unlock tables');
  273. // M('Trade')->where(array('id' => $id))->setField('status', 2);
  274. $mo->execute('commit');
  275. return array('0', '撤销失败');
  276. }
  277. }
  278. if (check_arr($rs)) {
  279. $mo->execute('commit');
  280. $mo->execute('unlock tables');
  281. S('getDepth', null);
  282. return array('1', '撤销成功');
  283. } else {
  284. $mo->execute('rollback');
  285. $mo->execute('unlock tables');
  286. return array('0', '撤销失败4|' . implode('|', $rs));
  287. }
  288. }
  289. }
  290. ?>