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

6.5 KiB
Raw Blame History

撤回处方审核功能修复

问题描述

撤回处方审核时,只更新了业务订单表(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()

  • 只更新业务订单表的支付审核状态

注意事项

  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 - 前端页面

总结

修复前:撤回审核只更新业务订单表
修复后:撤回审核同时更新业务订单表和处方表
容错处理:处方表更新失败不影响主流程
日志记录:错误会被记录到系统日志

这样可以确保数据一致性,避免审核状态不同步的问题。