git пре 6 година
родитељ
комит
527c3ff95e

+ 5 - 9
.gitignore

@@ -1,9 +1,5 @@
-# ---> Linux
-*~
-
-# KDE directory preferences
-.directory
-
-# Linux trash folder which might appear on any partition or disk
-.Trash-*
-
+.env
+vendor/
+.data/
+composer.lock
+.debug

+ 1 - 0
Home/Common/common.php

@@ -0,0 +1 @@
+<?php

+ 21 - 0
Home/Conf/config.php

@@ -0,0 +1,21 @@
+<?php
+
+return array(
+	
+	'TOKEN_OVERTIME' => 410,
+	'FAIL' => 600,
+
+	######### 极光推 #########
+	'JPUSH_APP_KEY' => '58e15e345e0c21b7e638e186',
+	'JPUSH_MASTER_SECRET' => 'a91d0b1c1fa1b327db832506',
+	######### 消息推送类型 #########
+    'OUTAGE_ALARM' 			=> 1, // 断电报警
+    'SOS_ALARM' 			=> 2, // SOS报警
+    'LOWWER_BATTERY_ALARM' 	=> 3, // 电池低电报警
+    'SHAKE_ALARM' 			=> 4, // 震动报警
+    'SHIFT_ALARM' 			=> 5, // 位移报警
+	'LOCK_VEHICLE_ALARM'    => 6, // 上锁车辆异动告警
+    'STOLEN_ALARM' 		    => 7, // 被盗告警
+    'FENCE_ALARM' 			=> 8, // 电子围栏告警
+    'BROADCASTING'			=> 9, // 广播
+);

+ 559 - 0
Home/Lib/Action/ApiAction.class.php

