token_verify($appkey,$timestamp,$random,$token); $res = $this->getPlateFromRedis(); json_success('查询成功',$res); } private function getPlateFromRedis( ){ $config = parse_url(C('REDIS_DSN')); $redis = new Redis(); $redis->connect($config["host"],$config["port"]?:6379); $redis->auth($config["pass"]?: ""); $redis->select(trim($config['path'],'//') ? : 0); /* for($i=0;$i<10;$i++){ $redis->sRem('plate_preselect_pool' , 'TK'.$i); } echo 'start sAdd'.PHP_EOL; $start = microtime(true); for($i=0;$i<100000;$i++){ //向集合中添加元素 $redis->sAdd('plate_preselect_pool' , 'TK'.$i); } echo 'sAdd: '.(microtime(true)-$start)*1000 .' ms'.PHP_EOL; */ /* //显示所有元素 $res = $redis->sMembers('plate_preselect_pool'); var_dump($res); //删除一个元素 $res = $redis->sRem('plate_preselect_pool','TK2'); var_dump($res); $res = $redis->sMembers('plate_preselect_pool'); var_dump($res); */ $start = microtime(true); //获取随机元素的一个集合 $list = $redis->sRandMember('plate_preselect_pool',20); //var_dump($list); //echo 'sRandMember: '.(microtime(true)-$start)*1000 .' ms'.PHP_EOL; return $list; } public function token_verify( $appkey, $timestamp, $random, $token ){ $old_token = base64_encode(md5($appkey . C('APPSECREAT') . $timestamp . $random)); //echo $old_token;exit; if($old_token != $token){ json_fail('token无效!'); } } public function reportPreSelectPlate( ){ header('Access-Control-Allow-Origin:*'); $data = $_POST; //验证需要字段是否存在 $appid = $data['AppId']; if(!$appid){ json_fail('AppId不存在!'); } $appkey = $data['AppKey']; if(!$appkey){ json_fail('AppKey不存在!'); } $token = $data['Token']; if(!$token){ json_fail('Token不存在!'); } $timestamp = $data['Timestamp']; if(!$timestamp){ json_fail('Timestamp不存在!'); } $random = $data['Random']; if(!$random){ json_fail('Random不存在!'); } //检验token $this->token_verify($appkey,$timestamp,$random,$token); $licenseplate = $data['LicensePlate']; if(!$licenseplate){ json_fail('LicensePlate不存在!'); } $res = $this->plate_verify($licenseplate); if(!res){ json_fail('无效车牌,请重新选择!'); } $openid = $data['Openid']; if(!$openid){ json_fail('Openid不存在!'); } //车牌加锁(20分钟) $servers = [ parse_url(C('REDIS_DSN_LOCK'), ]; $expirein = C('EXPIREIN')?:10; $redLock = new \RedLock\RedLock($servers); $lock = $redLock->lock($licenseplate, $expirein*60*1000, $openid); if(!$lock){ json_fail('车牌: '.$licenseplate .' 已被占用,请更换其它号牌!'); } //预选车牌加入临时队列 $key = strtoupper($licenseplate); $expire_time = time()+$expirein*60; $info = array( 'ExpireTime' => $expire_time, 'LicensePlate' => $licenseplate ); $preselect_plate_queue = Redis("wjw_preselect_plate_queue","queue"); $preselect_plate_queue -> add($info); //返回成功信息 $response = array( 'LicensePlate' => $licenseplate, 'ExpireIn' => C('EXPIREIN'), 'Timestamp' => time() ); //删除车牌库中的当前车牌 $this->deletePlateFromRedis($licenseplate); json_success('上报预选车牌成功',$response); /* //从redis获取车牌 $key = strtoupper($licenseplate); $p = Redis("wjw_plate","hash"); $val = $p->get($key); if(!$val){ //车牌信息不存在,添加到redis $info = array( 'ExpireIn' => C('EXPIREIN'), 'Timestamp' => time(), 'OpenId' => $openid ); $new_val = json_encode($info,JSON_UNESCAPED_UNICODE); $hash = array($key =>$new_val); $redis_res = $p->add($hash); if(!$redis_res){ json_fail('推送redis失败'); } //返回成功信息 $response = array( 'LicensePlate' => $licenseplate, 'ExpireIn' => C('EXPIREIN'), 'Timestamp' => time() ); //删除未选车牌库中的该车牌 $this->deletePlateFromRedis($licenseplate); json_success('上报预选车牌成功',$response); }else{ $info = json_decode($val,true); //检测openid是否是本人 if($info['OpenId'] == $openid){ //是否过期 $time = time() - (C('EXPIREIN')*60); if($time > $info['Timestamp']){ json_fail('该车牌已经过期'); }else{ $response = array( 'LicensePlate' => $licenseplate, 'ExpireIn' => C('EXPIREIN'), 'Timestamp' => $info['Timestamp'] ); json_success('上报预选车牌成功',$response); } }else{ //是否过期 $time = time() - (C('EXPIREIN')*60); if($time > $info['Timestamp']){ //过期车牌,新用户选牌信息添加到redis $info = array( 'ExpireIn' => C('EXPIREIN'), 'Timestamp' => time(), 'OpenId' => $openid ); $new_val = json_encode($info,JSON_UNESCAPED_UNICODE); $hash = array($key =>$new_val); $redis_res = $p->add($hash); if(!$redis_res){ json_fail('推送redis失败'); } //返回成功信息 $response = array( 'LicensePlate' => $licenseplate, 'ExpireIn' => C('EXPIREIN'), 'Timestamp' => time() ); //删除未选车牌库中的该车牌 $this->deletePlateFromRedis($licenseplate); json_success('上报预选车牌成功',$response); }else{ json_fail('该车牌已被占用,请重新选牌!'); } } } */ } public function getEnablePlaces( ){ header('Access-Control-Allow-Origin:*'); $appid = I('get.AppId'); if(!$appid){ json_fail('AppId不存在!'); } $appkey = I('get.AppKey'); if(!$appkey){ json_fail('AppKey不存在!'); } $token = I('get.Token'); if(!$token){ json_fail('Token不存在!'); } $timestamp = I('get.Timestamp'); if(!$timestamp){ json_fail('Timestamp不存在!'); } $random = I('get.Random'); if(!$random){ json_fail('Random不存在!'); } $this->token_verify($appkey,$timestamp,$random,$token); $res = M('yhgl_kh_places')->field('ID as PlaceId,RegPointName as PlaceName,Longitude,Latitude,Address')->select(); if(!$res){ json_fail('备案点不存在!'); } json_success('查询成功',$res); } public function reportPersonalOrderInfo( ){ header('Access-Control-Allow-Origin:*'); $data = $_POST; $data['OpenId'] = $data['Openid']; $appid = $data['AppId']; if(!$appid){ json_fail('AppId不存在!'); } $appkey = $data['AppKey']; if(!$appkey){ json_fail('AppKey不存在!'); } $token = $data['Token']; if(!$token){ json_fail('Token不存在!'); } $timestamp = $data['Timestamp']; if(!$timestamp){ json_fail('Timestamp不存在!'); } $random = $data['Random']; if(!$random){ json_fail('Random不存在!'); } $this->token_verify($appkey,$timestamp,$random,$token); if(!$data['FullName']){ json_fail('用户名不存在!'); } if(!$data['Sex']){ json_fail('用户性别不存在!'); } if(!$data['UserPhone']){ json_fail('用户手机号不存在!'); } if(!$data['IdCard']){ json_fail('用户身份证不存在!'); } if(!$data['DetailedAdd']){ json_fail('用户地址不存在!'); } if(!$data['PlaceId']){ json_fail('备案点不存在!'); } if(!$data['OrderType']){ json_fail('订单类型不存在!'); } if(!$data['OpenId']){ json_fail('用户ID不存在!'); } //获取备案点信息 $place_message = M('yhgl_kh_places')->where(array('ID'=>$data['PlaceId']))->field('RegPointName,PersonInCharge,ResPhone,Address,Latitude,Longitude')->find(); //获取订单号 $ordernumber = $this->setOrderNumber(); //检测车牌是否存在 if(!$data['LicensePlate']){ $data['ID'] = create_guid(); $data['OrderNumber'] = $ordernumber; $data['OrderStatus'] = 0; $data['AddTime'] = date('Y-m-d H:i:s'); if($data['OrderType']==1){ $data['EffectiveDate'] = date("Y-m-d",strtotime("+".C('WJW.DELIVERY_TIME')." day"));//开始安装日期 $data['ExpireDate'] = date("Y-m-d",strtotime("+".C('WJW.DELIVERY_TIME')+C('WJW.EXPIRATION_DATE')." day"));//过期日期 }else{ $data['EffectiveDate'] = date("Y-m-d"); $data['ExpireDate'] = date("Y-m-d",strtotime("+".C('WJW.DELIVERY_TIME')." day"));//过期日期 } $res = M('jms_order')->createAdd($data); if(!$res){ json_fail('订单信息添加失败!'); } $place_message['OrderNumber'] = $ordernumber; $place_message['EffectiveDate'] = $data['EffectiveDate']; $place_message['ExpireDate'] = $data['ExpireDate']; json_success('操作成功',$place_message); }else{ $licenseplate = $data['LicensePlate']; /* //从redis获取车牌 $key = strtoupper($licenseplate); $p = Redis("wjw_plate","hash"); $val = $p->get($key); if(!$val){ json_fail('系统错误'); } $info = json_decode($val,true); //检测openid是否是本人 if($info['OpenId'] == $data['OpenId']){ //是否过期 $time = time() - (C('EXPIREIN')*60); if($time > $info['Timestamp']){ json_fail('该车牌已经过期,请重选车牌'); } }else{ //是否过期 $time = time() - (C('EXPIREIN')*60); if($time < $info['Timestamp']){ json_fail('该车牌已被占用,请重新选牌!'); } } */ //检测车牌是否有效 $res = $this->plate_verify($licenseplate); if(!res){ json_fail('无效车牌,请重新选择!'); } //检测预选车牌是否超时 $result = $this->checkPreSelectPlateIsTimeout($licenseplate,$data['OpenId']); if($result['success'] === true){ json_fail($result['message']); } if($result['success'] === -1){ json_fail($result['message']); } $cond = array( 'LicensePlate'=>$data['LicensePlate'], 'OrderStatus'=>array('neq','2') ); $order_num = M('jms_order')->where($cond)->count(); //判断订单状态,过期重新开户 if($order_num){ json_fail('订单信息已经存在'); } $data['ID'] = create_guid(); $data['OrderNumber'] = $ordernumber; $data['OrderStatus'] = 0; $data['AddTime'] = date('Y-m-d H:i:s'); $data['LicensePlate'] = $data['LicensePlate']; if($data['OrderType']==1){ $data['EffectiveDate'] = date("Y-m-d",strtotime("+".C('WJW.DELIVERY_TIME')." day"));//开始安装日期 $data['ExpireDate'] = date("Y-m-d",strtotime("+".C('WJW.DELIVERY_TIME')+C('WJW.EXPIRATION_DATE')." day"));//过期日期 }else{ $data['EffectiveDate'] = date("Y-m-d"); $data['ExpireDate'] = date("Y-m-d",strtotime("+".C('WJW.DELIVERY_TIME')." day"));//过期日期 } $res = M('jms_order')->createAdd($data); if(!$res){ json_fail('订单信息保存失败!'); } $place_message['OrderNumber'] = $ordernumber; $place_message['LicensePlate'] = $data['LicensePlate']; $place_message['EffectiveDate'] = $data['EffectiveDate']; $place_message['ExpireDate'] = $data['ExpireDate']; json_success('操作成功',$place_message); } } public function getCompanyList( ){ header('Access-Control-Allow-Origin:*'); $appid = I('get.AppId'); if(!$appid){ json_fail('AppId不存在!'); } $appkey = I('get.AppKey'); if(!$appkey){ json_fail('AppKey不存在!'); } $token = I('get.Token'); if(!$token){ json_fail('Token不存在!'); } $timestamp = I('get.Timestamp'); if(!$timestamp){ json_fail('Timestamp不存在!'); } $random = I('get.Random'); if(!$random){ json_fail('Random不存在!'); } $this->token_verify($appkey,$timestamp,$random,$token); $res = M('jms_company')->field('ID as CompanyId,Name as CompanyName')->select(); if(!$res){ json_fail('公司不存在!'); } json_success('查询成功',$res); } public function reportCompanyOrderInfo( ){ header('Access-Control-Allow-Origin:*'); $data = $_POST; $appid = $data['AppId']; if(!$appid){ json_fail('AppId不存在!'); } $appkey = $data['AppKey']; if(!$appkey){ json_fail('AppKey不存在!'); } $token = $data['Token']; if(!$token){ json_fail('Token不存在!'); } $timestamp = $data['Timestamp']; if(!$timestamp){ json_fail('Timestamp不存在!'); } $random = $data['Random']; if(!$random){ json_fail('Random不存在!'); } $this->token_verify($appkey,$timestamp,$random,$token); if(!$data['FullName']){ json_fail('用户名不存在!'); } if(!$data['Sex']){ json_fail('用户性别不存在!'); } if(!$data['UserPhone']){ json_fail('用户手机号不存在!'); } if(!$data['IdCard']){ json_fail('用户身份证不存在!'); } if(!$data['DetailedAdd']){ json_fail('用户地址不存在!'); } if(!$data['PlaceId']){ json_fail('备案点不存在!'); } if(!$data['CompanyId']){ json_fail('公司ID不存在!'); } //获取备案点信息 $place_message = M('yhgl_kh_places')->where(array('ID'=>$data['PlaceId']))->field('RegPointName,PersonInCharge,ResPhone,Address,Latitude,Longitude')->find(); //获取订单号 $ordernumber = $this->setOrderNumber(); //检测车牌是否存在 if(!$data['LicensePlate']){ $data['ID'] = create_guid(); $data['InstallDate'] = date('Y-m-d'); $data['OrderType'] = 2; $data['OrderNumber'] = $ordernumber; $data['OrderStatus'] = 0; $data['AddTime'] = date('Y-m-d H:i:s'); $data['EffectiveDate'] = date("Y-m-d"); $data['ExpireDate'] = date("Y-m-d",strtotime("+".C('WJW.DELIVERY_TIME')." day")); $res = M('jms_order')->createAdd($data); if(!$res){ json_fail('订单信息添加失败!'); } $place_message['EffectiveDate'] =$data['EffectiveDate']; $place_message['ExpireDate'] =$data['ExpireDate']; $place_message['OrderNumber'] = $ordernumber; json_success('操作成功',$place_message); }else{ $order_num = M('jms_order')->where(array('LicensePlate'=>$data['LicensePlate'],'OrderStatus'=>array('neq','2')))->count(); //判断订单状态,过期重新开户 if(!$order_num){ $data['ID'] = create_guid(); $data['InstallDate'] = date('Y-m-d'); $data['OrderType'] = 2; $data['OrderNumber'] = $ordernumber; $data['OrderStatus'] = 0; $data['AddTime'] = date('Y-m-d H:i:s'); $data['LicensePlate'] = $data['LicensePlate']; $data['EffectiveDate'] = date("Y-m-d"); $data['ExpireDate'] = date("Y-m-d",strtotime("+".C('WJW.DELIVERY_TIME')." day")); $res = M('jms_order')->createAdd($data); if(!$res){ json_fail('订单信息保存失败!'); } $place_message['OrderNumber'] = $ordernumber; $place_message['EffectiveDate'] =$data['EffectiveDate']; $place_message['ExpireDate'] =$data['ExpireDate']; json_success('操作成功',$place_message); }else{ json_fail('订单信息已经存在'); } } } public function deletePlateFromRedis( $plate ){ $config = parse_url(C('REDIS_DSN')); $redis = new Redis(); $redis->connect($config["host"],$config["port"]?:6379); $redis->auth($config["pass"]?: ""); $redis->select(trim($config['path'],'//') ? : 0); //删除一个元素 $res = $redis->sRem('plate_preselect_pool',$plate); if(!$res){ json_fail('车牌库删除车牌失败'); } } public function setOrderNumber( ){ $i = 0; while($i < 100){ $order_id = rand(10000000,99999999); $res = M('jms_order')->where(array('OrderNumber'=>$order_id_main))->find(); if(!$res){ return $order_id; } $i++; } } private function plate_verify( $licenseplate ){ if(!$licenseplate){ json_fail('车牌不能为空!'); } $cond = array( 'LicensePlate'=>$licenseplate, 'PreSelection'=>1 ); $res = M('jms_plate')->where($cond)->find(); if(!$res){ return false; }else{ return true; } } private function checkPreSelectPlateIsTimeout( $plate, $openid ){ if(!$openid){ array('success'=> -1,'message'=>'openid不能为空'); } if(!$plate){ array('success'=> -1,'message'=>'车牌号不能为空'); } $server = parse_url(C('REDIS_DSN_LOCK')); $redis = new \Redis(); $redis->connect($server["host"],$server["port"]?:6379); $redis->auth($server["pass"]?: ""); $redis->select(trim($server['path'],'//') ? : 0); $old_openid = $redis->get($plate); if(!$old_openid){ return array('success'=>true,'message'=>'预选车牌超时,请重新选择车牌'); } if($old_openid != $openid){ return array('success'=>true,'message'=>'您选择的车牌已超时释放,已被其他用户占用,请选择其它车牌'); } return array('success'=>false,'message'=>'没有超时'); } }