Area.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. <?php
  2. namespace app\common\model;
  3. use think\facade\Db;
  4. /**
  5. * ============================================================================
  6. * DSMall多用户商城
  7. * ============================================================================
  8. * 版权所有 2014-2028 长沙德尚网络科技有限公司,并保留所有权利。
  9. * 网站地址: http://www.csdeshang.com
  10. * ----------------------------------------------------------------------------
  11. * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用 .
  12. * 不允许对程序代码以任何形式任何目的的再发布。
  13. * ============================================================================
  14. * 数据层模型
  15. */
  16. class Area extends BaseModel
  17. {
  18. /**
  19. * 获取地址列表
  20. * @access public
  21. * @author csdeshang
  22. * @param array $condition 条件
  23. * @param obj $fields 字段
  24. * @param array $group 分组
  25. * @param int $limit 数量限制
  26. * @param str $order 排序
  27. * @return array
  28. */
  29. public function getAreaList($condition = array(), $fields = '*', $group = '', $limit = 0, $order='')
  30. {
  31. return Db::name('area')->where($condition)->field($fields)->limit($limit)->order($order)->group($group)->select()->toArray();
  32. }
  33. /**
  34. * 从缓存获取分类 通过分类id
  35. * @access public
  36. * @author csdeshang
  37. * @param int $id 分类id
  38. * @return array
  39. */
  40. public function getAreaInfoById($id)
  41. {
  42. $data = $this->getCache();
  43. return $data['name'][$id];
  44. }
  45. /**
  46. * 获取地址详情
  47. * @access public
  48. * @author csdeshang
  49. * @param int $condition 条件
  50. * @param array $field 字段
  51. * @return array
  52. */
  53. public function getAreaInfo($condition = array(), $field = '*')
  54. {
  55. return Db::name('area')->where($condition)->field($field)->find();
  56. }
  57. /**
  58. * 获取一级地址(省级)名称数组
  59. * @access public
  60. * @author csdeshang
  61. * @return array 键为id 值为名称字符串
  62. */
  63. public function getTopLevelAreas()
  64. {
  65. $data = $this->getCache();
  66. $arr = array();
  67. foreach ($data['children'][0] as $i) {
  68. $arr[$i] = $data['name'][$i];
  69. }
  70. return $arr;
  71. }
  72. /**
  73. * 获取获取市级id对应省级id的数组
  74. * @access public
  75. * @author csdeshang
  76. * @return array 键为市级id 值为省级id
  77. */
  78. public function getCityProvince()
  79. {
  80. $data = $this->getCache();
  81. $arr = array();
  82. foreach ($data['parent'] as $k => $v) {
  83. if ($v && isset($data['parent'][$v]) && $data['parent'][$v] == 0) {
  84. $arr[$k] = $v;
  85. }
  86. }
  87. return $arr;
  88. }
  89. /**
  90. * 获取地区缓存
  91. * @access public
  92. * @author csdeshang
  93. * @return array
  94. */
  95. public function getAreas()
  96. {
  97. return $this->getCache();
  98. }
  99. /**
  100. * 获取全部地区名称数组
  101. * @access public
  102. * @author csdeshang
  103. * @return array 键为id 值为名称字符串
  104. */
  105. public function getAreaNames()
  106. {
  107. $data = $this->getCache();
  108. return $data['name'];
  109. }
  110. /**
  111. * 获取用于前端js使用的全部地址数组
  112. * @access public
  113. * @author csdeshang
  114. * @param str $src 缓存
  115. * @return array
  116. */
  117. public function getAreaArrayForJson($src = 'cache')
  118. {
  119. if ($src == 'cache') {
  120. $data = $this->getCache();
  121. } else {
  122. $data = $this->_getAllArea();
  123. }
  124. $arr = array();
  125. foreach ($data['children'] as $k => $v) {
  126. foreach ($v as $vv) {
  127. $arr[$k][] = array($vv, $data['name'][$vv]);
  128. }
  129. }
  130. return $arr;
  131. }
  132. /**
  133. * 更新编辑信息
  134. * @access public
  135. * @author csdeshang
  136. * @param array $data 参数内容
  137. * @param array $condition 条件
  138. * @return bool
  139. */
  140. public function editArea($data = array(), $condition = array())
  141. {
  142. // 删除缓存
  143. $this->dropCache();
  144. return Db::name('area')->where($condition)->update($data);
  145. }
  146. /**
  147. * 新增地区
  148. * @access public
  149. * @author csdeshang
  150. * @param array $data 参数内容
  151. * @return boolean
  152. */
  153. public function addArea($data)
  154. {
  155. // 删除缓存
  156. $this->dropCache();
  157. return Db::name('area')->insertGetId($data);
  158. }
  159. /**
  160. * 删除地区
  161. * @access public
  162. * @author csdeshang
  163. * @param array $area_ids 地区id
  164. * @return boolean
  165. */
  166. public function delAreaByAreaIds($area_ids)
  167. {
  168. $area_arr = explode(',', $area_ids);
  169. if (empty($area_arr)) {
  170. return false;
  171. }
  172. $condition = array();
  173. $condition[] = array('area_parent_id','in', $area_arr);
  174. $child_list = $this->getAreaList($condition);
  175. if (!empty($child_list)) {
  176. foreach ($child_list as $v) {
  177. $area_child_arr[] = $v['area_id'];
  178. }
  179. $area_child_ids = implode(',', $area_child_arr);
  180. $this->delAreaByAreaIds($area_child_ids);
  181. }
  182. // 删除地区
  183. $condition = array();
  184. $condition[] = array('area_id','in', $area_arr);
  185. $this->delArea($condition);
  186. }
  187. /**
  188. * 删除地区
  189. * @access public
  190. * @author csdeshang
  191. * @param unknown $condition 条件
  192. * @return boolean
  193. */
  194. public function delArea($condition)
  195. {
  196. // 删除缓存
  197. $this->dropCache();
  198. return Db::name('area')->where($condition)->delete();
  199. }
  200. /**
  201. * 删除缓存数据
  202. * @access public
  203. * @author csdeshang
  204. */
  205. public function dropCache()
  206. {
  207. $this->cachedData = null;
  208. dkcache('area');
  209. }
  210. /**
  211. * 获取地区数组 格式如下
  212. * array(
  213. * 'name' => array(
  214. * '地区id' => '地区名称',
  215. * // ..
  216. * ),
  217. * 'parent' => array(
  218. * '子地区id' => '父地区id',
  219. * // ..
  220. * ),
  221. * 'children' => array(
  222. * '父地区id' => array(
  223. * '子地区id 1',
  224. * '子地区id 2',
  225. * // ..
  226. * ),
  227. * // ..
  228. * ),
  229. * 'region' => array(array(
  230. * '华北区' => array(
  231. * '省级id 1',
  232. * '省级id 2',
  233. * // ..
  234. * ),
  235. * // ..
  236. * ),
  237. * )
  238. *
  239. * @return array
  240. */
  241. protected function getCache()
  242. {
  243. // 对象属性中有数据则返回
  244. if ($this->cachedData !== null)
  245. return $this->cachedData;
  246. // 缓存中有数据则返回
  247. if ($data = rkcache('area')) {
  248. $this->cachedData = $data;
  249. return $data;
  250. }
  251. // 查库
  252. $data = $this->_getAllArea();
  253. wkcache('area', $data);
  254. $this->cachedData = $data;
  255. return $data;
  256. }
  257. protected $cachedData;
  258. /**
  259. * 获取所有地区
  260. * @access public
  261. * @author csdeshang
  262. * @return array
  263. */
  264. private function _getAllArea()
  265. {
  266. $data = array();
  267. $area_all_array = Db::name('area')->select()->toArray();
  268. foreach ((array)$area_all_array as $a) {
  269. $data['name'][$a['area_id']] = $a['area_name'];
  270. $data['parent'][$a['area_id']] = $a['area_parent_id'];
  271. $data['children'][$a['area_parent_id']][] = $a['area_id'];
  272. if ($a['area_deep'] == 1 && $a['area_region'])
  273. $data['region'][$a['area_region']][] = $a['area_id'];
  274. }
  275. wkcache('area', $data);
  276. $this->cachedData = $data;
  277. return $data;
  278. }
  279. /**
  280. * 从缓存获取分类 通过上级分类id
  281. * @access public
  282. * @author csdeshang
  283. * @param int $pid 上级分类id 若传0则返回1级分类
  284. * @return array
  285. */
  286. public function getAreaListByParentId($pid)
  287. {
  288. $data = $this->getCache();
  289. $ret = array();
  290. foreach ((array)$data['children'][$pid] as $i) {
  291. if ($data['data'][$i]) {
  292. $ret[] = $data['data'][$i];
  293. }
  294. }
  295. return $ret;
  296. }
  297. /**
  298. * 递归取得本地区及所有上级地区名称
  299. * @access public
  300. * @author csdeshang
  301. * @param int $area_id 地区id
  302. * @param str $area_name 地区名称
  303. * @return array
  304. */
  305. public function getTopAreaName($area_id, $area_name = '')
  306. {
  307. $info_parent = $this->getAreaInfo(array('area_id' => $area_id), 'area_name,area_parent_id');
  308. if ($info_parent) {
  309. return $this->getTopAreaName($info_parent['area_parent_id'], $info_parent['area_name']) . ' ' . $info_parent['area_name'];
  310. }
  311. }
  312. /**
  313. * 递归取得本地区所有孩子ID
  314. * @access public
  315. * @author csdeshang
  316. * @param $area_id 地区id
  317. * @return array
  318. */
  319. public function getChildrenIDs($area_id)
  320. {
  321. $result = array();
  322. $list = $this->getAreaList(array('area_parent_id' => $area_id), 'area_id');
  323. if ($list) {
  324. foreach ($list as $v) {
  325. $result[] = $v['area_id'];
  326. $result = array_merge($result, $this->getChildrenIDs($v['area_id']));
  327. }
  328. }
  329. return $result;
  330. }
  331. /**
  332. * 从缓存获取所有子节点 通过id
  333. * @access public
  334. * @author csdeshang
  335. * @param int $pid 上级地区id 若传0则返回1级分类
  336. * @return array
  337. */
  338. public function getChildsByPid($pid)
  339. {
  340. $data = $this->getCache();
  341. if (!isset($data['children'][$pid])) {
  342. return false;
  343. }
  344. $ret = array();
  345. foreach ((array)$data['children'][$pid] as $i) {
  346. $ret[] = $i;
  347. $ret_temp = $this->getChildsByPid($i);
  348. if ($ret_temp != false) {
  349. foreach ($ret_temp as $v) {
  350. $ret[] = $v;
  351. }
  352. }
  353. }
  354. return $ret;
  355. }
  356. /**
  357. * 获取子节点名称通过id
  358. * @access public
  359. * @author csdeshang
  360. * @param int $pid id
  361. * @return array
  362. */
  363. public function GetChildName($pid){
  364. return Db::name('area')->field('area_id,area_name')->where(array('area_parent_id'=>$pid))->select()->toArray();
  365. }
  366. /**
  367. * 获取列表 根据id
  368. * @access public
  369. * @author csdeshang
  370. * @param type $parent_id id
  371. * @return array
  372. */
  373. public function getAreaChild($parent_id=-1){
  374. $map = array();
  375. if ($parent_id >= 0) {
  376. $map['area_parent_id'] = $parent_id;
  377. }
  378. return Db::name('area')->where($map)->order('area_sort')->select()->toArray();
  379. }
  380. }