@@ -0,0 +1,559 @@
+<?php
+
+
+
+class ApiAction extends Action {
+			
+
+
+ 
+	public  function login(  ){
+		$data = I('post.data');
+		//$data = json_decode(htmlspecialchars_decode(I('post.data')),true);
+		if(!$data){
+			$this->api_fail(C('FAIL'),'没有用户信息');
+		}
+		$cond = array(
+			'LicensePlate|GpsDeviceNumber|DeviceNumber'=>$data['username'],
+			'Password'=>$data['password']
+		);
+		$userinfo = M('jms_vehicle')->where($cond)->find();
+		if(!$userinfo){
+			$this->api_fail(C('FAIL'),'用户名或者密码不正确');
+		}
+		$token = md5($data['username'].I('post.loginMark').$data['password'].date('Y-m-d H:i:s'));
+		$result = \Jiaruan\RedisCache::setSessionRules(I('post.loginMark'),$token);
+		if($result === false){
+		    $this->api_fail(C('FAIL'),'添加redis失败');
+		  }
+		$where = array("ID" => $userinfo['ID']);
+		$data = array(
+			"LoginMark" => I('post.loginMark'),
+			"Token" => $token
+		);
+		$res = M('jms_vehicle')->createSave($where,$data);
+		if(!$res){
+			$this->api_fail(C('FAIL'),'token信息保存失败');
+		}
+		$baseinfo = array(
+			"userId" => $userinfo['ID'],
+			"enCode" => "System",
+			"account" => $userinfo['FullName'],
+			"password" => $userinfo['Password'],
+			"secretkey" => '',
+			"realName" => $userinfo['FullName'],
+			"nickName" => $userinfo['FullName'],
+			"headIcon" => ".jpg",
+			"gender" => $userinfo['Sex'],
+			"mobile" => $userinfo['UserPhone'],
+			"telephone" => $userinfo['Telephone'],
+			"email" => $userinfo['Email'],
+			"oICQ" => $userinfo['QQ'],
+			"weChat" => $userinfo['WxName'],
+			"companyId" => "",
+			"companyIds" => array(),
+			"departmentId" => "",
+			"departmentIds" => array(),
+			"openId" => $userinfo['WxOpenId'],
+			"roleIds" => $userinfo['RoleId'],
+			"postIds" => "",
+			"isSystem" => true,
+			"appId" => "renlian_1.0.0_App",
+			"logTime" => date('Y-m-d H:i:s'),
+			"iPAddress" => $_SERVER['REMOTE_ADDR'],
+			"browser" => "Safari 11.0",
+			"loginMark" => I('post.loginMark'),
+			"token" => $token,
+			"imUrl" => '',
+			"imOpen" => '',
+			"wfProcessId" => '',
+			"photoUrl" => $userinfo['Avatar'],
+			"plate" => $userinfo['LicensePlate'],
+			'deviceNumber' => $userinfo['DeviceNumber'],
+			'gpsNumber' => $userinfo['GpsDeviceNumber']
+		);
+		$data = array(
+			"baseinfo" => $baseinfo,
+			"post" => array(),
+			"role" => array()
+		);
+		$this->api_success('登录成功',$data);
+	}
+	
+ 
+	public  function modifypassword(  ){
+		$this->token_verify();
+		$post_data = I('post.data');
+		if( empty($post_data) ){
+			$this->api_fail(C('FAIL'),'post_data不能为空!');
+		}
+		$userid = $post_data['userid'];
+		$newpassword = $post_data['newpassword'];
+		$oldpassword = $post_data['oldpassword'];
+		if(!M('jms_vehicle')->where(array('ID'=>$userid,'Password'=>$oldpassword))->find()){
+			$this->api_fail(C('FAIL'),'旧密码不正确');
+		}
+		$where = array(
+			'ID' => $userid,
+			'Password' => $oldpassword
+		);
+		$data = array(
+			'Password' => $newpassword
+		);
+		$res = M('jms_vehicle')->createSave($where,$data);
+		if(!$res){
+			$this->api_fail(C('FAIL'),'修改密码失败');
+		}
+		$this->api_success('修改成功');
+		
+	}
+	
+ 
+	public  function get_baojing_info(  ){
+		$this->token_verify();
+		$plate = I('get.plate');
+		$msg = M('jms_baojing_message')->where(array('Type'=>C('STOLEN_ALARM'),'LicensePlate'=>$plate))->select();
+		if(!$msg){
+			$this->api_fail(C('FAIL'),'报警信息不存在');
+		}
+		$this->api_success('成功',$msg);
+	}
+	
+ 
+	public  function get_map_index_data(  ){
+		$this->token_verify();
+		$deviceNumber = $_GET['data']['deviceNumber'];
+		
+		if(!$deviceNumber){
+			$this->api_fail(C('FAIL'),'faild, no deviceNumber !');
+		}
+		
+		//获取车辆最新位置
+		$result = M('jms_vehicle')->field('GpsLongitude, GpsLatitude, Address, FenceShapeInfo, LockStatus, FenceAlarmEnable, Battery, GpsOnlineTime, Speed')->where(array('DeviceNumber' => $deviceNumber))->find();
+		if(!$result){
+			$this->api_fail(C('FAIL'),'cant find this vehicl !');
+		}
+		$onlineTimeStamp = strtotime($result['GpsOnlineTime']);
+		if(!$onlineTimeStamp){
+			$onlineTimeStamp = 0;
+		}
+		
+		$mapData = array(
+			'vehicleLocation' => array('longitude' => $result['GpsLongitude'], 'latitude' => $result['GpsLatitude']),
+			'vehicleAddress' => $result['Address'],
+			'lockStatus' => $result['LockStatus'],
+			'fenceShapeInfo' => $result['FenceShapeInfo'],
+			'battery' => $result['Battery'],
+			'fenceAlarmStatus' => $result['FenceAlarmEnable'],
+			'onlineTime' => $onlineTimeStamp,
+			'speed' => $result['Speed']
+		);
+		
+		$this->api_success('success', $mapData);
+		
+	}
+	
+ 
+	public  function get_insure_info(  ){
+		$this->token_verify();
+		$cityid = I('get.cityid');
+		$insure_info = M('jms_insurance')->where(array('CityId'=>$cityid))->select();
+		if(!$insure_info){
+			$this->api_fail(C('FAIL'),'保险信息不存在');
+		}
+		$this->api_success('成功',$insure_info);
+	}
+	
+ 
+	public  function get_user_platenumber(  ){
+		$this->token_verify();
+		$userid = I('get.userid');
+		if(!$userid){
+			$this->api_fail(C('FAIL'),'用户id不存在');
+		}
+		$plate_info = M('jms_vehicle')->where(array('ID'=>$userid))->field('ID,LicensePlate')->select();
+		if(!$plate_info){
+			$this->api_fail(C('FAIL'),'该车主没有使用的车牌');
+		}
+		$this->api_success('成功',$plate_info);
+	}
+	
+ 
+	public  function submit_add_baojing(  ){
+		$this->token_verify();
+		$post_data = I('post.data');
+		if( empty($post_data) ){
+			$this->api_fail(C('FAIL'),'post_data不能为空!');
+		}
+		$Keyword = strtoupper($post_data['LicensePlate']);
+		if ( empty($Keyword)) {
+			$this->api_fail(C('FAIL'),'报警车辆不能为空');
+		}
+		$userid = $post_data['userid'];
+		if ( empty($userid)) {
+			$this->api_fail(C('FAIL'),'用户id不能为空');
+		}
+		//获取登录用户城市id
+		/*$cond = array('ID'=>$userid);
+		$cityid = M('uc_user')->where($cond)->getField('CityId');
+		if(!$cityid){
+			$this->api_fail('failerror','获取登录城市失败!');
+		}*/
+		$vehicle_info = M('jms_vehicle')->where(array( 'LicensePlate|IdCard|UserPhone' => $Keyword ))->field('ID,UserId,CityId,IdCard,UserPhone,LicensePlate')->find();
+		if(!$vehicle_info){
+			$this->api_fail(C('FAIL'),'报警车辆不存在!');
+		}
+		/*if( $vehicle_info['CityId'] != $cityid ){
+			$this->api_fail('failerror','该车辆不在管辖区域,无法添加报警!');
+		}
+		if(!$vehicle_info['UserId']){
+			$this->api_fail('failerror','此车辆还未开户,不能添加报警信息!');
+		}*/
+		
+		//$vehicle_id = $vehicle_info['ID'];
+		/*$chezhu_id = $vehicle_info['UserId'];
+			//$chezhu_info = fd_get_userinfo($chezhu_id);
+			//$chezhu_info = get_chezhu_info($chezhu_id);*/
+		//$this->api_check_vehicle_isrepeat2($vehicle_id);
+		if (I('post.StolenDate')) {
+			$StolenDate = $post_data['StolenDate'];
+			$StolenDate = date('Y-m-d',strtotime($StolenDate));
+			// 被盗日期不能超过当前时间
+			$now_time = date('Y-m-d');
+			if(strtotime($StolenDate) > strtotime($now_time)){
+				$this->api_fail(C('FAIL'),'被盗日期不能超过当前时间!');
+			}
+		} else {
+			$StolenDate = date('Y-m-d');
+		}
+		if(M('jms_baojing')->where(array('LicensePlate' => $vehicle_info['LicensePlate'],'StolenState'=>0))->find()){
+			$this->api_fail(C('FAIL'),'报警信息已经存在');
+		}
+		$data = array(
+			'WoContent' => $post_data['WoContent'], 
+			'VehicleId' =>  $userid, 
+			'LicensePlate' => $vehicle_info['LicensePlate'], 
+			'IdCard' => $vehicle_info['IdCard'], 
+			'UserId' => $userid, 
+			'UserPhone' => I('post.UserPhone'),
+			'CityId' => $vehicle_info['CityId'], 
+			'SubmitUserId' => $userid, 
+			'SubmitTime' => date('Y-m-d H:i:s'), 
+			'StolenDate' => $StolenDate,
+			'StolenCityId' => $vehicle_info['CityId'], //新增:被盗城市id
+		);
+		if (!M('jms_baojing')->createAdd($data)) {
+			$this->api_fail(C('FAIL'),'添加报警信息失败');
+		}
+		$this->api_success('添加报警信息成功');
+		
+	}
+	
+ 
+	public  function update_jg_registrationid(  ){
+		$this->token_verify();
+		$post_data = I('post.data');
+		//$post_data = json_decode(htmlspecialchars_decode(I('post.data')),true);
+		
+		if( empty($post_data) ){
+			$this->api_fail(C('FAIL'),'post_data不能为空!');
+		}
+		$regid = $post_data['regid'];//极光推设备唯一标识id
+		if( empty($regid) ){
+			$this->api_fail(C('FAIL'),'极光推注册id不能为空!');
+		}
+		if(!$post_data['uid']){
+			$this->api_fail(C('FAIL'),'uid不能为空!');
+		}
+		$cond = array(
+			'ID' => $post_data['uid']
+		);
+		$result = M('jms_vehicle')->where($cond)->setField('JgClientRegistrationId',$regid);
+		if( false === $result ){
+			$this->api_fail(C('FAIL'),'更新极光推注册信息失败! error:'.M('jms_vehicle')->getDbError());
+		}
+		$this->api_success('更新成功');
+	}
+	
+ 
+	public  function save_fence_info(  ){
+		$this->token_verify();
+		$fence_info =I('post.data');
+		$fenceData = htmlspecialchars_decode($fence_info['data']);
+		
+		$device_number = $fence_info['vehicleNumber'];
+		//var_dump($fence_info['fenceAlarmEnable']);
+		if( !$fence_info || !$device_number){
+			json_fail('Missing param !');
+		}
+		$cond = array('DeviceNumber' => $device_number);
+		
+		$data = array(
+			'FenceAlarmEnable' => $fence_info['fenceAlarmEnable'] == 'true' ? true : false,
+			'FenceShapeInfo' => $fenceData
+		);
+		$result = M('jms_vehicle')->where($cond)->save($data);
+		if( $result === false ){
+			json_fail('保存失败');
+		}
+		json_success('保存成功');
+	}
+	
+ 
+	public  function get_gps_route(  ){
+		$this->token_verify();
+		$postParm = I('post.data');
+		$search_date = $postParm['date'];
+		$gps_number = $postParm['gpsNumber'];
+		if( !$gps_number || !$search_date){
+			json_fail('Missing param !');
+		}
+		
+		
+		$timestamp = strtotime($search_date);
+		if( !$timestamp ){
+			json_fail('Date format error !');
+		}
+		$start_date = strtotime( date('Y-m-d 00:00:00',$timestamp) );
+		$end_date = strtotime( date('Y-m-d 23:59:59',$timestamp) );
+		$cond = array(
+				'DeviceId' => $gps_number,
+				'DeviceTime' => array( 'between', array($start_date,$end_date) ),
+		);
+		$fields = 'Longitude as lng,Latitude as lat,Speed as speed, DeviceTime as deviceTime';
+		$dateStr = str_replace("-","",$search_date);
+		$route_list = M('gps_location_'.$dateStr, '', C('DB_DSN_GPS'))->field($fields)->where($cond)->order('DeviceTime asc')->select();
+		//var_dump(M('gps_location_'.$dateStr, '', C('DB_DSN_GPS'))->getLastSql());
+		if( !$route_list ){
+			json_fail('无轨迹 !');
+		}
+		
+		foreach($route_list as &$v){
+			$v['deviceTime'] = date('Y-m-d H:i:s', $v['deviceTime']);
+		}
+		
+		$route_data = json_encode($route_list);
+		//$testData = json_encode($testData);
+		json_success('success',$route_data);
+		//json_success('success',$testData);
+		
+	}
+	
+ 
+	public  function change_lock_status(  ){
+		$this->token_verify();
+		$lock_state = I('post.data')['lockStatus'];
+		$device_number = I('post.data')['deviceNumber'];
+		if( !$device_number || $lock_state === ''){
+			json_fail('Missing param !');
+		}
+		//检查锁定状态值
+		if( !is_numeric($lock_state) && ($lock_state != 0 && $lock_state != 1) ){
+			json_fail('unknown state !');
+		}
+		$cond = array('DeviceNumber' => $device_number);
+		$result = M('jms_vehicle')->where($cond)->setField('LockStatus',$lock_state);
+		if( $result === false ){
+			json_fail('设置失败');
+		}
+		json_success('设置成功');
+	}
+	
+ 
+	public  function api_success( $msg, $data ){
+		$array = array(
+			'success'=>true,
+			'message'=>$msg,
+			'data' => $data,
+			'code'=>200
+		);
+		echo json_encode($array,JSON_UNESCAPED_UNICODE);
+		exit;
+	}
+	
+ 
+	public  function api_fail( $code, $msg, $data ){
+		$array = array(
+				'success'=>false,
+				'message'=>$msg,
+				'data' => $data,
+				'code'=>$code
+		);
+		echo json_encode($array,JSON_UNESCAPED_UNICODE);
+		exit;
+	}
+	
+ 
+	public  function get_gonggao_info(  ){
+		$this->token_verify();
+		$plate = I('get.plate');
+		$msg = M('jms_baojing_message')->where(array('Type'=>C('BROADCASTING'),'LicensePlate'=>$plate))->select();
+		if(!$msg){
+			$this->api_fail(C('FAIL'),'公告信息不存在');
+		}
+		$this->api_success('成功',$msg);
+	}
+	
+ 
+	public  function token_verify(  ){
+		$token = I('token');//用户登录token
+		$login_mark = I('loginMark');
+		if(!$token){
+			$this->api_fail(C('FAIL'),'token不存在 !');
+		}
+		if(!$login_mark){
+			$this->api_fail(C('FAIL'),'login_mark不存在 !');
+		}
+		//获取token
+		$redis = Redis('czapp_client_login_session','hash');
+		$key = $login_mark;
+		$val = json_decode($redis->get($key),true);
+		
+		if(!$val){
+			$this->api_fail(C('FAIL'),'无效token1 !');
+		}
+		
+		//验证token是否一致 
+		if( $token != $val['token'] ){
+			$this->api_fail(C('FAIL'),'无效token2 !');
+		}
+		
+		//验证token是否过期
+		if(!$val['login_time']){
+			$this->api_fail(C('FAIL'),'没有登录时间,token校验失败 !');
+		}
+		$login_time = strtotime($val['login_time']);
+		$end_time = $login_time + $val['expire']*60;
+		if(time()>$end_time){
+			$this->api_fail(C('TOKEN_OVERTIME'),'token失效,请重新登录 !');
+		}
+	}
+	
+ 
+	public  function get_gonggao_detail(  ){
+		header('Access-Control-Allow-Origin:*');
+		$this->token_verify();
+		$plate = I('get.plate');
+		$msg = M('jms_baojing_message')->where(array('Type'=>C('BROADCASTING'),'LicensePlate'=>$plate))->find();
+		if(!$msg){
+			$this->api_fail(C('FAIL'),'公告信息不存在');
+		}
+		$this->api_success('成功',$msg);
+	}
+	
+ 
+	public  function get_baojing_detail(  ){
+		$this->token_verify();
+		$plate = I('get.plate');
+		$addtime = I('get.addtime');
+		$msg = M('jms_baojing_message')->where(array('Type'=>C('STOLEN_ALARM'),'LicensePlate'=>$plate,'AddTime'=>$addtime))->find();
+		if(!$msg){
+			$this->api_fail(C('FAIL'),'报警信息不存在');
+		}
+		$this->api_success('成功',$msg);
+	}
+	
+ 
+	public  function register(  ){
+		$where = array('LicensePlate'=>I('post.LicensePlate'));
+		$userinfo = M('jms_vehicle')->where($where)->find();
+		if(!$userinfo){
+			$this->api_fail(C('FAIL'),'用户车牌还未登记');
+		}
+		if($userinfo['FullName'] != I('post.FullName')){
+			$this->api_fail(C('FAIL'),'姓名和备案时填写不一致');
+		}
+		if($userinfo['IdCard'] != I('post.IdCard')){
+			$this->api_fail(C('FAIL'),'身份证和备案时填写不一致');
+		}
+		$data = array(
+			'Password' => I('post.Password'),
+		);
+		$result = M('jms_vehicle')->createSave($where,$data);
+		if(!$result){
+			$this->api_fail(C('FAIL'),'注册失败');
+		}
+		$this->api_success('注册成功');
+	}
+	
+ 
+	public  function get_fence_info(  ){
+		$this->token_verify();
+		$device_number = I('get.data');
+		if( !$device_number){
+			json_fail('Missing param !');
+		}
+		$cond = array(
+				'DeviceNumber' => $device_number,
+		);
+		$fields = 'FenceShapeInfo as fenceInfo,FenceAlarmEnable as fenceStatus';
+		$fence = M('jms_vehicle')->field($fields)->where($cond)->find();
+		if( !$fence ){
+			json_fail('无围栏 !');
+		}
+		
+		$fence = json_encode($fence);
+		json_success('success',$fence);
+		
+	}
+	
+ 
+	public  function get_gps_route_table(  ){
+		$this->token_verify();
+		$postParm = I('post.data');
+		$search_date = $postParm['date'];
+		$gps_number = $postParm['gpsNumber'];
+		if( !$gps_number || !$search_date){
+			json_fail('请检查GPS标签或者日期 !');
+		}
+		
+		//$list = $this->getBTGpsRoute($search_date,$gps_number);
+		$list = $this->getBTGpsRoute($search_date,'1');
+		
+		$respData = array();
+		foreach($list as $v){
+			$nv = array(
+				'lat' => $v['Latitude'],
+				'lng' => $v['Longitude'],
+				'speed' => $v['Speed'],
+				'deviceTime' => $v['OnlineTime']
+			);
+			array_push($respData, $nv);
+		}
+		/*
+		foreach(&$respData as &$v){
+			$v['deviceTime'] = date('Y-m-d H:i:s', $v['deviceTime']);
+		}
+		*/
+		if(!$respData){
+			json_success('无轨迹');
+		}
+		$route_data = json_encode($respData);
+		//$testData = json_encode($testData);
+		json_success('success',$route_data);
+		//json_success('success',$testData);
+	}
+	
+ 
+	private  function getBTGpsRoute( $date, $gpsNumber ){
+		if(!$gpsNumber){
+			return false;
+		}
+		if(!$date){ 
+			$date = date('Y-m-d');
+		}
+		//获取所有轨迹信号
+		$option = array();
+		$option['pagesize'] = 100;
+		$option['asc'];
+		$option['fields'] = array('Longitude','Latitude','Speed','DeviceTime');
+		$routesig = new \Rlfd\Route\RouteSignal();
+		$list = $routesig->queryEbicyleDailyGpsSignals($gpsNumber, $date,$option);
+		
+		//var_dump($list);
+		//var_dump(array('route'=>$list,'vehicle'=>$vehicle_info));
+		return $list;
+	}
+	
+
+}

