seed_clean_rooms.py 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. #!/usr/bin/env python3
  2. """批量初始化洁净室及子表测试数据(biz_clean_room + access_log + uv_disinfect_log),已存在编码则跳过。"""
  3. from __future__ import annotations
  4. import sys
  5. from datetime import datetime
  6. from pathlib import Path
  7. ROOT = Path(__file__).resolve().parents[1]
  8. if str(ROOT) not in sys.path:
  9. sys.path.insert(0, str(ROOT))
  10. from app.core.database import SessionLocal
  11. from app.crud import clean_room as clean_room_svc
  12. ADMIN_ID = "d3000000000000000000000000000001"
  13. TEST_USER_ID = "b13c2be24e7111f19f4700163e3bdd9601"
  14. # (room_code, room_name, room_grade, room_status, area_sqm, order_num, remark)
  15. CLEAN_ROOMS = [
  16. ("CR-A01", "细胞制备A级洁净室", "A", "zc", 45.50, 1, "主制备区,日常细胞培养"),
  17. ("CR-B01", "样本接收B级洁净室", "B", "zc", 32.00, 2, "样本接收与初检"),
  18. ("CR-B02", "质检B级洁净室", "B", "zc", 28.80, 3, "质检与留样"),
  19. ("CR-C01", "物料暂存C级洁净室", "C", "zc", 18.60, 4, "物料暂存与缓冲"),
  20. ("CR-D01", "更衣D级洁净室", "D", "yc", 12.00, 5, "压差异常,待检修"),
  21. ]
  22. # room_code -> list of access log dicts
  23. ACCESS_LOGS = {
  24. "CR-A01": [
  25. {
  26. "user_id": ADMIN_ID,
  27. "person_name": "管理员",
  28. "dept_name": "综合部",
  29. "enter_time": datetime(2026, 6, 10, 8, 15),
  30. "purpose": "日常巡检",
  31. "leave_time": datetime(2026, 6, 10, 8, 45),
  32. "body_temp": "36.5",
  33. },
  34. {
  35. "user_id": TEST_USER_ID,
  36. "person_name": "中科兴皖测试1",
  37. "dept_name": "技术研发部",
  38. "enter_time": datetime(2026, 6, 10, 9, 0),
  39. "purpose": "细胞培养操作",
  40. "leave_time": datetime(2026, 6, 10, 12, 30),
  41. "body_temp": "36.4",
  42. },
  43. ],
  44. "CR-B01": [
  45. {
  46. "user_id": TEST_USER_ID,
  47. "person_name": "中科兴皖测试1",
  48. "dept_name": "生产部",
  49. "enter_time": datetime(2026, 6, 11, 7, 50),
  50. "purpose": "样本接收登记",
  51. "leave_time": datetime(2026, 6, 11, 8, 40),
  52. "body_temp": "36.6",
  53. },
  54. {
  55. "person_name": "张质检",
  56. "dept_name": "质量安全部",
  57. "enter_time": datetime(2026, 6, 11, 14, 0),
  58. "purpose": "样本初检",
  59. "leave_time": datetime(2026, 6, 11, 15, 20),
  60. "body_temp": "36.3",
  61. "remark": "外部访客",
  62. },
  63. ],
  64. "CR-B02": [
  65. {
  66. "user_id": ADMIN_ID,
  67. "person_name": "管理员",
  68. "dept_name": "质量安全部",
  69. "enter_time": datetime(2026, 6, 12, 10, 0),
  70. "purpose": "留样复核",
  71. "leave_time": datetime(2026, 6, 12, 11, 0),
  72. "body_temp": "36.5",
  73. },
  74. ],
  75. "CR-C01": [
  76. {
  77. "person_name": "李物料",
  78. "dept_name": "生产部",
  79. "enter_time": datetime(2026, 6, 12, 15, 30),
  80. "purpose": "物料入库",
  81. "leave_time": datetime(2026, 6, 12, 16, 0),
  82. "body_temp": "36.7",
  83. },
  84. ],
  85. "CR-D01": [
  86. {
  87. "user_id": ADMIN_ID,
  88. "person_name": "管理员",
  89. "dept_name": "综合部",
  90. "enter_time": datetime(2026, 6, 10, 16, 0),
  91. "purpose": "压差异常排查",
  92. "leave_time": None,
  93. "body_temp": "36.5",
  94. "remark": "尚未离开",
  95. },
  96. ],
  97. }
  98. # room_code -> list of uv disinfect log dicts
  99. UV_LOGS = {
  100. "CR-A01": [
  101. {
  102. "user_id": ADMIN_ID,
  103. "operator_name": "管理员",
  104. "start_time": datetime(2026, 6, 9, 18, 0),
  105. "end_time": datetime(2026, 6, 9, 19, 0),
  106. "remark": "班后消毒",
  107. },
  108. {
  109. "user_id": ADMIN_ID,
  110. "operator_name": "管理员",
  111. "start_time": datetime(2026, 6, 10, 18, 0),
  112. "end_time": datetime(2026, 6, 10, 19, 0),
  113. "remark": "班后消毒",
  114. },
  115. ],
  116. "CR-B01": [
  117. {
  118. "user_id": ADMIN_ID,
  119. "operator_name": "管理员",
  120. "start_time": datetime(2026, 6, 10, 17, 30),
  121. "end_time": datetime(2026, 6, 10, 18, 30),
  122. },
  123. ],
  124. "CR-B02": [
  125. {
  126. "user_id": ADMIN_ID,
  127. "operator_name": "管理员",
  128. "start_time": datetime(2026, 6, 11, 18, 0),
  129. "end_time": datetime(2026, 6, 11, 19, 0),
  130. },
  131. ],
  132. "CR-C01": [
  133. {
  134. "user_id": ADMIN_ID,
  135. "operator_name": "管理员",
  136. "start_time": datetime(2026, 6, 11, 17, 0),
  137. "end_time": datetime(2026, 6, 11, 17, 45),
  138. "remark": "C级区缩短时长",
  139. },
  140. ],
  141. "CR-D01": [
  142. {
  143. "user_id": ADMIN_ID,
  144. "operator_name": "管理员",
  145. "start_time": datetime(2026, 6, 10, 14, 30),
  146. "end_time": None,
  147. "remark": "异常区暂停消毒",
  148. },
  149. ],
  150. }
  151. def _room_exists(db, code: str, tenant_no: str) -> bool:
  152. return clean_room_svc.room_code_exists(db, code, tenant_no)
  153. def _access_log_exists(db, room_id: str, enter_time: datetime, tenant_no: str) -> bool:
  154. rows, _ = clean_room_svc.list_access_logs(
  155. db, page=1, page_size=100, clean_room_id=room_id, tenant_no=tenant_no
  156. )
  157. ts = enter_time.strftime("%Y-%m-%d %H:%M:%S")
  158. return any(r.get("enterTime") == ts for r in rows)
  159. def _uv_log_exists(db, room_id: str, start_time: datetime, tenant_no: str) -> bool:
  160. rows, _ = clean_room_svc.list_uv_disinfect_logs(
  161. db, page=1, page_size=100, clean_room_id=room_id, tenant_no=tenant_no
  162. )
  163. ts = start_time.strftime("%Y-%m-%d %H:%M:%S")
  164. return any(r.get("startTime") == ts for r in rows)
  165. def seed(tenant_no: str = "zkxw", user_id: str = ADMIN_ID) -> None:
  166. db = SessionLocal()
  167. rooms_created = 0
  168. rooms_skipped = 0
  169. access_created = 0
  170. access_skipped = 0
  171. uv_created = 0
  172. uv_skipped = 0
  173. try:
  174. room_ids: dict[str, str] = {}
  175. for code, name, grade, status, area, order_num, remark in CLEAN_ROOMS:
  176. if _room_exists(db, code, tenant_no):
  177. rooms_skipped += 1
  178. existing = clean_room_svc.list_clean_rooms(db, page=1, page_size=1, keyword=code, tenant_no=tenant_no)
  179. if existing[0]:
  180. room_ids[code] = existing[0][0]["id"]
  181. continue
  182. obj = clean_room_svc.create_clean_room(
  183. db,
  184. room_code=code,
  185. room_name=name,
  186. room_grade=grade,
  187. room_status=status,
  188. area_sqm=area,
  189. tenant_no=tenant_no,
  190. order_num=order_num,
  191. remark=remark,
  192. user_id=user_id,
  193. )
  194. room_ids[code] = obj.id
  195. rooms_created += 1
  196. for code, logs in ACCESS_LOGS.items():
  197. room_id = room_ids.get(code)
  198. if not room_id:
  199. continue
  200. for idx, log in enumerate(logs, start=1):
  201. enter_time = log["enter_time"]
  202. if _access_log_exists(db, room_id, enter_time, tenant_no):
  203. access_skipped += 1
  204. continue
  205. clean_room_svc.create_access_log(
  206. db,
  207. clean_room_id=room_id,
  208. user_id=log.get("user_id"),
  209. person_name=log.get("person_name"),
  210. dept_name=log.get("dept_name"),
  211. enter_time=enter_time,
  212. purpose=log.get("purpose"),
  213. leave_time=log.get("leave_time"),
  214. body_temp=log.get("body_temp"),
  215. tenant_no=tenant_no,
  216. order_num=idx,
  217. remark=log.get("remark"),
  218. user_id_param=user_id,
  219. )
  220. access_created += 1
  221. for code, logs in UV_LOGS.items():
  222. room_id = room_ids.get(code)
  223. if not room_id:
  224. continue
  225. for idx, log in enumerate(logs, start=1):
  226. start_time = log["start_time"]
  227. if _uv_log_exists(db, room_id, start_time, tenant_no):
  228. uv_skipped += 1
  229. continue
  230. clean_room_svc.create_uv_disinfect_log(
  231. db,
  232. clean_room_id=room_id,
  233. user_id=log.get("user_id"),
  234. operator_name=log.get("operator_name"),
  235. start_time=start_time,
  236. end_time=log.get("end_time"),
  237. tenant_no=tenant_no,
  238. order_num=idx,
  239. remark=log.get("remark"),
  240. user_id_param=user_id,
  241. )
  242. uv_created += 1
  243. print(
  244. f"洁净室测试数据初始化完成:"
  245. f"洁净室 新增 {rooms_created} / 跳过 {rooms_skipped};"
  246. f"进出记录 新增 {access_created} / 跳过 {access_skipped};"
  247. f"消毒记录 新增 {uv_created} / 跳过 {uv_skipped}。"
  248. )
  249. finally:
  250. db.close()
  251. if __name__ == "__main__":
  252. seed()