273 lines
9.2 KiB
Python
273 lines
9.2 KiB
Python
#!/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()
|