0){ sr_throw('一口价输入非法'); } if (!floatval($jp_price)>0){ sr_throw('竞拍价输入非法'); } if ($buy_price < $jp_price){ sr_throw('一口价不能低于竞拍价'); } $order_info = Db::name('shop_order')->where('order_sn', $order_sn)->find(); if (!$order_info){ throw new Exception('未找到订单'); } if ($order_info['user_id'] != $uid){ throw new Exception('不是你的订单'); } if ($order_info['hg_status'] === 2){ throw new Exception('订单已回购,请求重复提交'); } if ($order_info['status'] != 1){ throw new Exception('订单状态有误'); } if ($order_info['hg_status'] == 2){ throw new Exception('已回购商品不能二次回购,请联系客服'); } $cur_time = time(); if ($order_info['pay_type'] != 3){ $pay_info = Db::name('payment')->where('order_type', 4)->where('remarks', $order_sn)->where('state', 6)->find(); if (!$pay_info){ throw new Exception('订单错误,或不是商城订单'); } if ($order_info['hg_enable'] == 1){ // 回购时间 if ($cur_time - strtotime($pay_info['pay_at']) > env('APP.YG_BACK_EXPIRE', 3600)){ throw new Exception('回购超时'); } }else{ sr_throw('该订单已回购,不能再次参与'); } } if ($order_info['status'] != 1){ throw new Exception('订单状态错误'); } Db::name('shop_order')->where('order_sn', $order_sn)->save(['status'=>4, 'hg_status'=>2, 'hg_enable'=>2]); $order_goodsinfo = Db::name('shop_order_goods')->where('order_id', $order_info['order_id'])->find(); $ygorder_id = Db::name('yg_order')->insertGetId([ 'uid'=>$uid, 'status'=>1, 'order_sn'=>$order_sn, 'end_time'=>sr_getcurtime($cur_time+env('app.YG_ORDER_EXPIRED_TIME', 3600)), 'buy_price'=>$buy_price, 'jp_price'=>$jp_price, 'create_time'=>sr_getcurtime(time()), 'goods_id'=>$order_goodsinfo['goods_id'], 'num'=>$order_info['num'] ]); // 定时任务 // $ex_time = intval(env('APP.YG_ORDER_EXPIRED_TIME', 3600)); // Queue::instance()->log('竞拍过期执行成功:'.$ygorder_id)->job(JpOrderJob::class)->do('YgOrderExpired')->secs($ex_time)->push([$ygorder_id]); } public function ygGoodsList($uid, $sort, $page, $limit, $status){ $order = 'y.id desc'; switch ($sort){ case 1: $order = 'y.create_time asc'; break; case 2: $order = 'y.create_time desc'; break; case 3: $order = 'y.buy_price asc'; break; case 4: $order = 'y.buy_price desc'; break; case 5: $order = 'y.cur_price asc'; break; case 6: $order = 'y.cur_price desc'; break; } if ($status == 0){ $status = [1,2,3]; }else{ $status = [$status]; } $list = Db::name('yg_order') ->alias('y') ->leftJoin('shop_goods g', 'g.goods_id = y.goods_id') ->where('status', 'in', $status) ->withAttr('create_time', function ($val, $data){ return sr_getcurtime(strtotime($val), 'Y-m-d H:i'); }) ->page($page, $limit) ->order($order) ->field('y.*,g.goods_name,g.goods_img') ->select() ->toArray(); return $list; } public function ygGoodsDetail($yg_goodsid){ $yg_goodsinfo = self::where('id', $yg_goodsid)->findOrEmpty()->toArray(); if (!$yg_goodsinfo){ sr_throw('查询失败'); } if ($yg_goodsinfo['cur_price'] == 0){ $yg_goodsinfo['cur_price'] = $yg_goodsinfo['jp_price']; } $goods_info = Db::name('shop_goods')->where('goods_id', $yg_goodsinfo['goods_id'])->field('goods_sn,goods_name,goods_remark,goods_img,goods_img_banner,price,rebate_score_most,rebate_score_lock')->find(); // 查询goods_sn $yg_goodsinfo['goods_sn'] = $goods_info['goods_sn']; // 查询富文本 $yg_goodsinfo['goods_name'] = $goods_info['goods_name']; $yg_goodsinfo['goods_remark'] = htmlspecialchars_decode($goods_info['goods_remark']); $yg_goodsinfo['goods_img'] = $goods_info['goods_img']; $yg_goodsinfo['goods_img_banner'] = $goods_info['goods_img_banner']; $yg_goodsinfo['price'] = $goods_info['price'] * $yg_goodsinfo['num']; $yg_goodsinfo['rebate_score_most'] = $goods_info['rebate_score_most'] * $yg_goodsinfo['num']; $yg_goodsinfo['rebate_score_lock'] = $goods_info['rebate_score_lock'] * $yg_goodsinfo['num']; return $yg_goodsinfo; } // is_all 1 不是全部 2全部 public function ygGoodsJpList($yg_goodsid, $is_all, $uid){ $list = Db::name('yg_buy_record') ->alias('r') ->leftJoin('user u', 'u.id = r.uid') ->where('yg_id', $yg_goodsid) ->field('r.*,u.nickname,u.avatar') ->withAttr('avatar', function ($val, $data){ return getWebUrl().'/'.$val; }) ->order('id desc') ->page(1, $is_all==2?10000:3) ->select() ->toArray(); foreach ($list as $key=>$val){ if ($val['uid'] == $uid){ $list[$key]['nickname'] = '我'; } } return $list; } // 竞拍购买 public function joinYgWithXz($uid, $address_id, $money, $yg_goodsid){ $user_info = Db::name('user')->where('id', $uid)->find(); $yg_goodsinfo = self::where('id', $yg_goodsid)->find()->toArray(); if (!floatval($money)>0){ sr_throw('输入非法'); } if ($yg_goodsinfo['status'] != 1){ sr_throw('竞拍失败,商品已流拍或已结算'); } if ($yg_goodsinfo['uid'] === $uid){ sr_throw('不能参加自己的竞拍,竞拍失败'); } $scale = get_user_shouxufei($uid); $shouxu_xz = number_format($scale*$money/100, '2', '.', ''); $need_xz = $money + $shouxu_xz; if ($user_info['xz_num'] < $need_xz){ sr_throw('您的星钻不足,竞拍失败'); } if ($user_info['xz_num'] < (10+$need_xz)){ sr_throw('参加失败,账户必须有10个星钻剩余'); } if (!Db::name('user_address')->where('uid', $uid)->where('id', $address_id)->find()){ sr_throw('地址校验失败'); } // 五分钟之内有抢购在加5分钟延时 $end_time = strtotime($yg_goodsinfo['end_time']); if (time() < $end_time){ if ($end_time - time() < 300){ self::where('id', $yg_goodsid)->save(['end_time'=>sr_getcurtime($end_time+300)]); } }else{ throw new Exception('状态错误,请刷新数据', 344); } // 当前没人竞拍 if ($yg_goodsinfo['jp_count'] == 0){ if ($money < $yg_goodsinfo['jp_price']){ sr_throw('第一次竞拍的价格必须大于等于竞拍价'); } if ($money >= $yg_goodsinfo['buy_price']){ sr_throw('第一次竞拍价格必须小于一口价'); } }else{ if ($money <= $yg_goodsinfo['cur_price']){ throw new Exception('竞拍价格必须大于当前竞拍最大价格', 344); } if ($money >= $yg_goodsinfo['buy_price']){ sr_throw('竞拍价格必须小于一口价'); } $addmoney = intval(number_format(($money*100 - $yg_goodsinfo['cur_price']*100), '0', '.', '')); $need = env('APP.YG_ONCE_ADD') * 100; if (intval($need) > intval($addmoney)){ sr_throw('当前加价幅度不能低于'.env('APP.YG_ONCE_ADD')); } $max_recordid = Db::name('yg_buy_record')->where('yg_id', $yg_goodsid)->max('id'); $max_recordInfo = Db::name('yg_buy_record')->where('id', $max_recordid)->find(); Db::name('yg_buy_record')->where('id', $max_recordid)->save([ 'status'=>2 ]); edit_user_xz(11, $max_recordInfo['uid'], $max_recordInfo['price']+$max_recordInfo['shouxu']); // $jg_regid = Db::name('user')->where('id', $max_recordInfo['uid'])->value('jg_regid'); // JPushServicePushOneMsg(false, $jg_regid, '您的竞拍被别人拍下了,快去看看吧', ['type'=>2,'params'=>json_encode(['yg_id'=>$max_recordInfo['yg_id']])]); } Db::name('yg_order')->where('id', $yg_goodsid)->inc('jp_count', 1)->update(); $r_id = Db::name('yg_buy_record')->insertGetId([ 'uid'=>$uid, 'price'=>$money, 'shouxu'=>$shouxu_xz, 'yg_id'=>$yg_goodsid, 'status'=>1, 'type'=>2, 'create_time'=>sr_getcurtime(time()), 'address_id'=>$address_id, 'goods_id'=>$yg_goodsinfo['goods_id'], 'num'=>$yg_goodsinfo['num'] ]); self::where('id', $yg_goodsid)->save([ 'cur_price'=>$money, 'address_id'=>$address_id ]); // 扣除用户竞拍的星钻 并添加记录 edit_user_xz(10, $uid, ($money+$shouxu_xz), $r_id, $shouxu_xz); } // 一口价购买 public function joinYgWithBuy($uid, $address_id, $yg_goodsid){ $user_info = Db::name('user')->where('id', $uid)->find(); $yg_goodsinfo = self::where('id', $yg_goodsid)->find()->toArray(); if ($yg_goodsinfo['status'] != 1){ sr_throw('竞拍失败,商品已流拍或已结算'); } if ($yg_goodsinfo['uid'] === $uid){ sr_throw('不能参加自己的竞拍,竞拍失败'); } $money = $yg_goodsinfo['buy_price']; $scale = get_user_shouxufei($uid); $shouxu_xz = number_format($scale*$money/100, '2', '.', ''); if ($user_info['xz_num'] < ($money+$shouxu_xz)){ sr_throw('您的星钻不足,购买失败'); } if ($user_info['xz_num'] < (10+$money+$shouxu_xz)){ sr_throw('参加失败,账户必须有10个星钻剩余'); } if (!Db::name('user_address')->where('uid', $uid)->where('id', $address_id)->find()){ sr_throw('地址校验失败'); } // 订单状态改变 Db::name('shop_order')->where('order_sn', $yg_goodsinfo['order_sn'])->save(['status'=>5,'hg_status'=>3]); Db::name('yg_order')->where('id', $yg_goodsid)->save(['status'=>2]); Db::name('yg_order')->where('id', $yg_goodsid)->inc('jp_count', 1)->update(); if ($yg_goodsinfo['jp_count'] > 0){ // 退回当前竞拍的最高价 $max_recordid = Db::name('yg_buy_record')->where('yg_id', $yg_goodsid)->max('id'); $max_recordInfo = Db::name('yg_buy_record')->where('id', $max_recordid)->find(); Db::name('yg_buy_record')->where('id', $max_recordid)->save([ 'status'=>2 ]); edit_user_xz(11, $max_recordInfo['uid'], $max_recordInfo['price']+$max_recordInfo['shouxu']); } $r_id = Db::name('yg_buy_record')->insertGetId([ 'uid'=>$uid, 'price'=>$yg_goodsinfo['buy_price'], 'yg_id'=>$yg_goodsid, 'status'=>3, 'type'=>1, 'create_time'=>sr_getcurtime(time()), 'address_id'=>$address_id, 'goods_id'=>$yg_goodsinfo['goods_id'], 'num'=>$yg_goodsinfo['num'] ]); self::where('id', $yg_goodsid)->save([ 'cur_price'=>$yg_goodsinfo['buy_price'], 'address_id'=>$address_id ]); // 扣除用户竞拍的星钻 并添加记录 edit_user_xz(10, $uid, $money+$shouxu_xz, $r_id, $shouxu_xz); // 给回购人员结算 // $demoney = number_format($yg_goodsinfo['buy_price']*(100-env('APP.YG_BACK_EXPIRE', 5))/100, '2', '.', ''); // $shouxu = $yg_goodsinfo['buy_price']-$demoney; edit_user_xz(12, $yg_goodsinfo['uid'], $yg_goodsinfo['buy_price'], $yg_goodsinfo['order_sn'], 0); } public function joinYgOrderList($uid, $status, $page, $limit){ $where = []; if (!(empty($status) || $status == 0)){ $where[] = ['r.status', '=', $status]; }else{ $where[] = ['r.status', 'in', [1,2,3,4]]; } $list = Db::name('yg_buy_record') ->alias('r') ->leftJoin('yg_order o', 'o.id = r.yg_id') ->leftJoin('shop_goods g', 'g.goods_id = r.goods_id') ->leftJoin('user_address a', 'a.id = r.address_id') ->where('r.uid', $uid) ->where($where) ->field('r.*,o.order_sn,g.goods_name,g.goods_img,a.name as reciver_name,a.mobile as reciver_mobile,a.mergename as reciver_remark') ->order('r.create_time desc') ->page($page, $limit) ->select() ->toArray(); return $list; } }