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