Files
zyt/REVOKE_PRESCRIPTION_AUDIT_FIX.md
T
2026-04-15 16:31:25 +08:00

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