Files
shanxia2.0/backend/app/utils/bx_codegen.py
T
2026-06-07 00:40:01 +08:00

47 lines
1.6 KiB
Python

"""报销单号/标题生成(从 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}"