diff --git a/inventory-backend/app/services/outbound_service.py b/inventory-backend/app/services/outbound_service.py index a158969..a222cf5 100644 --- a/inventory-backend/app/services/outbound_service.py +++ b/inventory-backend/app/services/outbound_service.py @@ -825,80 +825,70 @@ class OutboundApprovalService: try: from app.utils.email_service import send_approval_result_notify, send_warehouse_dispatch_notify + from app.models.system import SysUser as SU - # ★ 通过:只通知库管,附完整物料清单 + # 1. 提取申请人信息(供两个分支使用) + applicant_name = '' + applicant_emails = [] + if approval.applicant_id: + user = SU.query.get(approval.applicant_id) + if user: + applicant_name = str(user.username).split('/')[0] if '/' in (user.username or '') else (user.username or '') + if user.email: + applicant_emails.append(user.email) + + # 2. 提取物料明细(供通过分支使用) + items = approval.items_json if approval.items_json else [] + + # 3. 分支逻辑 if action == 'approve': + # 3.1 通知库管(带明细) warehouse_role_codes = ['WAREHOUSE_MGR', 'OUTBOUND'] + warehouse_emails = OutboundApprovalService._get_emails_by_identifiers(role_codes=warehouse_role_codes) + + if warehouse_emails: + try: + send_warehouse_dispatch_notify( + to_emails=warehouse_emails, + request_no=approval.request_no, + applicant_name=applicant_name, + items=items + ) + except Exception as e: + logger.error(f"[Email] 通知库管失败: {e}") - # --- 【DEBUG】精准打印调试信息 --- - print(f"[DEBUG] === _notify_approval_result 审批通过分支 ===") - print(f"[DEBUG] 审批单 ID={approval.id} request_no={approval.request_no}") - print(f"[DEBUG] items_json 原始值类型: {type(approval.items_json)} 值={repr(approval.items_json)}") + # 3.2 通知申请人(已通过) + if applicant_emails: + try: + send_approval_result_notify( + to_emails=applicant_emails, + request_no=approval.request_no, + is_passed=True, + applicant_name=applicant_name + ) + except Exception as e: + logger.error(f"[Email] 通知申请人通过失败: {e}") - # ★ items_json 已是 list,直接使用,不做 json.loads 解析 - items = approval.items_json if approval.items_json else [] - - # 查询库管邮箱 - emails = OutboundApprovalService._get_emails_by_identifiers( - role_codes=warehouse_role_codes - ) - print(f"[DEBUG] 库管邮箱列表: {emails}") - print(f"[DEBUG] 库管角色配置: {warehouse_role_codes}") - - # 打印所有 SysUser 中 role 属于这两个角色的邮箱(用于诊断) - from app.models.system import SysUser as SU - all_warehouse_users = SU.query.filter(SU.role.in_(warehouse_role_codes)).all() - print(f"[DEBUG] 数据库中库管角色用户数: {len(all_warehouse_users)}") - for u in all_warehouse_users: - print(f" -> 用户ID={u.id} role={u.role} email={u.email} username={u.username}") - - if not emails: - print(f"[DEBUG] 警告:无库管邮箱,跳过通知") - return - - # 获取申请人姓名 - applicant_name = '' - if approval.applicant_id: - user = SU.query.get(approval.applicant_id) - if user: - applicant_name = str(user.username).split('/')[0] if '/' in (user.username or '') else (user.username or '') - - print(f"[DEBUG] 准备发送邮件 to={emails} items数量={len(items)} items内容={items}") - - # ★ 调用库管备货通知(含完整物料明细表格) - send_warehouse_dispatch_notify( - to_emails=emails, - request_no=approval.request_no, - applicant_name=applicant_name, - items=items - ) - print(f"[DEBUG] send_warehouse_dispatch_notify 调用完成") - - # ★ 驳回:只通知申请人本人 - else: - from app.models.system import SysUser as SU2 - applicant_name = '' - if approval.applicant_id: - user = SU2.query.get(approval.applicant_id) - if user: - applicant_name = str(user.username).split('/')[0] if '/' in (user.username or '') else (user.username or '') - emails = OutboundApprovalService._get_emails_by_identifiers( - applicant_id=approval.applicant_id - ) - if not emails: - return - send_approval_result_notify( - to_emails=emails, - request_no=approval.request_no, - is_passed=False, - reject_reason=approval.reject_reason or '', - applicant_name=applicant_name - ) + elif action == 'reject': + # 3.3 通知申请人(已驳回) + if applicant_emails: + try: + send_approval_result_notify( + to_emails=applicant_emails, + request_no=approval.request_no, + is_passed=False, + reject_reason=approval.reject_reason or '未说明原因', + applicant_name=applicant_name + ) + except Exception as e: + logger.error(f"[Email] 通知申请人驳回失败: {e}") + else: + logger.warning("[Email] 申请人无邮箱,无法发送驳回通知") except Exception as e: import traceback traceback.print_exc() - logger.warning(f"[Email] 发送审批结果通知邮件失败: {e}") + logger.error(f"[Email] 外层发送异常: {e}") @staticmethod def get_request_list(page=1, per_page=10, applicant_id=None, status=None): diff --git a/inventory-backend/app/utils/email_service.py b/inventory-backend/app/utils/email_service.py index b9848d1..b6c5b80 100644 --- a/inventory-backend/app/utils/email_service.py +++ b/inventory-backend/app/utils/email_service.py @@ -180,13 +180,13 @@ def send_approval_result_notify(to_emails: List[str], request_no: str, applicant_name: 申请人姓名(仅驳回通知时使用) """ if is_passed: - # ★ 发给库管:提醒备货出库 - subject = f"【待出库】出库申请单 {request_no} 已审批通过" - content = f"""您好, + # ★ 发给申请人:告知已通过,去领料 + subject = f"【已通过】出库申请单 {request_no}" + content = f"""{"尊敬的 " + applicant_name + ",您好" if applicant_name else "您好"}, -出库申请单 {request_no} 已审批通过,请尽快备货出库。 +您的出库申请单 {request_no} 已审批通过,请联系仓库管理员领取物料。 -请登录仓库管理系统处理该出库任务。 +请登录仓库管理系统查看详情。 此邮件由系统自动发送,请勿回复。 """