test_pl_plan_copy_seq.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. """pl_plan.copy_seq_no:租户内 MAX+1,含软删;已有号幂等返回。"""
  2. from datetime import date, datetime
  3. from sqlalchemy import create_engine
  4. from sqlalchemy.orm import sessionmaker
  5. from app.models.pl_models import PlPlan
  6. from app.services.pl_driver_plan_service import allocate_or_get_plan_copy_seq
  7. TENANT = "t-copy-seq"
  8. def _session():
  9. engine = create_engine("sqlite://")
  10. PlPlan.__table__.create(engine)
  11. return sessionmaker(bind=engine)()
  12. def _plan(
  13. *,
  14. plan_id: str,
  15. plan_no: str,
  16. create_time: datetime,
  17. copy_seq_no=None,
  18. del_flag: int = 0,
  19. tenant_no: str = TENANT,
  20. ) -> PlPlan:
  21. return PlPlan(
  22. id=plan_id,
  23. plan_no=plan_no,
  24. copy_seq_no=copy_seq_no,
  25. create_date=create_time.date() if hasattr(create_time, "date") else date(2026, 1, 1),
  26. belongs_company="shanxia",
  27. plan_type="direct",
  28. follow_status="pending_arrange",
  29. transport_status="pending",
  30. archive_status="unarchived",
  31. complete_status="no",
  32. has_freight=0,
  33. total_amount=0,
  34. freight_amount=0,
  35. hazard_cert_ready=0,
  36. erp_entered=0,
  37. tenant_no=tenant_no,
  38. create_dept_id="d1",
  39. create_time=create_time,
  40. update_time=create_time,
  41. del_flag=del_flag,
  42. )
  43. def test_allocate_first_seq_when_tenant_empty():
  44. db = _session()
  45. db.add(_plan(plan_id="p1", plan_no="PO1", create_time=datetime(2026, 10, 1, 10, 0, 0)))
  46. db.commit()
  47. assert allocate_or_get_plan_copy_seq(db, tenant_no=TENANT, plan_id="p1") == 1
  48. db.commit()
  49. assert db.query(PlPlan).get("p1").copy_seq_no == 1
  50. def test_allocate_skips_soft_deleted_max():
  51. """软删占用的号计入 MAX,不回收。"""
  52. db = _session()
  53. db.add(
  54. _plan(
  55. plan_id="old",
  56. plan_no="PO0",
  57. create_time=datetime(2026, 9, 1, 10, 0, 0),
  58. copy_seq_no=3,
  59. del_flag=1,
  60. )
  61. )
  62. db.add(
  63. _plan(
  64. plan_id="new",
  65. plan_no="PO1",
  66. create_time=datetime(2026, 10, 1, 10, 0, 0),
  67. copy_seq_no=None,
  68. )
  69. )
  70. db.commit()
  71. assert allocate_or_get_plan_copy_seq(db, tenant_no=TENANT, plan_id="new") == 4
  72. def test_allocate_idempotent_when_already_set():
  73. db = _session()
  74. db.add(
  75. _plan(
  76. plan_id="p1",
  77. plan_no="PO1",
  78. create_time=datetime(2026, 10, 1, 10, 0, 0),
  79. copy_seq_no=7,
  80. )
  81. )
  82. db.commit()
  83. assert allocate_or_get_plan_copy_seq(db, tenant_no=TENANT, plan_id="p1") == 7
  84. assert db.query(PlPlan).get("p1").copy_seq_no == 7
  85. def test_allocate_missing_plan_returns_none():
  86. db = _session()
  87. assert allocate_or_get_plan_copy_seq(db, tenant_no=TENANT, plan_id="missing") is None