From ad4928108a77fa11f37ff0088a2c53a338d1c526 Mon Sep 17 00:00:00 2001
From: Tevin <tingquanren@163.com>
Date: Wed, 19 Mar 2025 18:10:09 +0800
Subject: [PATCH] 增加 cursor rules 工具,创建系统链接

---
 forms/chinaArea/ChinaLocations.js |  343 +++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 235 insertions(+), 108 deletions(-)

diff --git a/forms/chinaArea/ChinaLocations.js b/forms/chinaArea/ChinaLocations.js
index c5e6b98..ee602ce 100644
--- a/forms/chinaArea/ChinaLocations.js
+++ b/forms/chinaArea/ChinaLocations.js
@@ -1,124 +1,251 @@
 /**
- * ChinaLocations
+ * 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 readyCallbacks = [];
 
-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,
-            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;
+        readyCallbacks.forEach(callback => callback());
+    },
 });
 
-export default {
+export class ChinaLocations {
+
     onReady(callback) {
-        callback();
-    },
-    getLocationTree() {
-        return locationTree;
-    },
-    // 获取省市区拼合文本
-    getRegionText(regions) {
-        if (regions.length === 0) {
-            return '';
+        if (Tools.isEmptyObject(locationRes)) {
+            readyCallbacks.push(callback);
+        } else {
+            callback();
         }
-        let address = '';
-        let tempLocationData = ChinaLocationData;
-        regions.forEach((code) => {
-            if (typeof tempLocationData[code].name === 'string') {
-                address += tempLocationData[code].name;
-            } else {
-                address += tempLocationData[code];
-            }
-            tempLocationData = tempLocationData[code].children;
-        });
-        return address;
-    },
-    // 省市区名称
-    getRegionNames(regions) {
-        if (typeof regions === 'string') {
-            regions = regions.split(',');
-        }
-        if (!regions || regions.length === 0 || !regions[0]) {
-            return [];
-        }
-        let address = [];
-        let tempLocationData = ChinaLocationData;
-        regions.forEach((code) => {
-            if (!tempLocationData[code]) {
-                return;
-            }
-            if (typeof tempLocationData[code].name === 'string') {
-                address.push(tempLocationData[code].name);
-            } else {
-                address.push(tempLocationData[code]);
-            }
-            tempLocationData = tempLocationData[code].children;
-        });
-        return address;
-    },
-    // 省市区文本转code
-    getRegionCodes(regions) {
-        if (typeof regions === 'string') {
-            regions = regions.split(',');
-        }
-        if (!regions || regions.length === 0 || !regions[0]) {
-            return '';
-        }
-        const codes = [];
-        // 省
-        for (let provinceCode in ChinaLocationData) {
-            if (ChinaLocationData.hasOwnProperty(provinceCode)) {
-                if (ChinaLocationData[provinceCode].name === regions[0]) {
-                    codes[0] = provinceCode;
-                    // 市
-                    const provinceChildren = ChinaLocationData[provinceCode].children;
-                    for (let cityCode in provinceChildren) {
-                        if (provinceChildren.hasOwnProperty(cityCode)) {
-                            if (provinceChildren[cityCode].name === regions[1]) {
-                                codes[1] = cityCode;
-                                // 区
-                                const areaChildren = provinceChildren[cityCode].children;
-                                for (let areaCode in areaChildren) {
-                                    if (areaChildren.hasOwnProperty(areaCode)) {
-                                        if (areaChildren[areaCode] === regions[2]) {
-                                            codes[2] = areaCode;
-                                            break;
-                                        }
-                                    }
+    }
+
+    _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: '',
+                                    });
                                 }
-                                break;
                             }
                         }
+                        city.children.push(dist);
+                    });
+                }
+                province.children.push(city);
+            });
+            treeDatas.push(province);
+        });
+        return treeDatas;
+    }
+
+    getLocationTree(level, callback) {
+        this.onReady(() => {
+            if (level === 3) {
+                if (locationTreeLv3.length === 0) {
+                    locationTreeLv3 = this._createLocationTree(3);
+                }
+                callback(locationTreeLv3);
+            } else if (level === 4) {
+                if (locationTreeLv4.length === 0) {
+                    locationTreeLv4 = this._createLocationTree(4);
+                }
+                callback(locationTreeLv4);
+            }
+        });
+    }
+
+    // 获取省市区拼合文本
+    getRegionText(regions, callback) {
+        this.getRegionNames(regions, address => {
+            callback(address.join(''));
+        });
+    }
+
+    // 省市区名称
+    getRegionNames(regions, callback) {
+        this.onReady(() => {
+            if (typeof regions === 'string') {
+                regions = regions.split(',');
+            }
+            if (!regions || regions.length === 0 || !regions[0]) {
+                callback([]);
+            }
+            let address = [];
+            let tempLocationData = locationRes;
+            regions.forEach((code) => {
+                if (!code || !tempLocationData[code]) {
+                    address.push('');
+                    tempLocationData = [];
+                } else {
+                    if (typeof tempLocationData[code].name === 'string') {
+                        address.push(tempLocationData[code].name);
+                    } else {
+                        address.push(tempLocationData[code]);
                     }
-                    break;
+                    tempLocationData = tempLocationData[code].children;
+                }
+            });
+            callback(address);
+        });
+    }
+
+    // 省市区文本转code
+    getRegionCodes(regions, callback) {
+        this.onReady(() => {
+            if (typeof regions === 'string') {
+                regions = regions.split(',');
+            }
+            if (!regions || regions.length === 0 || !regions[0]) {
+                callback([]);
+            }
+            const codes = [];
+            // 省
+            for (let provinceCode in locationRes) {
+                if (locationRes.hasOwnProperty(provinceCode)) {
+                    if (locationRes[provinceCode].name === regions[0]) {
+                        codes[0] = provinceCode;
+                        // 市
+                        const provinceContainer = locationRes[provinceCode].children;
+                        for (let cityCode in provinceContainer) {
+                            if (provinceContainer.hasOwnProperty(cityCode)) {
+                                if (provinceContainer[cityCode].name === regions[1]) {
+                                    codes[1] = cityCode;
+                                    // 区
+                                    const distContainer = provinceContainer[cityCode].children;
+                                    for (let distCode in distContainer) {
+                                        if (distContainer.hasOwnProperty(distCode)) {
+                                            if (distContainer[distCode] === regions[2]) {
+                                                codes[2] = distCode;
+                                                break;
+                                            }
+                                            if (distContainer[distCode].name === regions[2]) {
+                                                codes[2] = distCode;
+                                                // 如果存在街道,继续转街道
+                                                if (regions[3]) {
+                                                    const streetContainer = distContainer[distCode].children;
+                                                    Object.keys(streetContainer).forEach(streetCode => {
+                                                        if (streetContainer[streetCode] === regions[3]) {
+                                                            codes[3] = streetCode;
+                                                        }
+                                                    });
+                                                }
+                                                break;
+                                            }
+                                        }
+                                    }
+                                    break;
+                                }
+                            }
+                        }
+                        break;
+                    }
                 }
             }
-        }
-        return codes;
-    },
-};
\ No newline at end of file
+            callback(codes);
+        });
+    }
+
+    // 电话区码
+    getRegionsArea(regions, callback) {
+        this.onReady(() => {
+            if (typeof regions === 'string') {
+                regions = regions.split(',');
+            }
+            if (!regions || regions.length === 0 || !regions[0] || !regions[1]) {
+                callback('');
+                return;
+            }
+            // 中文转编码
+            if (!/^\d+$/.test(regions[0])) {
+                this.getRegionCodes(regions, regionsCode => {
+                    this.getRegionsArea(regionsCode, callback);
+                });
+                return;
+            }
+            let area = '';
+            // 省
+            for (let provinceCode in locationRes) {
+                if (locationRes.hasOwnProperty(provinceCode)) {
+                    if (provinceCode === regions[0]) {
+                        // 市
+                        const provinceChildren = locationRes[provinceCode].children;
+                        for (let cityCode in provinceChildren) {
+                            if (provinceChildren.hasOwnProperty(cityCode)) {
+                                if (cityCode === regions[1]) {
+                                    area = provinceChildren[cityCode].area;
+                                    break;
+                                }
+                            }
+                        }
+                        break;
+                    }
+                }
+            }
+            callback(area);
+        });
+    }
+}
+
+export const $locations = new ChinaLocations();
\ No newline at end of file

--
Gitblit v1.9.1