From 92d034e0e124928179f072224e9c2c1ad87fc1b2 Mon Sep 17 00:00:00 2001
From: Tevin <tingquanren@163.com>
Date: Mon, 31 Jul 2023 11:43:45 +0800
Subject: [PATCH] 地址联动组件升级,支持第四级街道,数据采用异步

---
 forms/chinaArea/ChinaLocations.js |  181 ++++++++++++++++++++++++++++++++-------------
 1 files changed, 129 insertions(+), 52 deletions(-)

diff --git a/forms/chinaArea/ChinaLocations.js b/forms/chinaArea/ChinaLocations.js
index 32c57c1..b2e6c4e 100644
--- a/forms/chinaArea/ChinaLocations.js
+++ b/forms/chinaArea/ChinaLocations.js
@@ -1,54 +1,126 @@
 /**
- * ChinaLocations For Normal
+ * ChinaLocations For WeApp
  * @author Tevin
  */
 
-import ChinaLocationData from './ChinaLocationData.json';
+import Taro from '@tarojs/taro';
+import project from '@project';
+import { $hostBoot } from '@components/bases/HostBoot';
+import { Tools } from '@components/common/Tools';
 
-const locationTree = [];
+let locationTreeLv3 = [];
+let locationTreeLv4 = [];
+let locationRes = {};
+let readyCallback = () => { };
 
