| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411 |
- <?php
- namespace app\common\model;
- use jobs\JpOrderJob;
- use jobs\ShopOrderJob;
- use think\db\exception\DbEventException;
- use think\Exception;
- use think\facade\Db;
- use think\Model;
- use utils\Queue;
- use function Qcloud\Cos\startWith;
- class YgOrderModel extends Model
- {
- protected $name = 'yg_order';
- public function orderSubmit($uid, $data){
- $order_sn = $data['order_sn'];
- $buy_price = $data['buy_price'];
- $jp_price = $data['jp_price'];
- if (empty($buy_price) || empty($jp_price) || empty($order_sn)){
- throw new Exception('参数错误');
- }
- if (!floatval($buy_price)>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;
- }
- }
|