Orders.php 12 KB

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