+ 64 - 0
Home/Lib/Action/IndexAction.class.php

@@ -0,0 +1,64 @@
+<?php
+
+
+
+class IndexAction extends Action {
+			
+
+
+ 
+	public  function index(  ){
+		echo 'hello world';
+	}
+	
+	public function create_route(){
+		if( PHP_SAPI != 'cli' ){
+			exit(PHP_SAPI);
+		}
+		echo '['.date('Y-m-d H:i:s').']  ———————————————————— starting create route  ———————————————————— '.PHP_EOL;
+
+		// 模拟添加数据,10万个标签,每个每秒产生1条数据
+		$gps = M('gps_location_20190412','','mysql://dev:711e7D69f9d0c3f1@rm-bp13qpl023g02660t.mysql.rds.aliyuncs.com:3306/dev_fd_gps');	
+		
+		$start_time = 1555050000; //2019-3-30 00:00:00
+
+		while ( $start_time <= 1555050076) { //2019-3-30 23:59:59
+			
+
+			$deive_id = 100000000000001;
+
+			for( $i=1; $i <= 100000; $i++ ){
+
+				if( $i % 1200 == 1 ){
+					$start_submit = microtime(true);
+					$gps->startTrans();
+					$data = array();
+				}
+				$data[] = array(
+					'DeviceId' => $deive_id + $i,
+					'DeviceTime' => $start_time,
+					'Longitude' => 120 + rand(200001,220562)/1000000,
+					'Latitude' => 30 + rand(260001,260818)/1000000,
+					'Speed' => rand(0, 40),
+					'Direction' => rand(1,8),
+					'Status' => rand(1,10),
+					'SatelliteCount' => rand(4,11),
+					'LBS' => 'abcdefgh'
+				);
+
+				if( $i % 1200 == 0 ){
+					$gps->addAll($data);
+					$gps->commit();
+					$end_submit = microtime(true);
+					var_dump('now ' . $i .' use ' . ($start_submit - $end_submit) .' memory_get_usage :' . memory_get_usage());
+				}
+
+			}
+			usleep(1000);
+			$start_time ++;
+		}
+
+		echo '['.date('Y-m-d H:i:s').'] ———————————————————— create route finished  ———————————————————— '.PHP_EOL;
+	
+	}
+}

