duty_models.py 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. """值班排班模型 — docs/superpowers/specs/2026-08-14-duty-schedule-design.md"""
  2. from datetime import datetime
  3. from sqlalchemy import Column, Date, DateTime, Integer, SmallInteger, String
  4. from app.core.database import Base
  5. SHIFT_MORNING = "morning"
  6. SHIFT_EVENING = "evening"
  7. SHIFT_DUTY = "duty"
  8. SHIFT_LABELS = {
  9. SHIFT_MORNING: "早班",
  10. SHIFT_EVENING: "晚班",
  11. SHIFT_DUTY: "值班",
  12. }
  13. LINK_OPEN = "open"
  14. LINK_CLOSED = "closed"
  15. SOURCE_ASSIGN = "assign"
  16. SOURCE_GRAB = "grab"
  17. class DutyDay(Base):
  18. __tablename__ = "duty_day"
  19. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  20. duty_date = Column(Date, nullable=False, comment="值班日期")
  21. access_token = Column(String(64), nullable=False, comment="公开访问令牌")
  22. link_status = Column(String(16), nullable=False, default=LINK_OPEN, comment="open/closed")
  23. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  24. order_num = Column(Integer, nullable=True, comment="排序号")
  25. remark = Column(String(500), nullable=True, comment="备注")
  26. create_by = Column(String(64), nullable=True, comment="创建者")
  27. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  28. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  29. update_by = Column(String(64), nullable=True, comment="更新者")
  30. update_time = Column(
  31. DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间"
  32. )
  33. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标志")
  34. class DutySlot(Base):
  35. __tablename__ = "duty_slot"
  36. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  37. duty_day_id = Column(String(64), nullable=False, comment="值班日ID")
  38. shift_type = Column(String(32), nullable=False, comment="morning/evening/duty")
  39. capacity = Column(Integer, nullable=False, default=1, comment="名额")
  40. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  41. order_num = Column(Integer, nullable=True, comment="排序号")
  42. remark = Column(String(500), nullable=True, comment="备注")
  43. create_by = Column(String(64), nullable=True, comment="创建者")
  44. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  45. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  46. update_by = Column(String(64), nullable=True, comment="更新者")
  47. update_time = Column(
  48. DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间"
  49. )
  50. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标志")
  51. class DutyAssignment(Base):
  52. __tablename__ = "duty_assignment"
  53. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  54. duty_slot_id = Column(String(64), nullable=False, comment="班次名额ID")
  55. source = Column(String(16), nullable=False, comment="assign/grab")
  56. user_id = Column(String(64), nullable=True, comment="系统用户ID(指定时)")
  57. person_name = Column(String(64), nullable=False, comment="展示姓名")
  58. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  59. order_num = Column(Integer, nullable=True, comment="排序号")
  60. remark = Column(String(500), nullable=True, comment="备注")
  61. create_by = Column(String(64), nullable=True, comment="创建者")
  62. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  63. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  64. update_by = Column(String(64), nullable=True, comment="更新者")
  65. update_time = Column(
  66. DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间"
  67. )
  68. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标志")