更新
This commit is contained in:
@@ -0,0 +1,199 @@
|
||||
# Region Selector and Dosage Fields Fix
|
||||
|
||||
## Issues Identified
|
||||
|
||||
### 1. Region Selector Empty (省市区下拉为空)
|
||||
**Problem**: The region cascader dropdown is empty when opening the create order form.
|
||||
|
||||
**Root Cause**: The Vite proxy configuration is correct, but the development server needs to be restarted for the proxy to take effect.
|
||||
|
||||
**Solution**:
|
||||
- The proxy configuration in `admin/vite.config.ts` is already set up correctly:
|
||||
```typescript
|
||||
proxy: {
|
||||
'/api-proxy': {
|
||||
target: 'https://admin.zhenyangtang.com.cn',
|
||||
changeOrigin: true,
|
||||
rewrite: (path) => path.replace(/^\/api-proxy/, '')
|
||||
}
|
||||
}
|
||||
```
|
||||
- The `transformRegionData()` function correctly converts the API format to el-cascader format
|
||||
- **ACTION REQUIRED**: Restart the development server
|
||||
|
||||
### 2. Dosage Dropdown Not Showing Selected Value on First Load
|
||||
**Problem**: When editing a prescription, the dosage dropdown (用量) appears empty on first load, but shows correctly when reopening the dialog.
|
||||
|
||||
**Root Cause**: Timing issue with the `isLoadingData` flag. The `nextTick()` callback was executing before all data was fully rendered.
|
||||
|
||||
**Solution**: Changed from `nextTick()` to `setTimeout(..., 0)` to ensure all data is rendered before re-enabling the watch function.
|
||||
|
||||
**Changed in**: `admin/src/views/consumer/prescription/index.vue`
|
||||
```typescript
|
||||
// Before:
|
||||
nextTick(() => {
|
||||
isLoadingData.value = false
|
||||
})
|
||||
|
||||
// After:
|
||||
setTimeout(() => {
|
||||
isLoadingData.value = false
|
||||
}, 0)
|
||||
```
|
||||
|
||||
### 3. Dosage Fields Not Saving to Database
|
||||
**Problem**: User reported that dosage fields (用量、单位、代煎、每贴出包数) are not being saved to the database.
|
||||
|
||||
**Analysis**:
|
||||
- ✅ Backend validation (`PrescriptionValidate.php`) already includes all dosage fields in `sceneAdd()` and `sceneEdit()`
|
||||
- ✅ Frontend component (`tcm-prescription/index.vue`) includes all fields in `handleSave()`
|
||||
- ✅ Frontend prescription list view (`prescription/index.vue`) includes all fields in form submission
|
||||
- ✅ Watch function properly resets values when prescription type changes
|
||||
- ✅ `isLoadingData` flag prevents watch from overwriting loaded data
|
||||
|
||||
**Verification Needed**:
|
||||
1. Check if database migration was executed: `add_prescription_dosage_fields.sql`
|
||||
2. Check browser console for any API errors when saving
|
||||
3. Verify that the API response shows the fields were saved
|
||||
|
||||
## Files Modified
|
||||
|
||||
### 1. admin/src/views/consumer/prescription/index.vue
|
||||
- Changed `nextTick()` to `setTimeout(..., 0)` in `handleEdit()` function (line ~2187)
|
||||
|
||||
## Files Already Correct (No Changes Needed)
|
||||
|
||||
### 1. admin/vite.config.ts
|
||||
- Proxy configuration is correct
|
||||
|
||||
### 2. admin/src/views/consumer/prescription/index.vue
|
||||
- `transformRegionData()` function correctly converts API format
|
||||
- `loadRegionData()` function properly fetches and transforms data
|
||||
- Watch function includes `isLoadingData` flag to prevent overwriting
|
||||
- All dosage fields are included in form submission
|
||||
|
||||
### 3. admin/src/components/tcm-prescription/index.vue
|
||||
- All dosage fields are included in `handleSave()`
|
||||
- Watch function properly handles prescription type changes
|
||||
- bags_per_dose field is displayed for 饮片 type
|
||||
|
||||
### 4. server/app/adminapi/validate/tcm/PrescriptionValidate.php
|
||||
- All dosage fields are included in `sceneAdd()` and `sceneEdit()`
|
||||
|
||||
## Testing Steps
|
||||
|
||||
### Test 1: Region Selector
|
||||
1. **Restart the development server**:
|
||||
```bash
|
||||
# Stop current server (Ctrl+C)
|
||||
cd admin
|
||||
npm run dev
|
||||
```
|
||||
2. Open the create order form (创建订单)
|
||||
3. Click on the "省市区" cascader
|
||||
4. Verify that all provinces are displayed
|
||||
5. Select a province and verify cities are displayed
|
||||
6. Select a city and verify districts are displayed
|
||||
7. Check browser console for any errors
|
||||
|
||||
### Test 2: Dosage Dropdown Display
|
||||
1. Create a new prescription with type "饮片" and dosage "100ml"
|
||||
2. Save the prescription
|
||||
3. **Refresh the page** (F5)
|
||||
4. Edit the same prescription
|
||||
5. Verify that the dosage dropdown shows "100ml" immediately on first load
|
||||
6. Close and reopen the edit dialog
|
||||
7. Verify it still shows "100ml"
|
||||
|
||||
### Test 3: Dosage Fields Saving
|
||||
1. Create a new prescription:
|
||||
- Type: 饮片
|
||||
- Dosage: 150ml
|
||||
- Decoction: 代煎
|
||||
- Bags per dose: 3包
|
||||
2. Save the prescription
|
||||
3. Check browser Network tab for the API request payload
|
||||
4. Verify the payload includes:
|
||||
```json
|
||||
{
|
||||
"dosage_amount": 150,
|
||||
"dosage_unit": "ml",
|
||||
"need_decoction": true,
|
||||
"bags_per_dose": 3
|
||||
}
|
||||
```
|
||||
5. Refresh the page and edit the prescription
|
||||
6. Verify all fields display the saved values
|
||||
|
||||
### Test 4: Different Prescription Types
|
||||
1. Test 浓缩水丸:
|
||||
- Dosage: 1-10g dropdown
|
||||
- No decoction option
|
||||
- No bags_per_dose field
|
||||
2. Test 饮片:
|
||||
- Dosage: 50-250ml dropdown
|
||||
- Decoction radio buttons (代煎/不代煎)
|
||||
- Bags per dose: 1-9包 dropdown
|
||||
3. Test 其他类型 (颗粒、丸剂、散剂、膏方、汤剂):
|
||||
- Dosage: Free input with decimal support
|
||||
- No decoction option
|
||||
- No bags_per_dose field
|
||||
|
||||
## Database Verification
|
||||
|
||||
If dosage fields are still not saving, verify the database schema:
|
||||
|
||||
```sql
|
||||
-- Check if columns exist
|
||||
DESCRIBE tcm_prescription;
|
||||
|
||||
-- Should show these columns:
|
||||
-- dosage_amount (decimal or varchar)
|
||||
-- dosage_unit (varchar)
|
||||
-- need_decoction (tinyint)
|
||||
-- bags_per_dose (int)
|
||||
-- times_per_day (int)
|
||||
|
||||
-- If columns are missing, run the migration:
|
||||
SOURCE add_prescription_dosage_fields.sql;
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Region Selector Still Empty After Restart
|
||||
1. Check browser console for CORS errors
|
||||
2. Verify the proxy is working:
|
||||
```bash
|
||||
# In browser console:
|
||||
fetch('/api-proxy/area/ChinaCitys.json').then(r => r.json()).then(console.log)
|
||||
```
|
||||
3. Check if the API endpoint is accessible:
|
||||
```bash
|
||||
curl https://admin.zhenyangtang.com.cn/area/ChinaCitys.json
|
||||
```
|
||||
|
||||
### Dosage Dropdown Still Empty on First Load
|
||||
1. Check browser console for errors
|
||||
2. Verify `dosage_amount` is a number in the database (not string)
|
||||
3. Add console.log in `handleEdit()` to debug:
|
||||
```typescript
|
||||
console.log('dosage_amount from DB:', row.dosage_amount, typeof row.dosage_amount)
|
||||
console.log('dosage_amount after conversion:', editForm.dosage_amount, typeof editForm.dosage_amount)
|
||||
```
|
||||
|
||||
### Dosage Fields Not Saving
|
||||
1. Check browser Network tab for API errors
|
||||
2. Verify database migration was executed
|
||||
3. Check backend logs for validation errors
|
||||
4. Verify the API endpoint is receiving the fields:
|
||||
```php
|
||||
// In PrescriptionLogic.php
|
||||
Log::write('Prescription params: ' . json_encode($params));
|
||||
```
|
||||
|
||||
## Summary
|
||||
|
||||
- ✅ Region selector: Proxy configured, needs server restart
|
||||
- ✅ Dosage dropdown: Fixed timing issue with `setTimeout`
|
||||
- ✅ Dosage fields saving: All code is correct, verify database migration
|
||||
- ✅ bags_per_dose: Already implemented in both component and list view
|
||||
Reference in New Issue
Block a user