+ 272 - 0
Home/Lib/Action/NoticeAction.class.php

@@ -0,0 +1,272 @@
+<?php
+
+
+
+class NoticeAction extends Action {
+			
+
+
+ 
+	public  function jgpush(  ){
+		$app_key = '58e15e345e0c21b7e638e186';
+		$master_secret = 'a91d0b1c1fa1b327db832506';
+		$client = new \JPush\Client($app_key, $master_secret);
+		$push_payload = $client->push()
+		    ->setPlatform('all')
+		    ->addAllAudience()
+		    ->setNotificationAlert('车辆异动告警');
+		try {
+		    $response = $push_payload->send();
+		    print_r($response);
+		} catch (\JPush\Exceptions\APIConnectionException $e) {
+		    // try something here
+		    print $e;
+		} catch (\JPush\Exceptions\APIRequestException $e) {
+		    // try something here
+		    print $e;
+		}
+	}
+	
+ 
+	public  function pushFromKafka(  ){
+		$conf = new RdKafka\Conf();
+		// Set a rebalance callback to log partition assignments (optional)(当有新的消费进程加入或者退出消费组时,kafka 会自动重新分配分区给消费者进程,这里注册了一个回调函数,当分区被重新分配时触发)
+		$conf->setRebalanceCb(function (RdKafka\KafkaConsumer $kafka, $err, array $partitions = null) {
+		    switch ($err) {
+		        case RD_KAFKA_RESP_ERR__ASSIGN_PARTITIONS:
+		            echo "Assign: ";
+		            var_dump($partitions);
+		            $kafka->assign($partitions);
+		            break;
+		
+		         case RD_KAFKA_RESP_ERR__REVOKE_PARTITIONS:
+		             echo "Revoke: ";
+		             var_dump($partitions);
+		             $kafka->assign(NULL);
+		             break;
+		
+		         default:
+		            throw new \Exception($err);
+		    }
+		});
+		
+		// Configure the group.id. All consumer with the same group.id will consume( 配置groud.id 具有相同 group.id 的consumer 将会处理不同分区的消息,所以同一个组内的消费者数量如果订阅了一个topic, 那么消费者进程的数量多于这个topic 分区的数量是没有意义的。)
+		// different partitions.
+		$conf->set('group.id', 'myConsumerGroup');
+		
+		// Initial list of Kafka brokers(添加 kafka集群服务器地址)
+		$conf->set('metadata.broker.list', '127.0.0.1');
+		
+		$topicConf = new RdKafka\TopicConf();
+		
+		// Set where to start consuming messages when there is no initial offset in
+		// offset store or the desired offset is out of range.
+		// 'smallest': start from the beginning
+		$topicConf->set('auto.offset.reset', 'smallest');
+		
+		// Set the configuration to use for subscribed/assigned topics
+		$conf->setDefaultTopicConf($topicConf);
+		
+		$consumer = new RdKafka\KafkaConsumer($conf);
+		
+		// 消费者订阅
+		$consumer->subscribe(['gps_alarm_msg_queue']);
+		
+		while (true) {
+		    $message = $consumer->consume(120*1000);
+		    switch ($message->err) {
+		        case RD_KAFKA_RESP_ERR_NO_ERROR:
+		           $msg_data = json_decode($message->payload,true);
+						if($msg_data){
+						   // 使用极光推送消息
+							$jpush_client = new \JPush\Client( C('JPUSH_APP_KEY'), C('JPUSH_MASTER_SECRET') );
+							// 电子围栏告警,上锁车辆异动告警,低电量告警,被盗告警,广播消息推送
+							$this->jpushMsg( $jpush_client, $message->payload );
+						}
+		            break;
+		        case RD_KAFKA_RESP_ERR__PARTITION_EOF:
+		            echo "No more messages; will wait for more\n";
+		            break;
+		        case RD_KAFKA_RESP_ERR__TIMED_OUT:
+		            echo "Timed out\n";
+		            break;
+		        default:
+		            throw new \Exception($message->errstr(), $message->err);
+		            break;
+		    }
+		}
+	}
+	
+ 
+	public  function jpushMsg( $client, $msg_data ){
+		/*
+		$msg_data = '{
+			  "type":2,
+			  "title":"被盗告警",
+			  "content":"车被偷了,赶紧去找",
+			  "device_number":"FFFFFF123122"
+			}';
+		$msg_data = '{
+		  "type":9,
+		  "title":"群推消息",
+		  "content":"这是一个广播"
+		}'; 
+		*/ 
+		
+		$single_push_type = array(
+			C('LOCK_VEHICLE_ALARM'),   // 1-锁车告警
+			C('STOLEN_ALARM'),       // 2-被盗告警
+			C('FENCE_ALARM'),        // 3-电子围栏告警
+			C('LOWWER_BATTERY_ALARM'),  // 4-低电量告警
+		);
+		$msg_data = json_decode($msg_data,true);
+		if(!$msg_data){
+			echo 'invalid message data format!'.$msg_data . PHP_EOL;
+			return;
+		}
+		// 通过传过来的车牌查出JgClientRegistrationId
+		if( empty($client) ){
+			$client = new \JPush\Client( C('JPUSH_APP_KEY'), C('JPUSH_MASTER_SECRET') );
+		}
+		if( in_array($msg_data['type'],$single_push_type) && $msg_data['device_number'] ){
+			$where = array('DeviceNumber|GpsDeviceNumber' => $msg_data['device_number']);
+			$fields= 'CityId,LicensePlate,FullName,JgClientRegistrationId';
+			
+			if( !S( 'jpush_vinfo_'.$msg_data['device_number'] ) ){ //如果不存在,则缓存
+				$vehicle_info = M('jms_vehicle')->field($fields)->where($where)->find();
+				S( 'jpush_vinfo_'.$msg_data['device_number'], $vehicle_info, 60 ); //缓存1分钟
+			}
+			$vehicle_info = S( 'jpush_vinfo_'.$msg_data['device_number'] ); //从缓存取
+			
+		}
+		// 推送平台
+		$platform = array('ios', 'android');
+		// 通知栏显示内容
+		$alert = $msg_data['content'];
+		// 推送android
+		$android_notification = array(
+		    'title' => $msg_data['title'],
+		    'builder_id' => 2, //通知栏样式
+		);
+		// 推送ios
+		$ios_notification = array(
+		    'sound' => 'default',
+		    'badge' => '+1',
+		    'content-available' => true
+		);
+		// 可选项
+		$options = array(
+		    'sendno' => 100,
+		    'time_to_live' => 100,
+		);
+		// 组装推送
+		$cid = $client->push()->getCid();
+		//var_dump($cid['body']['cidlist'][0]);
+		$push_payload = $client->push()
+			 ->setCid($cid['body']['cidlist'][0])
+		    ->setPlatform( $platform )
+		    ->iosNotification($alert, $ios_notification)
+		    ->androidNotification($alert, $android_notification)
+		    ->options($options);
+		
+		if( $msg_data['type'] == C('BROADCASTING') ){ // 9-广播
+		   $push_payload->addAllAudience();
+		}elseif( isset($vehicle_info) && $vehicle_info ){ // 单推
+			$msg_data['vehicle_info'] = $vehicle_info;
+			$push_payload->addRegistrationId($vehicle_info['JgClientRegistrationId']);
+		}else{
+			//未知类型
+			var_dump('出错了:'.$msg_data);
+			return;
+		}
+		try {
+		    $response = $push_payload->send();
+			 // 保存日志
+			 $msg_data['response'] = array(
+			 			'code' => $response['http_code'],
+				 		'resp_msg' => 'ok',
+			 );
+			 $this->saveLog($msg_data);
+		    print_r($response);
+		} catch (\JPush\Exceptions\APIConnectionException $e) {
+		    // try something here
+			$msg_data['response'] = array(
+			 			'code' => $e->getHttpCode(),
+				 		'resp_msg' => substr($e->__toString(), strpos($e->__toString(),'[')),
+			 );
+			$this->saveLog($msg_data);
+			print $e;
+		} catch (\JPush\Exceptions\APIRequestException $e) {
+		    // try something here
+			$msg_data['response'] = array(
+			 			'code' => $e->getHttpCode(),
+				 		'resp_msg' => substr($e->__toString(), strpos($e->__toString(),'[')),
+			 );
+			$this->saveLog($msg_data);
+			print $e;
+		}
+	}
+	
+ 
+	public  function saveLog( $msg_data ){
+		$fdls_app_message = M('jms_baojing_message');
+		
+		$log_data = array(
+			'ID' => create_guid(),
+			'Type' => $msg_data['type'],
+			'Title' => $msg_data['title'],
+			'Comment' => $msg_data['content'],
+			'SendStatus' => $msg_data['response']['code'],
+			'AddTime' => date('Y-m-d H:i:s'),
+			'RespMsg' => $msg_data['response']['resp_msg'],
+		);
+		if( $msg_data['type'] != C('BROADCASTING') ){ // 非广播
+			$log_data['CityId'] 	  = $msg_data['vehicle_info']['CityId'];
+			$log_data['DeviceNumber'] = $msg_data['device_number'];
+			$log_data['FullName']	  = $msg_data['vehicle_info']['FullName'];
+			$log_data['LicensePlate'] = $msg_data['vehicle_info']['LicensePlate'];
+		}
+		
+		$result = $fdls_app_message->createAdd($log_data);
+		return $result;
+		
+	}
+	
+ 
+	public  function kafkaProducer( $msg_data ){
+		if (!extension_loaded('rdkafka')){
+			echo 'rdkafka extension is not installed!!'.PHP_EOL;
+			return false;
+		}
+		/********************* 初始化生产者配置项 start **************************/
+		//考勤记录分析结果生产者
+		$rk = new RdKafka\Producer();
+		$rk->setLogLevel(LOG_DEBUG);
+		$rk->addBrokers("127.0.0.1");
+		$start = microtime(true);
+		$topic = $rk->newTopic('gps_alarm_msg_queue');
+		/********************* 初始化生产者配置项 end **************************/
+		if( empty($msg_data) ){
+			var_dump($msg_data);
+			return;
+		}
+		if( is_array($msg_data) || is_object($msg_data) ){ // 对象、数组转换
+			$msg_data = json_encode($msg_data);
+		}
+		$topic->produce(RD_KAFKA_PARTITION_UA, 0, $msg_data);
+		$rk->poll(0);
+		
+	}
+	
+ 
+	public  function mockProduce(  ){
+		$msg_data = '{
+		  "type":9,
+		  "title":"群推消息",
+		  "content":"这是一个广播"
+		}';
+		$this->kafkaProducer($msg_data);
+	}
+	
+
+}