-Object.keys(ChinaLocationData).forEach((code1) => {
-    const province = {
-        label: ChinaLocationData[code1].name,
-        value: code1,
-        children: [],
-    };
-    const children1 = ChinaLocationData[code1].children;
-    Object.keys(children1).forEach((code2) => {
-        const city = {
-            label: children1[code2].name,
-            value: code2,
-            area: children1[code2].area,  // 电话区码
-            children: [],
-        };
-        if (typeof children1[code2].children !== 'undefined') {
-            const children2 = children1[code2].children;
-            Object.keys(children2).forEach((code3) => {
-                city.children.push({
-                    label: children2[code3],
-                    value: code3,
-                });
-            });
-        }
-        province.children.push(city);
-    });
-    locationTree.push(province);
+Taro.request({
+    url: $hostBoot.getHost() + project.host.assetsPath + '/datas/ChinaLocations.lv4.min.json',
+    header: {
+        'X-Requested-With': 'XMLHttpRequest',
+        'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
+        'Ax-Rq-Type': 'separation',
+    },
+    credentials: 'same-origin',
+    dataType: 'json',
+    timeout: 30 * 1000,
+    method: 'GET',
+    success: response => {
+        locationRes = response.data;
+        readyCallback();
+    }
 });
 
-export default {
+export class ChinaLocations {
+
     onReady(callback) {
-        callback();
-    },
-    getLocationTree() {
-        return locationTree;
-    },
+        if (Tools.isEmptyObject(locationRes)) {
+            readyCallback = callback;
+        } else {
+            callback();
+        }
+    }
+
+    _createLocationTree(level) {
+        const treeDatas = [];
+        // lv1-省
+        Object.keys(locationRes).forEach((provinceCode) => {
+            const province = {
+                label: locationRes[provinceCode].name,
+                value: provinceCode,
+                children: [],
+            };
+            // lv2-市
+            const cityContainer = locationRes[provinceCode].children;
+            Object.keys(cityContainer).forEach((cityCode) => {
+                const city = {
+                    value: cityCode,
+                    area: cityContainer[cityCode].area,  // 电话区码
+                    children: [],
+                };
+                if (typeof cityContainer[cityCode] === 'string') {
+                    city.label = cityContainer[cityCode];
+                } else {
+                    city.label = cityContainer[cityCode].name;
+                    // lv3-区
+                    const distContainer = cityContainer[cityCode].children || {};
+                    Object.keys(distContainer).forEach(distCode => {
+                        const dist = {
+                            value: distCode,
+                        };
+                        if (typeof distContainer[distCode] === 'string') {
+                            dist.label = distContainer[distCode];
+                        } else {
+                            dist.label = distContainer[distCode].name;
+                            // lv4-街
+                            if (level === 4) {
+                                dist.children = [];
+                                const streetContainer = distContainer[distCode].children || {};
+                                Object.keys(streetContainer).forEach(streetCode => {
+                                    const street = {
+                                        label: streetContainer[streetCode],
+                                        value: streetCode,
+                                    };
+                                    dist.children.push(street);
+                                });
+                                if (dist.children.length > 0) {
+                                    dist.children.unshift({
+                                        label: '( 不选 )',
+                                        value: '',
+                                    });
+                                }
+                            }
+                        }
+                        city.children.push(dist);
+                    });
+                }
+                province.children.push(city);
+            });
+            treeDatas.push(province);
+        });
+        return treeDatas;
+    }
+
+    getLocationTree(level) {
+        if (level === 3) {
+            if (locationTreeLv3.length === 0) {
+                locationTreeLv3 = this._createLocationTree(3);
+            }
+            return locationTreeLv3;
+        } else if (level === 4) {
+            if (locationTreeLv4.length === 0) {
+                locationTreeLv4 = this._createLocationTree(4);
+            }
+            return locationTreeLv4;
+        }
+    }
+
     // 获取省市区拼合文本
-    getRegionText(regions) {
+    getRegionText(regions, callback) {
         if (regions.length === 0) {
             return '';
         }
         let address = '';
-        let tempLocationData = ChinaLocationData;
+        let tempLocationData = locationRes;
         regions.forEach((code) => {
             if (!code || !tempLocationData[code]) {
                 address.push('');
@@ -63,9 +135,10 @@
             }
         });
         return address;
-    },
+    }
+
     // 省市区名称
-    getRegionNames(regions) {
+    getRegionNames(regions, callback) {
         if (typeof regions === 'string') {
             regions = regions.split(',');
         }
@@ -73,7 +146,7 @@
             return [];
         }
         let address = [];
-        let tempLocationData = ChinaLocationData;
+        let tempLocationData = locationRes;
         regions.forEach((code) => {
             if (!code || !tempLocationData[code]) {
                 address.push('');
@@ -88,9 +161,10 @@
             }
         });
         return address;
-    },
+    }
+
     // 省市区文本转code
-    getRegionCodes(regions) {
+    getRegionCodes(regions, callback) {
         if (typeof regions === 'string') {
             regions = regions.split(',');
         }
@@ -99,12 +173,12 @@
         }
         const codes = [];
         // 省
-        for (let provinceCode in ChinaLocationData) {
-            if (ChinaLocationData.hasOwnProperty(provinceCode)) {
-                if (ChinaLocationData[provinceCode].name === regions[0]) {
+        for (let provinceCode in locationRes) {
+            if (locationRes.hasOwnProperty(provinceCode)) {
+                if (locationRes[provinceCode].name === regions[0]) {
                     codes[0] = provinceCode;
                     // 市
-                    const provinceChildren = ChinaLocationData[provinceCode].children;
+                    const provinceChildren = locationRes[provinceCode].children;
                     for (let cityCode in provinceChildren) {
                         if (provinceChildren.hasOwnProperty(cityCode)) {
                             if (provinceChildren[cityCode].name === regions[1]) {
@@ -128,7 +202,8 @@
             }
         }
         return codes;
-    },
+    }
+
     // 电话区码
     getRegionsArea(regions) {
         if (typeof regions === 'string') {
@@ -139,11 +214,11 @@
         }
         let area = '';
         // 省
-        for (let provinceCode in ChinaLocationData) {
-            if (ChinaLocationData.hasOwnProperty(provinceCode)) {
+        for (let provinceCode in locationRes) {
+            if (locationRes.hasOwnProperty(provinceCode)) {
                 if (provinceCode === regions[0]) {
                     // 市
-                    const provinceChildren = ChinaLocationData[provinceCode].children;
+                    const provinceChildren = locationRes[provinceCode].children;
                     for (let cityCode in provinceChildren) {
                         if (provinceChildren.hasOwnProperty(cityCode)) {
                             if (cityCode === regions[1]) {
@@ -157,5 +232,7 @@
             }
         }
         return area;
-    },
-};
\ No newline at end of file
+    }
+};
+
+export const $locations = new ChinaLocations();
\ No newline at end of file

--
Gitblit v1.9.1