简单秒杀

/**
* 后台添加秒杀商品
*/

    public function add()
    {
        if ($this->request->isPost()) {
            $params = $this->request->post("row/a");
            $time_info = Db::name('seckill_category')->where('id',$params['id'])->find();
            $start_time = strtotime(date('Y-m-d',strtotime('+1 day'))) + $time_info['start']*3600;
            $end_time = strtotime(date('Y-m-d',strtotime('+1 day'))) + $time_info['end']*3600;

            $params['start_time'] = $start_time;
            $params['end_time'] = $end_time;

            if ($params) {
                $params = $this->preExcludeFields($params);
                if ($this->dataLimit && $this->dataLimitFieldAutoFill) {
                    $params[$this->dataLimitField] = $this->auth->id;
                }

                $result = false;
                Db::startTrans();
                try {
                    //是否采用模型验证
                    if ($this->modelValidate) {
//                       return $params;
                        $name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
                        $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : $name) : $this->modelValidate;
                        $this->model->validateFailException(true)->validate($validate);
                    }
                    unset($params['id']);
                    $result = $this->model->allowField(true)->save($params);

                    $id=$this->model->id; //刚刚插入的id
                    $redis = new \Redis();
                    $redis->connect('127.0.0.1', 6379);
                    $res = $redis->llen('seckill'.$id);
                    $count = $params['stock'] - $res;
                    for($i=0;$i<$count;$i++){
                        $redis->lpush('seckill'.$id,1);
                    }
//                    return $redis->llen("'seckill'.$id");
                    Db::commit();
                } catch (ValidateException $e) {
                    Db::rollback();
                    $this->error($e->getMessage());
                } catch (PDOException $e) {
                    Db::rollback();
                    $this->error($e->getMessage());
                } catch (Exception $e) {
                    Db::rollback();
                    $this->error($e->getMessage());
                }
                if ($result !== false) {
                    $this->success();
                } else {
                    $this->error(__('No rows were inserted'));
                }
            }
            $this->error(__('Parameter %s can not be empty', ''));
        }

        return $this->view->fetch();
    }

/**
* 抢到付款
* @ApiMethod (post)
* @ApiReturn ({“code”:1,“msg”:“返回成功”})
* @ApiParams (name=“goods_id”, type=“string”, required=true,description=“商品id”)
* @ApiParams (name=“address_id”, type=“string”, required=true,description=“地址id”)
* @ApiParams (name=“num”, type=“string”, required=true,description=“商品数量”)
* @ApiParams (name=“password”, type=“string”, required=true,description=“交易密码”)
*/


    public function payment()
    {
        $user = $this->auth->getUser();
        $address_id = $this->request->param('address_id');
        if (empty($address_id)){
            $this->error('请选择收货地址');
        }
        $goods_id = $this->request->param('goods_id');
        if (empty($goods_id)){
            $this->error('缺少商品id');}
        $goods_info =Db::name('seckill_goods')->where('id',$goods_id)->find();
        $price = $goods_info['seckill_price'];
        $num = $this->request->param('num');
        $password = $this->request->param('password');
        $uid = $user['id'];
        $all_money = $num*$price;
        $money = Db::name('user')->where('id',$uid)->value('money');

        $redis = new \Redis();
        $redis->connect('127.0.0.1', 6379);
        //查看库存
        $stock = $redis->llen(('seckill'.$goods_id));

        if ($stock == 0) {
            return json(['code' => 0, 'msg' => '该商品已被抢完']);
        }
        if ($num > $stock) {
            return json(['code' => 0, 'msg' => '库存不足']);
        }
        if (empty($password)){
            $this->error('请填写支付密码');
        }
        //判断交易密码
        if($user['safety_password'] != $this->auth->getEncryptPassword($password, $user['safety_salt'])){
            $this->error('支付密码错误');
        }
        if ($money<$all_money){
            $this->error('余额不足请充值');
        }
        Db::startTrans();
        try {
            //余额减少
            Db::name('user')->where('id',$uid)->setDec('money',$all_money);
            //减少库存
            $redis->lPop('seckill'.$goods_id);
            //添加地址生成订单
            $this->seckill_order($address_id,$goods_id,$num,$user);
            //记录log日志
            $money_log = [
                'user_id'=>$uid,
                'number'=>-$all_money,
                'before'=>$money,
                'after'=>$money-$all_money,
                'type'=>'seckill_01',
                'create_time'=>time()
            ];
            Db::name('money_log')->insert($money_log);
            //改变订单状态
            Db::commit();
            return json(['code'=>1,'msg'=>'成功']);
        } catch (ValidateException $e) {
            Db::rollback();
            $this->error($e->getMessage());
        }

    }

/*
**秒杀生成订单
/


    public function seckill_order($address_id,$id,$num,$user)
    {
        $goods_info = Db::name('seckill_goods')->where('id',$id)->find();
        $address = Db::name('address')->where('userid',$user['id'])->where('id',$address_id)->find();

        $seckill_order = [
            'order_number'=>$this->build_order_no(),
            'goods_id'=>$id,
            'user_id'=>$user['id'],
            'num'=>$num,
            'price'=>$goods_info['seckill_price'],
            'z_price'=>$num*$goods_info['seckill_price'],
            'username'=>$user['username'],
            'mobile' =>$user['mobile'],
            'address'=>$address['city'].$address['area'].$address['street'].$address['address'],
            'status'=>1,
            'create_time'=>time(),
            'fare'=>0,
            'pay_style'=>0,  //余额
            'address_id'=>$address_id
        ];

        Db::startTrans();
        try {
            Db::name('seckill_order')->insert($seckill_order);
            Db::name('seckill_goods')->where('id',$id)->setInc('sell',$num);
            Db::commit();
            return json(['code'=>1,'msg'=>'成功']);
        } catch (ValidateException $e) {
            Db::rollback();
            $this->error($e->getMessage());

        }       
    }

/*
**生成订单号
/

    public function build_order_no()
    {
        return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值