171 lines
5.1 KiB
Markdown
171 lines
5.1 KiB
Markdown
# Region Database Save Fix (省市区数据库保存修复)
|
|
|
|
## Issue
|
|
The region fields (province, city, district) were being sent in the API request payload but were not being saved to the database.
|
|
|
|
## Root Cause Analysis
|
|
|
|
### Frontend Issue
|
|
The frontend was sending the wrong parameter names:
|
|
- Sent: `province`, `city`, `district`
|
|
- Expected by backend: `shipping_province`, `shipping_city`, `shipping_district`
|
|
|
|
### Backend Issue
|
|
The `create()` method in `PrescriptionOrderLogic.php` was not handling the province/city/district fields at all, even though the `edit()` method had the code to handle them.
|
|
|
|
## Changes Made
|
|
|
|
### 1. Frontend - Fixed Parameter Names
|
|
**File**: `admin/src/views/consumer/prescription/index.vue`
|
|
|
|
Changed the payload to use the correct parameter names:
|
|
|
|
```typescript
|
|
// Before:
|
|
payload.province = createOrderForm.region[0]
|
|
payload.city = createOrderForm.region[1]
|
|
payload.district = createOrderForm.region[2]
|
|
|
|
// After:
|
|
payload.shipping_province = createOrderForm.region[0]
|
|
payload.shipping_city = createOrderForm.region[1]
|
|
payload.shipping_district = createOrderForm.region[2]
|
|
```
|
|
|
|
### 2. Backend - Added Region Fields to create() Method
|
|
**File**: `server/app/adminapi/logic/tcm/PrescriptionOrderLogic.php`
|
|
|
|
Added code to handle province/city/district fields in the `create()` method:
|
|
|
|
```php
|
|
// 处理省市区字段
|
|
if (isset($params['shipping_province'])) {
|
|
$order->shipping_province = (string) $params['shipping_province'];
|
|
}
|
|
if (isset($params['shipping_city'])) {
|
|
$order->shipping_city = (string) $params['shipping_city'];
|
|
}
|
|
if (isset($params['shipping_district'])) {
|
|
$order->shipping_district = (string) $params['shipping_district'];
|
|
}
|
|
```
|
|
|
|
This matches the existing code in the `edit()` method.
|
|
|
|
## Data Flow (After Fix)
|
|
|
|
### Create Order Flow:
|
|
1. User selects region: 北京市 → 北京市 → 丰台区
|
|
2. Frontend stores: `createOrderForm.region = ['北京市', '北京市', '丰台区']`
|
|
3. Frontend sends payload:
|
|
```json
|
|
{
|
|
"shipping_province": "北京市",
|
|
"shipping_city": "北京市",
|
|
"shipping_district": "丰台区",
|
|
...other fields
|
|
}
|
|
```
|
|
4. Backend `create()` method processes:
|
|
```php
|
|
$order->shipping_province = "北京市";
|
|
$order->shipping_city = "北京市";
|
|
$order->shipping_district = "丰台区";
|
|
```
|
|
5. Database columns are populated:
|
|
```
|
|
shipping_province: 北京市
|
|
shipping_city: 北京市
|
|
shipping_district: 丰台区
|
|
```
|
|
|
|
## Testing Steps
|
|
|
|
### 1. Test Create Order with Region
|
|
1. Open prescription list page
|
|
2. Click "创建订单" on any prescription
|
|
3. Fill in required fields:
|
|
- Select patient
|
|
- Enter recipient name and phone
|
|
- **Select region**: 北京市 → 北京市 → 丰台区
|
|
- Enter detailed address
|
|
4. Click "创建业务订单"
|
|
5. Check browser Network tab:
|
|
- Verify payload includes:
|
|
```json
|
|
{
|
|
"shipping_province": "北京市",
|
|
"shipping_city": "北京市",
|
|
"shipping_district": "丰台区"
|
|
}
|
|
```
|
|
|
|
### 2. Verify Database
|
|
After creating the order, check the database:
|
|
|
|
```sql
|
|
SELECT
|
|
id,
|
|
order_no,
|
|
shipping_province,
|
|
shipping_city,
|
|
shipping_district,
|
|
shipping_address
|
|
FROM tcm_prescription_order
|
|
ORDER BY id DESC
|
|
LIMIT 1;
|
|
```
|
|
|
|
Expected result:
|
|
```
|
|
| id | order_no | shipping_province | shipping_city | shipping_district | shipping_address |
|
|
|----|----------|-------------------|---------------|-------------------|------------------|
|
|
| XX | POXXXXXX | 北京市 | 北京市 | 丰台区 | 顶顶顶 |
|
|
```
|
|
|
|
### 3. Test Different Regions
|
|
Test with various regions to ensure all work correctly:
|
|
- 四川省 → 成都市 → 武侯区
|
|
- 上海市 → 上海市 → 浦东新区
|
|
- 广东省 → 深圳市 → 南山区
|
|
|
|
### 4. Test Edit Order
|
|
1. Edit an existing order
|
|
2. Change the region
|
|
3. Save and verify the database is updated
|
|
|
|
## Database Schema
|
|
|
|
The database should have these columns (from `add_shipping_region_fields.sql`):
|
|
|
|
```sql
|
|
ALTER TABLE `tcm_prescription_order`
|
|
ADD COLUMN `shipping_province` VARCHAR(50) DEFAULT NULL COMMENT '收货省份' AFTER `shipping_address`,
|
|
ADD COLUMN `shipping_city` VARCHAR(50) DEFAULT NULL COMMENT '收货城市' AFTER `shipping_province`,
|
|
ADD COLUMN `shipping_district` VARCHAR(50) DEFAULT NULL COMMENT '收货区县' AFTER `shipping_city`;
|
|
```
|
|
|
|
## Related Files
|
|
|
|
### Frontend:
|
|
- `admin/src/views/consumer/prescription/index.vue`
|
|
- Changed parameter names in `submitCreateOrderFromPrescription()`
|
|
|
|
### Backend:
|
|
- `server/app/adminapi/logic/tcm/PrescriptionOrderLogic.php`
|
|
- Added province/city/district handling in `create()` method
|
|
- Already had province/city/district handling in `edit()` method
|
|
|
|
### Database:
|
|
- `add_shipping_region_fields.sql` (migration file)
|
|
|
|
## Summary
|
|
|
|
✅ Fixed frontend parameter names: `province` → `shipping_province`, etc.
|
|
✅ Added province/city/district handling to backend `create()` method
|
|
✅ Backend `edit()` method already had the correct code
|
|
✅ Database columns will now be populated correctly on order creation
|
|
✅ Database columns will be updated correctly on order edit
|
|
|
|
The region fields are now properly saved to the database for both create and edit operations!
|