6.5 KiB
6.5 KiB
撤回处方审核功能修复
问题描述
撤回处方审核时,只更新了业务订单表(zyt_tcm_prescription_order)的 prescription_audit_status,但没有同步更新处方表(zyt_tcm_prescription)的 audit_status,导致处方表的审核状态不一致。
影响
- 业务订单显示"待审核",但处方表仍显示"已通过"
- 处方列表页面显示的审核状态与实际不符
- 可能导致业务流程混乱
修复方案
文件:server/app/adminapi/logic/tcm/PrescriptionOrderLogic.php
在 revokeRxAudit() 方法中添加同步处方表审核状态的逻辑:
// 同步撤回处方表的审核状态
$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
$order->prescription_audit_status = 0; // 重置为待审核
$order->prescription_audit_remark = ''; // 清空审核意见
2. 处方表同步更新(新增逻辑)
表: zyt_tcm_prescription
$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)
错误处理
容错设计
try {
// 更新处方表
$prescription->save();
} catch (\Throwable $e) {
// 记录日志但不影响主流程
Log::error('撤回处方审核时同步处方表失败: ' . $e->getMessage());
}
说明:
- 即使处方表更新失败,业务订单表的撤回仍然成功
- 错误会被记录到日志中,便于排查
- 不会因为处方表问题导致整个撤回操作失败
相关表结构
业务订单表 (zyt_tcm_prescription_order)
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)
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()
- 只更新业务订单表的支付审核状态
注意事项
- 数据一致性:确保两个表的审核状态始终保持一致
- 容错处理:处方表更新失败不影响主流程
- 日志记录:所有错误都会被记录,便于排查
- 权限控制:只有有审核权限的用户才能撤回
- 状态限制:订单已结束时不能撤回
相关文件
server/app/adminapi/logic/tcm/PrescriptionOrderLogic.php- 业务逻辑server/app/adminapi/controller/tcm/PrescriptionOrderController.php- 控制器admin/src/views/consumer/prescription/order_list.vue- 前端页面
总结
✅ 修复前:撤回审核只更新业务订单表
✅ 修复后:撤回审核同时更新业务订单表和处方表
✅ 容错处理:处方表更新失败不影响主流程
✅ 日志记录:错误会被记录到系统日志
这样可以确保数据一致性,避免审核状态不同步的问题。