+ 215 - 0
Home/Lib/Class/RedisCache.php

@@ -0,0 +1,215 @@
+<?php
+namespace Jiaruan;
+
+class RedisCache {
+			
+
+
+ 
+	public static function getKqRules( $gradeId, $field ){
+		if(!$gradeId){
+			echo 'getKqRules failed,gradeId empty!'.PHP_EOL;
+			return false;
+		}
+			
+		$p = Redis("xskq_rules","hash");
+		$where = strtoupper($gradeId);
+		$val = $p->get($where);
+		if(!$val){
+			echo 'getKqRules failed,Rules is empty!'.PHP_EOL;
+			return false;
+		}
+		
+		$info = json_decode($val,true);
+		if($field)
+			return $info[$field];
+		else
+			return $info;
+		
+		
+	}
+	
+ 
+	public static function getKqRuleDetail( $ruleId ){
+		if(!$ruleId){
+			echo 'getKqRuleDetail failed,ruleId empty!'.PHP_EOL;
+			return false;
+		}
+			
+		$p = Redis("xskq_rule_detail","hash");
+		$where = strtoupper($ruleId);
+		$val = $p->get($where);
+		if(!$val){
+			echo 'getKqRuleDetail failed,RuleDetail is empty!'.PHP_EOL;
+			return false;
+		}
+		
+		$info = json_decode($val,true);
+		
+		return $info;
+		
+		
+	}
+	
+ 
+	public static function setSessionRules( $loginmark, $token ){
+		if(!$loginmark){
+			echo 'setKqRules failed,loginmark empty!'.PHP_EOL;
+			return false;
+		}
+		
+		if(!$token){
+			echo 'setKqRules failed,token empty!'.PHP_EOL;
+			return false;
+		}
+		//保存token到redis
+		$p = Redis("czapp_client_login_session","hash");
+		$key = $loginmark;
+		$session_info = array(
+			"token"=>$token,
+			"login_time" => date('Y-m-d H:i:s'),
+			"expire"=> 1200
+		);
+		$val = json_encode($session_info,JSON_UNESCAPED_UNICODE);
+		$hash = array($key => $val );
+		return $p->add($hash);
+	}
+	
+ 
+	public static function setKqRuleDetail( $ruleId, $info ){
+		if(!$ruleId){
+			echo 'setKqRuleDetail failed,ruleId empty!'.PHP_EOL;
+			return false;
+		}
+		if(!$info){
+			echo 'setKqRuleDetail failed,info empty!'.PHP_EOL;
+			return false;
+		}
+			
+		//更新缓存信息
+		$p = Redis("xskq_rule_detail","hash");
+		$key = strtoupper($ruleId);
+		$val = json_encode($info,JSON_UNESCAPED_UNICODE);
+		$hash = array($key => $val );
+		return $p->add($hash);
+	}
+	
+ 
+	public static function deleteKqRules( $gradeId ){
+		if(!$gradeId){
+			echo 'deleteKqRules failed,gradeId empty!'.PHP_EOL;
+			return false;
+		}
+		$p = Redis("xskq_rules","hash");
+		$where = strtoupper($gradeId);
+		$p->where($where)->delete();
+		return true;
+	}
+	
+ 
+	public static function deleteKqRuleDetail( $ruleId ){
+		if(!$ruleId){
+			echo 'deleteKqRuleDetail failed,ruleId empty!'.PHP_EOL;
+			return false;
+		}
+		$p = Redis("xskq_rule_detail","hash");
+		$where = strtoupper($ruleId);
+		$p->where($where)->delete();
+		return true;
+	}
+	
+ 
+	public static function setUserPunchRecord( $rfid, $date, $info ){
+		if(!$rfid){
+			echo 'setUserPunchRecord failed,rfid empty!'.PHP_EOL;
+			return false;
+		}
+		if(!$info){
+			echo 'setUserPunchRecord failed,info empty!'.PHP_EOL;
+			return false;
+		}
+		if(!$date){
+			echo 'setUserPunchRecord failed,date empty!'.PHP_EOL;
+			return false;
+		}
+			
+		//更新缓存信息
+		$p = Redis("xskq_user_punch_record_".substr($date,0,6),"hash");
+		$key = strtoupper($rfid.'_'.$date);
+		$val = json_encode($info,JSON_UNESCAPED_UNICODE);
+		$hash = array($key => $val );
+		return $p->add($hash);
+	}
+	
+ 
+	public static function getUserPunchRecord( $rfid, $date, $field ){
+		if(!$rfid){
+			echo 'getUserPunchRecord failed,rfid empty!'.PHP_EOL;
+			return false;
+		}
+		if(!$date){
+			echo 'getUserPunchRecord failed,date empty!'.PHP_EOL;
+			return false;
+		}
+			
+		$p = Redis("xskq_user_punch_record_".substr($date,0,6),"hash");
+		$where = strtoupper($rfid.'_'.$date);
+		$val = $p->get($where);
+		if(!$val){
+			//如果没有打卡记录,就初始化一条
+			$init_status = array(
+				'in'=>C('KQ_RECORDS_STATUS_NO_RECORD'),
+				'out'=>C('KQ_RECORDS_STATUS_NO_RECORD'),
+			);
+			$init_data = array(
+				C('KQ_RULE_DETAIL_ALL_TYPE_TEXT')[C('KQ_RULE_DETAIL_TYPE_EARLY')] => $init_status,
+				C('KQ_RULE_DETAIL_ALL_TYPE_TEXT')[C('KQ_RULE_DETAIL_TYPE_AM')] => $init_status,
+				C('KQ_RULE_DETAIL_ALL_TYPE_TEXT')[C('KQ_RULE_DETAIL_TYPE_PM')] => $init_status,
+				C('KQ_RULE_DETAIL_ALL_TYPE_TEXT')[C('KQ_RULE_DETAIL_TYPE_NIGHT')] => $init_status,
+				C('KQ_RULE_DETAIL_ALL_TYPE_TEXT')[C('KQ_RULE_DETAIL_TYPE_AM_PM')] => $init_status,
+			);
+			$result = self::setUserPunchRecord($rfid,$date,$init_data);
+			if(!$result){
+				echo 'init user punch record failed, ActiveRfid: '.$rfid.PHP_EOL;
+				return false;
+			}
+			echo 'init user punch record success, ActiveRfid: '.$rfid.PHP_EOL;
+			return $init_data;
+		}
+		
+		$info = json_decode($val,true);
+		if($field)
+			return $info[$field];
+		else
+			return $info;
+		
+		
+	}
+	
+ 
+	public static function setStudentKqRules( $studentId, $info ){
+		if(!$studentId){
+			echo 'setKqRules failed,studentId empty!'.PHP_EOL;
+			return false;
+		}
+		$p = Redis("xskq_student_rules","hash");
+		$key = strtoupper($studentId);
+		$val = json_encode($info,JSON_UNESCAPED_UNICODE);
+		$hash = array($studentId => $val );
+		return $p->add($hash);
+	}
+	
+ 
+	public static function deleteKqStudentRules( $studentId ){
+		if(!$studentId){
+			echo 'deleteKqRules failed,studentId empty!'.PHP_EOL;
+			return false;
+		}
+		$p = Redis("xskq_student_rules","hash");
+		$where = strtoupper($studentId);
+		$p->where($where)->delete();
+		return true;
+	}
+	
+
+}

