"""报销单号/标题生成(从 bx-backend 迁移,增加 tenant_no 隔离)。""" from datetime import datetime from sqlalchemy import text from sqlalchemy.orm import Session def generate_apply_code(db: Session, prefix: str, tenant_no: str) -> str: """ 生成顺序单号:{prefix}{YYYYMMDD}{3位序号}。 prefix 示例:BYJ(备用金)、BX(报销)。 """ today = datetime.now().strftime("%Y%m%d") like_pattern = f"{prefix}{today}%" result = db.execute( text( "SELECT MAX(CAST(SUBSTRING(apply_code, -3) AS UNSIGNED)) FROM (" "SELECT apply_code FROM bx_advance_apply " "WHERE tenant_no = :tenant_no AND apply_code LIKE :p1 AND del_flag = 0 " "UNION ALL " "SELECT apply_code FROM bx_reimburse_apply " "WHERE tenant_no = :tenant_no AND apply_code LIKE :p2 AND del_flag = 0" ") t" ), {"tenant_no": tenant_no, "p1": like_pattern, "p2": like_pattern}, ).scalar() seq = (result or 0) + 1 return f"{prefix}{today}{seq:03d}" def generate_title(db: Session, applicant_name: str, tenant_no: str) -> str: today = datetime.now().strftime("%Y%m%d") like_pattern = f"%报销单{today}%" result = db.execute( text( "SELECT COUNT(*) FROM bx_reimburse_apply " "WHERE tenant_no = :tenant_no AND title LIKE :p AND del_flag = 0" ), {"tenant_no": tenant_no, "p": like_pattern}, ).scalar() seq = (result or 0) + 1 return f"{applicant_name}报销单{today}{seq:03d}"