codegen.py 999 B

12345678910111213141516171819202122232425262728
  1. """Generate business codes like BYJ20260424001 / BX20260424001."""
  2. from datetime import datetime
  3. from sqlalchemy.orm import Session
  4. from sqlalchemy import text
  5. def generate_apply_code(db: Session, prefix: str) -> str:
  6. """
  7. Generate a sequential code: {prefix}{YYYYMMDD}{3-digit-sequence}.
  8. prefix examples: 'BYJ' for advance, 'BX' for reimburse.
  9. Thread-safe via DB-level auto-increment fallback.
  10. """
  11. today = datetime.now().strftime("%Y%m%d")
  12. like_pattern = f"{prefix}{today}%"
  13. # Find the max sequence number for today
  14. result = db.execute(
  15. text("SELECT MAX(CAST(SUBSTRING(apply_code, -3) AS UNSIGNED)) FROM ("
  16. "SELECT apply_code FROM bx_advance_apply WHERE apply_code LIKE :p1 "
  17. "UNION ALL "
  18. "SELECT apply_code FROM bx_reimburse_apply WHERE apply_code LIKE :p2"
  19. ") t"),
  20. {"p1": like_pattern, "p2": like_pattern}
  21. ).scalar()
  22. seq = (result or 0) + 1
  23. return f"{prefix}{today}{seq:03d}"