feat(outbound): 审批单手动完结/作废功能

- 后端: outbound_service 新增 close_request 方法(状态 1-已通过 → 4-已完结)
- 后端: 新增 POST /api/v1/outbound/request/<id>/close 接口
- 模型: status_text 数组增加「已完结」
- 前端: create.vue 审批单选择区新增「强制完结此单」按钮
  完结后刷新列表,该单从已通过下拉中移除
- 权限: 超级管理员/审批人/拥有 outbound_create:operation 的用户可完结(库管可操作)
This commit is contained in:
yueli
2026-08-31 10:15:33 +08:00
parent b6ec45a8b8
commit 39f3f8af45
5 changed files with 136 additions and 2 deletions

View File

@ -994,6 +994,52 @@ class OutboundApprovalService:
logger.error(f"[Email] 外层发送异常: {e}")
@staticmethod
def close_request(request_id, user_id, user_role):
"""
手动完结/作废审批单(状态 1-已通过 → 4-已完结)
适用场景:已通过但无法出库/作废的单据,库管手动清理,
使其从"已审批通过"列表中消失。
Args:
request_id: 审批单ID
user_id: 操作人ID
user_role: 操作人角色
Returns:
(success: bool, message: str, approval: OutboundApproval or None)
"""
from app.models.outbound import OutboundApproval
approval = OutboundApproval.query.get(request_id)
if not approval:
return False, "审批单不存在", None
if approval.status != 1:
return False, f"仅「已通过」的审批单可完结 (当前状态: {approval.status})", None
# 权限检查:超级管理员、审批人 或 拥有出库操作权限(库管/主管)
if not OutboundApprovalService.can_approve(approval, user_id, user_role):
# 放宽:拥有 outbound_create:operation 的用户(库管)也可完结
from app.models.system import SysRolePermission
has_outbound_op = SysRolePermission.query.filter(
SysRolePermission.role_code == user_role,
SysRolePermission.target_code.in_(['outbound_create:operation', 'outbound_create:*'])
).first() is not None
if not has_outbound_op:
return False, "您没有完结此单的权限", None
try:
approval.status = 4 # 4-已完结(手动作废)
approval.actual_approver_id = user_id
approval.approved_at = None
db.session.commit()
return True, "审批单已完结", approval
except Exception as e:
db.session.rollback()
return False, f"完结失败: {str(e)}", None
def get_request_list(page=1, per_page=10, applicant_id=None, status=None):
"""
获取审批单列表