Files
zkxw/backend/scripts/seed_processes.py
T
2026-06-15 18:19:57 +08:00

203 lines
5.3 KiB
Python

#!/usr/bin/env python3
"""批量初始化工艺库测试数据(biz_process),已存在工序代码则跳过。
用法(在 backend 目录):
source venv/bin/activate
python scripts/seed_processes.py
python scripts/seed_processes.py --tenant-no zkxw
依赖:biz_process_category 中已有对应分类编码(可先运行 reset_process_categories.py)。
"""
from __future__ import annotations
import argparse
import sys
from pathlib import Path
from typing import Dict, Optional
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 process as process_svc
from app.models.models import BizProcessCategory
ADMIN_ID = "d3000000000000000000000000000001"
# (process_code, process_name, category_code, description, equipment_name, estimated_duration_min, order_num, remark)
SAMPLE_PROCESSES = [
(
"PR-YBJS-001",
"样本接收登记",
"PC-YBJS",
"核对样本信息、登记条码并分配接收批次",
"样本接收台",
"30",
1,
"样本接收首道工序",
),
(
"PR-YBJS-002",
"样本初检",
"PC-YBJS",
"外观检查、温度记录及初筛不合格样本隔离",
"生物安全柜",
"45",
2,
None,
),
(
"PR-XBYP-001",
"外周血分离",
"PC-XBYP",
"密度梯度离心分离单个核细胞",
"台式离心机",
"60",
3,
None,
),
(
"PR-XBYP-002",
"细胞培养扩增",
"PC-XBYP",
"接种至培养体系并进行扩增培养",
"CO2培养箱",
"480",
4,
"长周期工序",
),
(
"PR-XBYP-003",
"换液传代",
"PC-XBYP",
"更换培养基并按密度传代",
"生物安全柜",
"90",
5,
None,
),
(
"PR-ZJJC-001",
"细胞活性检测",
"PC-ZJJC",
"台盼蓝染色法检测细胞活率",
"倒置显微镜",
"30",
6,
None,
),
(
"PR-ZJJC-002",
"支原体检测",
"PC-ZJJC",
"PCR法检测支原体污染",
"PCR仪",
"180",
7,
None,
),
(
"PR-DCGL-001",
"程序降温冻存",
"PC-DCGL",
"按程序降温曲线完成细胞冻存",
"程序降温仪",
"150",
8,
None,
),
(
"PR-DCGL-002",
"冻存管入库",
"PC-DCGL",
"扫码登记并转入液氮罐指定位置",
"扫码枪",
"20",
9,
None,
),
(
"PR-BZZF-001",
"成品包装发运",
"PC-BZZF",
"成品核对、冷链包装及发运交接",
"包装台",
"45",
10,
"末道工序",
),
]
def _load_category_map(db, tenant_no: str) -> Dict[str, str]:
rows = (
db.query(BizProcessCategory)
.filter(BizProcessCategory.tenant_no == tenant_no, BizProcessCategory.del_flag == 0)
.all()
)
return {row.category_code: row.id for row in rows}
def seed(tenant_no: str = "zkxw", user_id: str = ADMIN_ID) -> None:
db = SessionLocal()
created = 0
skipped = 0
missing_categories: set[str] = set()
try:
category_map = _load_category_map(db, tenant_no)
for (
code,
name,
category_code,
description,
equipment_name,
estimated_duration,
order_num,
remark,
) in SAMPLE_PROCESSES:
if process_svc.process_code_exists(db, code, tenant_no):
skipped += 1
continue
category_id: Optional[str] = category_map.get(category_code)
if category_code and not category_id:
missing_categories.add(category_code)
process_svc.create_process(
db,
process_code=code,
process_name=name,
category_id=category_id,
description=description,
equipment_name=equipment_name,
estimated_duration=estimated_duration,
tenant_no=tenant_no,
order_num=order_num,
remark=remark,
user_id=user_id,
)
created += 1
print(
f"工艺库测试数据初始化完成(租户 {tenant_no}):"
f"新增 {created} 条,跳过 {skipped} 条(工序代码已存在)。"
)
if missing_categories:
print(
"以下工序分类编码未找到,对应工艺已写入但 category_id 为空:"
f" {', '.join(sorted(missing_categories))}"
)
print("可先执行:python scripts/reset_process_categories.py")
finally:
db.close()
def main() -> None:
parser = argparse.ArgumentParser(description="初始化 biz_process 测试数据")
parser.add_argument("--tenant-no", default="zkxw", help="租户编号,默认 zkxw")
parser.add_argument("--user-id", default=ADMIN_ID, help="create_by / update_by 用户 id")
args = parser.parse_args()
seed(tenant_no=args.tenant_no, user_id=args.user_id)
if __name__ == "__main__":
main()