/**
* 后台添加秒杀商品
*/
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);
}