Orders.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. <?php
  2. /**
  3. *
  4. * User: anyluck
  5. * Date: 2020/6/3
  6. * Time: 10:55
  7. */
  8. namespace app\web\model;
  9. use app\common\controller\Orde;
  10. use app\common\model\Mining;
  11. use app\common\model\Order;
  12. use app\common\model\OrderFrequency;
  13. use app\common\model\Quotation;
  14. use app\common\model\System;
  15. use app\common\model\User;
  16. use app\common\model\UserMessage;
  17. use app\common\model\VendibilityFinance;
  18. use Ramsey\Uuid\Uuid;
  19. use think\facade\Db;
  20. class Orders
  21. {
  22. // todo 订单
  23. /** 发布订单列表
  24. * @param $type 0买入数据 1卖出数据 2我的购买数据 3我的卖出数据
  25. * @param int $user_id 用户id
  26. * @param int $status 0 未匹配 1 已匹配或待支付 2已上传数据 3 已完成 4 已撤销 5 交易失败
  27. * @param int $page
  28. * @param int $limit
  29. * @param int $num 交易区块
  30. * @throws \think\db\exception\DbException
  31. */
  32. public static function order_list($type, $user_id = 0, $status = 0, $page = 1, $limit = 10,$num=0)
  33. {
  34. $where = [];
  35. switch ($type) {
  36. case 0 :// 求购数据
  37. $where[]=["push_user","=","0"];
  38. break;
  39. case 1:// 我的购买数据
  40. $where[] = ["buy_user", "=", $user_id];
  41. break;
  42. case 2:// 我的卖出数据
  43. $where[] = ["push_user", "=", $user_id];
  44. break;
  45. }
  46. if ($num){//交易区块 大小
  47. $where[]=["number","=",$num];
  48. }
  49. switch ($status){
  50. case 1:// 进行中的
  51. $where[]=["status","in",[0,1]];
  52. break;
  53. case 2:// 已完成
  54. $where[]=["status","in",[2,3,4,5]];
  55. break;
  56. }
  57. $order = Order::where($where)->order("status asc,id asc")->paginate(['list_rows' => $limit, 'page' => $page])->each(function ($item) use ($type) {
  58. if ($item["status"] == 0) {// 未支付结算时间计算
  59. if (time() > $item["add_time"]) {
  60. $item["stat_time"] = time() - $item["add_time"];
  61. } else {
  62. $item["stat_time"] = 0;
  63. }
  64. } else {
  65. $item["stat_time"] = 0;
  66. }
  67. $item["image"]=$item["image"]?:"";
  68. // 添加时间
  69. $item["add_times"] = date("Y-m-d H:i", $item["add_time"]);
  70. if ($item["end_time"]) {
  71. $item["end_time"] = date("Y-m-d H:i", $item["end_time"]);
  72. }
  73. return $item;
  74. })->toArray();
  75. return $order;
  76. }
  77. // 系统开关
  78. public static function open_system()
  79. {
  80. $list = Db::name('system')
  81. ->where(["type"=>"open"])
  82. ->field('name,value')
  83. ->column('value','name');
  84. return $list;
  85. }
  86. // 开盘控制
  87. public static function open_systems()
  88. {
  89. $day=date("w");
  90. $day=(int)$day;
  91. if ($day==0){
  92. $day=7;
  93. }
  94. $where["id"]=$day;
  95. $quer=Quotation::where($where)->find();
  96. if ($quer["status"]==1){
  97. json_result(400,"已经关盘,请等待开盘");
  98. }
  99. $now=date("H");
  100. if ($quer["stat"]>$now||$quer["end"]<$now){
  101. json_result(400,"开盘时间是".$quer["stat"]."点到".$quer["end"]."点");
  102. }
  103. return true;
  104. }
  105. /** 买入和卖出
  106. * @param $user 用户数据
  107. * @param $user_id 用户id
  108. * @param int $type 0 卖出 1 买入
  109. * @param int $qit_id // 卖出传买入的id
  110. * @param int $ming_id // 买入传 区块id
  111. * @throws \think\db\exception\DataNotFoundException
  112. * @throws \think\db\exception\DbException
  113. * @throws \think\db\exception\ModelNotFoundException
  114. */
  115. public static function push_order($user,$user_id,$type=0,$qit_id=0,$ming_id=0)
  116. {
  117. // 查看用户是否添加收账信息
  118. $userMeesage=UserMessage::where(["user_id"=>$user_id])->find();
  119. if (!$userMeesage){
  120. json_result(400,"请完善收账信息");
  121. }
  122. if ($type==0){// 直接卖出 更新原有数据
  123. $open_system=self::open_systems();
  124. // // 查看是否是否开盘
  125. // if (!$open_system["open"]){
  126. // json_result(400,"已经关盘,请等待开盘");
  127. // }
  128. // $now=date("H");
  129. // if ($open_system["open_start"]>$now||$open_system["open_end"]<$now){
  130. // json_result(400,"开盘时间是".$open_system["open_start"]."点到".$open_system["open_end"]."点");
  131. // }
  132. $where["id"]=$qit_id;
  133. $order=Order::where($where)->find();
  134. if (!$order){
  135. json_result(400,"买入订单id错误");
  136. }
  137. // 查看订单是否已经被买入
  138. if ($order->status!=0){// 这个可以加入redis 控制并发问题
  139. json_result(400,"该交易订单已经被卖出,或者取消");
  140. }
  141. // 查看交易是否是自己的
  142. if ($order->buy_user==$user_id){
  143. json_result(400,"自己买入的订单不能卖出");
  144. }
  145. // 查看矿区
  146. $mining=Mining::where(["id"=>$order->mining_id])->find();
  147. if ($user->money<$mining->tong_money){
  148. json_result(400,"通证余额不足");
  149. }
  150. if ($user->push_money<$order->number){
  151. json_result(400,"可售额度不足");
  152. }
  153. // 查看未完成订单
  154. $where_status[]=["status","in",[0,1,2]];
  155. $where_status[]=["push_user","=",$user_id];
  156. $count_order=Order::where($where_status)->count();
  157. // 查看该矿区交易次数
  158. $order_frequency=OrderFrequency::where(["user_id"=>$user_id,"mining_id"=>$order->mining_id])->find();
  159. if ($order_frequency){// 因为后台交易不加次数
  160. $count_order=$order_frequency->push+$count_order;
  161. if ($count_order==5){
  162. json_result(400,"该价格区已经达到卖出5次,请卖出其他价格区");
  163. }
  164. }else{
  165. if ($count_order==5){
  166. json_result(400,"该价格区已经达到卖出5次,请卖出其他价格区");
  167. }
  168. }
  169. if ($count_order+1==5){
  170. $sxf_money=$order->out_game;
  171. if ($user->money<$order->out_game){
  172. json_result(400,"通证余额不足");
  173. }
  174. }else{
  175. $sxf_money=$mining->tong_money;
  176. }
  177. // 订单处理
  178. Orde::push_order($user,$qit_id,$user_id,$order,$count_order,$sxf_money);
  179. }else{// 下单买入
  180. if (!$user["phone"]){
  181. json_result(310,"请绑定手机号码");
  182. }
  183. if (!$user["urgent_name"]||!$user["urgent_phone"]){
  184. json_result(320,"请完善紧急联系人");
  185. }
  186. $where_ming["id"]=$ming_id;
  187. $mining=Mining::where($where_ming)->find();
  188. if (!$mining){
  189. json_result(400,"交易区块id错误");
  190. }
  191. // 查看矿区
  192. $mining=Mining::where(["id"=>$ming_id])->find();
  193. if ($user->ensure_money<$mining->ensure_money){
  194. json_result(400,"保证金不足");
  195. }
  196. // 查看未完成订单
  197. $where_status[]=["status","in",[0,1,2]];
  198. $where_status[]=["buy_user","=",$user_id];
  199. $count_order=Order::where($where_status)->count();
  200. // 查看该矿区交易次数
  201. $order_frequency=OrderFrequency::where(["user_id"=>$user_id,"mining_id"=>$ming_id])->find();
  202. if ($order_frequency){// 因为后台交易不加次数
  203. $count_order=$order_frequency->buy+$count_order;
  204. if ($count_order==4){
  205. json_result(400,"该价格区已经达到买入4次,请购买其他价格区");
  206. }
  207. }else{
  208. if ($count_order==4){
  209. json_result(400,"该价格区已经达到买入4次,请购买其他价格区");
  210. }
  211. }
  212. // // 查看当前账号的通证是否满足
  213. // if ($user->money<$mining["num"]){
  214. // json_result(400,"当前账号通证不足");
  215. // }
  216. // $uuid = Uuid::uuid4(time());
  217. // $order = $uuid->getHex();
  218. $order=getordernum();
  219. $add["type"]=0;
  220. $add["buy_user"]=$user_id;
  221. $add["push_user"]="";
  222. $add["number"]=$mining["num"];
  223. $add["enlarge_quota"]=$mining["enlarge_quota"];
  224. $add["order"]=$order;
  225. $add["mining_id"]=$ming_id;
  226. $add["status"]=0;
  227. $add["add_time"]=time();
  228. $add["out_game"]=$mining["out_game"];
  229. $add["tong_money"]=$mining["tong_money"];
  230. $add["ensure_money"]=$mining["ensure_money"];
  231. Order::create($add);
  232. // // 账号操作 去除保证金
  233. // $ensure_money=$user->ensure_money-$mining->ensure_money;
  234. // Orde::buy_order($user_id,$ensure_money,$mining->ensure_money);
  235. }
  236. json_result(200,"操作成功");
  237. }
  238. // 订单详情
  239. public static function order_show($order,$user_id)
  240. {
  241. $data=[];
  242. if ($order->buy_user==$user_id){// 买入人是自己
  243. $data["type"]=0;// 查看卖出人信息
  244. $where_user["id"]=$order->buy_user;
  245. }else{// 卖出人
  246. $data["type"]=1;// 查看买入人信息
  247. $where_user["id"]=$order->push_user;
  248. }
  249. $user=User::where($where_user)->find();
  250. $user_message=UserMessage::where(["user_id"=>$where_user["id"]])->find();
  251. $data["number"]=$order->number;// bts数量
  252. $data["id"]=$order->id;// 订单id
  253. $data["msg"]=$order->msg?:"";// 失败原因
  254. $data["status"]=$order->status?:"";// 失败原因
  255. $data["order"]=$order->order;// 订单编号
  256. $data["add_time"]=date("Y-m-d H:i:s",$order->add_time);// 下单时间
  257. $data["adds_time"]=$order->add_time;// 下单时间戳
  258. $data["stat_time"]=$order->stat_time;// 下单结束时间戳
  259. if ($order->stat_time>$order->add_time){
  260. $data["time"]=$order->stat_time-$order->add_time;// 下单剩余多少秒
  261. }else{
  262. $data["time"]="";
  263. }
  264. if ($order->end_time){
  265. $data["end_time"]=date("Y-m-d H:i",$order->end_time);// 订单结束时间
  266. }else{
  267. $data["end_time"]="";
  268. }
  269. $data["image"]=$order->image?:"";// 支付凭据 图片 ,拼接
  270. if ( $data["type"]==0){//卖出人信息
  271. $data["user_name"]=$user->name;// 账号
  272. $data["user_phone"]=$user_message->phone;// 手机号
  273. $data["name"]=$user_message->name;//银行卡持卡人
  274. $data["bank_name"]=$user_message->bank_name;//银行卡名称
  275. $data["bank_number"]=$user_message->bank_number;//银行卡号
  276. $data["bank_branch"]=$user_message->bank_branch;//开户支行
  277. $data["ali_pay"]=$user_message->ali_pay;//支付宝账号
  278. $data["wx_pay"]=$user_message->wx_pay;//微信账号
  279. $data["ali_pay_image"]=$user_message->ali_pay_image;//支付宝收款码
  280. $data["wx_pay_image"]=$user_message->wx_pay_image;//微信收款码
  281. }else{// 买入人信息
  282. $data["user_name"]=$user->name;// 账号
  283. $data["user_phone"]=$user_message->phone;// 手机号
  284. $data["name"]="";//银行卡持卡人
  285. $data["bank_name"]="";//银行卡名称
  286. $data["bank_number"]="";//银行卡号
  287. $data["bank_branch"]="";//开户支行
  288. $data["ali_pay"]="";//支付宝账号
  289. $data["wx_pay"]="";//微信账号
  290. $data["ali_pay_image"]="";//支付宝收款码
  291. $data["wx_pay_image"]="";//微信收款码
  292. }
  293. json_result(200,"",$data);
  294. }
  295. /**处理订单失败
  296. * @param $user_id 用户id
  297. * @param $msg 失败原因
  298. */
  299. public static function order_fail($msg,$order_id)
  300. {
  301. $order=Order::where(["id"=>$order_id])->find();
  302. if (!$order){
  303. json_result(400,"订单不存在");
  304. }
  305. if ($order->status!=2){
  306. json_result(400,"还没有上传证明");
  307. }
  308. Orde::order_fail($msg,$order);
  309. json_result(200,"处理成功");
  310. }
  311. //手机号和邮箱注册次数
  312. public static function phone_email()
  313. {
  314. $phone_email=System::where(["name"=>"phone_email"])->value("value");
  315. if ($phone_email){
  316. return $phone_email;
  317. }else{
  318. return 1;
  319. }
  320. }
  321. /** 减去账号余额 或添加 并加加记录
  322. * @param $user_id 用户
  323. * @param $jian 0 加 1减
  324. * @param $zi 哪个字段
  325. * @param $money 金额
  326. * @param $content 说明
  327. */
  328. public static function user_find($user_id,$jian,$zi,$money,$content)
  329. {
  330. }
  331. }