Orde.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. <?php
  2. /**
  3. *
  4. * User: anyluck
  5. * Date: 2020/6/4
  6. * Time: 13:29
  7. */
  8. namespace app\common\controller;
  9. use app\common\model\BondFinance;
  10. use app\common\model\Finance;
  11. use app\common\model\Mining;
  12. use app\common\model\Order;
  13. use app\common\model\OrderFrequency;
  14. use app\common\model\User;
  15. use app\common\model\VendibilityFinance;
  16. use app\web\model\Msg;
  17. class Orde
  18. {
  19. // 订单处理 前后台通用
  20. /**卖出处理
  21. * @param $order_id 订单id
  22. * @param $push_user_id 购买用户
  23. * @param $order 交易订单
  24. * @param $count_order 已购买次数
  25. */
  26. public static function push_order($user, $order_id, $push_user_id, $order, $count_order, $sxf_money = 0)
  27. {
  28. // 修改订单信息
  29. Message::add_message($order->buy_user,2,"您有新交易","您有新的".$order["number"]."区交易匹配成功,编号【".$order["order"]."】,请在1小时内完成付款");
  30. //减去账号通证 和可售额度
  31. if ($count_order + 1 == 5) {
  32. $money = $user->money - $order->out_game;// 通行证
  33. } else {
  34. $money = $user->money - $order->tong_money;// 通行证
  35. }
  36. $push_money = $user->push_money - $order->number;// 可售额度
  37. User::update(["money" => $money, "push_money" => $push_money], ["id" => $push_user_id]);
  38. $where["id"] = $order_id;
  39. $update["push_user"] = $push_user_id;
  40. $update["sxf_money"] = $money;//卖出已交手续费
  41. $update["status"] = 1;
  42. $update["stat_time"] = time() + 1 * 3600;
  43. Order::where($where)->update($update);
  44. // 添加财务记录
  45. self::Finance($push_user_id, "卖出BTS", $money, 1);
  46. // 给买家发短信或邮件
  47. $buy_user_id = $order->buy_user;// 买入人
  48. $buy_user = User::where(["id" => $buy_user_id])->field("id,phone,mail")->find();
  49. // 发送通知用户 短信和邮件
  50. $content = "其他对您卖出BTS,请登录前去查看";
  51. if ($buy_user->phone) {
  52. Msg::phone($content, $user->phone);
  53. } else {
  54. Msg::mail($content, $user->mail);
  55. }
  56. }
  57. // /**买入 减去对应的保证金
  58. // * @param $buy_user_id 用户id
  59. // * @param $money // 剩余多少钱
  60. // * @param $jmoney // 减去多少钱
  61. // * @param $ensure_money // 减去保证金
  62. // */
  63. // public static function buy_order($buy_user_id, $ensure_money, $jensure_money)
  64. // {
  65. // User::update(["ensure_money" => $ensure_money], ["id" => $buy_user_id]);// 更新用户金额
  66. // // 添加保证金记录
  67. // self::bond_finance($buy_user_id, "发起购买BTS交易", $jensure_money, 1);
  68. // }
  69. // 转账处理
  70. public static function transfer($user_id, $puser_id, $money, $jmoney, $name)
  71. {
  72. // 给转账人减钱
  73. User::update(["money" => $jmoney], ["id" => $user_id]);
  74. // 给接受人加钱
  75. $where["id"] = $puser_id;
  76. $user = User::where($where)->field("money,name,phone,mail")->find();
  77. $zong_money = $user->money + $money;
  78. User::update(["money" => $zong_money], ["id" => $puser_id]);
  79. self::Finance($user_id, "您给用户" . $user->name . "转账", $money, 1);// 转账人减钱
  80. self::Finance($puser_id, "用户" . $name . "给您转账", $money, 0);// 收账人加钱
  81. // 发送通知用户 短信和邮件
  82. $content = "用户" . $name . "给你转账" . $money . "BTS";
  83. if ($user->phone) {
  84. Msg::phone($content, $user->phone);
  85. } else {
  86. Msg::mail($content, $user->mail);
  87. }
  88. }
  89. // 保证金操作
  90. public static function bond_transfer($user, $user_id, $money, $type)
  91. {
  92. if ($type == 0) {//0 充值 1 提现
  93. $moneys = $user->money - $money;// 通证
  94. $ensure_moneys = $user->ensure_money + $money;// 加保证金
  95. User::update(["money" => $moneys, "ensure_money" => $ensure_moneys], ["id" => $user_id]);
  96. // 添加财务记录
  97. self::Finance($user_id, "保证金充值", $money, 1);
  98. self::bond_finance($user_id, "保证金充值", $money, 0);
  99. } else {
  100. $ensure_moneys = $user->ensure_money - $money;// 加保证金
  101. $money = $user->money + $money;// 通证
  102. User::update(["money" => $money, "ensure_money" => $ensure_moneys], ["id" => $user_id]);
  103. // 添加财务记录
  104. self::Finance($user_id, "保证金提现", $money, 0);
  105. self::bond_finance($user_id, "保证金提现", $money, 1);
  106. }
  107. }
  108. //
  109. //// 后台充值
  110. // public static function admin_Recharge($user_id, $money)
  111. // {
  112. // $where["id"] = $user_id;
  113. // $user = User::where($where)->field("money,name,phone,mail")->find();
  114. // $zong_money = $user->money + $money;
  115. // User::update(["money" => $zong_money], ["id" => $user_id]);// 更新账号金额
  116. // self::Finance($user_id, "充值成功", $money, 0);
  117. // // 发送通知用户 短信和邮件
  118. // $content = "充值" . $money . "BTS已处理";
  119. // if ($user->phone) {
  120. // Msg::phone($content, $user->phone);
  121. // } else {
  122. // Msg::mail($content, $user->mail);
  123. // }
  124. // }
  125. // 订单失败处理,全局使用
  126. public static function order_fail($msg, $order)
  127. {
  128. Message::add_message($order->buy_user,2,"交易关闭","您在".$order->number."区的订单,编号【".$order->order."】,交易关闭。关闭原因".$msg);
  129. Message::add_message($order->push_user,2,"交易关闭","您在".$order->number."区的订单,编号【".$order->order."】,交易关闭。关闭原因".$msg);
  130. // 查找交易区块
  131. $mining = Mining::where(["id" => $order->mining_id])->find();
  132. // 扣除买入人的违约金
  133. $ensure_money = $mining->breach_money;
  134. $where["id"] = $order->buy_user;
  135. $user = User::where($where)->find();
  136. $update["ensure_money"] = $user->ensure_money - $ensure_money;
  137. // 添加违约金记录
  138. self::bond_finance($order->buy_user, "交易失败扣除保证金", $ensure_money, 1);
  139. User::update($update, $where);
  140. // 给卖出人加钱
  141. $push_user = User::where(["id" => $order->push_user])->find();
  142. $push_money = $push_user->push_money + $order->number;// 加回可售额度
  143. // 加上违约金 加入通证 和手续费
  144. $add_money = $ensure_money + $order->sxf_money;// 总获得多少钱
  145. $money = $push_user->money + $add_money;// 账号变动
  146. User::update(["money" => $money, "push_money" => $push_money], ["id" => $order->push_user]);
  147. // 添加记录
  148. self::Finance($order->push_user, "交易失败退回手续费", $order->sxf_money, 0);
  149. self::Finance($order->push_user, "交易失败获得违约金", $ensure_money, 0);
  150. Message::add_message($order->buy_user,2,"您有交易违约行为","您在".$order->number."区的订单,编号【".$order->order."】,交易违约。关闭原因".$msg."将从您的账户扣除".$ensure_money."保证金");
  151. Message::add_message($order->push_user,2,"交易关闭","您在".$order->number."区的订单,编号【".$order->order."】,交易关闭。关闭原因".$msg."您将获得".$ensure_money."违约金作为补偿");
  152. // 更新订单状态
  153. $where_order["id"] = $order->id;
  154. $update_order["msg"] = $msg;
  155. $update_order["status"] = 5;
  156. $update_order["end_time"] = time();
  157. Order::update($update_order, $where_order);
  158. return 1;
  159. }
  160. /** 交易成功全局使用
  161. * @param $order 订单数据
  162. */
  163. public static function order_success($order)
  164. {
  165. Message::add_message($order->buy_user,2,"交易完成","您在".$order->number."区的订单,编号【".$order->order."】,交易完成");
  166. Message::add_message($order->push_user,2,"交易完成","您在".$order->number."区的订单,编号【".$order->order."】,交易完成");
  167. // 更新订单状态
  168. $update_order["status"]=3;
  169. $update_order["end_time"]=time();
  170. Order::update($update_order,["id"=>$order->id]);
  171. $buy_user = $order->buy_user;// 买入人
  172. $push_user = $order->push_user;// 卖出人
  173. $mining_id = $order->mining_id;// 交易区
  174. $mining = Mining::where(["id" => $mining_id])->find();// 交易区
  175. if (!$mining){
  176. json_result(400,"价格区已经不存在了,无法计算");
  177. }
  178. // 统计交易次数
  179. // todo 买入人处理
  180. $buy_order_frequency = OrderFrequency::where(["user_id" => $buy_user, "mining_id" => $mining_id])->find();
  181. if (!$buy_order_frequency) {//不存在
  182. $buy_count = 1;
  183. $buy_number = 1;
  184. $push_number = 0;
  185. $add_buy["user_id"] = $buy_user;
  186. $add_buy["mining_id"] = $mining_id;
  187. $add_buy["buy"] = 1;
  188. $add_buy["push"] = 0;
  189. OrderFrequency::create($add_buy);
  190. } else {
  191. $buy_count = $buy_order_frequency->buy + 1;
  192. $buy_number = $buy_count;
  193. $push_number = $buy_order_frequency->push;
  194. OrderFrequency::update(["buy" => $buy_count], ["id" => $buy_order_frequency->id]);// 更新次数
  195. }
  196. $buy_user_data = User::where(["id" => $buy_user])->find();
  197. $keshou_money = $mining->enlarge_quota;// 可售额度
  198. // 第一次交易给用户加矿池金
  199. if ($buy_count == 1) {
  200. $pool_money = $mining->mining;
  201. $update_buy["pool_money"] = $buy_user_data->pool_money + $pool_money;// 加矿池金
  202. self::VendonolotyFinance($buy_user, $mining_id, $order->id, $order->number, $mining->mining, $keshou_money, $buy_number, $push_number, 1);
  203. }
  204. $enlarge_quota = $keshou_money + $buy_user_data->push_money;//可售额度
  205. // 给账号加相应数据
  206. $update_buy["push_money"] = $enlarge_quota;
  207. User::update($update_buy, ["id" => $buy_user]);
  208. // TODO 卖出处理
  209. $push_order_frequency = OrderFrequency::where(["user_id" => $push_user, "mining_id" => $mining_id])->find();
  210. if (!$push_order_frequency) {
  211. $push_count = 1;
  212. $add_push["user_id"] = $push_user;
  213. $add_push["mining_id"] = $mining_id;
  214. $add_push["buy"] = 0;
  215. $add_push["push"] = 1;
  216. OrderFrequency::create($add_push);
  217. } else {
  218. $push_count = $push_order_frequency->push + 1;
  219. OrderFrequency::update(["push" => $push_count], ["id" => $push_order_frequency->id]);// 更新次数
  220. }
  221. // 减少账号的矿金
  222. $push_user_data = User::where(["id" => $push_user])->find();
  223. $kuangjine = $push_user_data->pool_money - $mining->num;
  224. User::update(["pool_money" => $kuangjine], ["id" => $push_user]);
  225. if ($push_count == 5) {// 第五次 代理结算
  226. $direct_push = $mining->direct_push;//直推获得
  227. $second_push = $mining->second_push;//次推获得
  228. // 查找直接上级
  229. if ($push_user_data->pid) {// 是否存在直接上级
  230. $zhitui_push_user = User::where(["id" => $push_user_data->pid])->find();
  231. if ($zhitui_push_user) {
  232. // 直推奖励
  233. if ($direct_push) {// 直推奖励设置不小于0
  234. // 查看活跃度
  235. $zhitui_time =strtotime($zhitui_push_user->update_time) + (24 * 3600);
  236. if ($zhitui_time >= time()) {// 在活跃度里面就计算奖励
  237. $update_zhitui["money"] = $zhitui_push_user->money + $direct_push;
  238. User::update($update_zhitui, ["id" => $push_user_data->pid]);
  239. // 添加财务记录
  240. self::Finance($push_user_data->pid, "获得直推奖励", $direct_push, 0,1);
  241. }
  242. }
  243. if ($zhitui_push_user->pid) {// 是否存在次级上级
  244. // 次级上级
  245. if ($second_push) {// 次级奖励不小于0
  246. // 查询次级用户
  247. $ciji_push_user = User::where(["id" => $zhitui_push_user->pid])->find();
  248. if ($ciji_push_user) {
  249. $ciji_time = (int)strtotime($ciji_push_user->update_time) + 24 * 3600;
  250. if ($ciji_time >= time()) {// 给次级上级发奖励
  251. $update_ciji["money"] = $ciji_push_user->money - $second_push;
  252. User::update($update_ciji, ["id" => $zhitui_push_user->pid]);
  253. // 添加财务记录
  254. self::Finance($zhitui_push_user->pid, "获得次推奖励", $second_push, 0,1);
  255. }
  256. }
  257. }
  258. }
  259. }
  260. }
  261. }
  262. }
  263. //资产明细
  264. public static function Finance($user_id, $name, $money, $status,$daili=0)
  265. {
  266. $add["user_id"] = $user_id;
  267. $add["name"] = $name;
  268. $add["money"] = $money;
  269. $add["status"] = $status;
  270. $add["daili"] = $daili;
  271. $add["add_time"] = time();
  272. Finance::create($add);
  273. }
  274. // 保证金处理
  275. public static function bond_finance($user_id, $name, $money, $status)
  276. {
  277. $add["user_id"] = $user_id;
  278. $add["name"] = $name;
  279. $add["money"] = $money;
  280. $add["status"] = $status;
  281. $add["add_time"] = time();
  282. BondFinance::create($add);
  283. }
  284. /**可售余额 记录
  285. * @param $user_id 用户id
  286. * @param $mining_id 区块id
  287. * @param $order_id 订单id
  288. * @param $money 获得交易区块
  289. * @param $pool 矿池数量
  290. * @param $push_money 可售额度
  291. * @param $buy 当前买入次数
  292. * @param $push 当前卖出次数
  293. * @param $status 0 增加 1 减少
  294. */
  295. public static function VendonolotyFinance($user_id, $mining_id, $order_id, $money, $pool, $push_money, $buy, $push, $status)
  296. {
  297. $add["user_id"] = $user_id;
  298. $add["mining_id"] = $mining_id;
  299. $add["order_id"] = $order_id;
  300. $add["money"] = $money;
  301. $add["pool"] = $pool;
  302. $add["push_money"] = $push_money;
  303. $add["buy"] = $buy;
  304. $add["push"] = $push;
  305. $add["status"] = $status;
  306. $add["add_time"] = time();
  307. VendibilityFinance::create($add);
  308. }
  309. }