227 lines
6.5 KiB
Markdown
227 lines
6.5 KiB
Markdown
# 撤回处方审核功能修复
|
||
|
||
## 问题描述
|
||
撤回处方审核时,只更新了业务订单表(`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` - 前端页面
|
||
|
||
## 总结
|
||
|
||
✅ **修复前**:撤回审核只更新业务订单表
|
||
✅ **修复后**:撤回审核同时更新业务订单表和处方表
|
||
✅ **容错处理**:处方表更新失败不影响主流程
|
||
✅ **日志记录**:错误会被记录到系统日志
|
||
|
||
这样可以确保数据一致性,避免审核状态不同步的问题。
|