Files
zyt/REGION_FIELD_SUBMISSION_FIX.md
T
2026-04-16 11:13:26 +08:00

154 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Region Field Submission Fix (省市区字段提交修复)
## Issue
The region selector (省市区) in the create order form was not submitting the selected province, city, and district values to the database.
## Root Cause
1. The cascader component had `emitPath: false`, which only returned the last selected value (district name) instead of the full path
2. The `submitCreateOrderFromPrescription()` function was not including the region fields in the payload sent to the backend
## Changes Made
### 1. Updated Cascader Configuration
**File**: `admin/src/views/consumer/prescription/index.vue`
Changed `emitPath` from `false` to `true` to get the full path array:
```typescript
// Before:
:props="{ value: 'name', label: 'name', children: 'children', emitPath: false, checkStrictly: false }"
// After:
:props="{ value: 'name', label: 'name', children: 'children', emitPath: true, checkStrictly: false }"
```
**Effect**: Now `createOrderForm.region` will contain an array like `['四川省', '成都市', '锦江区']` instead of just `'锦江区'`
### 2. Updated Form Submission
**File**: `admin/src/views/consumer/prescription/index.vue`
Added code to extract province, city, and district from the region array and include them in the payload:
```typescript
// 添加省市区字段
if (createOrderForm.region && createOrderForm.region.length >= 3) {
payload.province = createOrderForm.region[0]
payload.city = createOrderForm.region[1]
payload.district = createOrderForm.region[2]
}
```
### 3. Updated handleRegionChange Comment
Added clarification that the value is now an array of the full path.
## Data Flow
### Before Fix:
1. User selects: 四川省 → 成都市 → 锦江区
2. `createOrderForm.region` = `'锦江区'` (only last value)
3. Payload sent to backend: **No province/city/district fields**
4. Database: province, city, district columns remain empty
### After Fix:
1. User selects: 四川省 → 成都市 → 锦江区
2. `createOrderForm.region` = `['四川省', '成都市', '锦江区']` (full path)
3. Payload sent to backend:
```json
{
"province": "四川省",
"city": "成都市",
"district": "锦江区",
...other fields
}
```
4. Database: province, city, district columns are populated correctly
## Testing Steps
### 1. Test Region Selection and Submission
1. Open the prescription list page
2. Click "创建订单" button on any prescription
3. Fill in the required fields:
- Select a patient (患者)
- Enter recipient name (收货人)
- Enter recipient phone (收货手机)
- **Select province/city/district** (省市区): e.g., 四川省 → 成都市 → 锦江区
- Enter detailed address (详细地址)
4. Click "创建业务订单" button
5. Check browser Network tab:
- Find the API request to create order
- Verify the payload includes:
```json
{
"province": "四川省",
"city": "成都市",
"district": "锦江区"
}
```
### 2. Verify Database Storage
After creating an order, check the database:
```sql
SELECT id, order_no, province, city, district, shipping_address
FROM tcm_prescription_order
ORDER BY id DESC
LIMIT 1;
```
Expected result:
```
| id | order_no | province | city | district | shipping_address |
|----|----------|----------|--------|----------|------------------|
| XX | XXXXXX | 四川省 | 成都市 | 锦江区 | 中关村... |
```
### 3. Test Different Regions
Test with various regions to ensure the data structure works correctly:
- 北京市 → 北京市 → 朝阳区
- 上海市 → 上海市 → 浦东新区
- 广东省 → 深圳市 → 南山区
### 4. Test Edge Cases
1. **No region selected**: Should still allow submission (if not required)
2. **Only province selected**: Should not submit incomplete data
3. **Clear selection**: Click the clear button (×) and verify region is cleared
## Backend Verification
The backend should already have the database columns from the migration `add_shipping_region_fields.sql`:
- `province` (varchar)
- `city` (varchar)
- `district` (varchar)
If the backend validation or logic needs to be updated, check:
- `server/app/adminapi/validate/tcm/PrescriptionOrderValidate.php`
- `server/app/adminapi/logic/tcm/PrescriptionOrderLogic.php`
## Console Debugging
If you need to debug, check the browser console for the log message:
```
选择的省市区: ['四川省', '成都市', '锦江区']
```
This confirms the cascader is emitting the correct data structure.
## Related Files
### Frontend:
- `admin/src/views/consumer/prescription/index.vue` (main changes)
### Backend:
- `server/app/adminapi/logic/tcm/PrescriptionOrderLogic.php` (should handle province/city/district)
- `add_shipping_region_fields.sql` (database migration)
## Summary
✅ Changed cascader `emitPath` to `true` to get full path array
✅ Added province/city/district extraction in form submission
✅ Payload now includes all three region fields
✅ Database columns will be populated correctly
The region selector now properly submits province, city, and district values to the database.