订单
This commit is contained in:
@@ -0,0 +1,226 @@
|
||||
# 撤回处方审核功能修复
|
||||
|
||||
## 问题描述
|
||||
撤回处方审核时,只更新了业务订单表(`zyt_tcm_prescription_order`)的 `prescription_audit_status`,但没有同步更新处方表(`zyt_tcm_prescription`)的 `audit_status`,导致处方表的审核状态不一致。
|
||||
|
||||
## 影响
|
||||
- 业务订单显示"待审核",但处方表仍显示"已通过"
|
||||
- 处方列表页面显示的审核状态与实际不符
|
||||
- 可能导致业务流程混乱
|
||||
|
||||
## 修复方案
|
||||
|
||||
### 文件:`server/app/adminapi/logic/tcm/PrescriptionOrderLogic.php`
|
||||
|
||||
在 `revokeRxAudit()` 方法中添加同步处方表审核状态的逻辑:
|
||||
|
||||
```php
|
||||
// 同步撤回处方表的审核状态
|
||||
$prescriptionId = (int) $order->prescription_id;
|
||||
if ($prescriptionId > 0) {
|
||||
try {
|
||||
$prescription = Prescription::where('id', $prescriptionId)->whereNull('delete_time')->find();
|
||||
if ($prescription) {
|
||||
$prescription->audit_status = 0;
|
||||
$prescription->audit_remark = '';
|
||||
$prescription->audit_time = null;
|
||||
$prescription->audit_by = null;
|
||||
$prescription->audit_by_name = '';
|
||||
$prescription->save();
|
||||
}
|
||||
} catch (\Throwable $e) {
|
||||
// 记录日志但不影响主流程
|
||||
Log::error('撤回处方审核时同步处方表失败: ' . $e->getMessage(), [
|
||||
'prescription_id' => $prescriptionId,
|
||||
'order_id' => $id
|
||||
]);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 修复内容
|
||||
|
||||
### 1. 业务订单表更新(原有逻辑)
|
||||
**表**: `zyt_tcm_prescription_order`
|
||||
|
||||
```php
|
||||
$order->prescription_audit_status = 0; // 重置为待审核
|
||||
$order->prescription_audit_remark = ''; // 清空审核意见
|
||||
```
|
||||
|
||||
### 2. 处方表同步更新(新增逻辑)
|
||||
**表**: `zyt_tcm_prescription`
|
||||
|
||||
```php
|
||||
$prescription->audit_status = 0; // 重置为待审核
|
||||
$prescription->audit_remark = ''; // 清空审核意见
|
||||
$prescription->audit_time = null; // 清空审核时间
|
||||
$prescription->audit_by = null; // 清空审核人ID
|
||||
$prescription->audit_by_name = ''; // 清空审核人姓名
|
||||
```
|
||||
|
||||
## 数据流转
|
||||
|
||||
### 撤回前
|
||||
```
|
||||
业务订单表 (zyt_tcm_prescription_order):
|
||||
prescription_audit_status: 1 (已通过)
|
||||
prescription_audit_remark: "审核通过"
|
||||
|
||||
处方表 (zyt_tcm_prescription):
|
||||
audit_status: 1 (已通过)
|
||||
audit_remark: "审核通过"
|
||||
audit_time: 1713168000
|
||||
audit_by: 5
|
||||
audit_by_name: "张医生"
|
||||
```
|
||||
|
||||
### 撤回后
|
||||
```
|
||||
业务订单表 (zyt_tcm_prescription_order):
|
||||
prescription_audit_status: 0 (待审核)
|
||||
prescription_audit_remark: ""
|
||||
|
||||
处方表 (zyt_tcm_prescription):
|
||||
audit_status: 0 (待审核)
|
||||
audit_remark: ""
|
||||
audit_time: null
|
||||
audit_by: null
|
||||
audit_by_name: ""
|
||||
```
|
||||
|
||||
## 审核状态说明
|
||||
|
||||
| 状态值 | 说明 |
|
||||
|--------|------|
|
||||
| 0 | 待审核 |
|
||||
| 1 | 已通过 |
|
||||
| 2 | 已驳回 |
|
||||
|
||||
## 业务流程
|
||||
|
||||
```
|
||||
创建订单
|
||||
↓
|
||||
处方待审核 (audit_status = 0)
|
||||
↓ 审核通过
|
||||
处方已通过 (audit_status = 1)
|
||||
↓ 撤回审核
|
||||
处方待审核 (audit_status = 0) ← 两个表都重置
|
||||
↓ 重新审核
|
||||
处方已通过 (audit_status = 1)
|
||||
```
|
||||
|
||||
## 错误处理
|
||||
|
||||
### 容错设计
|
||||
```php
|
||||
try {
|
||||
// 更新处方表
|
||||
$prescription->save();
|
||||
} catch (\Throwable $e) {
|
||||
// 记录日志但不影响主流程
|
||||
Log::error('撤回处方审核时同步处方表失败: ' . $e->getMessage());
|
||||
}
|
||||
```
|
||||
|
||||
**说明**:
|
||||
- 即使处方表更新失败,业务订单表的撤回仍然成功
|
||||
- 错误会被记录到日志中,便于排查
|
||||
- 不会因为处方表问题导致整个撤回操作失败
|
||||
|
||||
## 相关表结构
|
||||
|
||||
### 业务订单表 (zyt_tcm_prescription_order)
|
||||
```sql
|
||||
prescription_id int(11) unsigned NOT NULL DEFAULT 0 COMMENT '消费者处方ID'
|
||||
prescription_audit_status tinyint(2) unsigned NOT NULL DEFAULT 0 COMMENT '处方审核 0待审1通过2驳回'
|
||||
prescription_audit_remark varchar(500) NOT NULL DEFAULT '' COMMENT '处方审核意见'
|
||||
```
|
||||
|
||||
### 处方表 (zyt_tcm_prescription)
|
||||
```sql
|
||||
audit_status tinyint(1) NOT NULL DEFAULT 1 COMMENT '审核:0待审核 1已通过 2已驳回'
|
||||
audit_time int(10) unsigned DEFAULT NULL COMMENT '审核时间'
|
||||
audit_by int(11) unsigned DEFAULT NULL COMMENT '审核人ID'
|
||||
audit_by_name varchar(50) NOT NULL DEFAULT '' COMMENT '审核人姓名'
|
||||
audit_remark varchar(500) NOT NULL DEFAULT '' COMMENT '审核意见'
|
||||
```
|
||||
|
||||
## 测试清单
|
||||
|
||||
### 正常流程测试
|
||||
- [ ] 创建订单,处方待审核
|
||||
- [ ] 审核通过处方
|
||||
- [ ] 验证业务订单表和处方表状态都为"已通过"
|
||||
- [ ] 撤回处方审核
|
||||
- [ ] 验证业务订单表和处方表状态都为"待审核"
|
||||
- [ ] 验证处方表的审核时间、审核人等字段已清空
|
||||
|
||||
### 边界情况测试
|
||||
- [ ] 撤回时处方不存在(已删除)
|
||||
- [ ] 撤回时处方ID为0
|
||||
- [ ] 撤回时数据库连接失败
|
||||
- [ ] 验证错误被正确记录到日志
|
||||
|
||||
### 权限测试
|
||||
- [ ] 无审核权限的用户不能撤回
|
||||
- [ ] 有审核权限的用户可以撤回
|
||||
- [ ] 订单已结束时不能撤回
|
||||
|
||||
## 日志记录
|
||||
|
||||
### 成功日志
|
||||
```
|
||||
操作日志 (zyt_tcm_prescription_order_log):
|
||||
action: "revoke_rx_audit"
|
||||
summary: "撤回处方审核,状态重置为待审核"
|
||||
```
|
||||
|
||||
### 错误日志
|
||||
```
|
||||
系统日志:
|
||||
level: ERROR
|
||||
message: "撤回处方审核时同步处方表失败: [错误信息]"
|
||||
context: {
|
||||
"prescription_id": 123,
|
||||
"order_id": 456
|
||||
}
|
||||
```
|
||||
|
||||
## 相关功能
|
||||
|
||||
### 1. 审核处方
|
||||
**方法**: `PrescriptionOrderLogic::auditPrescription()`
|
||||
- 同时更新业务订单表和处方表的审核状态
|
||||
|
||||
### 2. 撤回处方审核
|
||||
**方法**: `PrescriptionOrderLogic::revokeRxAudit()`
|
||||
- 同时重置业务订单表和处方表的审核状态(本次修复)
|
||||
|
||||
### 3. 撤回支付单审核
|
||||
**方法**: `PrescriptionOrderLogic::revokePayAudit()`
|
||||
- 只更新业务订单表的支付审核状态
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. **数据一致性**:确保两个表的审核状态始终保持一致
|
||||
2. **容错处理**:处方表更新失败不影响主流程
|
||||
3. **日志记录**:所有错误都会被记录,便于排查
|
||||
4. **权限控制**:只有有审核权限的用户才能撤回
|
||||
5. **状态限制**:订单已结束时不能撤回
|
||||
|
||||
## 相关文件
|
||||
|
||||
- `server/app/adminapi/logic/tcm/PrescriptionOrderLogic.php` - 业务逻辑
|
||||
- `server/app/adminapi/controller/tcm/PrescriptionOrderController.php` - 控制器
|
||||
- `admin/src/views/consumer/prescription/order_list.vue` - 前端页面
|
||||
|
||||
## 总结
|
||||
|
||||
✅ **修复前**:撤回审核只更新业务订单表
|
||||
✅ **修复后**:撤回审核同时更新业务订单表和处方表
|
||||
✅ **容错处理**:处方表更新失败不影响主流程
|
||||
✅ **日志记录**:错误会被记录到系统日志
|
||||
|
||||
这样可以确保数据一致性,避免审核状态不同步的问题。
|
||||
Reference in New Issue
Block a user