fix(email): 审批通过后库管通知增加明细+DEBUG日志,修复MAIL_DEFAULT_SENDER格式问题

This commit is contained in:
DXC
2026-04-28 16:46:12 +08:00
parent 183b93012e
commit ccbce82c2e
3 changed files with 178 additions and 36 deletions

View File

@ -492,8 +492,6 @@ class OutboundService:
ModelClass = model_map.get(d.source_table)
if ModelClass and d.stock_id:
# 注意这里在循环中查询可能会有N+1问题但考虑到单页数据量通常每单条目不多暂时可接受
# 生产环境建议优化为预加载或批量查询
try:
stock_item = ModelClass.query.get(d.stock_id)
if stock_item:
@ -716,12 +714,16 @@ class OutboundApprovalService:
# username 格式为 "姓名/账号",取姓名部分
applicant_name = str(u.username).split('/')[0] if '/' in u.username else (u.username or str(applicant_id))
# ★ 发送通知,附完整物料清单
items = approval.get_items()
send_new_request_notify(
to_emails=emails,
request_no=approval.request_no,
applicant_name=applicant_name,
remark=approval.remark or ''
remark=approval.remark or '',
items=items
)
except Exception as e:
# ★ 捕获所有异常,确保邮件发送失败不阻断主流程
try:
@ -729,6 +731,7 @@ class OutboundApprovalService:
current_app.logger.error(f"[Email] 发送新申请通知邮件失败: {e}")
except RuntimeError:
# 如果不在 Flask 应用上下文内,降级为标准日志
import logging
logging.getLogger(__name__).error(f"[Email] 发送新申请通知邮件失败: {e}")
@staticmethod
@ -817,28 +820,85 @@ class OutboundApprovalService:
@staticmethod
def _notify_approval_result(approval, approver_id, action):
"""发送审批结果通知邮件(静默处理,不阻断主流程)"""
import logging
logger = logging.getLogger(__name__)
try:
from app.utils.email_service import send_approval_result_notify
from app.utils.email_service import send_approval_result_notify, send_warehouse_dispatch_notify
# 仓库管理员角色代码
warehouse_role_codes = ['WAREHOUSE_MGR', 'OUTBOUND']
# ★ 通过:只通知库管,附完整物料清单
if action == 'approve':
warehouse_role_codes = ['WAREHOUSE_MGR', 'OUTBOUND']
# 查询库管邮箱 + 申请人本人邮箱
emails = OutboundApprovalService._get_emails_by_identifiers(
applicant_id=approval.applicant_id,
role_codes=warehouse_role_codes
)
if not emails:
return
# --- 【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)}")
# ★ 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
)
send_approval_result_notify(
to_emails=emails,
request_no=approval.request_no,
is_passed=(action == 'approve'),
reject_reason=approval.reject_reason or ''
)
except Exception as e:
logging.getLogger(__name__).warning(f"[Email] 发送审批结果通知邮件失败: {e}")
import traceback
traceback.print_exc()
logger.warning(f"[Email] 发送审批结果通知邮件失败: {e}")
@staticmethod
def get_request_list(page=1, per_page=10, applicant_id=None, status=None):