| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 |
- #!/usr/bin/env python3
- """批量初始化洁净室及子表测试数据(biz_clean_room + access_log + uv_disinfect_log),已存在编码则跳过。"""
- from __future__ import annotations
- import sys
- from datetime import datetime
- from pathlib import Path
- ROOT = Path(__file__).resolve().parents[1]
- if str(ROOT) not in sys.path:
- sys.path.insert(0, str(ROOT))
- from app.core.database import SessionLocal
- from app.crud import clean_room as clean_room_svc
- ADMIN_ID = "d3000000000000000000000000000001"
- TEST_USER_ID = "b13c2be24e7111f19f4700163e3bdd9601"
- # (room_code, room_name, room_grade, room_status, area_sqm, order_num, remark)
- CLEAN_ROOMS = [
- ("CR-A01", "细胞制备A级洁净室", "A", "zc", 45.50, 1, "主制备区,日常细胞培养"),
- ("CR-B01", "样本接收B级洁净室", "B", "zc", 32.00, 2, "样本接收与初检"),
- ("CR-B02", "质检B级洁净室", "B", "zc", 28.80, 3, "质检与留样"),
- ("CR-C01", "物料暂存C级洁净室", "C", "zc", 18.60, 4, "物料暂存与缓冲"),
- ("CR-D01", "更衣D级洁净室", "D", "yc", 12.00, 5, "压差异常,待检修"),
- ]
- # room_code -> list of access log dicts
- ACCESS_LOGS = {
- "CR-A01": [
- {
- "user_id": ADMIN_ID,
- "person_name": "管理员",
- "dept_name": "综合部",
- "enter_time": datetime(2026, 6, 10, 8, 15),
- "purpose": "日常巡检",
- "leave_time": datetime(2026, 6, 10, 8, 45),
- "body_temp": "36.5",
- },
- {
- "user_id": TEST_USER_ID,
- "person_name": "中科兴皖测试1",
- "dept_name": "技术研发部",
- "enter_time": datetime(2026, 6, 10, 9, 0),
- "purpose": "细胞培养操作",
- "leave_time": datetime(2026, 6, 10, 12, 30),
- "body_temp": "36.4",
- },
- ],
- "CR-B01": [
- {
- "user_id": TEST_USER_ID,
- "person_name": "中科兴皖测试1",
- "dept_name": "生产部",
- "enter_time": datetime(2026, 6, 11, 7, 50),
- "purpose": "样本接收登记",
- "leave_time": datetime(2026, 6, 11, 8, 40),
- "body_temp": "36.6",
- },
- {
- "person_name": "张质检",
- "dept_name": "质量安全部",
- "enter_time": datetime(2026, 6, 11, 14, 0),
- "purpose": "样本初检",
- "leave_time": datetime(2026, 6, 11, 15, 20),
- "body_temp": "36.3",
- "remark": "外部访客",
- },
- ],
- "CR-B02": [
- {
- "user_id": ADMIN_ID,
- "person_name": "管理员",
- "dept_name": "质量安全部",
- "enter_time": datetime(2026, 6, 12, 10, 0),
- "purpose": "留样复核",
- "leave_time": datetime(2026, 6, 12, 11, 0),
- "body_temp": "36.5",
- },
- ],
- "CR-C01": [
- {
- "person_name": "李物料",
- "dept_name": "生产部",
- "enter_time": datetime(2026, 6, 12, 15, 30),
- "purpose": "物料入库",
- "leave_time": datetime(2026, 6, 12, 16, 0),
- "body_temp": "36.7",
- },
- ],
- "CR-D01": [
- {
- "user_id": ADMIN_ID,
- "person_name": "管理员",
- "dept_name": "综合部",
- "enter_time": datetime(2026, 6, 10, 16, 0),
- "purpose": "压差异常排查",
- "leave_time": None,
- "body_temp": "36.5",
- "remark": "尚未离开",
- },
- ],
- }
- # room_code -> list of uv disinfect log dicts
- UV_LOGS = {
- "CR-A01": [
- {
- "user_id": ADMIN_ID,
- "operator_name": "管理员",
- "start_time": datetime(2026, 6, 9, 18, 0),
- "end_time": datetime(2026, 6, 9, 19, 0),
- "remark": "班后消毒",
- },
- {
- "user_id": ADMIN_ID,
- "operator_name": "管理员",
- "start_time": datetime(2026, 6, 10, 18, 0),
- "end_time": datetime(2026, 6, 10, 19, 0),
- "remark": "班后消毒",
- },
- ],
- "CR-B01": [
- {
- "user_id": ADMIN_ID,
- "operator_name": "管理员",
- "start_time": datetime(2026, 6, 10, 17, 30),
- "end_time": datetime(2026, 6, 10, 18, 30),
- },
- ],
- "CR-B02": [
- {
- "user_id": ADMIN_ID,
- "operator_name": "管理员",
- "start_time": datetime(2026, 6, 11, 18, 0),
- "end_time": datetime(2026, 6, 11, 19, 0),
- },
- ],
- "CR-C01": [
- {
- "user_id": ADMIN_ID,
- "operator_name": "管理员",
- "start_time": datetime(2026, 6, 11, 17, 0),
- "end_time": datetime(2026, 6, 11, 17, 45),
- "remark": "C级区缩短时长",
- },
- ],
- "CR-D01": [
- {
- "user_id": ADMIN_ID,
- "operator_name": "管理员",
- "start_time": datetime(2026, 6, 10, 14, 30),
- "end_time": None,
- "remark": "异常区暂停消毒",
- },
- ],
- }
- def _room_exists(db, code: str, tenant_no: str) -> bool:
- return clean_room_svc.room_code_exists(db, code, tenant_no)
- def _access_log_exists(db, room_id: str, enter_time: datetime, tenant_no: str) -> bool:
- rows, _ = clean_room_svc.list_access_logs(
- db, page=1, page_size=100, clean_room_id=room_id, tenant_no=tenant_no
- )
- ts = enter_time.strftime("%Y-%m-%d %H:%M:%S")
- return any(r.get("enterTime") == ts for r in rows)
- def _uv_log_exists(db, room_id: str, start_time: datetime, tenant_no: str) -> bool:
- rows, _ = clean_room_svc.list_uv_disinfect_logs(
- db, page=1, page_size=100, clean_room_id=room_id, tenant_no=tenant_no
- )
- ts = start_time.strftime("%Y-%m-%d %H:%M:%S")
- return any(r.get("startTime") == ts for r in rows)
- def seed(tenant_no: str = "zkxw", user_id: str = ADMIN_ID) -> None:
- db = SessionLocal()
- rooms_created = 0
- rooms_skipped = 0
- access_created = 0
- access_skipped = 0
- uv_created = 0
- uv_skipped = 0
- try:
- room_ids: dict[str, str] = {}
- for code, name, grade, status, area, order_num, remark in CLEAN_ROOMS:
- if _room_exists(db, code, tenant_no):
- rooms_skipped += 1
- existing = clean_room_svc.list_clean_rooms(db, page=1, page_size=1, keyword=code, tenant_no=tenant_no)
- if existing[0]:
- room_ids[code] = existing[0][0]["id"]
- continue
- obj = clean_room_svc.create_clean_room(
- db,
- room_code=code,
- room_name=name,
- room_grade=grade,
- room_status=status,
- area_sqm=area,
- tenant_no=tenant_no,
- order_num=order_num,
- remark=remark,
- user_id=user_id,
- )
- room_ids[code] = obj.id
- rooms_created += 1
- for code, logs in ACCESS_LOGS.items():
- room_id = room_ids.get(code)
- if not room_id:
- continue
- for idx, log in enumerate(logs, start=1):
- enter_time = log["enter_time"]
- if _access_log_exists(db, room_id, enter_time, tenant_no):
- access_skipped += 1
- continue
- clean_room_svc.create_access_log(
- db,
- clean_room_id=room_id,
- user_id=log.get("user_id"),
- person_name=log.get("person_name"),
- dept_name=log.get("dept_name"),
- enter_time=enter_time,
- purpose=log.get("purpose"),
- leave_time=log.get("leave_time"),
- body_temp=log.get("body_temp"),
- tenant_no=tenant_no,
- order_num=idx,
- remark=log.get("remark"),
- user_id_param=user_id,
- )
- access_created += 1
- for code, logs in UV_LOGS.items():
- room_id = room_ids.get(code)
- if not room_id:
- continue
- for idx, log in enumerate(logs, start=1):
- start_time = log["start_time"]
- if _uv_log_exists(db, room_id, start_time, tenant_no):
- uv_skipped += 1
- continue
- clean_room_svc.create_uv_disinfect_log(
- db,
- clean_room_id=room_id,
- user_id=log.get("user_id"),
- operator_name=log.get("operator_name"),
- start_time=start_time,
- end_time=log.get("end_time"),
- tenant_no=tenant_no,
- order_num=idx,
- remark=log.get("remark"),
- user_id_param=user_id,
- )
- uv_created += 1
- print(
- f"洁净室测试数据初始化完成:"
- f"洁净室 新增 {rooms_created} / 跳过 {rooms_skipped};"
- f"进出记录 新增 {access_created} / 跳过 {access_skipped};"
- f"消毒记录 新增 {uv_created} / 跳过 {uv_skipped}。"
- )
- finally:
- db.close()
- if __name__ == "__main__":
- seed()
|