duty_models.py 4.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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, Time
  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. DICT_SHIFT_TYPE = "duty_shift_type"
  14. DICT_WORK_PLAN = "duty_work_plan"
  15. DICT_TIME_RANGE = "duty_time_range"
  16. DEFAULT_SHIFT_TIMES = {
  17. SHIFT_MORNING: ("08:00", "18:00", 0),
  18. SHIFT_EVENING: ("18:00", "07:00", 1),
  19. }
  20. # 预置时段 dict_value:start|end|cross_day
  21. TIME_RANGE_DAY = "08:00|18:00|0"
  22. TIME_RANGE_NIGHT = "18:00|07:00|1"
  23. LINK_OPEN = "open"
  24. LINK_CLOSED = "closed"
  25. SOURCE_ASSIGN = "assign"
  26. SOURCE_GRAB = "grab"
  27. # 可排班名单角色(sys_role 固定 id;无菜单,仅标签)
  28. DUTY_STAFF_ROLE_ID = "R65CAAE057914CCCAE2A81BE627A5101"
  29. DUTY_STAFF_ROLE_NAME = "值班人员"
  30. class DutyDay(Base):
  31. __tablename__ = "duty_day"
  32. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  33. duty_date = Column(Date, nullable=False, comment="值班日期")
  34. access_token = Column(String(64), nullable=False, comment="公开访问令牌")
  35. link_status = Column(String(16), nullable=False, default=LINK_OPEN, comment="open/closed")
  36. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  37. order_num = Column(Integer, nullable=True, comment="排序号")
  38. remark = Column(String(500), nullable=True, comment="备注")
  39. create_by = Column(String(64), nullable=True, comment="创建者")
  40. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  41. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  42. update_by = Column(String(64), nullable=True, comment="更新者")
  43. update_time = Column(
  44. DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间"
  45. )
  46. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标志")
  47. class DutySlot(Base):
  48. __tablename__ = "duty_slot"
  49. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  50. duty_day_id = Column(String(64), nullable=False, comment="值班日ID")
  51. shift_type = Column(String(32), nullable=False, comment="morning/evening/duty")
  52. capacity = Column(Integer, nullable=False, default=1, comment="名额")
  53. work_plans = Column(String(500), nullable=True, comment="工作安排dict_value逗号分隔")
  54. start_time = Column(Time, nullable=True, comment="值班开始时间")
  55. end_time = Column(Time, nullable=True, comment="值班结束时间")
  56. cross_day = Column(SmallInteger, nullable=False, default=0, comment="结束是否次日")
  57. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  58. order_num = Column(Integer, nullable=True, comment="排序号")
  59. remark = Column(String(500), nullable=True, comment="备注")
  60. create_by = Column(String(64), nullable=True, comment="创建者")
  61. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  62. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  63. update_by = Column(String(64), nullable=True, comment="更新者")
  64. update_time = Column(
  65. DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间"
  66. )
  67. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标志")
  68. class DutyAssignment(Base):
  69. __tablename__ = "duty_assignment"
  70. id = Column(String(64), primary_key=True, comment="主键ID(UUID)")
  71. duty_slot_id = Column(String(64), nullable=False, comment="班次名额ID")
  72. source = Column(String(16), nullable=False, comment="assign/grab")
  73. user_id = Column(String(64), nullable=True, comment="系统用户ID(指定时)")
  74. person_name = Column(String(64), nullable=False, comment="展示姓名")
  75. tenant_no = Column(String(64), nullable=False, default="shanxia2.0", comment="租户编号")
  76. order_num = Column(Integer, nullable=True, comment="排序号")
  77. remark = Column(String(500), nullable=True, comment="备注")
  78. create_by = Column(String(64), nullable=True, comment="创建者")
  79. create_dept_id = Column(String(64), nullable=False, default="", comment="创建部门")
  80. create_time = Column(DateTime, nullable=False, default=datetime.now, comment="创建时间")
  81. update_by = Column(String(64), nullable=True, comment="更新者")
  82. update_time = Column(
  83. DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment="更新时间"
  84. )
  85. del_flag = Column(SmallInteger, nullable=False, default=0, comment="删除标志")