seed.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. from datetime import time
  2. from sqlalchemy import select
  3. from sqlalchemy.ext.asyncio import AsyncSession
  4. from backend.app.core.security import hash_password
  5. from backend.app.core.config import settings
  6. from backend.app.models import Role, Permission, RolePermission, User, Campus, Department, Shift
  7. PERMISSIONS = [
  8. ("shifts.view", "查看班次", "shifts"),
  9. ("shifts.create", "新增班次", "shifts"),
  10. ("shifts.edit", "编辑班次", "shifts"),
  11. ("shifts.delete", "删除班次", "shifts"),
  12. ("schedule.view", "查看排班", "schedule"),
  13. ("schedule.create", "新增排班", "schedule"),
  14. ("schedule.edit", "编辑排班", "schedule"),
  15. ("schedule.delete", "删除排班", "schedule"),
  16. ("schedule.swap", "调班", "schedule"),
  17. ("schedule.substitute", "替班", "schedule"),
  18. ("schedule.stopClinic", "停诊", "schedule"),
  19. ("schedule.export", "导出排班", "schedule"),
  20. ("duty.view", "查看值班", "duty"),
  21. ("duty.create", "新增值班", "duty"),
  22. ("duty.edit", "编辑值班", "duty"),
  23. ("duty.delete", "删除值班", "duty"),
  24. ("duty.export", "导出值班", "duty"),
  25. ("statistics.view", "查看统计", "statistics"),
  26. ("statistics.export", "导出统计", "statistics"),
  27. ("users.view", "查看人员", "users"),
  28. ("users.create", "新增人员", "users"),
  29. ("users.edit", "编辑人员", "users"),
  30. ("users.delete", "删除人员", "users"),
  31. ("users.assignRole", "分配角色", "users"),
  32. ]
  33. ROLE_TEMPLATES = {
  34. "管理员": [
  35. "shifts.view", "shifts.create", "shifts.edit", "shifts.delete",
  36. "schedule.view", "schedule.create", "schedule.edit", "schedule.delete", "schedule.swap", "schedule.substitute", "schedule.stopClinic", "schedule.export",
  37. "duty.view", "duty.create", "duty.edit", "duty.delete", "duty.export",
  38. "statistics.view", "statistics.export",
  39. "users.view", "users.create", "users.edit", "users.delete", "users.assignRole"
  40. ],
  41. "护士长": [
  42. "schedule.view", "schedule.create", "schedule.edit", "schedule.swap", "schedule.substitute", "schedule.stopClinic",
  43. "duty.view", "duty.create", "duty.edit",
  44. "statistics.view"
  45. ],
  46. "医生": [
  47. "schedule.view",
  48. "duty.view",
  49. "statistics.view"
  50. ],
  51. "护士": [
  52. "schedule.view",
  53. "duty.view"
  54. ],
  55. "排班员": [
  56. "shifts.view", "shifts.create", "shifts.edit", "shifts.delete",
  57. "schedule.view", "schedule.create", "schedule.edit", "schedule.delete", "schedule.swap", "schedule.substitute", "schedule.stopClinic",
  58. "duty.view", "duty.create", "duty.edit", "duty.delete",
  59. "statistics.view", "statistics.export"
  60. ]
  61. }
  62. async def seed_data(db: AsyncSession) -> None:
  63. permission_exists = await db.execute(select(Permission.code).limit(1))
  64. if not permission_exists.first():
  65. for code, name, module in PERMISSIONS:
  66. db.add(Permission(code=code, name=name, module=module))
  67. role_exists = await db.execute(select(Role.id).limit(1))
  68. if not role_exists.first():
  69. roles = {}
  70. for name, permissions in ROLE_TEMPLATES.items():
  71. role = Role(name=name, description=f"{name}角色模板", is_system=True)
  72. db.add(role)
  73. roles[name] = (role, permissions)
  74. await db.flush()
  75. for role, permissions in roles.values():
  76. for code in permissions:
  77. db.add(RolePermission(role_id=role.id, permission_code=code))
  78. campus_exists = await db.execute(select(Campus.id).limit(1))
  79. if not campus_exists.first():
  80. campuses = [
  81. Campus(name="主院区"),
  82. Campus(name="分院区"),
  83. Campus(name="东院区")
  84. ]
  85. db.add_all(campuses)
  86. await db.flush()
  87. dept_seed = [
  88. (campuses[0].id, "心内科"),
  89. (campuses[0].id, "呼吸科"),
  90. (campuses[0].id, "神经内科"),
  91. (campuses[0].id, "消化内科"),
  92. (campuses[1].id, "骨科"),
  93. (campuses[1].id, "普外科"),
  94. (campuses[1].id, "泌尿外科"),
  95. (campuses[2].id, "儿科"),
  96. (campuses[2].id, "妇产科")
  97. ]
  98. for campus_id, name in dept_seed:
  99. db.add(Department(campus_id=campus_id, name=name))
  100. shift_exists = await db.execute(select(Shift.id).limit(1))
  101. if not shift_exists.first():
  102. db.add_all([
  103. Shift(name="白班", start_time=time.fromisoformat("08:00"), end_time=time.fromisoformat("16:00"), enabled=True),
  104. Shift(name="夜班", start_time=time.fromisoformat("16:00"), end_time=time.fromisoformat("08:00"), enabled=True, remark="跨天班次"),
  105. Shift(name="门诊", start_time=time.fromisoformat("09:00"), end_time=time.fromisoformat("12:00"), enabled=True),
  106. Shift(name="急诊", start_time=time.fromisoformat("00:00"), end_time=time.fromisoformat("23:59"), enabled=True),
  107. ])
  108. if settings.seed_admin_account and settings.seed_admin_password:
  109. admin_exists = await db.execute(select(User).where(User.account == settings.seed_admin_account))
  110. if not admin_exists.scalar_one_or_none():
  111. role_result = await db.execute(select(Role).where(Role.name == "管理员"))
  112. admin_role = role_result.scalar_one_or_none()
  113. if admin_role:
  114. db.add(User(
  115. name="系统管理员",
  116. account=settings.seed_admin_account,
  117. phone="13800000000",
  118. title="系统管理员",
  119. role_id=admin_role.id,
  120. status="active",
  121. password_hash=hash_password(settings.seed_admin_password),
  122. token_version=1
  123. ))
  124. await db.commit()