This commit is contained in:
Your Name
2026-04-15 16:31:25 +08:00
parent 906684c1ed
commit 3d9c5dd8f5
47 changed files with 7963 additions and 10 deletions
+226
View File
@@ -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` - 前端页面
## 总结
**修复前**:撤回审核只更新业务订单表
**修复后**:撤回审核同时更新业务订单表和处方表
**容错处理**:处方表更新失败不影响主流程
**日志记录**:错误会被记录到系统日志
这样可以确保数据一致性,避免审核状态不同步的问题。