+ 20 - 0
composer.json

@@ -0,0 +1,20 @@
+{
+    "name": "rlfd/account-rep",
+    "type": "project",
+	"repositories": [
+		{ "type": "composer", "url": "http://satis.jrcad.com/" }
+    ],
+    "require": {
+        "php": ">=5.6.0",
+		"spatie/url-signer":"1.0.2",
+		"elvisszhang/php-tp313": "dev-master",
+		"elvisszhang/php-workerman352": "dev-master",
+		"jrtk/php-crypto":"dev-master",
+		"jrtk/jr-phpcls2": "dev-master",
+		"jrtk/aliyun-ots-sdk-php":"2.1.1",
+		"jpush/jpush": "*"
+    },
+	"config": {
+		"secure-http": false
+	}
+}

+ 1 - 0
czapp

@@ -0,0 +1 @@
+Subproject commit 8d468299c20fb0382f12489fd844c1122555b514

+ 24 - 0
index.php

@@ -0,0 +1,24 @@
+<?php
+$plugins = array(
+	'czapp' => '',
+);
+$prefix = substr( $_GET['s'] ,0,strpos($_GET['s'] ,'_'));
+//define('UICOMP_SERVER','http://jrcomp.rltest.cn:8080/uicomp');
+define('UICOMP_SERVER','http://jrcomp.rltest.cn/uicomp');
+define('SOLUTION_PATH',__DIR__ .'/');
+define('ENTRY_PATH',__DIR__ .'/');
+if(! $plugins[$prefix]){
+	define('SCRIPT_FILENAME',__FILE__);
+}
+else{
+	//运行相应插件
+	$path = __DIR__ . $plugins[$prefix] . 'stub.php';
+	if(! file_exists($path) )
+		die('invalid plugin path - ' . $path);
+	define('SCRIPT_FILENAME', $path);
+	require $path;
+}
+
+require 'vendor/autoload.php';
+//$c = new \Aliyun\OTS\OTSClient;
+require 'vendor/elvisszhang/php-tp313/ThinkPHP.php';

Разлика између датотеке није приказан због своје велике величине
+ 116 - 0
jpush.log


+ 9 - 0
stub.php

@@ -0,0 +1,9 @@
+<?php
+//插件或者工程ID
+define('APP_ID','b4b3a2aeafccd8ef7acef97456441f49');
+//插件前缀
+define('APP_PREFIX','czapp');
+//插件版本
+define('APP_VERSION','1.0.0');
+//入口文件路径
+define('APP_FILENAME', __FILE__);