xsh_1997 пре 1 недеља
родитељ
комит
3350ec7db2

+ 4 - 8
ruoyi-ui/src/api/agri/region.js

@@ -1,15 +1,11 @@
1
-import request from '@/utils/request'
2
-import { normalizeRegionTree } from '@/utils/region'
1
+import { getRegionTreeFromCityCode, normalizeRegionTree } from '@/utils/region'
3 2
 
4
-// 查询省市区三级树(平台端,原始数据)
3
+/** 查询省市区三级树(本地 cityCode.json,原始结构) */
5 4
 export function getRegionTree() {
6
-  return request({
7
-    url: '/agri/region/tree',
8
-    method: 'get'
9
-  })
5
+  return Promise.resolve({ data: getRegionTreeFromCityCode() })
10 6
 }
11 7
 
12 8
 /** 查询供 el-cascader 使用的省市区树(已 normalize,仅区县可选) */
13 9
 export function getRegionCascaderTree() {
14
-  return getRegionTree().then(response => normalizeRegionTree(response.data || []))
10
+  return Promise.resolve(normalizeRegionTree(getRegionTreeFromCityCode()))
15 11
 }

Разлика између датотеке није приказан због своје велике величине
+ 13637 - 0
ruoyi-ui/src/utils/json/cityCode.json


+ 56 - 0
ruoyi-ui/src/utils/region.js

@@ -1,3 +1,5 @@
1
+import cityCodeJson from '@/utils/json/cityCode.json'
2
+
1 3
 /** el-cascader 省市区配置(须配合 normalizeRegionTree 使用) */
2 4
 export const REGION_CASCADER_PROPS = {
3 5
   value: 'code',
@@ -106,3 +108,57 @@ export function parseRegionSelection(regionTree, codes) {
106 108
     name: names.join('/')
107 109
   }
108 110
 }
111
+
112
+let cachedRegionTree = null
113
+
114
+/**
115
+ * 将 cityCode.json 转为与后端 RegionTreeVO 一致的三级树结构。
116
+ * code 为字符串;省级 id 取行政区划 code 数值,供省份多选等场景使用。
117
+ */
118
+export function convertCityCodeToRegionTree(cityCodeList) {
119
+  return (cityCodeList || []).map(province => {
120
+    const provinceCode = String(province.code)
121
+    const cities = (province.cityList || []).map(city => {
122
+      const cityCode = String(city.code)
123
+      const areas = (city.areaList || []).map(area => ({
124
+        code: String(area.code),
125
+        name: area.name,
126
+        type: 3
127
+      }))
128
+      const cityNode = {
129
+        code: cityCode,
130
+        name: city.name,
131
+        type: 2
132
+      }
133
+      if (areas.length) {
134
+        cityNode.children = areas
135
+      }
136
+      return cityNode
137
+    })
138
+    const provinceNode = {
139
+      id: Number(provinceCode),
140
+      code: provinceCode,
141
+      name: province.name,
142
+      type: 1
143
+    }
144
+    if (cities.length) {
145
+      provinceNode.children = cities
146
+    }
147
+    return provinceNode
148
+  })
149
+}
150
+
151
+/** 从本地 cityCode.json 获取省市区树(带模块级缓存) */
152
+export function getRegionTreeFromCityCode() {
153
+  if (!cachedRegionTree) {
154
+    cachedRegionTree = convertCityCodeToRegionTree(cityCodeJson)
155
+  }
156
+  return cachedRegionTree
157
+}
158
+
159
+/** 从地区树提取省级选项(运费模版等省份多选) */
160
+export function getProvinceOptionsFromTree(regionTree) {
161
+  return (regionTree || [])
162
+    .filter(item => item.type === 1)
163
+    .map(item => ({ id: item.id, name: item.name }))
164
+}

+ 4 - 1
shop-app/api/region.js

@@ -1,6 +1,9 @@
1 1
 import request from '@/utils/request'
2 2
 
3
-/** 省市区三级树(匿名,收货地址/入驻地址共用) */
3
+/**
4
+ * 省市区三级树(接口)
5
+ * @deprecated 业务已改读本地 utils/json/cityCode.json,见 utils/region.js
6
+ */
4 7
 export function getRegionTree() {
5 8
   return request({
6 9
     url: '/api/region/tree',

Разлика између датотеке није приказан због своје велике величине
+ 13637 - 0
shop-app/utils/json/cityCode.json


+ 48 - 7
shop-app/utils/region.js

@@ -1,4 +1,4 @@
1
-import { getRegionTree } from '@/api/region'
1
+import cityCodeJson from '@/utils/json/cityCode.json'
2 2
 
3 3
 /** 与平台 ruoyi-ui `utils/region.js` 逻辑一致 */
4 4
 export function normalizeRegionTree(nodes) {
@@ -95,16 +95,57 @@ export function formatRegionDisplay(regionName) {
95 95
   return (regionName || '').replace(/\//g, ' ')
96 96
 }
97 97
 
98
+/**
99
+ * 将 cityCode.json 转为三级树(与后端 RegionTreeVO 结构一致)
100
+ */
101
+export function convertCityCodeToRegionTree(cityCodeList) {
102
+  return (cityCodeList || []).map((province) => {
103
+    const provinceCode = String(province.code)
104
+    const cities = (province.cityList || []).map((city) => {
105
+      const cityCode = String(city.code)
106
+      const areas = (city.areaList || []).map((area) => ({
107
+        code: String(area.code),
108
+        name: area.name,
109
+        type: 3
110
+      }))
111
+      const cityNode = {
112
+        code: cityCode,
113
+        name: city.name,
114
+        type: 2
115
+      }
116
+      if (areas.length) {
117
+        cityNode.children = areas
118
+      }
119
+      return cityNode
120
+    })
121
+    const provinceNode = {
122
+      code: provinceCode,
123
+      name: province.name,
124
+      type: 1
125
+    }
126
+    if (cities.length) {
127
+      provinceNode.children = cities
128
+    }
129
+    return provinceNode
130
+  })
131
+}
132
+
98 133
 let cachedRawTree = null
99 134
 let cachedCascaderTree = null
100 135
 
101
-/** 加载并缓存级联树(normalize 后供 up-cascader) */
102
-export async function loadRegionCascaderTree(force = false) {
136
+function getRegionTreeFromCityCode() {
137
+  if (!cachedRawTree) {
138
+    cachedRawTree = convertCityCodeToRegionTree(cityCodeJson)
139
+  }
140
+  return cachedRawTree
141
+}
142
+
143
+/** 加载并缓存级联树(本地 cityCode.json,normalize 后供 up-cascader) */
144
+export function loadRegionCascaderTree(force = false) {
103 145
   if (!force && cachedCascaderTree) {
104
-    return { raw: cachedRawTree, cascader: cachedCascaderTree }
146
+    return Promise.resolve({ raw: cachedRawTree, cascader: cachedCascaderTree })
105 147
   }
106
-  const res = await getRegionTree()
107
-  cachedRawTree = res.data || []
148
+  cachedRawTree = getRegionTreeFromCityCode()
108 149
   cachedCascaderTree = normalizeRegionTree(cachedRawTree)
109
-  return { raw: cachedRawTree, cascader: cachedCascaderTree }
150
+  return Promise.resolve({ raw: cachedRawTree, cascader: cachedCascaderTree })
110 151
 }