JyzlCronAction.class.php 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. <?php
  2. class JyzlCronAction extends Action {
  3. public $size = 1000;
  4. public function getList( $model, $field ){
  5. $list = $model->field($field)->select();
  6. if(!$list){
  7. return false;
  8. }
  9. $jms_city_list = array();
  10. foreach ($list as $key => $val) {
  11. $jms_city_list[$val['ID']] = $this->md5_id_base($val);
  12. }
  13. return $jms_city_list;
  14. }
  15. public function md5_id_base( $data, $length = -6 ){
  16. $str = '';
  17. foreach ($data as $val){
  18. $str.=$val;
  19. }
  20. return substr(md5($str),$length);
  21. }
  22. public function sync( ){
  23. echo "同步数据开始 time:".date("Y-m-d H:i:s").PHP_EOL;
  24. $this->syncJyzlCity();
  25. $this->syncJyzlStation();
  26. echo "jjyzl_vehicle数据开始同步".PHP_EOL;
  27. $this->syncJyzlVehicle();
  28. echo "Jjyzl_vehicle数据结束同步".PHP_EOL;
  29. echo "同步数据结束 time:".date("Y-m-d H:i:s").PHP_EOL;
  30. }
  31. public function getSignsList( $ids, $model, $field ){
  32. //$where = array('ID' => array('IN',$ids));
  33. //$list = $model->field($field)->where($where)->order('ID ASC')->select();
  34. $list = $model->field($field)->order('ID ASC')->select();
  35. $jyzl_city_list = array();
  36. if ($list) {
  37. foreach ($list as $key => $val) {
  38. $jyzl_city_list[$val['ID']] = $this->md5_id_base($val);
  39. }
  40. }
  41. return $jyzl_city_list;
  42. }
  43. public function getDetailDiff( $data, $model, $field ){
  44. $list = array();
  45. if ($data['update']) {
  46. foreach ($data['update'] as $update) {
  47. $where = array('ID' => $update);
  48. $list['update'][] = $model->field($field)->where($where)->find();
  49. }
  50. }
  51. if ($data['add']) {
  52. foreach ($data['add'] as $add) {
  53. $where = array('ID' => $add);
  54. $list['add'][] = $model->field($field)->where($where)->find();
  55. }
  56. }
  57. if($data['del']){
  58. $list['del'] = $data['del'];
  59. }
  60. return $list;
  61. }
  62. public function _initialize( ){
  63. $this->field_jms_city = "ID,ParentId,OrderNum,CityName,ProvinceName,LicensePlatePrefix,FullName,AreaCode,RzxFtpServer,SiteDomain,RegionId,ProvinceId,DefaultZoomFactor,MinZoomFactor,CenterLng,CenterLat";
  64. $this->model_jms_city = M("jms_city");//数据源
  65. $this->model_jyzl_city = M("jyzl_city");
  66. $this->field_jyzl_vehicle = "";
  67. $this->model_jms_vehicle = M("jms_vehicle");//数据源
  68. $this->model_jyzl_vehicle = M("jyzl_vehicle");
  69. $this->field_jzgl_station = "";
  70. $this->model_jzgl_station = M("jzgl_station");//数据源
  71. $this->model_jyzl_station = M("jyzl_station");
  72. }
  73. public function submitDetailDiff( $list, $model ){
  74. /*if (!$list) {
  75. $result = array('success'=>true,'message'=>'no sync data','error'=>'');
  76. echo json_encode($result);exit;
  77. }
  78. if (!$model) {
  79. $result = array("success" => true, "message" => "model not found");
  80. echo json_encode($result);exit;
  81. }*/
  82. //修改
  83. $error = array();
  84. if ($list['update']) {
  85. foreach ($list['update'] as $val) {
  86. $where = array('ID'=>$val['ID']);
  87. $res = $model->createSave($where,$val);
  88. if ($res == false){
  89. $error['update'][] = $model->getLastSql();
  90. }
  91. }
  92. }
  93. //新增
  94. if ($list['add']) {
  95. foreach ($list['add'] as $val) {
  96. $res = $model->createAdd($val);
  97. if($res == false){
  98. $error['add'][] = $model->getLastSql();
  99. }
  100. }
  101. }
  102. //删除
  103. /*if ($list['del']) {
  104. foreach ($list['del'] as $val) {
  105. $where = array( 'ID' => $val );
  106. //$data['IsDel'] = C('删除状态_是');
  107. //$res = $model->createSave($where,$data);
  108. $res = $model->where($where)->delete();
  109. if ($res == false) {
  110. $error['del'][] = $model->getLastSql();
  111. }
  112. }
  113. }*/
  114. $result = array( 'success' => true, 'message' => 'sync data success', 'error'=>$error );
  115. echo json_encode($result).PHP_EOL;
  116. }
  117. public function syncJyzlCity( ){
  118. //获取城市数据列表及基本字段签名 (id=>签名 键值对)
  119. $jms_city_list = $this->getList($this->model_jms_city, $this->field_jms_city);
  120. if(!$jms_city_list)
  121. return false;
  122. //获取同部数据表城市数据列表及基本字段签名 ( id=>签名 键值对)
  123. //$jyzl_city_list = $this->getSignsList(array_keys($jms_city_list), $this->model_jyzl_city, $this->field_jms_city);
  124. $jyzl_city_list = $this->getSignsList([], $this->model_jyzl_city, $this->field_jms_city);
  125. //上述两组数据比较,获取差异的(增加,删除,修改)
  126. // id=> 差异(add,del,update) 键值对
  127. $diff_info_list = $this->query_diff($jyzl_city_list, $jms_city_list);
  128. //获取差异的用户详细信息
  129. $diff_jyzl_city_list = $this->getDetailDiff($diff_info_list, $this->model_jms_city, $this->field_jms_city);
  130. //同步差异的用户详细信息
  131. $this->submitDetailDiff($diff_jyzl_city_list, $this->model_jyzl_city);
  132. }
  133. public function query_diff( $server, $local ){
  134. $diff = array_keys(array_diff($local,$server));
  135. $result['add'] = array_values(array_diff(array_keys($local),array_keys($server)));
  136. $result['del'] = array_values(array_diff(array_keys($server),array_keys($local)));
  137. $result['update'] =array_diff($diff,$result['add']);
  138. if(!$result){
  139. return false;
  140. }
  141. return $result;
  142. }
  143. public function syncJyzlVehicle( ){
  144. ini_set('memory_limit', '256M');
  145. $count = $this->model_jms_vehicle->count();
  146. $pageCount = ceil($count/$this->size);//总页数
  147. $diff_jyzl_vehicle_list_data = [];
  148. for ($i = 1; $i < $pageCount + 1; $i++) {
  149. $p = ($i-1)*$this->size;
  150. //获取车辆列表及基本字段签名 (id=>签名 键值对)
  151. $jms_vehicle_list = $this->getVehicleList($this->model_jms_vehicle, $this->field_jyzl_vehicle,"$p,".$this->size);
  152. // 设置缓存
  153. //S('VehicleCount',$p);
  154. $jms_vehicle_list_ids = array_merge($jms_vehicle_list_ids,$jms_vehicle_list);
  155. if(!$jms_vehicle_list) continue;
  156. //获取同步数据表车辆列表及基本字段签名 ( id=>签名 键值对)
  157. $jyzl_vehicle_list = $this->getVehicleSignsList(array_keys($jms_vehicle_list), $this->model_jyzl_vehicle, $this->field_jyzl_vehicle);
  158. //上述两组数据比较,获取差异的(增加,删除,修改) id=> 差异(add,del,update) 键值对
  159. $diff_info_list = $this->query_diff($jyzl_vehicle_list, $jms_vehicle_list);
  160. //获取差异的用户详细信息
  161. $diff_jyzl_vehicle_list = $this->getDetailDiff($diff_info_list, $this->model_jms_vehicle, $this->field_jyzl_vehicle);
  162. //sleep(5);
  163. //$diff_jyzl_vehicle_list_data += $diff_jyzl_vehicle_list;
  164. if(!empty($diff_jyzl_vehicle_list['add']) || !empty($diff_jyzl_vehicle_list['update'])) {//忽略删除数据的情况
  165. $this->submitDetailDiff($diff_jyzl_vehicle_list, $this->model_jyzl_vehicle);
  166. }
  167. }
  168. //不考虑jzyl_vehicle 里面有数据 但是jms_vehicle 无数据的情况
  169. //$jyzl_vehicle_ids = $this->model_jyzl_vehicle->getField("ID",true);//获取同步数据表所有的ID
  170. //$jms_vehicle_list_ids = $this->model_jms_vehicle->getField("ID",true);//获取数据源表所有的ID
  171. //$diff_ids = array_diff($jyzl_vehicle_ids, $jms_vehicle_list_ids);
  172. //$diff_jyzl_vehicle_list_data['del'] = empty($diff_ids)?[]:array_values($diff_ids);
  173. }
  174. public function syncJyzlStation( ){
  175. //获取基站列表及基本字段签名 (id=>签名 键值对)
  176. $jzgl_station_list = $this->getList($this->model_jzgl_station, $this->field_jzgl_station);
  177. if(!$jzgl_station_list)
  178. return false;
  179. //获取同步数据表基站列表及基本字段签名 ( id=>签名 键值对)
  180. //$jyzl_station_list = $this->getSignsList(array_keys($jzgl_station_list), $this->model_jyzl_station, $this->field_jzgl_station);
  181. $jyzl_station_list = $this->getSignsList([], $this->model_jyzl_station, $this->field_jzgl_station);
  182. //上述两组数据比较,获取差异的(增加,删除,修改)
  183. // id=> 差异(add,del,update) 键值对
  184. $diff_info_list = $this->query_diff($jyzl_station_list, $jzgl_station_list);
  185. //获取差异的用户详细信息
  186. $diff_jyzl_station_list = $this->getDetailDiff($diff_info_list, $this->model_jzgl_station, $this->field_jzgl_station);
  187. //同步差异的用户详细信息
  188. $this->submitDetailDiff($diff_jyzl_station_list, $this->model_jyzl_station);
  189. }
  190. public function getVehicleList( $model, $field, $limit ){
  191. $list = $model->field($field)->limit($limit)->select();
  192. if(!$list){
  193. return false;
  194. }
  195. $jms_city_list = array();
  196. foreach ($list as $key => $val) {
  197. $jms_city_list[$val['ID']] = $this->md5_id_base($val);
  198. }
  199. return $jms_city_list;
  200. }
  201. public function getVehicleSignsList( $ids, $model, $field ){
  202. $where = array('ID' => array('IN',$ids));
  203. $list = $model->field($field)->where($where)->order('ID ASC')->select();
  204. $jyzl_city_list = array();
  205. if ($list) {
  206. foreach ($list as $key => $val) {
  207. $jyzl_city_list[$val['ID']] = $this->md5_id_base($val);
  208. }
  209. }
  210. return $jyzl_city_list;
  211. }
  212. }