Przeglądaj źródła

feat(UserAddressRepository): 扩展地址解析功能以包含区域ID

- 修改阿里云市场地址解析接口调用,增加区域ID查询功能
- 添加 appendRegionIds 方法从 rrx_regions 表查询省/市/区/街道的 ID
- 在返回数据中追加 province_id、city_id、district_id、street_id 字段
- 生成 code_list 字段拼接各级区域ID
- 更新方法注释说明新增的区域ID查询功能
- 添加查询构造器复用问题的注意事项注释
shichen 2 miesięcy temu
rodzic
commit
21aab618d4

+ 68 - 2
app/common/repositories/user/UserAddressRepository.php

@@ -142,7 +142,8 @@ class UserAddressRepository extends BaseRepository
142 142
     /**
143 143
      * 阿里云市场 - 地址解析
144 144
      *
145
-     * 调用阿里云市场地址解析接口,将完整的地址文本解析为省/市/区/街道等结构化信息
145
+     * 调用阿里云市场地址解析接口,将完整的地址文本解析为省/市/区/街道等结构化信息,
146
+     * 并从 rrx_regions 表查询省/市/区/街道的 id 追加到返回数据中
146 147
      *
147 148
      * 接口文档: https://market.aliyun.com/detail/cmapi00067026
148 149
      * 请求方式: POST
@@ -193,7 +194,10 @@ class UserAddressRepository extends BaseRepository
193 194
             // 接口返回格式:{"msg":"成功","success":true,"code":200,"data":{"orderNo":"...","data":{...}}}
194 195
             // 提取内层 data.data 作为解析结果
195 196
             if (isset($result['code']) && $result['code'] == 200 && isset($result['data']['data'])) {
196
-                return ['code' => 200, 'msg' => '成功', 'data' => $result['data']['data']];
197
+                $data = $result['data']['data'];
198
+                // 从 rrx_regions 表查询省/市/区/街道的 id
199
+                $data = $this->appendRegionIds($data);
200
+                return ['code' => 200, 'msg' => '成功', 'data' => $data];
197 201
             }
198 202
 
199 203
             // 如果外层 code 不是 200,返回接口的错误信息
@@ -211,4 +215,66 @@ class UserAddressRepository extends BaseRepository
211 215
             return ['code' => -5, 'msg' => $msg, 'data' => []];
212 216
         }
213 217
     }
218
+
219
+    /**
220
+     * 根据省/市/区/街道名称从 rrx_regions 表查询对应的 id,并追加到返回数据中
221
+     *
222
+     * 注意:每次查询必须重新调用 Db::name('regions'),避免 ThinkPHP 查询构造器复用导致 where 条件叠加
223
+     *
224
+     * @param array $data 接口返回的地址解析数据,包含 province/city/district/street
225
+     * @return array
226
+     */
227
+    private function appendRegionIds(array $data)
228
+    {
229
+        $provinceId = 0;
230
+        $cityId = 0;
231
+        $districtId = 0;
232
+        $streetId = 0;
233
+
234
+        // 查询省份 id (level = 1),未查到返回 0
235
+        if (!empty($data['province'])) {
236
+            $province = \think\facade\Db::name('regions')
237
+                ->where('name', $data['province'])
238
+                ->where('level', 1)
239
+                ->find();
240
+            $provinceId = $province ? (int)$province['id'] : 0;
241
+        }
242
+        $data['province_id'] = $provinceId;
243
+
244
+        // 查询城市 id (level = 2),未查到返回 0
245
+        if (!empty($data['city'])) {
246
+            $city = \think\facade\Db::name('regions')
247
+                ->where('name', $data['city'])
248
+                ->where('level', 2)
249
+                ->find();
250
+            $cityId = $city ? (int)$city['id'] : 0;
251
+        }
252
+        $data['city_id'] = $cityId;
253
+
254
+        // 查询区/县 id (level = 3),未查到返回 0
255
+        if (!empty($data['district'])) {
256
+            $district = \think\facade\Db::name('regions')
257
+                ->where('name', $data['district'])
258
+                ->where('level', 3)
259
+                ->find();
260
+            $districtId = $district ? (int)$district['id'] : 0;
261
+        }
262
+        $data['district_id'] = $districtId;
263
+
264
+        // 查询街道/乡镇 id (level = 4),未查到返回 0
265
+        if (!empty($data['street'])) {
266
+            $street = \think\facade\Db::name('regions')
267
+                ->where('name', $data['street'])
268
+                ->where('level', 4)
269
+                ->find();
270
+            $streetId = $street ? (int)$street['id'] : 0;
271
+        }
272
+        $data['street_id'] = $streetId;
273
+
274
+        // 拼接 code_list,格式:province_id,city_id,district_id,street_id
275
+        $codeList = implode(',', [$provinceId, $cityId, $districtId, $streetId]);
276
+        $data['code_list'] = $codeList;
277
+
278
+        return $data;
279
+    }
214 280
 }