area_upgrade.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: stanley-king
  5. * Date: 2017/3/16
  6. * Time: 下午8:54
  7. */
  8. namespace area;
  9. require_once(BASE_ROOT_PATH . '/helper/util_helper.php');
  10. use util;
  11. class upgrade
  12. {
  13. private $mod_area;
  14. private $mod_region;
  15. public function __construct()
  16. {
  17. $this->mod_area = Model('area');
  18. $this->mod_region = Model('bs_region');
  19. }
  20. public function province()
  21. {
  22. $this->parent_match(0,1,1);
  23. }
  24. public function city()
  25. {
  26. $items = $this->mod_area->where(array('area_parent_id' => 0))->field('area_id,tm_region_id')->order('area_name ASC')->select();
  27. foreach ($items as $item)
  28. {
  29. $area_id = intval($item['area_id']);
  30. $region_id = intval($item['tm_region_id']);
  31. $this->parent_match($area_id,$region_id,2);
  32. }
  33. }
  34. public function country()
  35. {
  36. //得到所有的省
  37. $items = $this->mod_area->where(array('area_parent_id' => 0))->field('area_id,tm_region_id')->order('area_name ASC')->select();
  38. foreach ($items as $item)
  39. {
  40. $area_id = intval($item['area_id']);
  41. if($area_id >= 32) continue; //海外地区不处理了。
  42. $citys = $this->mod_area->where(array('area_parent_id' => $area_id))->field('area_id,tm_region_id')->order('area_name ASC')->select();
  43. foreach ($citys as $city)
  44. {
  45. $city_id = intval($city['area_id']);
  46. $region_id = intval($city['tm_region_id']);
  47. $this->parent_match($city_id,$region_id,3);
  48. }
  49. }
  50. }
  51. private function parent_match($area_parent,$tm_parent,$area_deep)
  52. {
  53. $areas = $this->mod_area->where(array('area_parent_id' => $area_parent))->field('area_id,area_name,area_parent_id,area_deep')->order('area_name ASC')->select();
  54. $regions = $this->mod_region->where(array('parent_id' => $tm_parent)) ->field('county_name,region_id,parent_id')->order('county_name ASC')->select();
  55. $maps = $this->map_region($regions);
  56. $this->match($areas,$maps,$area_parent,$area_deep);
  57. }
  58. private function match($areas,$maps,$parent_id,$area_deep)
  59. {
  60. foreach ($areas as $area)
  61. {
  62. $name = $area['area_name'];
  63. if(array_key_exists($name,$maps)) {
  64. $maps[$name]['finded'] = true;
  65. $this->update($area,$maps[$name]);
  66. }
  67. else
  68. {
  69. foreach ($maps as $key => $region)
  70. {
  71. if($region['finded'] == true) continue;
  72. if(self::fuzzy_name($key,$name)) {
  73. $maps[$name]['finded'] = true;
  74. $this->update($area,$region);
  75. break;
  76. }
  77. }
  78. $this->nouse($area);
  79. }
  80. }
  81. foreach ($maps as $region)
  82. {
  83. if($region['finded'] != true) {
  84. $this->insert($parent_id,$area_deep,$region);
  85. }
  86. }
  87. }
  88. private function nouse($area)
  89. {
  90. $ret = $this->mod_area->where(array('area_id' => $area['area_id']))->update(array('enable' => 0));
  91. }
  92. private function update($area,$region)
  93. {
  94. $this->mod_area->where(array('area_id' => $area['area_id']))->update(array('tm_name' => $region['county_name'],'tm_region_id' => $region['region_id'],'tm_parent_id' => $region['parent_id']));
  95. }
  96. private function insert($parent_id,$area_deep,$region)
  97. {
  98. $ret = $this->mod_area->insert(array('area_name' => "",'area_parent_id' => $parent_id,'area_deep' => $area_deep,
  99. 'tm_name' => $region['county_name'],'tm_region_id' => $region['region_id'],'tm_parent_id' => $region['parent_id']));
  100. }
  101. private static function short_name($area_name)
  102. {
  103. static $words = array('省','市','区','县','乡','镇','阁');
  104. $last = mb_substr($area_name, -1, 1);
  105. if(in_array($last,$words)) {
  106. return mb_substr($area_name, 0, mb_strlen($area_name) - 1);
  107. }
  108. else {
  109. return $area_name;
  110. }
  111. }
  112. private static function fuzzy_name($country_name,$area_name)
  113. {
  114. if (util::start_with($country_name, $area_name)) {
  115. return true;
  116. }
  117. $area_name = self::short_name($area_name);
  118. if (util::start_with($country_name, $area_name)) {
  119. return true;
  120. } else {
  121. return false;
  122. }
  123. }
  124. private function map_region($regions)
  125. {
  126. $maps = [];
  127. foreach ($regions as $region) {
  128. $name = trim($region['county_name']);
  129. $maps[$name] = $region;
  130. }
  131. return $maps;
  132. }
  133. }