Area.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. <?php
  2. namespace app\data\controller\api;
  3. use app\data\model\BasePostageRegion;
  4. use hg\apidoc\annotation\Param;
  5. use hg\apidoc\annotation\Returned;
  6. use hg\apidoc\annotation\Title;
  7. use think\admin\Controller;
  8. use think\Cache;
  9. /**
  10. * @Title("地区模块")
  11. */
  12. class Area extends Controller
  13. {
  14. /**
  15. * @Title("获取地区信息")
  16. * @Param("level",desc="1省2市3区")
  17. * @Param("pid",desc="上级区域ID")
  18. * @Returned("id",desc="地区ID")
  19. * @Returned("name",desc="地区名称")
  20. * @Returned("short",desc="地区简短名称")
  21. * @Returned("pinyin",desc="地区拼音")
  22. * @Returned("first",desc="地区首字母")
  23. */
  24. public function area(){
  25. $data=$this->_vali([
  26. 'level.require'=>'级别必须',
  27. 'pid.require'=>"上级必须",
  28. ]);
  29. $this->success(
  30. '',
  31. BasePostageRegion::where('level',$data['level'])
  32. ->where('pid',$data['pid'])
  33. ->order('pinyin')
  34. ->select()
  35. );
  36. }
  37. /**
  38. * @Title("获取地区信息(按字母排序)")
  39. * @Param("level",desc="1省2市3区")
  40. * @Param("hot",desc="1是否获取热门城市")
  41. */
  42. public function sort(){
  43. $data=$this->_vali([
  44. 'level.require'=>'级别必须',
  45. 'level.in:1,2,3'=>'级别必须',
  46. ]);
  47. $sortArea=$this->app->cache->remember("app_area_sort_{$data['level']}",function ()use ($data){
  48. $citys=BasePostageRegion::field(['id','name','first'])->where('level',$data['level'])->select();
  49. $a = [];
  50. for ($i = 65; $i < 91; $i++) {
  51. $one = [
  52. 'index' => chr($i),
  53. 'child' => []
  54. ];
  55. foreach ($citys as $key => &$city) {
  56. if ($city['first'] == $one['index']) {
  57. $one['child'][] = [
  58. 'title' => $city['name'],
  59. 'weight' => $city['id'],
  60. 'id' => $city['id'],
  61. ];
  62. unset($citys[$key]);
  63. }
  64. }
  65. $a[] = $one;
  66. }
  67. return $a;
  68. },0);
  69. $info=[
  70. 'areas'=>$sortArea,
  71. ];
  72. if(input('hot')){
  73. $info['hot']=BasePostageRegion::hot();
  74. }
  75. $this->success('',$info);
  76. }
  77. /**
  78. * @Title("地区递归三级联动")
  79. */
  80. public function tree(){
  81. function area(&$data,$areas,$first=false){
  82. foreach ($areas as $k=>$area){
  83. if($first){
  84. if($area['pid']==0) {
  85. area($area, $areas);
  86. unset($area['pid']);
  87. $data[] = $area;
  88. unset($areas[$k]);
  89. }
  90. }else{
  91. if($data['value']==$area['pid']){
  92. area($area, $areas);
  93. unset($area['pid']);
  94. $data['children'][]=$area;
  95. unset($areas[$k]);
  96. }
  97. }
  98. }
  99. }
  100. $cache=$this->app->cache;
  101. $fromCache=$cache->get('app_area');
  102. if(!$fromCache){
  103. $fina=[];
  104. $areas=BasePostageRegion::where('level','<=',3)->field('id as value,name as label,pid')->select()->toArray();
  105. area($fina,$areas,true);
  106. $fromCache=$fina;
  107. $cache->remember('app_area',$fina,0);
  108. }
  109. $this->success('',$fromCache);
  110. }
  111. /**
  112. * @Title("根据名称获取信息")
  113. * @Param("name",desc="城市名")
  114. */
  115. public function name(){
  116. $rs=null;
  117. $cache=$this->app->cache;
  118. if($name=input('name')){
  119. $cacheName="area_name_".$name;
  120. $rs=$cache->get($cacheName,null);
  121. if(!$rs){
  122. $rs=BasePostageRegion::where('name|short',$name)->find();
  123. $cache->set($cacheName,$rs);
  124. }
  125. }
  126. $this->success('',$rs);
  127. }
  128. }