This commit is contained in:
zlwu committed 2026-07-01 16:37:33 +08:00
1 parent 28f233c922
commit 038a60b09e
478 files changed
+67530 -51951

No files matched your search

+1
View File
@@ -0,0 +1 @@
59139
+1
View File
@@ -205,6 +205,7 @@ class ProtocolUpdateBody(BaseModel):
expire_desc: Optional[str] = Field(None, alias="expireDesc")
void_time: Optional[str] = Field(None, alias="voidTime")
void_desc: Optional[str] = Field(None, alias="voidDesc")
void_type: Optional[str] = Field(None, alias="voidType")
to_research_time: Optional[str] = Field(None, alias="toResearchTime")
to_research_desc: Optional[str] = Field(None, alias="toResearchDesc")
collector_user_id: Optional[str] = Field(None, alias="collectorUserId")
+44 -19
View File
@@ -17,10 +17,27 @@ from app.crud import material_stock_batch as batch_svc
from app.crud import material_stock_check as stock_check_svc
from app.crud import material_usage as mu_svc
from app.crud import material_stock_log as msl_svc
from app.models.models import SysUser
router = APIRouter(prefix="/web/admin", tags=["市场物料"])
def _resolve_operator_name(db: Session, user: dict, operator_name: Optional[str]) -> str:
name = (operator_name or "").strip()
if name:
return name
user_id = _get_current_user_id(user)
if user_id:
row = (
db.query(SysUser)
.filter(SysUser.id == user_id, SysUser.del_flag == 0)
.first()
)
if row:
return (row.nick_name or row.user_no or "").strip()
return (user.get("real_name") or user.get("username") or "").strip()
# ---------- Body models ----------
@@ -54,31 +71,32 @@ class MaterialUpdateBody(BaseModel):
class StockInBody(BaseModel):
model_config = ConfigDict(populate_by_name=True)
stock_in_no: str = Field(..., alias="stockInNo")
stock_in_date: str = Field(..., alias="stockInDate")
expire_date: str = Field(..., alias="expireDate")
catalog_no: str = Field(..., alias="catalogNo")
batch_no: str = Field(..., alias="batchNo")
manufacturer: str
unit_price: float = Field(..., alias="unitPrice")
amount: float
qty: float = Field(..., gt=0)
stock_in_no: Optional[str] = Field(None, alias="stockInNo")
stock_in_date: Optional[str] = Field(None, alias="stockInDate")
expire_date: Optional[str] = Field(None, alias="expireDate")
catalog_no: Optional[str] = Field(None, alias="catalogNo")
batch_no: Optional[str] = Field(None, alias="batchNo")
manufacturer: Optional[str] = None
unit_price: Optional[float] = Field(None, alias="unitPrice")
amount: Optional[float] = None
qty: Optional[float] = Field(None, ge=0)
remark: Optional[str] = None
stock_in_time: Optional[str] = Field(None, alias="stockInTime")
operator_name: Optional[str] = Field(None, alias="operatorName")
class BatchStockInItem(BaseModel):
model_config = ConfigDict(populate_by_name=True)
material_id: str = Field(..., alias="materialId")
stock_in_no: str = Field(..., alias="stockInNo")
stock_in_date: str = Field(..., alias="stockInDate")
expire_date: str = Field(..., alias="expireDate")
catalog_no: str = Field(..., alias="catalogNo")
batch_no: str = Field(..., alias="batchNo")
manufacturer: str
unit_price: float = Field(..., alias="unitPrice")
amount: float
qty: float = Field(..., gt=0)
stock_in_no: Optional[str] = Field(None, alias="stockInNo")
stock_in_date: Optional[str] = Field(None, alias="stockInDate")
expire_date: Optional[str] = Field(None, alias="expireDate")
catalog_no: Optional[str] = Field(None, alias="catalogNo")
batch_no: Optional[str] = Field(None, alias="batchNo")
manufacturer: Optional[str] = None
unit_price: Optional[float] = Field(None, alias="unitPrice")
amount: Optional[float] = None
qty: Optional[float] = Field(None, ge=0)
remark: Optional[str] = None
@@ -87,6 +105,7 @@ class BatchStockInBody(BaseModel):
items: List[BatchStockInItem] = Field(..., min_length=1)
remark: Optional[str] = None
stock_in_time: Optional[str] = Field(None, alias="stockInTime")
operator_name: Optional[str] = Field(None, alias="operatorName")
class BatchStockOutItem(BaseModel):
@@ -103,6 +122,7 @@ class BatchStockOutBody(BaseModel):
purpose: Optional[str] = None
remark: Optional[str] = None
stock_out_time: Optional[str] = Field(None, alias="stockOutTime")
operator_name: Optional[str] = Field(None, alias="operatorName")
class BatchDiscardItem(BaseModel):
@@ -119,6 +139,7 @@ class BatchDiscardBody(BaseModel):
discard_reason: str = Field(..., alias="discardReason")
remark: Optional[str] = None
discard_time: Optional[str] = Field(None, alias="discardTime")
operator_name: Optional[str] = Field(None, alias="operatorName")
class MaterialBatchUpdateBody(BaseModel):
@@ -414,6 +435,7 @@ async def batch_stock_in_material(
db,
items=items,
remark=body.remark,
operator_name=_resolve_operator_name(db, user, body.operator_name),
tenant_no=tenant_no,
user_id=user_id,
operate_time=operate_time,
@@ -450,6 +472,7 @@ async def batch_stock_out_material(
receiver=body.receiver,
purpose=body.purpose,
remark=body.remark,
operator_name=_resolve_operator_name(db, user, body.operator_name),
tenant_no=tenant_no,
user_id=user_id,
operate_time=operate_time,
@@ -492,6 +515,7 @@ async def batch_discard_material(
items=items,
discard_reason=body.discard_reason,
remark=body.remark,
operator_name=_resolve_operator_name(db, user, body.operator_name),
tenant_no=tenant_no,
user_id=user_id,
operate_time=operate_time,
@@ -530,8 +554,9 @@ async def stock_in_material(
manufacturer=body.manufacturer,
unit_price=body.unit_price,
amount=body.amount,
qty=Decimal(str(body.qty)),
qty=body.qty,
remark=body.remark,
operator_name=_resolve_operator_name(db, user, body.operator_name),
tenant_no=tenant_no,
user_id=user_id,
operate_time=operate_time,
+16
View File
@@ -1865,6 +1865,22 @@ async def list_production_work_order_cell_product_options(
return error_response(400, str(e))
@router.get("/production-work-orders/{wo_id}/qc-info")
async def get_production_work_order_qc_info_api(
wo_id: str,
user: dict = Depends(require_admin_or_super_admin),
db: Session = Depends(get_db),
):
try:
tenant_no = _get_tenant_no(db, user)
data = qc_work_order_svc.get_production_work_order_qc_info(
db, production_work_order_id=wo_id, tenant_no=tenant_no
)
return success_response(data)
except ValueError as e:
return error_response(400, str(e))
@router.post("/production-work-orders/{wo_id}/qc-work-orders")
async def create_qc_work_order_from_production_api(
wo_id: str,
+42
View File
@@ -34,6 +34,7 @@ from app.crud import qc_material as mat_svc
from app.crud import qc_material_stock_batch as batch_svc
from app.crud import qc_material_stock_check as stock_check_svc
from app.crud import qc_material_usage as mu_svc
from app.crud import inbound_sample_special as inbound_sample_special_svc
from app.crud import qc_work_order as wo_svc
from app.crud.collection_protocol import total_pages
from app.api.sample_reception import _get_current_user_id, _get_tenant_no, _page_payload
@@ -797,6 +798,47 @@ async def delete_qc_work_order_api(
return error_response(400, str(e))
class InboundSampleSpecialMarkBody(BaseModel):
model_config = ConfigDict(populate_by_name=True)
reception_source: str = Field(..., alias="receptionSource")
protocol_sample_id: str = Field(..., alias="protocolSampleId")
is_special: bool = Field(..., alias="isSpecial")
special_remark: Optional[str] = Field(None, alias="specialRemark")
@router.put("/inbound-samples/special-mark")
async def update_inbound_sample_special_mark(
body: InboundSampleSpecialMarkBody,
db: Session = Depends(get_db),
user: dict = Depends(
require_any_menu_code("biz:qcWorkOrder:list", "biz:myQcTask:list")
),
):
try:
tenant_no = _get_tenant_no(db, user)
source = (body.reception_source or "").strip()
if source not in ("cell_storage", "research_donation"):
return error_response(400, "仅支持细胞存储或科研捐赠样本")
data = inbound_sample_special_svc.update_inbound_sample_special_mark(
db,
tenant_no=tenant_no,
reception_source=source,
protocol_sample_id=body.protocol_sample_id,
is_special=body.is_special,
special_remark=body.special_remark,
user_id=user.get("user_id") or "",
)
db.commit()
return success_response(data, message="保存成功")
except ValueError as e:
db.rollback()
return error_response(400, str(e))
except Exception as e:
db.rollback()
return error_response(400, str(e))
@router.post("/qc-work-orders/{work_order_id}/configure")
async def configure_qc_work_order(
work_order_id: str,
+2
View File
@@ -98,6 +98,7 @@ class StatusChangeBody(BaseModel):
new_status: str = Field(..., alias="newStatus")
desc: Optional[str] = Field(None, alias="desc")
time_val: Optional[str] = Field(None, alias="timeVal")
void_type: Optional[str] = Field(None, alias="voidType")
class ConvertFromStorageBody(BaseModel):
@@ -372,6 +373,7 @@ async def change_donation_status(
new_status=body.new_status,
desc=body.desc,
time_val=body.time_val,
void_type=body.void_type,
user_id=user_id,
tenant_no=tenant_no,
)
@@ -0,0 +1,99 @@
"""协议状态展示(含作废类型后缀)。"""
from __future__ import annotations
from typing import Dict, Optional
from sqlalchemy.orm import Session
from app.models.models import SysDictData
VOID_TYPE_DICT = "xyzflx"
_PROTOCOL_STATUS_LABELS = {
"dsx": "待生效",
"sxz": "生效中",
"ygq": "已过期",
"yzf": "已作废",
"sdfq": "属地废弃",
"zky": "转科研",
}
_DONATION_STATUS_LABELS = {
"dsx": "待生效",
"sxz": "生效中",
"ygq": "已过期",
"yzf": "已作废",
"sdfq": "属地废弃",
"zckc": "转细胞存储",
}
_VOID_TYPE_FALLBACK_LABELS = {
"khhc": "客户毁存",
"jcbhg": "检测不合格",
}
def resolve_void_type_label(
db: Optional[Session],
tenant_no: Optional[str],
void_type: Optional[str],
) -> str:
code = (void_type or "").strip()
if not code:
return ""
if db is not None and tenant_no:
row = (
db.query(SysDictData.dict_label)
.filter(
SysDictData.dict_type == VOID_TYPE_DICT,
SysDictData.dict_value == code,
SysDictData.tenant_no == tenant_no,
SysDictData.del_flag == 0,
)
.first()
)
if row and (row.dict_label or "").strip():
return (row.dict_label or "").strip()
return _VOID_TYPE_FALLBACK_LABELS.get(code, code)
def format_protocol_status_label(
status: str,
void_type: Optional[str] = None,
*,
kind: str = "protocol",
db: Optional[Session] = None,
tenant_no: Optional[str] = None,
) -> str:
st = (status or "").strip()
labels = _DONATION_STATUS_LABELS if kind == "donation" else _PROTOCOL_STATUS_LABELS
base = labels.get(st, st)
if st != "yzf":
return base
vt_label = resolve_void_type_label(db, tenant_no, void_type)
if vt_label:
return f"{base}({vt_label})"
return base
def build_void_type_label_map(
db: Session,
tenant_no: str,
codes: list[str],
) -> Dict[str, str]:
normalized = list({(c or "").strip() for c in codes if (c or "").strip()})
if not normalized:
return {}
rows = (
db.query(SysDictData.dict_value, SysDictData.dict_label)
.filter(
SysDictData.dict_type == VOID_TYPE_DICT,
SysDictData.dict_value.in_(normalized),
SysDictData.tenant_no == tenant_no,
SysDictData.del_flag == 0,
)
.all()
)
out = {r.dict_value: (r.dict_label or "").strip() for r in rows if (r.dict_value or "").strip()}
for code in normalized:
out.setdefault(code, _VOID_TYPE_FALLBACK_LABELS.get(code, code))
return out
+3
View File
@@ -10,6 +10,7 @@ from sqlalchemy import and_, func, or_
from sqlalchemy.orm import Session
from app.core.utils import generate_uuid
from app.utils.sample_special import sample_special_to_dict
from app.crud import storage_occupancy as occupancy_svc
from app.models.models import BizStorageSlotOccupancy
from app.models.models import (
@@ -1119,6 +1120,7 @@ def _protocol_sample_chain_node(
"receptionSourceLabel": _SOURCE_LABELS.get(reception_source, reception_source),
"customer": _sample_customer_dict(db, protocol_id, tenant_no),
"isCurrent": False,
**sample_special_to_dict(sample),
},
"edge": edge,
"parent": None,
@@ -1150,6 +1152,7 @@ def _donation_sample_chain_node(
"receptionSourceLabel": _SOURCE_LABELS["research_donation"],
"customer": _donation_sample_customer_dict(db, donation_id, tenant_no),
"isCurrent": False,
**sample_special_to_dict(sample),
},
"edge": edge,
"parent": None,
+22
View File
@@ -25,6 +25,11 @@ from app.services.protocol_payment_installment import (
resolve_installment_due_amounts,
)
from app.services.protocol_pay_mode_switch import validate_payment_details_for_save
from app.utils.sample_special import (
apply_sample_special_fields,
sample_special_to_dict,
validate_sample_special_raw,
)
from app.models.research_donation import BizResearchDonation, BizResearchDonationSample
from app.models.models import (
BizAttachment,
@@ -345,6 +350,7 @@ def _protocol_to_dict(p: BizCollectionProtocol) -> Dict[str, Any]:
"expireDesc": p.expire_desc or "",
"voidTime": _fmt_dt(p.void_time),
"voidDesc": p.void_desc or "",
"voidType": p.void_type or "",
"toResearchTime": _fmt_dt(p.to_research_time),
"toResearchDesc": p.to_research_desc or "",
"collectorUserId": p.collector_user_id or "",
@@ -516,6 +522,7 @@ def _sample_to_dict(s: BizProtocolSample) -> Dict[str, Any]:
"detectStartDate": (s.detect_start_date or "").strip() if s.detect_start_date else "",
"voidDate": (s.void_date or "").strip() if s.void_date else "",
"storageExpireDate": (s.storage_expire_date or "").strip() if s.storage_expire_date else "",
**sample_special_to_dict(s),
"tenantNo": s.tenant_no,
"orderNum": s.order_num if s.order_num is not None else 0,
"remark": s.remark or "",
@@ -1125,6 +1132,7 @@ def list_collection_protocols(
"sampleStatus": (s.sample_status or "").strip(),
"labStorageCode": lab_code_map.get(code, "") if code else "",
"transport": transport_dict,
**sample_special_to_dict(s),
}
)
d["sampleItems"] = sample_items
@@ -2277,6 +2285,7 @@ def update_collection_protocol(
expire_desc: Optional[str] = None,
void_time: Optional[datetime] = None,
void_desc: Optional[str] = None,
void_type: Optional[str] = None,
to_research_time: Optional[datetime] = None,
to_research_desc: Optional[str] = None,
collector_user_id: Optional[str] = None,
@@ -2293,6 +2302,9 @@ def update_collection_protocol(
raise ValueError("协议号不可修改")
if protocol_status is not None:
obj.protocol_status = protocol_status.strip()
if protocol_status.strip() == "yzf" and void_time is not None:
if void_type is None or not str(void_type).strip():
raise ValueError("请选择作废类型")
if protocol_attachments is not None:
obj.protocol_attachments = protocol_attachments.strip() or None
if register_date is not None:
@@ -2309,6 +2321,14 @@ def update_collection_protocol(
obj.void_time = void_time
if void_desc is not None:
obj.void_desc = void_desc.strip() or None
if void_type is not None:
from app.crud.dict_data import normalize_void_type
obj.void_type = (
normalize_void_type(db, value=void_type, tenant_no=tenant_no)
if (void_type or "").strip()
else None
)
if to_research_time is not None:
obj.to_research_time = to_research_time
if to_research_desc is not None:
@@ -2592,6 +2612,7 @@ def save_samples(
result = []
for idx, raw in enumerate(samples):
raw = _normalize_fields(raw)
validate_sample_special_raw(raw, index=idx)
obj = BizProtocolSample(
id=generate_uuid(),
collection_protocol_id=collection_protocol_id,
@@ -2622,6 +2643,7 @@ def save_samples(
for k in _INT_FIELDS:
if k in raw:
setattr(obj, k, raw[k])
apply_sample_special_fields(obj, raw)
db.add(obj)
result.append(obj)
new_code_to_id = {
+17
View File
@@ -144,6 +144,7 @@ def soft_delete_dict_data(db: Session, data_id: str) -> None:
TRANSFER_TYPE_DICT = "zzfs"
VOID_TYPE_DICT = "xyzflx"
def list_dict_data_options(
@@ -196,6 +197,22 @@ def normalize_transfer_type(
return normalized
def normalize_void_type(
db: Session,
*,
value: str,
tenant_no: str,
) -> str:
normalized = (value or "").strip()
if not normalized:
raise ValueError("请选择作废类型")
if not is_dict_value_valid(
db, dict_type_code=VOID_TYPE_DICT, value=normalized, tenant_no=tenant_no
):
raise ValueError("作废类型无效")
return normalized
def total_pages(total: int, page_size: int) -> int:
if total <= 0:
return 0
@@ -0,0 +1,63 @@
"""入库样本(采集协议 / 科研捐赠)· 特殊标记维护。"""
from __future__ import annotations
from typing import Any, Dict, Optional
from sqlalchemy.orm import Session
from app.models.models import BizProtocolSample
from app.models.research_donation import BizResearchDonationSample
from app.utils.sample_special import (
apply_inbound_sample_special_mark_fields,
sample_special_to_dict,
validate_sample_special_raw,
)
def update_inbound_sample_special_mark(
db: Session,
*,
tenant_no: str,
reception_source: str,
protocol_sample_id: str,
is_special: bool,
special_remark: Optional[str],
user_id: str,
) -> Dict[str, Any]:
sample_id = (protocol_sample_id or "").strip()
if not sample_id:
raise ValueError("缺少样本 ID")
source = (reception_source or "cell_storage").strip()
raw = {"is_special": is_special, "special_remark": special_remark or ""}
validate_sample_special_raw(raw)
if source == "research_donation":
sample = (
db.query(BizResearchDonationSample)
.filter(
BizResearchDonationSample.id == sample_id,
BizResearchDonationSample.tenant_no == tenant_no,
BizResearchDonationSample.del_flag == 0,
)
.first()
)
if not sample:
raise ValueError("捐赠样本不存在")
else:
sample = (
db.query(BizProtocolSample)
.filter(
BizProtocolSample.id == sample_id,
BizProtocolSample.tenant_no == tenant_no,
BizProtocolSample.del_flag == 0,
)
.first()
)
if not sample:
raise ValueError("协议样本不存在")
apply_inbound_sample_special_mark_fields(sample, raw)
sample.update_by = user_id
db.flush()
return sample_special_to_dict(sample)
+144 -46
View File
@@ -12,9 +12,14 @@ from app.core.utils import generate_uuid
from app.crud.material import _dec, _fmt_dt, _is_enabled_status, _norm_status
from app.models.material import BizMaterial, BizMaterialStockBatch, BizMaterialUsage
_SENTINEL_EXPIRE_DATE = date(9999, 12, 31)
_DEFAULT_STOCK_IN_QTY = Decimal("1")
def _fmt_date(d: Optional[date]) -> str:
return d.strftime("%Y-%m-%d") if d else ""
if not d or d >= _SENTINEL_EXPIRE_DATE:
return ""
return d.strftime("%Y-%m-%d")
def _parse_date(v: Any, *, label: str = "入库日期") -> date:
@@ -32,9 +37,82 @@ def _parse_date(v: Any, *, label: str = "入库日期") -> date:
def _parse_expire_date(v: Any) -> date:
if isinstance(v, date) and not isinstance(v, datetime):
if v >= _SENTINEL_EXPIRE_DATE:
return _SENTINEL_EXPIRE_DATE
return v
s = str(v or "").strip()
if not s:
return _SENTINEL_EXPIRE_DATE
return _parse_date(v, label="过期日期")
def _opt_str(v: Any, *, default: str = "") -> str:
return str(v or "").strip() or default
def _opt_decimal(v: Any, *, default: Decimal = Decimal("0")) -> Decimal:
if v is None or str(v).strip() == "":
return default
try:
d = Decimal(str(v))
except Exception as e:
raise ValueError("金额格式无效") from e
if d < 0:
raise ValueError("金额不能为负数")
return d
def _opt_stock_in_date(v: Any) -> date:
if isinstance(v, date) and not isinstance(v, datetime):
return v
s = str(v or "").strip()
if not s:
return date.today()
return _parse_date(v, label="入库日期")
def _opt_stock_in_qty(v: Any) -> Decimal:
if v is None or str(v).strip() == "":
return _DEFAULT_STOCK_IN_QTY
try:
qty = Decimal(str(v))
except Exception as e:
raise ValueError("入库数量格式无效") from e
if qty < 0:
raise ValueError("入库数量不能为负数")
return qty
def _gen_stock_in_no(db: Session, tenant_no: str) -> str:
for _ in range(10):
suffix = generate_uuid()[:8].upper()
sno = f"RK{datetime.now().strftime('%Y%m%d%H%M%S')}{suffix}"
if not stock_in_no_exists(db, sno, tenant_no):
return sno
raise ValueError("入库编号自动生成失败,请稍后重试")
def _resolve_stock_in_no(
db: Session,
tenant_no: str,
stock_in_no: Any,
*,
exclude_id: Optional[str] = None,
seen_nos: Optional[set] = None,
) -> str:
s = str(stock_in_no or "").strip()
if not s:
s = _gen_stock_in_no(db, tenant_no)
if seen_nos is not None:
if s in seen_nos:
raise ValueError(f"入库编号「{s}」在本单中重复")
seen_nos.add(s)
if stock_in_no_exists(db, s, tenant_no, exclude_id=exclude_id):
raise ValueError(f"入库编号「{s}」已存在")
return s
def _require_str(v: Any, label: str) -> str:
s = str(v or "").strip()
if not s:
@@ -295,19 +373,18 @@ def _create_batch_and_usage(
manufacturer: str,
unit_price: Decimal,
amount: Decimal,
qty: Decimal,
qty: Any,
remark: Optional[str],
operator_name: Optional[str],
tenant_no: str,
user_id: Optional[str],
operate_time: datetime,
commit: bool = False,
) -> BizMaterialStockBatch:
qty = _opt_stock_in_qty(qty)
if qty <= 0:
raise ValueError("入库数量必须大于0")
sno = _require_str(stock_in_no, "入库编号")
if stock_in_no_exists(db, sno, tenant_no):
raise ValueError(f"入库编号「{sno}」已存在")
sno = _resolve_stock_in_no(db, tenant_no, stock_in_no)
if not _is_enabled_status(material.status):
raise ValueError(f"物料「{material.material_name}」已停用,无法入库")
@@ -326,13 +403,13 @@ def _create_batch_and_usage(
spec_model=material.spec_model,
unit=material.unit,
stock_in_no=sno,
stock_in_date=stock_in_date,
expire_date=expire_date,
catalog_no=catalog_no,
batch_no=batch_no,
manufacturer=manufacturer,
unit_price=unit_price,
amount=amount,
stock_in_date=_opt_stock_in_date(stock_in_date),
expire_date=_parse_expire_date(expire_date),
catalog_no=_opt_str(catalog_no),
batch_no=_opt_str(batch_no),
manufacturer=_opt_str(manufacturer),
unit_price=_opt_decimal(unit_price),
amount=_opt_decimal(amount),
in_qty=qty,
remaining_qty=qty,
tenant_no=tenant_no,
@@ -358,6 +435,7 @@ def _create_batch_and_usage(
stock_after=new_stock,
source_type="manual_in",
tenant_no=tenant_no,
operator_name=(operator_name or "").strip() or None,
remark=(remark or "").strip() or None,
create_by=user_id,
create_dept_id=material.create_dept_id or "",
@@ -386,8 +464,9 @@ def stock_in_one(
manufacturer: str,
unit_price: Any,
amount: Any,
qty: Decimal,
qty: Any,
remark: Optional[str] = None,
operator_name: Optional[str] = None,
tenant_no: str,
user_id: Optional[str] = None,
operate_time: Optional[datetime] = None,
@@ -398,15 +477,16 @@ def stock_in_one(
db,
material=material,
stock_in_no=stock_in_no,
stock_in_date=_parse_date(stock_in_date),
expire_date=_parse_expire_date(expire_date),
catalog_no=_require_str(catalog_no, "货号"),
batch_no=_require_str(batch_no, "批号"),
manufacturer=_require_str(manufacturer, "厂家"),
unit_price=_require_decimal(unit_price, "单价"),
amount=_require_decimal(amount, "金额"),
stock_in_date=stock_in_date,
expire_date=expire_date,
catalog_no=catalog_no,
batch_no=batch_no,
manufacturer=manufacturer,
unit_price=unit_price,
amount=amount,
qty=qty,
remark=remark,
operator_name=operator_name,
tenant_no=tenant_no,
user_id=user_id,
operate_time=op_time,
@@ -420,6 +500,7 @@ def batch_stock_in(
*,
items: List[Dict[str, Any]],
remark: Optional[str] = None,
operator_name: Optional[str] = None,
tenant_no: str,
user_id: Optional[str] = None,
operate_time: Optional[datetime] = None,
@@ -435,14 +516,15 @@ def batch_stock_in(
material_id = (it.get("material_id") or it.get("materialId") or "").strip()
if not material_id:
raise ValueError("请选择物资")
sno = _require_str(it.get("stock_in_no") or it.get("stockInNo"), "入库编号")
if sno in seen_nos:
raise ValueError(f"入库编号「{sno}」在本单中重复")
seen_nos.add(sno)
qty = it.get("qty")
if qty is None or Decimal(str(qty)) <= 0:
sno = _resolve_stock_in_no(
db,
tenant_no,
it.get("stock_in_no") or it.get("stockInNo"),
seen_nos=seen_nos,
)
qty_dec = _opt_stock_in_qty(it.get("qty"))
if qty_dec <= 0:
raise ValueError("入库数量必须大于0")
qty_dec = Decimal(str(qty))
line_remark = (it.get("remark") or "").strip() or shared_remark
material = _get_material_for_update(db, material_id, tenant_no)
@@ -450,15 +532,16 @@ def batch_stock_in(
db,
material=material,
stock_in_no=sno,
stock_in_date=_parse_date(it.get("stock_in_date") or it.get("stockInDate")),
expire_date=_parse_expire_date(it.get("expire_date") or it.get("expireDate")),
catalog_no=_require_str(it.get("catalog_no") or it.get("catalogNo"), "货号"),
batch_no=_require_str(it.get("batch_no") or it.get("batchNo"), "批号"),
manufacturer=_require_str(it.get("manufacturer"), "厂家"),
unit_price=_require_decimal(it.get("unit_price") or it.get("unitPrice"), "单价"),
amount=_require_decimal(it.get("amount"), "金额"),
stock_in_date=it.get("stock_in_date") or it.get("stockInDate"),
expire_date=it.get("expire_date") or it.get("expireDate"),
catalog_no=it.get("catalog_no") or it.get("catalogNo"),
batch_no=it.get("batch_no") or it.get("batchNo"),
manufacturer=it.get("manufacturer"),
unit_price=it.get("unit_price") or it.get("unitPrice"),
amount=it.get("amount"),
qty=qty_dec,
remark=line_remark,
operator_name=operator_name,
tenant_no=tenant_no,
user_id=user_id,
operate_time=op_time,
@@ -479,6 +562,7 @@ def _stock_out_batch(
receiver: Optional[str],
purpose: Optional[str],
remark: Optional[str],
operator_name: Optional[str],
usage_unit: Optional[str] = None,
tenant_no: str,
user_id: Optional[str],
@@ -539,6 +623,7 @@ def _stock_out_batch(
source_type="manual_out",
tenant_no=tenant_no,
receiver=(receiver or "").strip() or None,
operator_name=(operator_name or "").strip() or None,
purpose=(purpose or "").strip() or None,
remark=(remark or "").strip() or None,
create_by=user_id,
@@ -559,6 +644,7 @@ def batch_stock_out(
receiver: Optional[str] = None,
purpose: Optional[str] = None,
remark: Optional[str] = None,
operator_name: Optional[str] = None,
tenant_no: str,
user_id: Optional[str] = None,
operate_time: Optional[datetime] = None,
@@ -590,6 +676,7 @@ def batch_stock_out(
receiver=receiver,
purpose=purpose,
remark=line_remark,
operator_name=operator_name,
usage_unit=usage_unit,
tenant_no=tenant_no,
user_id=user_id,
@@ -621,6 +708,7 @@ def _discard_batch(
qty: Decimal,
discard_reason: str,
remark: Optional[str],
operator_name: Optional[str],
usage_unit: Optional[str] = None,
tenant_no: str,
user_id: Optional[str],
@@ -679,6 +767,7 @@ def _discard_batch(
source_type="manual_discard",
tenant_no=tenant_no,
purpose=discard_reason,
operator_name=(operator_name or "").strip() or None,
remark=(remark or "").strip() or None,
create_by=user_id,
create_dept_id=material.create_dept_id or "",
@@ -697,6 +786,7 @@ def batch_discard(
items: List[Dict[str, Any]],
discard_reason: Optional[str] = None,
remark: Optional[str] = None,
operator_name: Optional[str] = None,
tenant_no: str,
user_id: Optional[str] = None,
operate_time: Optional[datetime] = None,
@@ -730,6 +820,7 @@ def batch_discard(
qty=qty_dec,
discard_reason=reason,
remark=line_remark,
operator_name=operator_name,
usage_unit=usage_unit,
tenant_no=tenant_no,
user_id=user_id,
@@ -809,24 +900,31 @@ def update_batch(
)
if stock_in_no is not None:
sno = _require_str(stock_in_no, "入库编号")
if stock_in_no_exists(db, sno, tenant_no, exclude_id=batch_id):
raise ValueError(f"入库编号「{sno}」已存在")
batch.stock_in_no = sno
s = str(stock_in_no).strip()
if s:
if stock_in_no_exists(db, s, tenant_no, exclude_id=batch_id):
raise ValueError(f"入库编号「{s}」已存在")
batch.stock_in_no = s
if stock_in_date is not None:
batch.stock_in_date = _parse_date(stock_in_date)
s = str(stock_in_date).strip()
if s:
batch.stock_in_date = _parse_date(stock_in_date)
if expire_date is not None:
batch.expire_date = _parse_expire_date(expire_date)
s = str(expire_date).strip()
if s:
batch.expire_date = _parse_expire_date(expire_date)
else:
batch.expire_date = _SENTINEL_EXPIRE_DATE
if catalog_no is not None:
batch.catalog_no = _require_str(catalog_no, "货号")
batch.catalog_no = _opt_str(catalog_no)
if batch_no is not None:
batch.batch_no = _require_str(batch_no, "批号")
batch.batch_no = _opt_str(batch_no)
if manufacturer is not None:
batch.manufacturer = _require_str(manufacturer, "厂家")
batch.manufacturer = _opt_str(manufacturer)
if unit_price is not None:
batch.unit_price = _require_decimal(unit_price, "单价")
batch.unit_price = _opt_decimal(unit_price)
if amount is not None:
batch.amount = _require_decimal(amount, "金额")
batch.amount = _opt_decimal(amount)
if remark is not None:
batch.remark = (remark or "").strip() or None
+2
View File
@@ -144,6 +144,7 @@ def _row_to_dict(
"stockAfter": stock_after,
"receiver": receiver,
"receiverName": receiver_name or receiver,
"operatorName": (getattr(r, "operator_name", None) or "").strip(),
"purpose": purpose,
"sourceType": r.source_type or "",
"requisitionStatus": (getattr(r, "requisition_status", None) or "open").strip() or "open",
@@ -368,6 +369,7 @@ def list_stock_check_requisitions(
"taskConsumedQty": 0,
"receiver": rcv,
"receiverName": rcv_name,
"operatorName": (getattr(r, "operator_name", None) or "").strip(),
"purpose": purpose,
"useTime": use_time,
"requisitionStatus": (r.requisition_status or "open").strip() or "open",
+4 -2
View File
@@ -18,6 +18,7 @@ from app.crud.collection_protocol import (
_protocol_to_dict,
total_pages,
)
from app.utils.sample_special import sample_special_to_dict
from app.crud.research_donation import (
_collection_to_dict,
_donation_to_dict,
@@ -42,8 +43,8 @@ from app.models.research_donation import (
BizResearchDonationSampleTransport,
)
_CELL_IN_TRANSIT_EXCLUDED = ("yzf", "zky", "ygq")
_DONATION_IN_TRANSIT_EXCLUDED = ("yzf", "zckc", "ygq")
_CELL_IN_TRANSIT_EXCLUDED = ("yzf", "sdfq", "zky", "ygq")
_DONATION_IN_TRANSIT_EXCLUDED = ("yzf", "sdfq", "zckc", "ygq")
_PRE_DELIVERY_STATUSES = ("dsx", "sxz")
@@ -273,6 +274,7 @@ def _build_sample_items(
"sampleStatus": (getattr(s, "sample_status", None) or "").strip(),
"labStorageCode": lab_code_map.get(code, "") if code else "",
"transport": transport_dict,
**sample_special_to_dict(s),
}
)
return items, eta_values
+52 -14
View File
@@ -77,10 +77,10 @@ def _require_requisition_for_catalog_material(
_PROTOCOL_STATUS_LABELS = {
"dsx": "待生效", "sxz": "生效中", "ygq": "已过期", "yzf": "已作废", "zky": "转科研"
"dsx": "待生效", "sxz": "生效中", "ygq": "已过期", "yzf": "已作废", "sdfq": "属地废弃", "zky": "转科研"
}
_DONATION_STATUS_LABELS = {
"dsx": "待生效", "sxz": "生效中", "ygq": "已过期", "yzf": "已作废", "zckc": "转细胞存储"
"dsx": "待生效", "sxz": "生效中", "ygq": "已过期", "yzf": "已作废", "sdfq": "属地废弃", "zckc": "转细胞存储"
}
_RECEPTION_SOURCE_LABELS = {
"cell_storage": "细胞存储",
@@ -1352,21 +1352,35 @@ def list_production_tasks(
and w.collection_protocol_id
]
proto_status_map: Dict[str, str] = {}
proto_void_type_map: Dict[str, str] = {}
if cell_wo_ids:
for p in (
db.query(BizCollectionProtocol.id, BizCollectionProtocol.protocol_status)
db.query(
BizCollectionProtocol.id,
BizCollectionProtocol.protocol_status,
BizCollectionProtocol.void_type,
)
.filter(BizCollectionProtocol.id.in_(cell_wo_ids), BizCollectionProtocol.del_flag == 0)
.all()
):
proto_status_map[p.id] = p.protocol_status or ""
proto_void_type_map[p.id] = p.void_type or ""
donation_status_map: Dict[str, str] = {}
donation_void_type_map: Dict[str, str] = {}
if donation_wo_ids:
for d in (
db.query(BizResearchDonation.id, BizResearchDonation.donation_status)
db.query(
BizResearchDonation.id,
BizResearchDonation.donation_status,
BizResearchDonation.void_type,
)
.filter(BizResearchDonation.id.in_(donation_wo_ids), BizResearchDonation.del_flag == 0)
.all()
):
donation_status_map[d.id] = d.donation_status or ""
donation_void_type_map[d.id] = d.void_type or ""
from app.core.protocol_status_display import format_protocol_status_label
for item, row in zip(items, rows):
wo = wo_map.get(row.work_order_id)
if wo:
@@ -1378,12 +1392,20 @@ def list_production_tasks(
_source = wo.reception_source or "cell_storage"
if _source == "research_donation":
_st = donation_status_map.get(wo.collection_protocol_id, "")
_vt = donation_void_type_map.get(wo.collection_protocol_id, "")
item["protocolStatus"] = _st
item["protocolStatusLabel"] = _DONATION_STATUS_LABELS.get(_st, _st)
item["voidType"] = _vt
item["protocolStatusLabel"] = format_protocol_status_label(
_st, _vt, kind="donation", db=db, tenant_no=tenant_no
)
else:
_st = proto_status_map.get(wo.collection_protocol_id, "")
_vt = proto_void_type_map.get(wo.collection_protocol_id, "")
item["protocolStatus"] = _st
item["protocolStatusLabel"] = _PROTOCOL_STATUS_LABELS.get(_st, _st)
item["voidType"] = _vt
item["protocolStatusLabel"] = format_protocol_status_label(
_st, _vt, kind="protocol", db=db, tenant_no=tenant_no
)
else:
item["sampleCode"] = wo.sample_code or ""
_enrich_outbound_task_items(db, tenant_no, items, wo_ctx_map)
@@ -1593,19 +1615,35 @@ def get_production_task_detail(
_src = getattr(wo, "reception_source", "cell_storage") or "cell_storage"
_cpid = wo.collection_protocol_id or ""
if _src == "research_donation" and _cpid:
d = db.query(BizResearchDonation.donation_status).filter(
BizResearchDonation.id == _cpid, BizResearchDonation.del_flag == 0
).first()
d = (
db.query(BizResearchDonation.donation_status, BizResearchDonation.void_type)
.filter(BizResearchDonation.id == _cpid, BizResearchDonation.del_flag == 0)
.first()
)
_st = d.donation_status or "" if d else ""
_vt = d.void_type or "" if d else ""
result["protocolStatus"] = _st
result["protocolStatusLabel"] = _DONATION_STATUS_LABELS.get(_st, _st)
result["voidType"] = _vt
from app.core.protocol_status_display import format_protocol_status_label
result["protocolStatusLabel"] = format_protocol_status_label(
_st, _vt, kind="donation", db=db, tenant_no=tenant_no
)
elif _cpid:
p = db.query(BizCollectionProtocol.protocol_status).filter(
BizCollectionProtocol.id == _cpid, BizCollectionProtocol.del_flag == 0
).first()
p = (
db.query(BizCollectionProtocol.protocol_status, BizCollectionProtocol.void_type)
.filter(BizCollectionProtocol.id == _cpid, BizCollectionProtocol.del_flag == 0)
.first()
)
_st = p.protocol_status or "" if p else ""
_vt = p.void_type or "" if p else ""
result["protocolStatus"] = _st
result["protocolStatusLabel"] = _PROTOCOL_STATUS_LABELS.get(_st, _st)
result["voidType"] = _vt
from app.core.protocol_status_display import format_protocol_status_label
result["protocolStatusLabel"] = format_protocol_status_label(
_st, _vt, kind="protocol", db=db, tenant_no=tenant_no
)
else:
result["protocolStatus"] = ""
result["protocolStatusLabel"] = ""
@@ -9,6 +9,7 @@ from sqlalchemy import and_, or_
from sqlalchemy.orm import Session
from app.core.utils import format_date
from app.utils.sample_special import sample_special_to_dict
from app.models.models import (
BizCellSampleType,
BizCollectionHospital,
@@ -224,8 +225,7 @@ def list_protocol_sample_collections(
status = (psample.sample_status or "").strip() if psample else ""
region_id = (ci.region_id or "").strip() if ci else ""
hospital_id = (ci.hospital_id or "").strip() if ci else ""
items.append(
_row_to_dict(
item = _row_to_dict(
protocol_sample_id=psample.id,
collection_protocol_id=proto.id if proto else "",
protocol_no=(proto.protocol_no or "") if proto else "",
@@ -243,7 +243,8 @@ def list_protocol_sample_collections(
sample_collect_time=_fmt_dt(ci.sample_collect_time) if ci else "",
maternal_blood_collect_time=_fmt_dt(ci.maternal_blood_collect_time) if ci else "",
)
)
item.update(sample_special_to_dict(psample))
items.append(item)
if items and tenant_no:
from app.crud import sample_reception as reception_svc
+51 -6
View File
@@ -22,6 +22,7 @@ from app.crud.qc_work_order import (
build_work_order_list_summaries,
)
from app.core.db_collation import eq_unicode, unicode_ci
from app.utils.sample_special import apply_special_to_item_from_samples
from app.crud import qc_task_assignee as assignee_svc
from app.models.models import (
BizCollectionProtocol,
@@ -50,10 +51,10 @@ def _gen_task_no(db: Session, work_order, seq: int) -> str:
_CONCLUSION_LABELS = {"tg": "通过", "btg": "不通过"}
_PROTOCOL_STATUS_LABELS = {
"dsx": "待生效", "sxz": "生效中", "ygq": "已过期", "yzf": "已作废", "zky": "转科研"
"dsx": "待生效", "sxz": "生效中", "ygq": "已过期", "yzf": "已作废", "sdfq": "属地废弃", "zky": "转科研"
}
_DONATION_STATUS_LABELS = {
"dsx": "待生效", "sxz": "生效中", "ygq": "已过期", "yzf": "已作废", "zckc": "转细胞存储"
"dsx": "待生效", "sxz": "生效中", "ygq": "已过期", "yzf": "已作废", "sdfq": "属地废弃", "zckc": "转细胞存储"
}
@@ -166,6 +167,9 @@ _WORK_ORDER_SUMMARY_COPY_KEYS = (
"bizTypeLabel",
"motherName",
"newbornName",
"isSpecial",
"specialRemark",
"unfinishedBadgeCount",
)
@@ -186,6 +190,8 @@ def _merge_work_order_summary_into_task(item: Dict[str, Any], summary: Dict[str,
"protocolStatusLabel",
"motherName",
"newbornName",
"isSpecial",
"specialRemark",
):
if not item.get(key) and summary.get(key):
item[key] = summary[key]
@@ -273,21 +279,40 @@ def _enrich_tasks_reception_fields(
if (rec.reception_source or "") == "research_donation" and rec.research_donation_id
]
proto_status_map: Dict[str, str] = {}
proto_void_type_map: Dict[str, str] = {}
tenant_no_for_status = ""
if cell_proto_ids:
for p in (
db.query(BizCollectionProtocol.id, BizCollectionProtocol.protocol_status)
db.query(
BizCollectionProtocol.id,
BizCollectionProtocol.protocol_status,
BizCollectionProtocol.void_type,
BizCollectionProtocol.tenant_no,
)
.filter(BizCollectionProtocol.id.in_(cell_proto_ids), BizCollectionProtocol.del_flag == 0)
.all()
):
proto_status_map[p.id] = p.protocol_status or ""
proto_void_type_map[p.id] = p.void_type or ""
if not tenant_no_for_status and (p.tenant_no or "").strip():
tenant_no_for_status = (p.tenant_no or "").strip()
donation_status_map: Dict[str, str] = {}
donation_void_type_map: Dict[str, str] = {}
if donation_ids:
for d in (
db.query(BizResearchDonation.id, BizResearchDonation.donation_status)
db.query(
BizResearchDonation.id,
BizResearchDonation.donation_status,
BizResearchDonation.void_type,
BizResearchDonation.tenant_no,
)
.filter(BizResearchDonation.id.in_(donation_ids), BizResearchDonation.del_flag == 0)
.all()
):
donation_status_map[d.id] = d.donation_status or ""
donation_void_type_map[d.id] = d.void_type or ""
if not tenant_no_for_status and (d.tenant_no or "").strip():
tenant_no_for_status = (d.tenant_no or "").strip()
for item in items:
if item.get("orderSource") in ("temporary", "outbound"):
item.setdefault("receptionSource", "")
@@ -309,13 +334,33 @@ def _enrich_tasks_reception_fields(
if source == "research_donation":
_did = rec.research_donation_id if rec else ""
_st = donation_status_map.get(_did or "", "")
_vt = donation_void_type_map.get(_did or "", "")
item["protocolStatus"] = _st
item["protocolStatusLabel"] = _DONATION_STATUS_LABELS.get(_st, _st)
item["voidType"] = _vt
from app.core.protocol_status_display import format_protocol_status_label
item["protocolStatusLabel"] = format_protocol_status_label(
_st, _vt, kind="donation", db=db, tenant_no=tenant_no_for_status or None
)
else:
_pid = rec.collection_protocol_id if rec else ""
_st = proto_status_map.get(_pid or "", "")
_vt = proto_void_type_map.get(_pid or "", "")
item["protocolStatus"] = _st
item["protocolStatusLabel"] = _PROTOCOL_STATUS_LABELS.get(_st, _st)
item["voidType"] = _vt
from app.core.protocol_status_display import format_protocol_status_label
item["protocolStatusLabel"] = format_protocol_status_label(
_st, _vt, kind="protocol", db=db, tenant_no=tenant_no_for_status or None
)
apply_special_to_item_from_samples(
item,
source=source,
protocol_sample_id=rec.protocol_sample_id or "",
donation_sample_id=rec.donation_sample_id or "",
protocol_samples=protocol_samples,
donation_samples=donation_samples,
)
return items
+213 -6
View File
@@ -17,6 +17,7 @@ from app.crud import qc_task_assignee as assignee_svc
from app.crud import qc_third_party_item as third_item_svc
from app.crud.qc_third_party_company import get_company
from app.crud.collection_protocol import urls_to_attachment_list
from app.utils.sample_special import apply_special_to_item_from_samples
from app.crud import sample_reception as sample_reception_svc
from app.crud.sample_reception import _donation_sample_id_col
from app.crud import sample_reception_check_result as check_result_svc
@@ -78,10 +79,10 @@ _VALID_QC_WORK_ORDER_STATUSES = frozenset(_WORK_ORDER_STATUS_LABELS.keys())
_TASK_TYPE_LABELS = {"sysz": "实验室自检", "dsfjc": "第三方检测"}
_TASK_STATUS_LABELS = {"dzx": "待执行", "jxz": "进行中", "ywc": "已完成"}
_PROTOCOL_STATUS_LABELS = {
"dsx": "待生效", "sxz": "生效中", "ygq": "已过期", "yzf": "已作废", "zky": "转科研"
"dsx": "待生效", "sxz": "生效中", "ygq": "已过期", "yzf": "已作废", "sdfq": "属地废弃", "zky": "转科研"
}
_DONATION_STATUS_LABELS = {
"dsx": "待生效", "sxz": "生效中", "ygq": "已过期", "yzf": "已作废", "zckc": "转细胞存储"
"dsx": "待生效", "sxz": "生效中", "ygq": "已过期", "yzf": "已作废", "sdfq": "属地废弃", "zckc": "转细胞存储"
}
_CONCLUSION_LABELS = {"tg": "通过", "btg": "不通过"}
_OUTBOUND_BIZ_TYPE_LABELS = {
@@ -676,21 +677,40 @@ def _enrich_work_order_list_items(
)
type_map = _load_sample_type_name_map(db, type_ids)
proto_status_map: Dict[str, str] = {}
proto_void_type_map: Dict[str, str] = {}
tenant_no_for_status = ""
if cell_proto_ids:
for p in (
db.query(BizCollectionProtocol.id, BizCollectionProtocol.protocol_status)
db.query(
BizCollectionProtocol.id,
BizCollectionProtocol.protocol_status,
BizCollectionProtocol.void_type,
BizCollectionProtocol.tenant_no,
)
.filter(BizCollectionProtocol.id.in_(cell_proto_ids), BizCollectionProtocol.del_flag == 0)
.all()
):
proto_status_map[p.id] = p.protocol_status or ""
proto_void_type_map[p.id] = p.void_type or ""
if not tenant_no_for_status and (p.tenant_no or "").strip():
tenant_no_for_status = (p.tenant_no or "").strip()
donation_status_map: Dict[str, str] = {}
donation_void_type_map: Dict[str, str] = {}
if donation_ids:
for d in (
db.query(BizResearchDonation.id, BizResearchDonation.donation_status)
db.query(
BizResearchDonation.id,
BizResearchDonation.donation_status,
BizResearchDonation.void_type,
BizResearchDonation.tenant_no,
)
.filter(BizResearchDonation.id.in_(donation_ids), BizResearchDonation.del_flag == 0)
.all()
):
donation_status_map[d.id] = d.donation_status or ""
donation_void_type_map[d.id] = d.void_type or ""
if not tenant_no_for_status and (d.tenant_no or "").strip():
tenant_no_for_status = (d.tenant_no or "").strip()
cell_party_map: Dict[str, Tuple[str, str]] = {}
if cell_proto_ids:
for party in (
@@ -761,22 +781,42 @@ def _enrich_work_order_list_items(
protocol_samples=protocol_samples,
donation_samples=donation_samples,
)
apply_special_to_item_from_samples(
item,
source=source,
protocol_sample_id=_effective_protocol_sample_id(item, rec),
donation_sample_id=_effective_donation_sample_id(item, rec),
protocol_samples=protocol_samples,
donation_samples=donation_samples,
)
if source == "research_donation":
_did = (
(getattr(rec, "research_donation_id", None) or "").strip()
or (item.get("collectionProtocolId") or "").strip()
)
_st = donation_status_map.get(_did or "", "")
_vt = donation_void_type_map.get(_did or "", "")
item["protocolStatus"] = _st
item["protocolStatusLabel"] = _DONATION_STATUS_LABELS.get(_st, _st)
item["voidType"] = _vt
from app.core.protocol_status_display import format_protocol_status_label
item["protocolStatusLabel"] = format_protocol_status_label(
_st, _vt, kind="donation", db=db, tenant_no=tenant_no_for_status or None
)
else:
_pid = (
(getattr(rec, "collection_protocol_id", None) or "").strip()
or (item.get("collectionProtocolId") or "").strip()
)
_st = proto_status_map.get(_pid or "", "")
_vt = proto_void_type_map.get(_pid or "", "")
item["protocolStatus"] = _st
item["protocolStatusLabel"] = _PROTOCOL_STATUS_LABELS.get(_st, _st)
item["voidType"] = _vt
from app.core.protocol_status_display import format_protocol_status_label
item["protocolStatusLabel"] = format_protocol_status_label(
_st, _vt, kind="protocol", db=db, tenant_no=tenant_no_for_status or None
)
return items
@@ -1471,6 +1511,7 @@ def list_work_orders(
items = _enrich_production_work_order_refs(db, items)
items = _enrich_outbound_work_orders(db, tenant_no, items)
items = enrich_work_order_fee_summaries(db, items, tenant_no)
items = _enrich_unfinished_badge_counts(db, items)
return items, int(total)
@@ -1494,6 +1535,7 @@ def build_work_order_list_summaries(
items = _enrich_production_work_order_refs(db, items)
items = _enrich_outbound_work_orders(db, tenant_no, items)
items = enrich_work_order_fee_summaries(db, items, tenant_no)
items = _enrich_unfinished_badge_counts(db, items)
return {item["id"]: item for item in items if item.get("id")}
@@ -1540,6 +1582,42 @@ def _unfinished_work_order_filter(q):
)
def _enrich_unfinished_badge_counts(
db: Session, items: List[Dict[str, Any]]
) -> List[Dict[str, Any]]:
"""列表项补充未完成卡片角标:待配置=1,已配置=未完成质检任务数(至少 1)。"""
if not items:
return items
unfinished_ids = [
x["id"]
for x in items
if (x.get("id") or "").strip() and x.get("workOrderStatus") in ("dpz", "ypz")
]
task_counts: Dict[str, int] = {}
if unfinished_ids:
rows = (
db.query(BizQcTask.work_order_id, func.count(BizQcTask.id))
.filter(
BizQcTask.del_flag == 0,
BizQcTask.work_order_id.in_(unfinished_ids),
BizQcTask.task_status.notin_(("ywc", "yzf")),
)
.group_by(BizQcTask.work_order_id)
.all()
)
task_counts = {wo_id: int(cnt or 0) for wo_id, cnt in rows}
for item in items:
status = item.get("workOrderStatus") or ""
if status == "dpz":
item["unfinishedBadgeCount"] = 1
elif status == "ypz":
pending = task_counts.get(item.get("id") or "", 0)
item["unfinishedBadgeCount"] = max(pending, 1)
else:
item["unfinishedBadgeCount"] = 0
return items
def _aggregate_qc_tab_counts(rows) -> Dict[str, int]:
counts = _empty_qc_tab_counts()
for wo_type, rs, bt, cnt in rows:
@@ -1930,6 +2008,130 @@ def list_process_qc_info_for_schedule(
return _process_qc_info_items_from_wos(db, wos, tenant_no)
def list_process_qc_info_for_production_work_order(
db: Session,
*,
production_work_order_id: str,
tenant_no: str,
) -> List[Dict[str, Any]]:
"""按生产工单返回生产过程派发的质检工单摘要。"""
pid = (production_work_order_id or "").strip()
if not pid or not tenant_no:
return []
wos = (
db.query(BizQcWorkOrder)
.filter(
BizQcWorkOrder.tenant_no == tenant_no,
BizQcWorkOrder.del_flag == 0,
BizQcWorkOrder.production_work_order_id == pid,
BizQcWorkOrder.trigger_source == "production",
)
.order_by(BizQcWorkOrder.create_time.asc())
.all()
)
return _process_qc_info_items_from_wos(db, wos, tenant_no)
def _gate_qc_info_for_inbound_production_work_order(
db: Session, pwo, tenant_no: str
) -> Optional[Dict[str, Any]]:
"""入库生产工单关联的样本接收质检(trigger_source=reception)。"""
from app.models.models import BizProductionWorkOrder
if not isinstance(pwo, BizProductionWorkOrder):
return None
source = (getattr(pwo, "reception_source", None) or "cell_storage").strip()
if source not in ("cell_storage", "research_donation"):
return None
q = db.query(BizQcWorkOrder).filter(
BizQcWorkOrder.tenant_no == tenant_no,
BizQcWorkOrder.del_flag == 0,
BizQcWorkOrder.trigger_source == "reception",
)
wo = None
if source == "cell_storage":
code = (pwo.sample_code or "").strip()
if code:
wo = q.filter(
BizQcWorkOrder.reception_source == "cell_storage",
BizQcWorkOrder.sample_code == code,
).first()
else:
psid = (pwo.protocol_sample_id or "").strip()
if psid:
wo = q.filter(BizQcWorkOrder.protocol_sample_id == psid).first()
if not wo:
code = (pwo.sample_code or "").strip()
if code:
wo = q.filter(BizQcWorkOrder.sample_code == code).first()
if not wo and pwo.reception_id:
wo = q.filter(BizQcWorkOrder.reception_id == pwo.reception_id).first()
if not wo:
return None
return _qc_info_item(db, wo, tenant_no)
def get_production_work_order_qc_info(
db: Session,
*,
production_work_order_id: str,
tenant_no: str,
) -> Dict[str, Any]:
"""生产工单质检只读摘要:入库含样本接收质检 + 本工单派发的生产过程质检。"""
from app.models.models import BizProductionWorkOrder, BizSampleReception
pid = (production_work_order_id or "").strip()
if not pid or not tenant_no:
raise ValueError("生产工单不存在")
pwo = (
db.query(BizProductionWorkOrder)
.filter(
BizProductionWorkOrder.id == pid,
BizProductionWorkOrder.tenant_no == tenant_no,
BizProductionWorkOrder.del_flag == 0,
)
.first()
)
if not pwo:
raise ValueError("生产工单不存在")
wo_type = (getattr(pwo, "work_order_type", None) or "inbound").strip()
reception_source = (getattr(pwo, "reception_source", None) or "cell_storage").strip()
show_gate_section = (
wo_type == "inbound"
and reception_source in ("cell_storage", "research_donation")
)
gate_qc_info = None
sample_reception = None
if show_gate_section:
gate_qc_info = _gate_qc_info_for_inbound_production_work_order(db, pwo, tenant_no)
rec = None
if pwo.reception_id:
rec = (
db.query(BizSampleReception)
.filter(
BizSampleReception.id == pwo.reception_id,
BizSampleReception.del_flag == 0,
)
.first()
)
if rec:
sample_reception = {"acceptConclusion": rec.accept_conclusion or ""}
process_qc_info_list = list_process_qc_info_for_production_work_order(
db, production_work_order_id=pwo.id, tenant_no=tenant_no
)
return {
"showGateSection": show_gate_section,
"gateQcInfo": gate_qc_info,
"processQcInfoList": process_qc_info_list,
"sampleReception": sample_reception,
}
def _resolve_reception_id_for_work_order_detail(
db: Session, wo: BizQcWorkOrder, tenant_no: str
) -> Optional[str]:
@@ -1965,11 +2167,16 @@ def get_work_order_detail(
enriched = enriched_list[0]
out.update(
{
"receptionSource": enriched.get("receptionSource", out.get("receptionSource", "")),
"receptionTime": enriched.get("receptionTime", ""),
"handlerName": enriched.get("handlerName", ""),
"labStorageCode": enriched.get("labStorageCode", ""),
"sampleTypeName": enriched.get("sampleTypeName", ""),
"receptionSourceLabel": enriched.get("receptionSourceLabel", ""),
"motherName": enriched.get("motherName", ""),
"newbornName": enriched.get("newbornName", ""),
"protocolStatus": enriched.get("protocolStatus", ""),
"protocolStatusLabel": enriched.get("protocolStatusLabel", ""),
"cellProductCode": enriched.get("cellProductCode", ""),
"cellProductName": enriched.get("cellProductName", ""),
"cellProductTypeName": enriched.get("cellProductTypeName", ""),
+33 -5
View File
@@ -27,6 +27,11 @@ from app.crud.protocol_donation_convert import (
has_active_convert_link,
upsert_convert_link_for_to_storage,
)
from app.utils.sample_special import (
apply_sample_special_fields,
sample_special_to_dict,
validate_sample_special_raw,
)
from app.models.models import (
BizCollectionProtocol,
BizCollectionRegion,
@@ -66,7 +71,7 @@ _DONATION_SAMPLE_CODE_SEQ_LEN = 4
def _donation_sample_code_seq(code: str, *, date_str: str) -> Optional[int]:
"""解析 KYJZ+YYYYMMDD+序号 中的序号;不匹配则返回 None。"""
"""解析 KYJZ+YYYYMM+序号 中的序号;不匹配则返回 None。"""
prefix = f"{_DONATION_SAMPLE_CODE_PREFIX}{date_str}"
c = (code or "").strip()
if not c.startswith(prefix):
@@ -83,8 +88,8 @@ def next_donation_sample_code(
tenant_no: str,
extra_codes: Optional[List[str]] = None,
) -> str:
"""生成捐赠样本编码:KYJZ + YYYYMMDD + 4 位递增序号(0001 起)。"""
date_str = datetime.now().strftime("%Y%m%d")
"""生成捐赠样本编码:KYJZ + YYYYMM + 4 位递增序号(0001 起)。"""
date_str = datetime.now().strftime("%Y%m")
prefix = f"{_DONATION_SAMPLE_CODE_PREFIX}{date_str}"
max_seq = 0
@@ -265,6 +270,7 @@ def _donation_to_dict(
"expireDesc": d.expire_desc or "",
"voidTime": _fmt_dt(d.void_time),
"voidDesc": d.void_desc or "",
"voidType": d.void_type or "",
"toStorageTime": _fmt_dt(d.to_storage_time),
"toStorageDesc": d.to_storage_desc or "",
"tenantNo": d.tenant_no,
@@ -364,6 +370,7 @@ def _sample_to_dict(s: BizResearchDonationSample) -> Dict[str, Any]:
"detectStartDate": (s.detect_start_date or "").strip() if s.detect_start_date else "",
"voidDate": (s.void_date or "").strip() if s.void_date else "",
"storageExpireDate": (s.storage_expire_date or "").strip() if s.storage_expire_date else "",
**sample_special_to_dict(s),
"tenantNo": s.tenant_no,
"orderNum": s.order_num if s.order_num is not None else 0,
"remark": s.remark or "",
@@ -698,6 +705,7 @@ def list_donations(
donation_samples = sample_map.get(r.id, [])
type_names: List[str] = []
codes: List[str] = []
sample_items: List[Dict[str, Any]] = []
for s in donation_samples:
type_name = sample_type_name_map.get(s.sample_type_id or "", "")
if type_name:
@@ -705,6 +713,16 @@ def list_donations(
code = (s.sample_code or "").strip()
if code:
codes.append(code)
sample_items.append(
{
"sampleTypeName": type_name,
"sampleCode": code,
"sampleStatus": (s.sample_status or "").strip(),
"labStorageCode": lab_code_map.get(code, "") if code else "",
**sample_special_to_dict(s),
}
)
d["sampleItems"] = sample_items
d["sampleTypeNames"] = ",".join(type_names)
d["sampleCodes"] = ",".join(codes)
d["labStorageCodes"] = ",".join((lab_code_map.get(c) or "") for c in codes)
@@ -1239,8 +1257,8 @@ def submit_audit(
# 合法状态转换: {当前状态: {可转状态列表}}
_VALID_TRANSITIONS: Dict[str, List[str]] = {
"dsx": ["sxz", "yzf"],
"sxz": ["ygq", "yzf", "zckc"],
"dsx": ["sxz", "yzf", "sdfq"],
"sxz": ["ygq", "yzf", "zckc", "sdfq"],
}
@@ -1251,6 +1269,7 @@ def change_status(
new_status: str,
desc: Optional[str] = None,
time_val: Optional[Any] = None,
void_type: Optional[str] = None,
user_id: Optional[str] = None,
tenant_no: str = "",
) -> BizResearchDonation:
@@ -1293,6 +1312,9 @@ def change_status(
elif ns == "yzf":
obj.void_time = effective_time
obj.void_desc = (desc or "").strip() or None
from app.crud.dict_data import normalize_void_type
obj.void_type = normalize_void_type(db, value=void_type or "", tenant_no=tenant_no)
elif ns == "ygq":
obj.expire_time = effective_time
obj.expire_desc = (desc or "").strip() or None
@@ -1493,6 +1515,8 @@ def convert_from_storage(
detect_start_date=ss.detect_start_date,
void_date=ss.void_date,
storage_expire_date=ss.storage_expire_date,
is_special=getattr(ss, "is_special", 0),
special_remark=getattr(ss, "special_remark", None),
tenant_no=tenant_no,
order_num=idx,
create_by=user_id,
@@ -1735,6 +1759,8 @@ def convert_to_storage(
detect_start_date=ss.detect_start_date,
void_date=ss.void_date,
storage_expire_date=ss.storage_expire_date,
is_special=ss.is_special,
special_remark=ss.special_remark,
tenant_no=tenant_no,
order_num=idx,
create_by=user_id,
@@ -1979,6 +2005,7 @@ def _create_samples(
assigned_codes: List[str] = []
for idx, raw_item in enumerate(samples or []):
raw = _normalize_fields(raw_item)
validate_sample_special_raw(raw, index=idx)
code = (raw.get("sample_code") or "").strip()
if not code and (raw.get("sample_type_id") or "").strip():
code = next_donation_sample_code(
@@ -2020,6 +2047,7 @@ def _create_samples(
for k in _SAMPLE_INT_FIELDS:
if k in raw:
setattr(obj, k, raw[k])
apply_sample_special_fields(obj, raw)
db.add(obj)
db.flush()
result.append(obj)
@@ -9,6 +9,7 @@ from sqlalchemy import and_, or_
from sqlalchemy.orm import Session
from app.core.utils import format_date
from app.utils.sample_special import sample_special_to_dict
from app.models.models import (
BizCellSampleType,
BizCollectionHospital,
@@ -226,8 +227,7 @@ def list_donation_sample_collections(
status = (dsample.sample_status or "").strip() if dsample else ""
region_id = (ci.region_id or "").strip() if ci else ""
hospital_id = (ci.hospital_id or "").strip() if ci else ""
items.append(
_row_to_dict(
item = _row_to_dict(
donation_sample_id=dsample.id,
research_donation_id=donation.id if donation else "",
donation_no=(donation.donation_no or "") if donation else "",
@@ -245,7 +245,8 @@ def list_donation_sample_collections(
sample_collect_time=_fmt_dt(ci.sample_collect_time) if ci else "",
maternal_blood_collect_time=_fmt_dt(ci.maternal_blood_collect_time) if ci else "",
)
)
item.update(sample_special_to_dict(dsample))
items.append(item)
if items and tenant_no:
from app.crud import sample_reception as reception_svc
+7 -4
View File
@@ -9,6 +9,7 @@ from sqlalchemy.orm import Session
from app.core.utils import generate_uuid
from app.crud.collection_protocol import urls_to_attachment_list
from app.utils.sample_special import sample_special_to_dict
from app.crud import sample_reception_check_result as check_result_svc
from app.crud import sample_production_reception as prod_reception_svc
from app.models.models import (
@@ -36,8 +37,8 @@ SAMPLE_RECEPTION_EDIT_ROLE = "质量主管"
# 科研捐赠表默认 general_ci,样本接收等为 unicode_ci,跨表比较需统一
_UNICODE_CI = "utf8mb4_unicode_ci"
# 协议/捐赠单已作废时不需样本接收
_VOIDED_PROTOCOL_STATUS = "yzf"
# 协议/捐赠单已作废或属地废弃时不需样本接收
_INACTIVE_PROTOCOL_STATUSES = ("yzf", "sdfq")
def _donation_sample_id_col(col):
@@ -172,7 +173,7 @@ def _donation_sample_pending_query(db: Session, tenant_no: str, keyword: Optiona
BizResearchDonationSample.del_flag == 0,
BizResearchDonationSample.tenant_no == tenant_no,
BizResearchDonation.tenant_no == tenant_no,
BizResearchDonation.donation_status != _VOIDED_PROTOCOL_STATUS,
BizResearchDonation.donation_status.notin_(_INACTIVE_PROTOCOL_STATUSES),
~received_exists,
)
if keyword and keyword.strip():
@@ -285,6 +286,7 @@ def _donation_rows_to_sample_list_items(
),
"carrierName": (transport.carrier_name if transport else "") or "",
"carrierPhone": (transport.carrier_phone if transport else "") or "",
**sample_special_to_dict(sample),
}
if reception_map and sample.id in reception_map:
rec = reception_map[sample.id]
@@ -324,7 +326,7 @@ def _sample_pending_query(db: Session, tenant_no: str, keyword: Optional[str] =
BizProtocolSample.del_flag == 0,
BizProtocolSample.tenant_no == tenant_no,
BizCollectionProtocol.tenant_no == tenant_no,
BizCollectionProtocol.protocol_status != _VOIDED_PROTOCOL_STATUS,
BizCollectionProtocol.protocol_status.notin_(_INACTIVE_PROTOCOL_STATUSES),
~received_exists,
)
if keyword and keyword.strip():
@@ -444,6 +446,7 @@ def _rows_to_sample_list_items(
),
"carrierName": (transport.carrier_name if transport else "") or "",
"carrierPhone": (transport.carrier_phone if transport else "") or "",
**sample_special_to_dict(sample),
"sourceType": "cell_storage",
"sourceTypeLabel": "细胞存储",
"paymentSummary": payment_summary_map.get(protocol.id) if protocol else None,
+19 -2
View File
@@ -8,6 +8,7 @@ from sqlalchemy import func, or_
from sqlalchemy.orm import Session
from app.core.utils import generate_uuid
from app.utils.sample_special import sample_special_to_dict
from app.models.models import (
BizCollectionProtocol,
BizProductionWorkOrder,
@@ -37,6 +38,7 @@ _PROTOCOL_STATUS_LABELS = {
"sxz": "生效中",
"ygq": "已过期",
"yzf": "已作废",
"sdfq": "属地废弃",
"zky": "转科研",
}
_DONATION_STATUS_LABELS = {
@@ -44,6 +46,7 @@ _DONATION_STATUS_LABELS = {
"sxz": "生效中",
"ygq": "已过期",
"yzf": "已作废",
"sdfq": "属地废弃",
"zckc": "转细胞存储",
}
def _fmt_dt(t: Optional[datetime]) -> str:
@@ -255,15 +258,27 @@ def _enrich_review_list_items(db: Session, items: List[Dict[str, Any]]) -> List[
donation = donation_map.get(pid)
if donation:
st = donation.donation_status or ""
vt = donation.void_type or ""
item["protocolStatus"] = st
item["protocolStatusLabel"] = _DONATION_STATUS_LABELS.get(st, st)
item["voidType"] = vt
from app.core.protocol_status_display import format_protocol_status_label
item["protocolStatusLabel"] = format_protocol_status_label(
st, vt, kind="donation", db=db, tenant_no=donation.tenant_no
)
item["motherName"] = dparty_map.get(pid, "")
else:
proto = proto_map.get(pid)
if proto:
st = getattr(proto, "protocol_status", "") or ""
vt = getattr(proto, "void_type", "") or ""
item["protocolStatus"] = st
item["protocolStatusLabel"] = _PROTOCOL_STATUS_LABELS.get(st, st)
item["voidType"] = vt
from app.core.protocol_status_display import format_protocol_status_label
item["protocolStatusLabel"] = format_protocol_status_label(
st, vt, kind="protocol", db=db, tenant_no=proto.tenant_no
)
item["motherName"] = party_map.get(pid, "")
return items
@@ -385,6 +400,7 @@ def _build_cell_storage_protocol_info(db: Session, rev: BizStorageReleaseReview)
info["sampleTypeName"] = type_map.get(sample.sample_type_id or "", "")
info["collectAmount"] = float(sample.collect_amount) if sample.collect_amount else None
info["storageYears"] = sample.storage_years
info.update(sample_special_to_dict(sample))
if party:
info["motherName"] = party.mother_name or ""
info["motherPhone"] = party.mother_phone or ""
@@ -442,6 +458,7 @@ def _build_research_donation_protocol_info(db: Session, rev: BizStorageReleaseRe
info["sampleTypeName"] = type_map.get(dsample.sample_type_id or "", "")
info["collectAmount"] = float(dsample.collect_amount) if dsample.collect_amount else None
info["storageYears"] = dsample.storage_years
info.update(sample_special_to_dict(dsample))
if party:
info["motherName"] = party.mother_name or ""
info["motherPhone"] = party.mother_phone or ""
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_qc_work_order_py", "label": "qc_work_order.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L1"}, {"id": "crud_qc_work_order_resolve_outbound_biz_type_for_schedule", "label": "resolve_outbound_biz_type_for_schedule()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L96"}, {"id": "crud_qc_work_order_dec", "label": "_dec()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L137"}, {"id": "crud_qc_work_order_fmt_dt", "label": "_fmt_dt()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L143"}, {"id": "crud_qc_work_order_normalize_date_bound", "label": "_normalize_date_bound()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L147"}, {"id": "crud_qc_work_order_reception_source_label", "label": "_reception_source_label()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L154"}, {"id": "crud_qc_work_order_qc_biz_type_label", "label": "_qc_biz_type_label()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L159"}, {"id": "crud_qc_work_order_work_order_qc_biz_type", "label": "_work_order_qc_biz_type()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L164"}, {"id": "crud_qc_work_order_validate_cell_product_id", "label": "_validate_cell_product_id()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L171"}, {"id": "crud_qc_work_order_enrich_work_order_cell_products", "label": "_enrich_work_order_cell_products()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L183"}, {"id": "crud_qc_work_order_enrich_work_order_step_outputs", "label": "_enrich_work_order_step_outputs()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L212"}, {"id": "crud_qc_work_order_enrich_work_order_qc_targets", "label": "_enrich_work_order_qc_targets()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L251"}, {"id": "crud_qc_work_order_enrich_outbound_work_orders", "label": "_enrich_outbound_work_orders()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L258"}, {"id": "crud_qc_work_order_outbound_qc_work_order_ids_by_keyword", "label": "_outbound_qc_work_order_ids_by_keyword()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L379"}, {"id": "crud_qc_work_order_inbound_qc_work_order_ids_by_mother_name", "label": "_inbound_qc_work_order_ids_by_mother_name()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L426"}, {"id": "crud_qc_work_order_accept_conclusion_label", "label": "_accept_conclusion_label()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L492"}, {"id": "crud_qc_work_order_load_sample_type_name_map", "label": "_load_sample_type_name_map()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L497"}, {"id": "crud_qc_work_order_effective_reception_source", "label": "_effective_reception_source()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L509"}, {"id": "crud_qc_work_order_effective_donation_sample_id", "label": "_effective_donation_sample_id()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L518"}, {"id": "crud_qc_work_order_effective_protocol_sample_id", "label": "_effective_protocol_sample_id()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L527"}, {"id": "crud_qc_work_order_sample_type_name_for_item", "label": "_sample_type_name_for_item()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L535"}, {"id": "crud_qc_work_order_sample_type_name_for_reception", "label": "_sample_type_name_for_reception()", "file_type": "code", "source_file": "/Users/wuzLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_dict_data_py", "label": "dict_data.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/dict_data.py", "source_location": "L1"}, {"id": "crud_dict_data_row_to_dict", "label": "_row_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/dict_data.py", "source_location": "L15"}, {"id": "crud_dict_data_list_dict_data", "label": "list_dict_data()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/dict_data.py", "source_location": "L29"}, {"id": "crud_dict_data_get_dict_data", "label": "get_dict_data()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/dict_data.py", "source_location": "L67"}, {"id": "crud_dict_data_create_dict_data", "label": "create_dict_data()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/dict_data.py", "source_location": "L75"}, {"id": "crud_dict_data_update_dict_data", "label": "update_dict_data()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/dict_data.py", "source_location": "L107"}, {"id": "crud_dict_data_soft_delete_dict_data", "label": "soft_delete_dict_data()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/dict_data.py", "source_location": "L136"}, {"id": "crud_dict_data_list_dict_data_options", "label": "list_dict_data_options()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/dict_data.py", "source_location": "L150"}, {"id": "crud_dict_data_is_dict_value_valid", "label": "is_dict_value_valid()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/dict_data.py", "source_location": "L162"}, {"id": "crud_dict_data_normalize_transfer_type", "label": "normalize_transfer_type()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/dict_data.py", "source_location": "L184"}, {"id": "crud_dict_data_normalize_void_type", "label": "normalize_void_type()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/dict_data.py", "source_location": "L200"}, {"id": "crud_dict_data_total_pages", "label": "total_pages()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/dict_data.py", "source_location": "L216"}, {"id": "crud_dict_data_rationale_1", "label": "\u5b57\u5178\u6570\u636e CRUD\uff08sys_dict_data\uff09", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/dict_data.py", "source_location": "L1"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_dict_data_py", "target": "math", "relation": "imports", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/dict_data.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_dict_data_py", "target": "datetime", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/dict_data.py", "source_location": "L5", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_dict_data_py", "target": "typing", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/dict_data.py", "source_location": "L6", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_dict_data_py", "target": "sqlalchemy", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/dict_data.py", "source_location": "L8", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_dict_data_py", "target": "sqlalchemy_orm", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/dict_data.py", "source_location": "L9", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_dict_data_py", "target": "app_core_utils", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/dict_data.py", "source_location": "L11", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_dict_data_py", "target": "app_models_models", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/dict_data.py", "source_location": "L12", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_dict_data_py", "target": "crud_dict_data_row_to_dict", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/dict_data.py", "source_location": "L15", "weight": 1.0}, {"source": "users_wuzilong_work_00codeLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_models_models_py", "label": "models.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L1"}, {"id": "models_models_userrole", "label": "UserRole", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L10"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "models_models_sysuser", "label": "SysUser", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L22"}, {"id": "base", "label": "Base", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "models_models_sysrole", "label": "SysRole", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L48"}, {"id": "models_models_sysuserrole", "label": "SysUserRole", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L68"}, {"id": "models_models_sysrolemenu", "label": "SysRoleMenu", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L87"}, {"id": "models_models_sysroledatascopedetail", "label": "SysRoleDataScopeDetail", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L106"}, {"id": "models_models_sysmenu", "label": "SysMenu", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L126"}, {"id": "models_models_sysdept", "label": "SysDept", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L152"}, {"id": "models_models_systenant", "label": "SysTenant", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L175"}, {"id": "models_models_syssite", "label": "SysSite", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L195"}, {"id": "models_models_syspost", "label": "SysPost", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L221"}, {"id": "models_models_sysuserpost", "label": "SysUserPost", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L241"}, {"id": "models_models_bizitemunit", "label": "BizItemUnit", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L260"}, {"id": "models_models_bizexpresscompany", "label": "BizExpressCompany", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L279"}, {"id": "models_models_bizcustomer", "label": "BizCustomer", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L299"}, {"id": "models_models_bizcellsampletype", "label": "BizCellSampleType", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L322"}, {"id": "models_models_bizcollectionregion", "label": "BizCollectionRegion", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L345"}, {"id": "models_models_bizcollectionhospital", "label": "BizCollectionHospital", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L363"}, {"id": "models_models_bizcollectionprotocolno", "label": "BizCollectionProtocolNo", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L382"}, {"id": "models_models_bizbiznosequence", "label": "BizBizNoSequence", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L404"}, {"id": "models_models_bizsamplecode", "label": "BizSampleCode", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L424"}, {"id": "models_models_sysdicttype", "label": "SysDictType", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L452"}, {"id": "models_models_sysethnic", "label": "SysEthnic", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L471"}, {"id": "models_models_sysdictdata", "label": "SysDictData", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location"Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_pre_transit_sample_py", "label": "pre_transit_sample.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L1"}, {"id": "crud_pre_transit_sample_is_uncollected_status", "label": "_is_uncollected_status()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L51"}, {"id": "crud_pre_transit_sample_is_in_transit_sample", "label": "_is_in_transit_sample()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L55"}, {"id": "crud_pre_transit_sample_cell_received_exists", "label": "_cell_received_exists()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L59"}, {"id": "crud_pre_transit_sample_donation_received_exists", "label": "_donation_received_exists()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L76"}, {"id": "crud_pre_transit_sample_apply_collection_keyword", "label": "_apply_collection_keyword()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L93"}, {"id": "crud_pre_transit_sample_apply_donation_keyword", "label": "_apply_donation_keyword()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L129"}, {"id": "crud_pre_transit_sample_apply_create_time_filter", "label": "_apply_create_time_filter()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L165"}, {"id": "crud_pre_transit_sample_apply_collection_sample_collect_time_filter", "label": "_apply_collection_sample_collect_time_filter()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L173"}, {"id": "crud_pre_transit_sample_apply_donation_sample_collect_time_filter", "label": "_apply_donation_sample_collect_time_filter()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L200"}, {"id": "crud_pre_transit_sample_earliest_eta", "label": "_earliest_eta()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L227"}, {"id": "crud_pre_transit_sample_build_sample_items", "label": "_build_sample_items()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L234"}, {"id": "crud_pre_transit_sample_summarize_in_transit_items", "label": "_summarize_in_transit_items()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L283"}, {"id": "crud_pre_transit_sample_summarize_pre_delivery", "label": "_summarize_pre_delivery()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L290"}, {"id": "crud_pre_transit_sample_list_in_transit_collection_ids", "label": "_list_in_transit_collection_ids()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L297"}, {"id": "crud_pre_transit_sample_list_in_transit_donation_ids", "label": "_list_in_transit_donation_ids()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L339"}, {"id": "crud_pre_transit_sample_list_pre_delivery_collection_ids", "label": "_list_pre_delivery_collection_ids()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L381"}, {"id": "crud_pre_transit_sample_list_pre_delivery_donation_ids", "label": "_list_pre_delivery_donation_ids()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L450"}, {"id": "crud_pre_transit_sample_sort_key_in_transit", "label": "_sort_key_in_transit()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L519"}, {"id": "crud_pre_transit_sample_sort_key_pre_delivery", "label": "_sort_key_pre_delivery()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L524"}, {"id": "crud_pre_transit_sample_hydrate_collection_rows", "label": "_hydrate_collection_rows()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/apLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_qc_task_py", "label": "qc_task.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L1"}, {"id": "crud_qc_task_dec", "label": "_dec()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L37"}, {"id": "crud_qc_task_fmt_dt", "label": "_fmt_dt()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L43"}, {"id": "crud_qc_task_gen_task_no", "label": "_gen_task_no()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L47"}, {"id": "crud_qc_task_conclusion_label", "label": "_conclusion_label()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L60"}, {"id": "crud_qc_task_task_to_dict", "label": "_task_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L65"}, {"id": "crud_qc_task_task_work_order_context", "label": "_task_work_order_context()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L99"}, {"id": "crud_qc_task_merge_work_order_summary_into_task", "label": "_merge_work_order_summary_into_task()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L173"}, {"id": "crud_qc_task_enrich_mine_tasks_with_work_order_summaries", "label": "_enrich_mine_tasks_with_work_order_summaries()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L195"}, {"id": "crud_qc_task_enrich_tasks_reception_fields", "label": "_enrich_tasks_reception_fields()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L215"}, {"id": "crud_qc_task_task_row_to_dict", "label": "_task_row_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L323"}, {"id": "crud_qc_task_create_task_for_line", "label": "create_task_for_line()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L334"}, {"id": "crud_qc_task_list_tasks", "label": "list_tasks()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L381"}, {"id": "crud_qc_task_list_mine_tasks", "label": "list_mine_tasks()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L462"}, {"id": "crud_qc_task_assert_task_assignee", "label": "assert_task_assignee()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L554"}, {"id": "crud_qc_task_list_tasks_by_work_order", "label": "list_tasks_by_work_order()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L561"}, {"id": "crud_qc_task_list_tasks_by_work_order_ids", "label": "list_tasks_by_work_order_ids()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L568"}, {"id": "crud_qc_task_get_task", "label": "get_task()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L598"}, {"id": "crud_qc_task_get_task_detail", "label": "get_task_detail()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L607"}, {"id": "crud_qc_task_start_task", "label": "start_task()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L640"}, {"id": "crud_qc_task_set_task_remark", "label": "_set_task_remark()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L657"}, {"id": "crud_qc_task_complete_task", "label": "complete_task()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L661"}, {"id": "crud_qc_task_apply_task_result", "label": "apply_task_result()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L702"}, {"id": "crud_qc_task_update_task_attachments", "label": "update_task_attachments()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L754"}, {"id": "crud_qc_task_create_qc_task_manual", "label": "create_qc_task_manual()", "file_type": "code",Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_production_task_py", "label": "production_task.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L1"}, {"id": "crud_production_task_require_requisition_for_catalog_material", "label": "_require_requisition_for_catalog_material()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L53"}, {"id": "crud_production_task_production_conclusion_label", "label": "_production_conclusion_label()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L105"}, {"id": "crud_production_task_fmt_dt", "label": "_fmt_dt()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L112"}, {"id": "crud_production_task_normalize_date_bound", "label": "_normalize_date_bound()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L116"}, {"id": "crud_production_task_enrich_outbound_task_items", "label": "_enrich_outbound_task_items()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L123"}, {"id": "crud_production_task_generate_task_no", "label": "_generate_task_no()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L257"}, {"id": "crud_production_task_task_to_dict", "label": "_task_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L271"}, {"id": "crud_production_task_step_to_dict", "label": "_step_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L300"}, {"id": "crud_production_task_step_reagent_to_dict", "label": "_step_reagent_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L325"}, {"id": "crud_production_task_step_configured_reagent_to_dict", "label": "_step_configured_reagent_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L342"}, {"id": "crud_production_task_step_consumable_to_dict", "label": "_step_consumable_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L358"}, {"id": "crud_production_task_step_output_to_dict", "label": "_step_output_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L375"}, {"id": "crud_production_task_step_data_collection_to_dict", "label": "_step_data_collection_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L387"}, {"id": "crud_production_task_task_input_to_dict", "label": "_task_input_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L399"}, {"id": "crud_production_task_task_output_to_dict", "label": "_task_output_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L421"}, {"id": "crud_production_task_soft_delete_sub", "label": "_soft_delete_sub()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L446"}, {"id": "crud_production_task_resolve_sub_table_order_num", "label": "_resolve_sub_table_order_num()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L459"}, {"id": "crud_production_task_empty_step_sub_tables", "label": "_empty_step_sub_tables()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L468"}, {"id": "crud_production_task_batch_load_step_sub_tables", "label": "_batch_load_step_sub_tables()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L478"}, {"id": "crud_production_task_step_sub_tables_to_dict", "label": "_step_sub_tables_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L578"}, {"id": "crud_production_task_clone_step_reagents", "label": "_clone_step_reagents()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_locatiLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_storage_release_review_py", "label": "storage_release_review.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L1"}, {"id": "crud_storage_release_review_fmt_dt", "label": "_fmt_dt()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L52"}, {"id": "crud_storage_release_review_total_pages", "label": "total_pages()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L56"}, {"id": "crud_storage_release_review_row_to_dict", "label": "_row_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L62"}, {"id": "crud_storage_release_review_create_review_from_reception", "label": "create_review_from_reception()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L90"}, {"id": "crud_storage_release_review_list_reviews", "label": "list_reviews()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L128"}, {"id": "crud_storage_release_review_enrich_review_list_items", "label": "_enrich_review_list_items()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L193"}, {"id": "crud_storage_release_review_get_user_name", "label": "_get_user_name()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L286"}, {"id": "crud_storage_release_review_get_review_detail", "label": "get_review_detail()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L291"}, {"id": "crud_storage_release_review_build_cell_storage_protocol_info", "label": "_build_cell_storage_protocol_info()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L355"}, {"id": "crud_storage_release_review_build_research_donation_protocol_info", "label": "_build_research_donation_protocol_info()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L413"}, {"id": "crud_storage_release_review_build_cell_storage_transport_info", "label": "_build_cell_storage_transport_info()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L471"}, {"id": "crud_storage_release_review_build_research_donation_transport_info", "label": "_build_research_donation_transport_info()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L505"}, {"id": "crud_storage_release_review_build_reception_info", "label": "_build_reception_info()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L539"}, {"id": "crud_storage_release_review_build_gate_qc_info", "label": "_build_gate_qc_info()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L562"}, {"id": "crud_storage_release_review_build_process_qc_info_list", "label": "_build_process_qc_info_list()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L582"}, {"id": "crud_storage_release_review_build_production_info", "label": "_build_production_info()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L593"}, {"id": "crud_storage_release_review_submit_review", "label": "submit_review()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L611"}, {"id": "crud_storage_release_review_batch_submit_review", "label": "batch_submit_review()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L646"}, {"id": "crud_storage_release_review_store_sample", "label": "store_sample()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L675"}, {"id": "crud_storage_release_review_batch_store_samples", "label": "batch_store_samples()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_releLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_protocol_sample_collection_py", "label": "protocol_sample_collection.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/protocol_sample_collection.py", "source_location": "L1"}, {"id": "crud_protocol_sample_collection_total_pages", "label": "total_pages()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/protocol_sample_collection.py", "source_location": "L24"}, {"id": "crud_protocol_sample_collection_fmt_dt", "label": "_fmt_dt()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/protocol_sample_collection.py", "source_location": "L30"}, {"id": "crud_protocol_sample_collection_sample_status_label", "label": "_sample_status_label()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/protocol_sample_collection.py", "source_location": "L34"}, {"id": "crud_protocol_sample_collection_row_to_dict", "label": "_row_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/protocol_sample_collection.py", "source_location": "L43"}, {"id": "crud_protocol_sample_collection_base_query", "label": "_base_query()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/protocol_sample_collection.py", "source_location": "L82"}, {"id": "crud_protocol_sample_collection_apply_sample_status_filter", "label": "_apply_sample_status_filter()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/protocol_sample_collection.py", "source_location": "L118"}, {"id": "crud_protocol_sample_collection_list_protocol_sample_collections", "label": "list_protocol_sample_collections()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/protocol_sample_collection.py", "source_location": "L132"}, {"id": "crud_protocol_sample_collection_rationale_1", "label": "\u91c7\u96c6\u534f\u8bae\u6837\u672c\u91c7\u96c6\u4fe1\u606f\u5217\u8868 CRUD\uff08\u6837\u672c\u4fe1\u606f\u7ba1\u7406 \u00b7 \u6837\u672c\u91c7\u96c6\u4fe1\u606f Tab\uff09", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/protocol_sample_collection.py", "source_location": "L1"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_protocol_sample_collection_py", "target": "math", "relation": "imports", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/protocol_sample_collection.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_protocol_sample_collection_py", "target": "datetime", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/protocol_sample_collection.py", "source_location": "L5", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_protocol_sample_collection_py", "target": "typing", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/protocol_sample_collection.py", "source_location": "L6", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_protocol_sample_collection_py", "target": "sqlalchemy", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/protocol_sample_collection.py", "source_location": "L8", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_protocol_sample_collection_py", "target": "sqlalchemy_orm", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/protocol_sample_collection.py", "source_location": "L9", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_protocol_sample_collection_py", "target": "app_core_utils", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/protocol_sample_collection.py", "source_location": "L11", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_protocol_sample_collection_py", "target": "app_utils_sample_special", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/protocol_sample_collection.py", "source_location": "L12", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_protocol_sample_collection_py", "target": "app_models_models", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/protocol_sample_collection.py", "source_location": "L13", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_protocol_sample_collection_py", "target": "crud_protocol_sample_collection_total_pLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_pre_transit_sample_py", "label": "pre_transit_sample.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L1"}, {"id": "crud_pre_transit_sample_is_uncollected_status", "label": "_is_uncollected_status()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L51"}, {"id": "crud_pre_transit_sample_is_in_transit_sample", "label": "_is_in_transit_sample()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L55"}, {"id": "crud_pre_transit_sample_cell_received_exists", "label": "_cell_received_exists()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L59"}, {"id": "crud_pre_transit_sample_donation_received_exists", "label": "_donation_received_exists()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L76"}, {"id": "crud_pre_transit_sample_apply_collection_keyword", "label": "_apply_collection_keyword()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L93"}, {"id": "crud_pre_transit_sample_apply_donation_keyword", "label": "_apply_donation_keyword()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L129"}, {"id": "crud_pre_transit_sample_apply_create_time_filter", "label": "_apply_create_time_filter()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L165"}, {"id": "crud_pre_transit_sample_apply_collection_sample_collect_time_filter", "label": "_apply_collection_sample_collect_time_filter()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L173"}, {"id": "crud_pre_transit_sample_apply_donation_sample_collect_time_filter", "label": "_apply_donation_sample_collect_time_filter()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L200"}, {"id": "crud_pre_transit_sample_earliest_eta", "label": "_earliest_eta()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L227"}, {"id": "crud_pre_transit_sample_build_sample_items", "label": "_build_sample_items()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L234"}, {"id": "crud_pre_transit_sample_summarize_in_transit_items", "label": "_summarize_in_transit_items()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L283"}, {"id": "crud_pre_transit_sample_summarize_pre_delivery", "label": "_summarize_pre_delivery()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L290"}, {"id": "crud_pre_transit_sample_list_in_transit_collection_ids", "label": "_list_in_transit_collection_ids()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L297"}, {"id": "crud_pre_transit_sample_list_in_transit_donation_ids", "label": "_list_in_transit_donation_ids()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L339"}, {"id": "crud_pre_transit_sample_list_pre_delivery_collection_ids", "label": "_list_pre_delivery_collection_ids()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L381"}, {"id": "crud_pre_transit_sample_list_pre_delivery_donation_ids", "label": "_list_pre_delivery_donation_ids()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L450"}, {"id": "crud_pre_transit_sample_sort_key_in_transit", "label": "_sort_key_in_transit()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L519"}, {"id": "crud_pre_transit_sample_sort_key_pre_delivery", "label": "_sort_key_pre_delivery()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py", "source_location": "L524"}, {"id": "crud_pre_transit_sample_hydrate_collection_rows", "label": "_hydrate_collection_rows()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/apLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_storage_release_review_py", "label": "storage_release_review.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L1"}, {"id": "crud_storage_release_review_fmt_dt", "label": "_fmt_dt()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L52"}, {"id": "crud_storage_release_review_total_pages", "label": "total_pages()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L56"}, {"id": "crud_storage_release_review_row_to_dict", "label": "_row_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L62"}, {"id": "crud_storage_release_review_create_review_from_reception", "label": "create_review_from_reception()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L90"}, {"id": "crud_storage_release_review_list_reviews", "label": "list_reviews()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L128"}, {"id": "crud_storage_release_review_enrich_review_list_items", "label": "_enrich_review_list_items()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L193"}, {"id": "crud_storage_release_review_get_user_name", "label": "_get_user_name()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L274"}, {"id": "crud_storage_release_review_get_review_detail", "label": "get_review_detail()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L279"}, {"id": "crud_storage_release_review_build_cell_storage_protocol_info", "label": "_build_cell_storage_protocol_info()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L343"}, {"id": "crud_storage_release_review_build_research_donation_protocol_info", "label": "_build_research_donation_protocol_info()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L401"}, {"id": "crud_storage_release_review_build_cell_storage_transport_info", "label": "_build_cell_storage_transport_info()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L459"}, {"id": "crud_storage_release_review_build_research_donation_transport_info", "label": "_build_research_donation_transport_info()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L493"}, {"id": "crud_storage_release_review_build_reception_info", "label": "_build_reception_info()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L527"}, {"id": "crud_storage_release_review_build_gate_qc_info", "label": "_build_gate_qc_info()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L550"}, {"id": "crud_storage_release_review_build_process_qc_info_list", "label": "_build_process_qc_info_list()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L570"}, {"id": "crud_storage_release_review_build_production_info", "label": "_build_production_info()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L581"}, {"id": "crud_storage_release_review_submit_review", "label": "submit_review()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L599"}, {"id": "crud_storage_release_review_batch_submit_review", "label": "batch_submit_review()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L634"}, {"id": "crud_storage_release_review_store_sample", "label": "store_sample()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L663"}, {"id": "crud_storage_release_review_batch_store_samples", "label": "batch_store_samples()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_releLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_production_task_py", "label": "production_task.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L1"}, {"id": "crud_production_task_require_requisition_for_catalog_material", "label": "_require_requisition_for_catalog_material()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L53"}, {"id": "crud_production_task_production_conclusion_label", "label": "_production_conclusion_label()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L105"}, {"id": "crud_production_task_fmt_dt", "label": "_fmt_dt()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L112"}, {"id": "crud_production_task_normalize_date_bound", "label": "_normalize_date_bound()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L116"}, {"id": "crud_production_task_enrich_outbound_task_items", "label": "_enrich_outbound_task_items()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L123"}, {"id": "crud_production_task_generate_task_no", "label": "_generate_task_no()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L257"}, {"id": "crud_production_task_task_to_dict", "label": "_task_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L271"}, {"id": "crud_production_task_step_to_dict", "label": "_step_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L300"}, {"id": "crud_production_task_step_reagent_to_dict", "label": "_step_reagent_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L325"}, {"id": "crud_production_task_step_configured_reagent_to_dict", "label": "_step_configured_reagent_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L342"}, {"id": "crud_production_task_step_consumable_to_dict", "label": "_step_consumable_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L358"}, {"id": "crud_production_task_step_output_to_dict", "label": "_step_output_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L375"}, {"id": "crud_production_task_step_data_collection_to_dict", "label": "_step_data_collection_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L387"}, {"id": "crud_production_task_task_input_to_dict", "label": "_task_input_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L399"}, {"id": "crud_production_task_task_output_to_dict", "label": "_task_output_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L421"}, {"id": "crud_production_task_soft_delete_sub", "label": "_soft_delete_sub()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L446"}, {"id": "crud_production_task_resolve_sub_table_order_num", "label": "_resolve_sub_table_order_num()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L459"}, {"id": "crud_production_task_empty_step_sub_tables", "label": "_empty_step_sub_tables()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L468"}, {"id": "crud_production_task_batch_load_step_sub_tables", "label": "_batch_load_step_sub_tables()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L478"}, {"id": "crud_production_task_step_sub_tables_to_dict", "label": "_step_sub_tables_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_location": "L578"}, {"id": "crud_production_task_clone_step_reagents", "label": "_clone_step_reagents()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py", "source_locatiLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_api_research_donation_py", "label": "research_donation.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/research_donation.py", "source_location": "L1"}, {"id": "api_research_donation_get_tenant_no", "label": "_get_tenant_no()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/research_donation.py", "source_location": "L18"}, {"id": "api_research_donation_get_current_user_id", "label": "_get_current_user_id()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/research_donation.py", "source_location": "L28"}, {"id": "api_research_donation_donationcreatebody", "label": "DonationCreateBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/research_donation.py", "source_location": "L40"}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "api_research_donation_donationupdatebody", "label": "DonationUpdateBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/research_donation.py", "source_location": "L61"}, {"id": "api_research_donation_batchdeletebody", "label": "BatchDeleteBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/research_donation.py", "source_location": "L82"}, {"id": "api_research_donation_auditsubmitbody", "label": "AuditSubmitBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/research_donation.py", "source_location": "L88"}, {"id": "api_research_donation_statuschangebody", "label": "StatusChangeBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/research_donation.py", "source_location": "L95"}, {"id": "api_research_donation_convertfromstoragebody", "label": "ConvertFromStorageBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/research_donation.py", "source_location": "L104"}, {"id": "api_research_donation_list_research_donations", "label": "list_research_donations()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/research_donation.py", "source_location": "L116"}, {"id": "api_research_donation_list_research_donation_audits", "label": "list_research_donation_audits()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/research_donation.py", "source_location": "L151"}, {"id": "api_research_donation_next_research_donation_sample_code", "label": "next_research_donation_sample_code()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/research_donation.py", "source_location": "L180"}, {"id": "api_research_donation_get_research_donation_detail", "label": "get_research_donation_detail()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/research_donation.py", "source_location": "L197"}, {"id": "api_research_donation_create_research_donation", "label": "create_research_donation()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/research_donation.py", "source_location": "L215"}, {"id": "api_research_donation_update_research_donation", "label": "update_research_donation()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/research_donation.py", "source_location": "L247"}, {"id": "api_research_donation_delete_research_donation", "label": "delete_research_donation()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/research_donation.py", "source_location": "L278"}, {"id": "api_research_donation_batch_delete_research_donations", "label": "batch_delete_research_donations()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/research_donation.py", "source_location": "L303"}, {"id": "api_research_donation_submit_donation_audit", "label": "submit_donation_audit()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/research_donation.py", "source_location": "L328"}, {"id": "api_research_donation_change_donation_status", "label": "change_donation_status()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/research_donation.py", "source_location": "L361"}, {"id": "api_research_donation_convert_from_storage", "label": "convert_from_storage()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/research_donation.py", "source_location": "L394"}, {"id": "api_research_donation_convert_to_storage", "label": "convert_to_storage()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/research_donation.py", "source_location": "L422"}, {"id": "api_research_donation_rationale_1", "label": "\u79d1\u7814\u6350\u8d60\u7ba1Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_collection_protocol_py", "label": "collection_protocol.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L1"}, {"id": "crud_collection_protocol_get_protocol_nos_used_in_protocols", "label": "get_protocol_nos_used_in_protocols()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L69"}, {"id": "crud_collection_protocol_get_sample_codes_used_in_protocol_samples", "label": "get_sample_codes_used_in_protocol_samples()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L103"}, {"id": "crud_collection_protocol_validate_sample_codes_not_used", "label": "validate_sample_codes_not_used()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L137"}, {"id": "crud_collection_protocol_total_pages", "label": "total_pages()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L170"}, {"id": "crud_collection_protocol_fmt_dt", "label": "_fmt_dt()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L176"}, {"id": "crud_collection_protocol_dec", "label": "_dec()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L180"}, {"id": "crud_collection_protocol_optional_decimal", "label": "_optional_decimal()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L188"}, {"id": "crud_collection_protocol_today_yyyymmdd", "label": "_today_yyyymmdd()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L194"}, {"id": "crud_collection_protocol_normalize_yyyymmdd_date", "label": "_normalize_yyyymmdd_date()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L198"}, {"id": "crud_collection_protocol_normalize_fields", "label": "_normalize_fields()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L217"}, {"id": "crud_collection_protocol_pop_attachment_urls", "label": "_pop_attachment_urls()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L228"}, {"id": "crud_collection_protocol_attachments_to_urls", "label": "attachments_to_urls()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L239"}, {"id": "crud_collection_protocol_normalize_attachment_url_key", "label": "_normalize_attachment_url_key()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L258"}, {"id": "crud_collection_protocol_format_attachment_file_size", "label": "_format_attachment_file_size()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L267"}, {"id": "crud_collection_protocol_lookup_attachment_by_url", "label": "_lookup_attachment_by_url()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L275"}, {"id": "crud_collection_protocol_urls_to_attachment_list", "label": "urls_to_attachment_list()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L299"}, {"id": "crud_collection_protocol_user_nick_name_map", "label": "_user_nick_name_map()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L331"}, {"id": "crud_collection_protocol_protocol_to_dict", "label": "_protocol_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L339"}, {"id": "crud_collection_protocol_payment_to_dict", "label": "_payment_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L364"}, {"id": "crud_collection_protocol_detail_to_dict", "label": "_detail_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L385"}, {"id": "crud_collection_protocol_audit_to_dict", "label": "_audit_to_dict()", "file_type": "code", "sourceLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_research_donation_sample_collection_py", "label": "research_donation_sample_collection.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation_sample_collection.py", "source_location": "L1"}, {"id": "crud_research_donation_sample_collection_total_pages", "label": "total_pages()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation_sample_collection.py", "source_location": "L26"}, {"id": "crud_research_donation_sample_collection_fmt_dt", "label": "_fmt_dt()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation_sample_collection.py", "source_location": "L32"}, {"id": "crud_research_donation_sample_collection_sample_status_label", "label": "_sample_status_label()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation_sample_collection.py", "source_location": "L36"}, {"id": "crud_research_donation_sample_collection_row_to_dict", "label": "_row_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation_sample_collection.py", "source_location": "L45"}, {"id": "crud_research_donation_sample_collection_base_query", "label": "_base_query()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation_sample_collection.py", "source_location": "L84"}, {"id": "crud_research_donation_sample_collection_apply_sample_status_filter", "label": "_apply_sample_status_filter()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation_sample_collection.py", "source_location": "L120"}, {"id": "crud_research_donation_sample_collection_list_donation_sample_collections", "label": "list_donation_sample_collections()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation_sample_collection.py", "source_location": "L134"}, {"id": "crud_research_donation_sample_collection_rationale_1", "label": "\u79d1\u7814\u6350\u8d60\u6837\u672c\u91c7\u96c6\u4fe1\u606f\u5217\u8868 CRUD\uff08\u6837\u672c\u4fe1\u606f\u7ba1\u7406 \u00b7 \u6837\u672c\u91c7\u96c6\u4fe1\u606f\uff09", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation_sample_collection.py", "source_location": "L1"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_research_donation_sample_collection_py", "target": "math", "relation": "imports", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation_sample_collection.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_research_donation_sample_collection_py", "target": "datetime", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation_sample_collection.py", "source_location": "L5", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_research_donation_sample_collection_py", "target": "typing", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation_sample_collection.py", "source_location": "L6", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_research_donation_sample_collection_py", "target": "sqlalchemy", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation_sample_collection.py", "source_location": "L8", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_research_donation_sample_collection_py", "target": "sqlalchemy_orm", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation_sample_collection.py", "source_location": "L9", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_research_donation_sample_collection_py", "target": "app_core_utils", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation_sample_collection.py", "source_location": "L11", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_research_donation_sample_collection_py", "target": "app_utils_sample_special", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation_sample_collection.py", "source_location": "L12", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_research_donation_sample_collection_py", "target": "app_models_models", "relation": "imports_from", "confideLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_api_qc_py", "label": "qc.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/qc.py", "source_location": "L1"}, {"id": "api_qc_thirdpartycompanybody", "label": "ThirdPartyCompanyBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/qc.py", "source_location": "L63"}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "api_qc_thirdpartycompanyupdatebody", "label": "ThirdPartyCompanyUpdateBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/qc.py", "source_location": "L81"}, {"id": "api_qc_list_qc_third_party_companies", "label": "list_qc_third_party_companies()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/qc.py", "source_location": "L100"}, {"id": "api_qc_list_qc_third_party_company_options", "label": "list_qc_third_party_company_options()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/qc.py", "source_location": "L122"}, {"id": "api_qc_create_qc_third_party_company", "label": "create_qc_third_party_company()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/qc.py", "source_location": "L136"}, {"id": "api_qc_update_qc_third_party_company", "label": "update_qc_third_party_company()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/qc.py", "source_location": "L171"}, {"id": "api_qc_delete_qc_third_party_company", "label": "delete_qc_third_party_company()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/qc.py", "source_location": "L208"}, {"id": "api_qc_thirdpartyitembody", "label": "ThirdPartyItemBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/qc.py", "source_location": "L228"}, {"id": "api_qc_thirdpartyitemupdatebody", "label": "ThirdPartyItemUpdateBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/qc.py", "source_location": "L240"}, {"id": "api_qc_list_qc_third_party_items", "label": "list_qc_third_party_items()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/qc.py", "source_location": "L253"}, {"id": "api_qc_list_qc_third_party_items_active", "label": "list_qc_third_party_items_active()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/qc.py", "source_location": "L282"}, {"id": "api_qc_create_qc_third_party_item", "label": "create_qc_third_party_item()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/qc.py", "source_location": "L297"}, {"id": "api_qc_update_qc_third_party_item", "label": "update_qc_third_party_item()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/qc.py", "source_location": "L326"}, {"id": "api_qc_delete_qc_third_party_item", "label": "delete_qc_third_party_item()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/qc.py", "source_location": "L357"}, {"id": "api_qc_labtestitembody", "label": "LabTestItemBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/qc.py", "source_location": "L377"}, {"id": "api_qc_labtestitemupdatebody", "label": "LabTestItemUpdateBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/qc.py", "source_location": "L388"}, {"id": "api_qc_itemparambody", "label": "ItemParamBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/qc.py", "source_location": "L402"}, {"id": "api_qc_taskresultbody", "label": "TaskResultBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/qc.py", "source_location": "L407"}, {"id": "api_qc_taskcompletewithresultbody", "label": "TaskCompleteWithResultBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/qc.py", "source_location": "L412"}, {"id": "api_qc_list_qc_lab_test_items", "label": "list_qc_lab_test_items()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/qc.py", "source_location": "L422"}, {"id": "api_qc_list_qc_lab_test_items_active", "label": "list_qc_lab_test_items_active()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/qc.py", "source_location": "L444"}, {"id": "api_qc_create_qc_lab_test_item", "label": "create_qc_lab_test_item()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/qc.py", "source_location": "L458"}, {"id": "api_qc_update_qc_lab_test_item", "label": "update_qc_lab_test_item()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/qc.py", "source_location": "L486"}, {"id": "apiLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_api_material_py", "label": "material.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L1"}, {"id": "api_material_materialbody", "label": "MaterialBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L27"}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "api_material_materialupdatebody", "label": "MaterialUpdateBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L41"}, {"id": "api_material_stockinbody", "label": "StockInBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L55"}, {"id": "api_material_batchstockinitem", "label": "BatchStockInItem", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L70"}, {"id": "api_material_batchstockinbody", "label": "BatchStockInBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L85"}, {"id": "api_material_batchstockoutitem", "label": "BatchStockOutItem", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L92"}, {"id": "api_material_batchstockoutbody", "label": "BatchStockOutBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L99"}, {"id": "api_material_batchdiscarditem", "label": "BatchDiscardItem", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L108"}, {"id": "api_material_batchdiscardbody", "label": "BatchDiscardBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L116"}, {"id": "api_material_materialbatchupdatebody", "label": "MaterialBatchUpdateBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L124"}, {"id": "api_material_stockcheckcreatebody", "label": "StockCheckCreateBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L144"}, {"id": "api_material_stockcheckunusedlineitem", "label": "StockCheckUnusedLineItem", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L151"}, {"id": "api_material_stockcheckunusedlinesbody", "label": "StockCheckUnusedLinesBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L171"}, {"id": "api_material_list_material_batches", "label": "list_material_batches()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L180"}, {"id": "api_material_material_batch_options", "label": "material_batch_options()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L211"}, {"id": "api_material_update_material_batch", "label": "update_material_batch()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L234"}, {"id": "api_material_delete_material_batch", "label": "delete_material_batch()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L263"}, {"id": "api_material_list_materials", "label": "list_materials()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L283"}, {"id": "api_material_material_options", "label": "material_options()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L306"}, {"id": "api_material_create_material", "label": "create_material()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L318"}, {"id": "api_material_update_material", "label": "update_material()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L338"}, {"id": "api_material_delete_material", "label": "delete_material()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L359"}, {"id": "api_material_batch_stock_in_material", "label": "batch_stock_in_material()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L376"}, {"id": "api_material_batchLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_material_stock_batch_py", "label": "material_stock_batch.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L1"}, {"id": "crud_material_stock_batch_fmt_date", "label": "_fmt_date()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L19"}, {"id": "crud_material_stock_batch_parse_date", "label": "_parse_date()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L25"}, {"id": "crud_material_stock_batch_parse_expire_date", "label": "_parse_expire_date()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L39"}, {"id": "crud_material_stock_batch_opt_str", "label": "_opt_str()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L50"}, {"id": "crud_material_stock_batch_opt_decimal", "label": "_opt_decimal()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L54"}, {"id": "crud_material_stock_batch_opt_stock_in_date", "label": "_opt_stock_in_date()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L66"}, {"id": "crud_material_stock_batch_opt_stock_in_qty", "label": "_opt_stock_in_qty()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L75"}, {"id": "crud_material_stock_batch_gen_stock_in_no", "label": "_gen_stock_in_no()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L87"}, {"id": "crud_material_stock_batch_resolve_stock_in_no", "label": "_resolve_stock_in_no()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L96"}, {"id": "crud_material_stock_batch_require_str", "label": "_require_str()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L116"}, {"id": "crud_material_stock_batch_require_decimal", "label": "_require_decimal()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L123"}, {"id": "crud_material_stock_batch_stock_in_no_exists", "label": "stock_in_no_exists()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L135"}, {"id": "crud_material_stock_batch_batch_row_to_dict", "label": "_batch_row_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L151"}, {"id": "crud_material_stock_batch_usage_batch_snapshots", "label": "_usage_batch_snapshots()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L184"}, {"id": "crud_material_stock_batch_get_material_for_update", "label": "_get_material_for_update()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L205"}, {"id": "crud_material_stock_batch_list_batches", "label": "list_batches()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L223"}, {"id": "crud_material_stock_batch_batch_options", "label": "batch_options()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L291"}, {"id": "crud_material_stock_batch_create_batch_and_usage", "label": "_create_batch_and_usage()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L364"}, {"id": "crud_material_stock_batch_stock_in_one", "label": "stock_in_one()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L453"}, {"id": "crud_material_stock_batch_batch_stock_in", "label": "batch_stock_in()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L494"}, {"id": "crud_material_stock_batch_stock_out_batch", "label": "_stock_out_batch()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L551"}, {"id": "crud_material_stock_batch_batch_stocLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_cell_product_py", "label": "cell_product.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/cell_product.py", "source_location": "L1"}, {"id": "crud_cell_product_apply_cell_product_status_change", "label": "_apply_cell_product_status_change()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/cell_product.py", "source_location": "L32"}, {"id": "crud_cell_product_row_to_dict", "label": "_row_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/cell_product.py", "source_location": "L87"}, {"id": "crud_cell_product_build_facility_path_label", "label": "_build_facility_path_label()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/cell_product.py", "source_location": "L121"}, {"id": "crud_cell_product_enrich_product_dicts", "label": "_enrich_product_dicts()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/cell_product.py", "source_location": "L136"}, {"id": "crud_cell_product_product_to_response", "label": "product_to_response()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/cell_product.py", "source_location": "L272"}, {"id": "crud_cell_product_list_cell_products", "label": "list_cell_products()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/cell_product.py", "source_location": "L277"}, {"id": "crud_cell_product_get_cell_product", "label": "get_cell_product()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/cell_product.py", "source_location": "L344"}, {"id": "crud_cell_product_create_cell_product", "label": "create_cell_product()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/cell_product.py", "source_location": "L358"}, {"id": "crud_cell_product_update_cell_product", "label": "update_cell_product()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/cell_product.py", "source_location": "L431"}, {"id": "crud_cell_product_delete_cell_product", "label": "delete_cell_product()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/cell_product.py", "source_location": "L531"}, {"id": "crud_cell_product_next_code_start_seq", "label": "_next_code_start_seq()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/cell_product.py", "source_location": "L548"}, {"id": "crud_cell_product_get_next_code", "label": "get_next_code()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/cell_product.py", "source_location": "L569"}, {"id": "crud_cell_product_normalize_passage_product_base", "label": "normalize_passage_product_base()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/cell_product.py", "source_location": "L580"}, {"id": "crud_cell_product_get_max_passage_product_seq", "label": "get_max_passage_product_seq()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/cell_product.py", "source_location": "L591"}, {"id": "crud_cell_product_get_max_passage_product_seq_map", "label": "get_max_passage_product_seq_map()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/cell_product.py", "source_location": "L625"}, {"id": "crud_cell_product_get_max_product_suffix_seq", "label": "get_max_product_suffix_seq()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/cell_product.py", "source_location": "L643"}, {"id": "crud_cell_product_product_code_exists", "label": "product_code_exists()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/cell_product.py", "source_location": "L675"}, {"id": "crud_cell_product_normalize_product_code_base", "label": "normalize_product_code_base()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/cell_product.py", "source_location": "L694"}, {"id": "crud_cell_product_build_split_product_codes", "label": "build_split_product_codes()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/cell_product.py", "source_location": "L705"}, {"id": "crud_cell_product_reserve_next_codes", "label": "reserve_next_codes()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/cell_product.py", "source_location": "L712"}, {"id": "crud_cell_product_validate_batch_items", "label": "_validate_batch_items()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/cell_product.py", "source_location": "L722"}, {"id": "crud_cell_product_create_cell_products_by_quantity", "label": "create_cell_products_by_quantity()", "file_type": "code"Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_sample_reception_py", "label": "sample_reception.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L1"}, {"id": "crud_sample_reception_donation_sample_id_col", "label": "_donation_sample_id_col()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L44"}, {"id": "crud_sample_reception_fmt_dt", "label": "_fmt_dt()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L49"}, {"id": "crud_sample_reception_normalize_date_bound", "label": "_normalize_date_bound()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L53"}, {"id": "crud_sample_reception_dec", "label": "_dec()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L60"}, {"id": "crud_sample_reception_reception_to_dict", "label": "_reception_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L66"}, {"id": "crud_sample_reception_sample_detail_rows_query", "label": "_sample_detail_rows_query()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L89"}, {"id": "crud_sample_reception_donation_sample_detail_rows_query", "label": "_donation_sample_detail_rows_query()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L123"}, {"id": "crud_sample_reception_donation_sample_pending_query", "label": "_donation_sample_pending_query()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L157"}, {"id": "crud_sample_reception_donation_rows_to_sample_list_items", "label": "_donation_rows_to_sample_list_items()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L195"}, {"id": "crud_sample_reception_sample_pending_query", "label": "_sample_pending_query()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L310"}, {"id": "crud_sample_reception_rows_to_sample_list_items", "label": "_rows_to_sample_list_items()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L348"}, {"id": "crud_sample_reception_list_pending_protocol_samples", "label": "list_pending_protocol_samples()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L473"}, {"id": "crud_sample_reception_list_received_protocol_samples", "label": "list_received_protocol_samples()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L546"}, {"id": "crud_sample_reception_finalize_reception_detail", "label": "_finalize_reception_detail()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L685"}, {"id": "crud_sample_reception_get_reception_by_id", "label": "get_reception_by_id()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L691"}, {"id": "crud_sample_reception_create_sample_reception", "label": "create_sample_reception()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L759"}, {"id": "crud_sample_reception_can_edit_sample_reception", "label": "_can_edit_sample_reception()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L1021"}, {"id": "crud_sample_reception_update_sample_reception", "label": "update_sample_reception()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L1036"}, {"id": "crud_sample_reception_attach_production_reception", "label": "_attach_production_reception()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L1152"}, {"id": "crud_sample_reception_reception_detail_item", "label": "_reception_detail_item()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L1170"}, {"id": "crud_sample_reception_reception_detail_item_with_production", "label": "_reception_detail_item_with_production(Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_qc_work_order_py", "label": "qc_work_order.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L1"}, {"id": "crud_qc_work_order_resolve_outbound_biz_type_for_schedule", "label": "resolve_outbound_biz_type_for_schedule()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L96"}, {"id": "crud_qc_work_order_dec", "label": "_dec()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L137"}, {"id": "crud_qc_work_order_fmt_dt", "label": "_fmt_dt()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L143"}, {"id": "crud_qc_work_order_normalize_date_bound", "label": "_normalize_date_bound()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L147"}, {"id": "crud_qc_work_order_reception_source_label", "label": "_reception_source_label()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L154"}, {"id": "crud_qc_work_order_qc_biz_type_label", "label": "_qc_biz_type_label()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L159"}, {"id": "crud_qc_work_order_work_order_qc_biz_type", "label": "_work_order_qc_biz_type()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L164"}, {"id": "crud_qc_work_order_validate_cell_product_id", "label": "_validate_cell_product_id()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L171"}, {"id": "crud_qc_work_order_enrich_work_order_cell_products", "label": "_enrich_work_order_cell_products()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L183"}, {"id": "crud_qc_work_order_enrich_work_order_step_outputs", "label": "_enrich_work_order_step_outputs()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L212"}, {"id": "crud_qc_work_order_enrich_work_order_qc_targets", "label": "_enrich_work_order_qc_targets()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L251"}, {"id": "crud_qc_work_order_enrich_outbound_work_orders", "label": "_enrich_outbound_work_orders()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L258"}, {"id": "crud_qc_work_order_outbound_qc_work_order_ids_by_keyword", "label": "_outbound_qc_work_order_ids_by_keyword()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L379"}, {"id": "crud_qc_work_order_inbound_qc_work_order_ids_by_mother_name", "label": "_inbound_qc_work_order_ids_by_mother_name()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L426"}, {"id": "crud_qc_work_order_accept_conclusion_label", "label": "_accept_conclusion_label()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L492"}, {"id": "crud_qc_work_order_load_sample_type_name_map", "label": "_load_sample_type_name_map()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L497"}, {"id": "crud_qc_work_order_effective_reception_source", "label": "_effective_reception_source()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L509"}, {"id": "crud_qc_work_order_effective_donation_sample_id", "label": "_effective_donation_sample_id()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L518"}, {"id": "crud_qc_work_order_effective_protocol_sample_id", "label": "_effective_protocol_sample_id()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L527"}, {"id": "crud_qc_work_order_sample_type_name_for_item", "label": "_sample_type_name_for_item()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L535"}, {"id": "crud_qc_work_order_sample_type_name_for_reception", "label": "_sample_type_name_for_reception()", "file_type": "code", "source_file": "/Users/wuzLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_material_stock_batch_py", "label": "material_stock_batch.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L1"}, {"id": "crud_material_stock_batch_fmt_date", "label": "_fmt_date()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L19"}, {"id": "crud_material_stock_batch_parse_date", "label": "_parse_date()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L25"}, {"id": "crud_material_stock_batch_parse_expire_date", "label": "_parse_expire_date()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L39"}, {"id": "crud_material_stock_batch_opt_str", "label": "_opt_str()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L50"}, {"id": "crud_material_stock_batch_opt_decimal", "label": "_opt_decimal()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L54"}, {"id": "crud_material_stock_batch_opt_stock_in_date", "label": "_opt_stock_in_date()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L66"}, {"id": "crud_material_stock_batch_opt_stock_in_qty", "label": "_opt_stock_in_qty()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L75"}, {"id": "crud_material_stock_batch_gen_stock_in_no", "label": "_gen_stock_in_no()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L87"}, {"id": "crud_material_stock_batch_resolve_stock_in_no", "label": "_resolve_stock_in_no()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L96"}, {"id": "crud_material_stock_batch_require_str", "label": "_require_str()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L116"}, {"id": "crud_material_stock_batch_require_decimal", "label": "_require_decimal()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L123"}, {"id": "crud_material_stock_batch_stock_in_no_exists", "label": "stock_in_no_exists()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L135"}, {"id": "crud_material_stock_batch_batch_row_to_dict", "label": "_batch_row_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L151"}, {"id": "crud_material_stock_batch_usage_batch_snapshots", "label": "_usage_batch_snapshots()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L184"}, {"id": "crud_material_stock_batch_get_material_for_update", "label": "_get_material_for_update()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L205"}, {"id": "crud_material_stock_batch_list_batches", "label": "list_batches()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L223"}, {"id": "crud_material_stock_batch_batch_options", "label": "batch_options()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L291"}, {"id": "crud_material_stock_batch_create_batch_and_usage", "label": "_create_batch_and_usage()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L364"}, {"id": "crud_material_stock_batch_stock_in_one", "label": "stock_in_one()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L455"}, {"id": "crud_material_stock_batch_batch_stock_in", "label": "batch_stock_in()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L498"}, {"id": "crud_material_stock_batch_stock_out_batch", "label": "_stock_out_batch()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py", "source_location": "L557"}, {"id": "crud_material_stock_batch_batch_stocLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_qc_work_order_py", "label": "qc_work_order.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L1"}, {"id": "crud_qc_work_order_resolve_outbound_biz_type_for_schedule", "label": "resolve_outbound_biz_type_for_schedule()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L96"}, {"id": "crud_qc_work_order_dec", "label": "_dec()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L137"}, {"id": "crud_qc_work_order_fmt_dt", "label": "_fmt_dt()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L143"}, {"id": "crud_qc_work_order_normalize_date_bound", "label": "_normalize_date_bound()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L147"}, {"id": "crud_qc_work_order_reception_source_label", "label": "_reception_source_label()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L154"}, {"id": "crud_qc_work_order_qc_biz_type_label", "label": "_qc_biz_type_label()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L159"}, {"id": "crud_qc_work_order_work_order_qc_biz_type", "label": "_work_order_qc_biz_type()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L164"}, {"id": "crud_qc_work_order_validate_cell_product_id", "label": "_validate_cell_product_id()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L171"}, {"id": "crud_qc_work_order_enrich_work_order_cell_products", "label": "_enrich_work_order_cell_products()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L183"}, {"id": "crud_qc_work_order_enrich_work_order_step_outputs", "label": "_enrich_work_order_step_outputs()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L212"}, {"id": "crud_qc_work_order_enrich_work_order_qc_targets", "label": "_enrich_work_order_qc_targets()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L251"}, {"id": "crud_qc_work_order_enrich_outbound_work_orders", "label": "_enrich_outbound_work_orders()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L258"}, {"id": "crud_qc_work_order_outbound_qc_work_order_ids_by_keyword", "label": "_outbound_qc_work_order_ids_by_keyword()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L379"}, {"id": "crud_qc_work_order_inbound_qc_work_order_ids_by_mother_name", "label": "_inbound_qc_work_order_ids_by_mother_name()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L426"}, {"id": "crud_qc_work_order_accept_conclusion_label", "label": "_accept_conclusion_label()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L492"}, {"id": "crud_qc_work_order_load_sample_type_name_map", "label": "_load_sample_type_name_map()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L497"}, {"id": "crud_qc_work_order_effective_reception_source", "label": "_effective_reception_source()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L509"}, {"id": "crud_qc_work_order_effective_donation_sample_id", "label": "_effective_donation_sample_id()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L518"}, {"id": "crud_qc_work_order_effective_protocol_sample_id", "label": "_effective_protocol_sample_id()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L527"}, {"id": "crud_qc_work_order_sample_type_name_for_item", "label": "_sample_type_name_for_item()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L535"}, {"id": "crud_qc_work_order_sample_type_name_for_reception", "label": "_sample_type_name_for_reception()", "file_type": "code", "source_file": "/Users/wuzLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_storage_release_review_py", "label": "storage_release_review.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L1"}, {"id": "crud_storage_release_review_fmt_dt", "label": "_fmt_dt()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L50"}, {"id": "crud_storage_release_review_total_pages", "label": "total_pages()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L54"}, {"id": "crud_storage_release_review_row_to_dict", "label": "_row_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L60"}, {"id": "crud_storage_release_review_create_review_from_reception", "label": "create_review_from_reception()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L88"}, {"id": "crud_storage_release_review_list_reviews", "label": "list_reviews()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L126"}, {"id": "crud_storage_release_review_enrich_review_list_items", "label": "_enrich_review_list_items()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L191"}, {"id": "crud_storage_release_review_get_user_name", "label": "_get_user_name()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L272"}, {"id": "crud_storage_release_review_get_review_detail", "label": "get_review_detail()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L277"}, {"id": "crud_storage_release_review_build_cell_storage_protocol_info", "label": "_build_cell_storage_protocol_info()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L341"}, {"id": "crud_storage_release_review_build_research_donation_protocol_info", "label": "_build_research_donation_protocol_info()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L399"}, {"id": "crud_storage_release_review_build_cell_storage_transport_info", "label": "_build_cell_storage_transport_info()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L457"}, {"id": "crud_storage_release_review_build_research_donation_transport_info", "label": "_build_research_donation_transport_info()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L491"}, {"id": "crud_storage_release_review_build_reception_info", "label": "_build_reception_info()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L525"}, {"id": "crud_storage_release_review_build_gate_qc_info", "label": "_build_gate_qc_info()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L548"}, {"id": "crud_storage_release_review_build_process_qc_info_list", "label": "_build_process_qc_info_list()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L568"}, {"id": "crud_storage_release_review_build_production_info", "label": "_build_production_info()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L579"}, {"id": "crud_storage_release_review_submit_review", "label": "submit_review()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L597"}, {"id": "crud_storage_release_review_batch_submit_review", "label": "batch_submit_review()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L632"}, {"id": "crud_storage_release_review_store_sample", "label": "store_sample()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py", "source_location": "L661"}, {"id": "crud_storage_release_review_batch_store_samples", "label": "batch_store_samples()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_releLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_utils_sample_special_py", "label": "sample_special.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L1"}, {"id": "utils_sample_special_truthy_flag", "label": "_truthy_flag()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L7"}, {"id": "utils_sample_special_sample_special_to_dict", "label": "sample_special_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L15"}, {"id": "utils_sample_special_validate_sample_special_raw", "label": "validate_sample_special_raw()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L24"}, {"id": "utils_sample_special_apply_sample_special_fields", "label": "apply_sample_special_fields()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L34"}, {"id": "utils_sample_special_apply_inbound_sample_special_mark_fields", "label": "apply_inbound_sample_special_mark_fields()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L41"}, {"id": "utils_sample_special_apply_special_to_item_from_samples", "label": "apply_special_to_item_from_samples()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L52"}, {"id": "utils_sample_special_rationale_42", "label": "\u8d28\u68c0\u7b49\u573a\u666f\uff1a\u53d6\u6d88\u52fe\u9009\u65f6\u4fdd\u7559 special_remark\uff0c\u4ec5\u6e05\u9664 is_special \u6807\u8bb0\u3002", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L42"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_backend_app_utils_sample_special_py", "target": "typing", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_utils_sample_special_py", "target": "utils_sample_special_truthy_flag", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L7", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_utils_sample_special_py", "target": "utils_sample_special_sample_special_to_dict", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L15", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_utils_sample_special_py", "target": "utils_sample_special_validate_sample_special_raw", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L24", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_utils_sample_special_py", "target": "utils_sample_special_apply_sample_special_fields", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L34", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_utils_sample_special_py", "target": "utils_sample_special_apply_inbound_sample_special_mark_fields", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L41", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_utils_sample_special_py", "target": "utils_sample_special_apply_special_to_item_from_samples", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L52", "weight": 1.0}, {"source": "utils_sample_special_validate_sample_special_raw", "target": "utils_sample_special_truthy_flag", "relation": "calls", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L25", "weight": 1.0}, {"source": "utils_sample_special_apply_sample_special_fields", "target": "utils_sample_special_truthy_flag", "relation": "calls", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L35", "weight": 1.0}, {"source": "utils_sample_special_apply_inbound_sample_special_mark_fields", "target": "utils_sample_special_truthy_flag", "relation": "calls", "confidence": "EXTRACTED", "source_Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_qc_work_order_py", "label": "qc_work_order.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L1"}, {"id": "crud_qc_work_order_resolve_outbound_biz_type_for_schedule", "label": "resolve_outbound_biz_type_for_schedule()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L95"}, {"id": "crud_qc_work_order_dec", "label": "_dec()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L136"}, {"id": "crud_qc_work_order_fmt_dt", "label": "_fmt_dt()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L142"}, {"id": "crud_qc_work_order_normalize_date_bound", "label": "_normalize_date_bound()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L146"}, {"id": "crud_qc_work_order_reception_source_label", "label": "_reception_source_label()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L153"}, {"id": "crud_qc_work_order_qc_biz_type_label", "label": "_qc_biz_type_label()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L158"}, {"id": "crud_qc_work_order_work_order_qc_biz_type", "label": "_work_order_qc_biz_type()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L163"}, {"id": "crud_qc_work_order_validate_cell_product_id", "label": "_validate_cell_product_id()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L170"}, {"id": "crud_qc_work_order_enrich_work_order_cell_products", "label": "_enrich_work_order_cell_products()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L182"}, {"id": "crud_qc_work_order_enrich_work_order_step_outputs", "label": "_enrich_work_order_step_outputs()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L211"}, {"id": "crud_qc_work_order_enrich_work_order_qc_targets", "label": "_enrich_work_order_qc_targets()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L250"}, {"id": "crud_qc_work_order_enrich_outbound_work_orders", "label": "_enrich_outbound_work_orders()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L257"}, {"id": "crud_qc_work_order_outbound_qc_work_order_ids_by_keyword", "label": "_outbound_qc_work_order_ids_by_keyword()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L378"}, {"id": "crud_qc_work_order_inbound_qc_work_order_ids_by_mother_name", "label": "_inbound_qc_work_order_ids_by_mother_name()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L425"}, {"id": "crud_qc_work_order_accept_conclusion_label", "label": "_accept_conclusion_label()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L491"}, {"id": "crud_qc_work_order_load_sample_type_name_map", "label": "_load_sample_type_name_map()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L496"}, {"id": "crud_qc_work_order_effective_reception_source", "label": "_effective_reception_source()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L508"}, {"id": "crud_qc_work_order_effective_donation_sample_id", "label": "_effective_donation_sample_id()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L517"}, {"id": "crud_qc_work_order_effective_protocol_sample_id", "label": "_effective_protocol_sample_id()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L526"}, {"id": "crud_qc_work_order_sample_type_name_for_item", "label": "_sample_type_name_for_item()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L534"}, {"id": "crud_qc_work_order_sample_type_name_for_reception", "label": "_sample_type_name_for_reception()", "file_type": "code", "source_file": "/Users/wuzLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_sample_reception_py", "label": "sample_reception.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L1"}, {"id": "crud_sample_reception_donation_sample_id_col", "label": "_donation_sample_id_col()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L44"}, {"id": "crud_sample_reception_fmt_dt", "label": "_fmt_dt()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L49"}, {"id": "crud_sample_reception_normalize_date_bound", "label": "_normalize_date_bound()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L53"}, {"id": "crud_sample_reception_dec", "label": "_dec()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L60"}, {"id": "crud_sample_reception_reception_to_dict", "label": "_reception_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L66"}, {"id": "crud_sample_reception_sample_detail_rows_query", "label": "_sample_detail_rows_query()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L89"}, {"id": "crud_sample_reception_donation_sample_detail_rows_query", "label": "_donation_sample_detail_rows_query()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L123"}, {"id": "crud_sample_reception_donation_sample_pending_query", "label": "_donation_sample_pending_query()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L157"}, {"id": "crud_sample_reception_donation_rows_to_sample_list_items", "label": "_donation_rows_to_sample_list_items()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L195"}, {"id": "crud_sample_reception_sample_pending_query", "label": "_sample_pending_query()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L310"}, {"id": "crud_sample_reception_rows_to_sample_list_items", "label": "_rows_to_sample_list_items()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L348"}, {"id": "crud_sample_reception_list_pending_protocol_samples", "label": "list_pending_protocol_samples()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L473"}, {"id": "crud_sample_reception_list_received_protocol_samples", "label": "list_received_protocol_samples()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L546"}, {"id": "crud_sample_reception_finalize_reception_detail", "label": "_finalize_reception_detail()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L685"}, {"id": "crud_sample_reception_get_reception_by_id", "label": "get_reception_by_id()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L691"}, {"id": "crud_sample_reception_create_sample_reception", "label": "create_sample_reception()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L759"}, {"id": "crud_sample_reception_can_edit_sample_reception", "label": "_can_edit_sample_reception()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L1021"}, {"id": "crud_sample_reception_update_sample_reception", "label": "update_sample_reception()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L1036"}, {"id": "crud_sample_reception_attach_production_reception", "label": "_attach_production_reception()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L1152"}, {"id": "crud_sample_reception_reception_detail_item", "label": "_reception_detail_item()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L1170"}, {"id": "crud_sample_reception_reception_detail_item_with_production", "label": "_reception_detail_item_with_production(Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_models_research_donation_py", "label": "research_donation.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L1"}, {"id": "models_research_donation_bizresearchdonation", "label": "BizResearchDonation", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L9"}, {"id": "base", "label": "Base", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "models_research_donation_bizresearchdonationaudit", "label": "BizResearchDonationAudit", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L43"}, {"id": "models_research_donation_bizresearchdonationparty", "label": "BizResearchDonationParty", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L64"}, {"id": "models_research_donation_bizresearchdonationcollection", "label": "BizResearchDonationCollection", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L104"}, {"id": "models_research_donation_bizresearchdonationsample", "label": "BizResearchDonationSample", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L128"}, {"id": "models_research_donation_bizresearchdonationsampletransport", "label": "BizResearchDonationSampleTransport", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L159"}, {"id": "models_research_donation_bizprotocoldonationconvert", "label": "BizProtocolDonationConvert", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L187"}, {"id": "models_research_donation_rationale_10", "label": "\u79d1\u7814\u6350\u8d60\u4e3b\u8868 biz_research_donation", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L10"}, {"id": "models_research_donation_rationale_44", "label": "\u79d1\u7814\u6350\u8d60\u5ba1\u6838\u8bb0\u5f55 biz_research_donation_audit", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L44"}, {"id": "models_research_donation_rationale_65", "label": "\u79d1\u7814\u6350\u8d60\u5f53\u4e8b\u4eba\u4fe1\u606f biz_research_donation_party", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L65"}, {"id": "models_research_donation_rationale_105", "label": "\u79d1\u7814\u6350\u8d60\u91c7\u96c6\u4fe1\u606f biz_research_donation_collection", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L105"}, {"id": "models_research_donation_rationale_129", "label": "\u79d1\u7814\u6350\u8d60\u6837\u672c\u4fe1\u606f biz_research_donation_sample\uff08\u65e0\u91d1\u989d\u5b57\u6bb5\uff09", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L129"}, {"id": "models_research_donation_rationale_160", "label": "\u79d1\u7814\u6350\u8d60\u6837\u672c\u8fd0\u8f93 biz_research_donation_sample_transport", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L160"}, {"id": "models_research_donation_rationale_188", "label": "\u7ec6\u80de\u5b58\u50a8\u534f\u8bae\u4e0e\u79d1\u7814\u6350\u8d60\u8f6c\u79fb\u5173\u8054 biz_protocol_donation_convert", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L188"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_backend_app_models_research_donation_py", "target": "datetime", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L2", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_models_research_donation_py", "target": "sqlalchemy", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_models_research_donation_py", "target": "app_models_base", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L6", "weLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_models_models_py", "label": "models.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L1"}, {"id": "models_models_userrole", "label": "UserRole", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L10"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "models_models_sysuser", "label": "SysUser", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L22"}, {"id": "base", "label": "Base", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "models_models_sysrole", "label": "SysRole", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L48"}, {"id": "models_models_sysuserrole", "label": "SysUserRole", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L68"}, {"id": "models_models_sysrolemenu", "label": "SysRoleMenu", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L87"}, {"id": "models_models_sysroledatascopedetail", "label": "SysRoleDataScopeDetail", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L106"}, {"id": "models_models_sysmenu", "label": "SysMenu", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L126"}, {"id": "models_models_sysdept", "label": "SysDept", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L152"}, {"id": "models_models_systenant", "label": "SysTenant", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L175"}, {"id": "models_models_syssite", "label": "SysSite", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L195"}, {"id": "models_models_syspost", "label": "SysPost", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L221"}, {"id": "models_models_sysuserpost", "label": "SysUserPost", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L241"}, {"id": "models_models_bizitemunit", "label": "BizItemUnit", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L260"}, {"id": "models_models_bizexpresscompany", "label": "BizExpressCompany", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L279"}, {"id": "models_models_bizcustomer", "label": "BizCustomer", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L299"}, {"id": "models_models_bizcellsampletype", "label": "BizCellSampleType", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L322"}, {"id": "models_models_bizcollectionregion", "label": "BizCollectionRegion", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L345"}, {"id": "models_models_bizcollectionhospital", "label": "BizCollectionHospital", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L363"}, {"id": "models_models_bizcollectionprotocolno", "label": "BizCollectionProtocolNo", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L382"}, {"id": "models_models_bizbiznosequence", "label": "BizBizNoSequence", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L404"}, {"id": "models_models_bizsamplecode", "label": "BizSampleCode", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L424"}, {"id": "models_models_sysdicttype", "label": "SysDictType", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L452"}, {"id": "models_models_sysethnic", "label": "SysEthnic", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L471"}, {"id": "models_models_sysdictdata", "label": "SysDictData", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location"Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_utils_sample_special_py", "label": "sample_special.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L1"}, {"id": "utils_sample_special_truthy_flag", "label": "_truthy_flag()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L7"}, {"id": "utils_sample_special_sample_special_to_dict", "label": "sample_special_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L15"}, {"id": "utils_sample_special_validate_sample_special_raw", "label": "validate_sample_special_raw()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L24"}, {"id": "utils_sample_special_apply_sample_special_fields", "label": "apply_sample_special_fields()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L34"}, {"id": "utils_sample_special_apply_special_to_item_from_samples", "label": "apply_special_to_item_from_samples()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L41"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_backend_app_utils_sample_special_py", "target": "typing", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_utils_sample_special_py", "target": "utils_sample_special_truthy_flag", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L7", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_utils_sample_special_py", "target": "utils_sample_special_sample_special_to_dict", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L15", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_utils_sample_special_py", "target": "utils_sample_special_validate_sample_special_raw", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L24", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_utils_sample_special_py", "target": "utils_sample_special_apply_sample_special_fields", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L34", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_utils_sample_special_py", "target": "utils_sample_special_apply_special_to_item_from_samples", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L41", "weight": 1.0}, {"source": "utils_sample_special_validate_sample_special_raw", "target": "utils_sample_special_truthy_flag", "relation": "calls", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L25", "weight": 1.0}, {"source": "utils_sample_special_apply_sample_special_fields", "target": "utils_sample_special_truthy_flag", "relation": "calls", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L35", "weight": 1.0}, {"source": "utils_sample_special_apply_special_to_item_from_samples", "target": "utils_sample_special_sample_special_to_dict", "relation": "calls", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L55", "weight": 1.0}], "raw_calls": [{"caller_nid": "utils_sample_special_truthy_flag", "callee": "isinstance", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L10"}, {"caller_nid": "utils_sample_special_truthy_flag", "callee": "lower", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L11"}, {"caller_nid": "utils_sample_special_truthy_flag", "callee": "strip", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L11"}, {"caller_nid": "utils_sample_special_sample_special_to_dict", "callee": "bool", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py", "source_location": "L19"}, {"caller_nid": "utils_sample_special_sample_specialLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_models_research_donation_py", "label": "research_donation.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L1"}, {"id": "models_research_donation_bizresearchdonation", "label": "BizResearchDonation", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L9"}, {"id": "base", "label": "Base", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "models_research_donation_bizresearchdonationaudit", "label": "BizResearchDonationAudit", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L42"}, {"id": "models_research_donation_bizresearchdonationparty", "label": "BizResearchDonationParty", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L63"}, {"id": "models_research_donation_bizresearchdonationcollection", "label": "BizResearchDonationCollection", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L103"}, {"id": "models_research_donation_bizresearchdonationsample", "label": "BizResearchDonationSample", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L127"}, {"id": "models_research_donation_bizresearchdonationsampletransport", "label": "BizResearchDonationSampleTransport", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L158"}, {"id": "models_research_donation_bizprotocoldonationconvert", "label": "BizProtocolDonationConvert", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L186"}, {"id": "models_research_donation_rationale_10", "label": "\u79d1\u7814\u6350\u8d60\u4e3b\u8868 biz_research_donation", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L10"}, {"id": "models_research_donation_rationale_43", "label": "\u79d1\u7814\u6350\u8d60\u5ba1\u6838\u8bb0\u5f55 biz_research_donation_audit", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L43"}, {"id": "models_research_donation_rationale_64", "label": "\u79d1\u7814\u6350\u8d60\u5f53\u4e8b\u4eba\u4fe1\u606f biz_research_donation_party", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L64"}, {"id": "models_research_donation_rationale_104", "label": "\u79d1\u7814\u6350\u8d60\u91c7\u96c6\u4fe1\u606f biz_research_donation_collection", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L104"}, {"id": "models_research_donation_rationale_128", "label": "\u79d1\u7814\u6350\u8d60\u6837\u672c\u4fe1\u606f biz_research_donation_sample\uff08\u65e0\u91d1\u989d\u5b57\u6bb5\uff09", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L128"}, {"id": "models_research_donation_rationale_159", "label": "\u79d1\u7814\u6350\u8d60\u6837\u672c\u8fd0\u8f93 biz_research_donation_sample_transport", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L159"}, {"id": "models_research_donation_rationale_187", "label": "\u7ec6\u80de\u5b58\u50a8\u534f\u8bae\u4e0e\u79d1\u7814\u6350\u8d60\u8f6c\u79fb\u5173\u8054 biz_protocol_donation_convert", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L187"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_backend_app_models_research_donation_py", "target": "datetime", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L2", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_models_research_donation_py", "target": "sqlalchemy", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_models_research_donation_py", "target": "app_models_base", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L6", "weLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_models_research_donation_py", "label": "research_donation.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L1"}, {"id": "models_research_donation_bizresearchdonation", "label": "BizResearchDonation", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L9"}, {"id": "base", "label": "Base", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "models_research_donation_bizresearchdonationaudit", "label": "BizResearchDonationAudit", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L42"}, {"id": "models_research_donation_bizresearchdonationparty", "label": "BizResearchDonationParty", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L63"}, {"id": "models_research_donation_bizresearchdonationcollection", "label": "BizResearchDonationCollection", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L103"}, {"id": "models_research_donation_bizresearchdonationsample", "label": "BizResearchDonationSample", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L127"}, {"id": "models_research_donation_bizresearchdonationsampletransport", "label": "BizResearchDonationSampleTransport", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L158"}, {"id": "models_research_donation_bizprotocoldonationconvert", "label": "BizProtocolDonationConvert", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L186"}, {"id": "models_research_donation_rationale_10", "label": "\u79d1\u7814\u6350\u8d60\u4e3b\u8868 biz_research_donation", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L10"}, {"id": "models_research_donation_rationale_43", "label": "\u79d1\u7814\u6350\u8d60\u5ba1\u6838\u8bb0\u5f55 biz_research_donation_audit", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L43"}, {"id": "models_research_donation_rationale_64", "label": "\u79d1\u7814\u6350\u8d60\u5f53\u4e8b\u4eba\u4fe1\u606f biz_research_donation_party", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L64"}, {"id": "models_research_donation_rationale_104", "label": "\u79d1\u7814\u6350\u8d60\u91c7\u96c6\u4fe1\u606f biz_research_donation_collection", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L104"}, {"id": "models_research_donation_rationale_128", "label": "\u79d1\u7814\u6350\u8d60\u6837\u672c\u4fe1\u606f biz_research_donation_sample\uff08\u65e0\u91d1\u989d\u5b57\u6bb5\uff09", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L128"}, {"id": "models_research_donation_rationale_159", "label": "\u79d1\u7814\u6350\u8d60\u6837\u672c\u8fd0\u8f93 biz_research_donation_sample_transport", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L159"}, {"id": "models_research_donation_rationale_187", "label": "\u7ec6\u80de\u5b58\u50a8\u534f\u8bae\u4e0e\u79d1\u7814\u6350\u8d60\u8f6c\u79fb\u5173\u8054 biz_protocol_donation_convert", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L187"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_backend_app_models_research_donation_py", "target": "datetime", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L2", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_models_research_donation_py", "target": "sqlalchemy", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_models_research_donation_py", "target": "app_models_base", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py", "source_location": "L6", "weLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_api_material_py", "label": "material.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L1"}, {"id": "api_material_resolve_operator_name", "label": "_resolve_operator_name()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L25"}, {"id": "api_material_materialbody", "label": "MaterialBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L44"}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "api_material_materialupdatebody", "label": "MaterialUpdateBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L58"}, {"id": "api_material_stockinbody", "label": "StockInBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L72"}, {"id": "api_material_batchstockinitem", "label": "BatchStockInItem", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L88"}, {"id": "api_material_batchstockinbody", "label": "BatchStockInBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L103"}, {"id": "api_material_batchstockoutitem", "label": "BatchStockOutItem", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L111"}, {"id": "api_material_batchstockoutbody", "label": "BatchStockOutBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L118"}, {"id": "api_material_batchdiscarditem", "label": "BatchDiscardItem", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L128"}, {"id": "api_material_batchdiscardbody", "label": "BatchDiscardBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L136"}, {"id": "api_material_materialbatchupdatebody", "label": "MaterialBatchUpdateBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L145"}, {"id": "api_material_stockcheckcreatebody", "label": "StockCheckCreateBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L165"}, {"id": "api_material_stockcheckunusedlineitem", "label": "StockCheckUnusedLineItem", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L172"}, {"id": "api_material_stockcheckunusedlinesbody", "label": "StockCheckUnusedLinesBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L192"}, {"id": "api_material_list_material_batches", "label": "list_material_batches()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L201"}, {"id": "api_material_material_batch_options", "label": "material_batch_options()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L232"}, {"id": "api_material_update_material_batch", "label": "update_material_batch()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L255"}, {"id": "api_material_delete_material_batch", "label": "delete_material_batch()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L284"}, {"id": "api_material_list_materials", "label": "list_materials()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L304"}, {"id": "api_material_material_options", "label": "material_options()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L327"}, {"id": "api_material_create_material", "label": "create_material()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L339"}, {"id": "api_material_update_material", "label": "update_material()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L359"}, {"id": "api_material_delete_material", "label": "delete_material()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py", "source_location": "L380"}, {"id": "api_material_batch_Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_inbound_sample_special_py", "label": "inbound_sample_special.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/inbound_sample_special.py", "source_location": "L1"}, {"id": "crud_inbound_sample_special_update_inbound_sample_special_mark", "label": "update_inbound_sample_special_mark()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/inbound_sample_special.py", "source_location": "L17"}, {"id": "crud_inbound_sample_special_rationale_1", "label": "\u5165\u5e93\u6837\u672c\uff08\u91c7\u96c6\u534f\u8bae / \u79d1\u7814\u6350\u8d60\uff09\u00b7 \u7279\u6b8a\u6807\u8bb0\u7ef4\u62a4\u3002", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/inbound_sample_special.py", "source_location": "L1"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_inbound_sample_special_py", "target": "typing", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/inbound_sample_special.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_inbound_sample_special_py", "target": "sqlalchemy_orm", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/inbound_sample_special.py", "source_location": "L6", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_inbound_sample_special_py", "target": "app_models_models", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/inbound_sample_special.py", "source_location": "L8", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_inbound_sample_special_py", "target": "app_models_research_donation", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/inbound_sample_special.py", "source_location": "L9", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_inbound_sample_special_py", "target": "app_utils_sample_special", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/inbound_sample_special.py", "source_location": "L10", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_inbound_sample_special_py", "target": "crud_inbound_sample_special_update_inbound_sample_special_mark", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/inbound_sample_special.py", "source_location": "L17", "weight": 1.0}, {"source": "crud_inbound_sample_special_rationale_1", "target": "users_wuzilong_work_00code_zkxw_backend_app_crud_inbound_sample_special_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/inbound_sample_special.py", "source_location": "L1", "weight": 1.0}], "raw_calls": [{"caller_nid": "crud_inbound_sample_special_update_inbound_sample_special_mark", "callee": "strip", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/inbound_sample_special.py", "source_location": "L27"}, {"caller_nid": "crud_inbound_sample_special_update_inbound_sample_special_mark", "callee": "ValueError", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/inbound_sample_special.py", "source_location": "L29"}, {"caller_nid": "crud_inbound_sample_special_update_inbound_sample_special_mark", "callee": "strip", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/inbound_sample_special.py", "source_location": "L31"}, {"caller_nid": "crud_inbound_sample_special_update_inbound_sample_special_mark", "callee": "validate_sample_special_raw", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/inbound_sample_special.py", "source_location": "L33"}, {"caller_nid": "crud_inbound_sample_special_update_inbound_sample_special_mark", "callee": "first", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/inbound_sample_special.py", "source_location": "L37"}, {"caller_nid": "crud_inbound_sample_special_update_inbound_sample_special_mark", "callee": "filter", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/inbound_sample_special.py", "source_location": "L37"}, {"caller_nid": "crud_inbound_sample_special_update_inbound_sample_special_mark", "callee": "query", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/inbound_sample_special.py", "source_location": "L37"}, {"caller_nid": "crud_inbound_sample_special_update_inbound_sample_special_mark", "callee": "ValueError", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/inbound_sample_special.py", "source_location": "L46"}, {"caller_nid": "crud_inbound_sample_special_updaLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_research_donation_py", "label": "research_donation.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L1"}, {"id": "crud_research_donation_total_pages", "label": "total_pages()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L58"}, {"id": "crud_research_donation_donation_sample_code_seq", "label": "_donation_sample_code_seq()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L68"}, {"id": "crud_research_donation_next_donation_sample_code", "label": "next_donation_sample_code()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L80"}, {"id": "crud_research_donation_fmt_dt", "label": "_fmt_dt()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L141"}, {"id": "crud_research_donation_normalize_date_bound", "label": "_normalize_date_bound()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L145"}, {"id": "crud_research_donation_dec", "label": "_dec()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L152"}, {"id": "crud_research_donation_optional_decimal", "label": "_optional_decimal()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L160"}, {"id": "crud_research_donation_normalize_fields", "label": "_normalize_fields()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L172"}, {"id": "crud_research_donation_merge_comma_separated_urls", "label": "_merge_comma_separated_urls()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L183"}, {"id": "crud_research_donation_resolve_donation_payload", "label": "_resolve_donation_payload()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L199"}, {"id": "crud_research_donation_user_nick_name_map", "label": "_user_nick_name_map()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L217"}, {"id": "crud_research_donation_load_unit_name_map", "label": "_load_unit_name_map()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L225"}, {"id": "crud_research_donation_donation_to_dict", "label": "_donation_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L244"}, {"id": "crud_research_donation_audit_to_dict", "label": "_audit_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L278"}, {"id": "crud_research_donation_party_to_dict", "label": "_party_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L300"}, {"id": "crud_research_donation_collection_to_dict", "label": "_collection_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L334"}, {"id": "crud_research_donation_sample_to_dict", "label": "_sample_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L352"}, {"id": "crud_research_donation_transport_to_dict", "label": "_transport_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L375"}, {"id": "crud_research_donation_get_party", "label": "get_party()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L400"}, {"id": "crud_research_donation_get_collection", "label": "get_collection()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L416"}, {"id": "crud_research_donation_list_samples", "label": "list_samples()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L432"}, {"id": "crud_research_donation_list_sample_transports", "label": "list_sample_transports()", "file_type": "code", "source_file": "/UsLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_qc_work_order_py", "label": "qc_work_order.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L1"}, {"id": "crud_qc_work_order_resolve_outbound_biz_type_for_schedule", "label": "resolve_outbound_biz_type_for_schedule()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L95"}, {"id": "crud_qc_work_order_dec", "label": "_dec()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L136"}, {"id": "crud_qc_work_order_fmt_dt", "label": "_fmt_dt()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L142"}, {"id": "crud_qc_work_order_normalize_date_bound", "label": "_normalize_date_bound()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L146"}, {"id": "crud_qc_work_order_reception_source_label", "label": "_reception_source_label()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L153"}, {"id": "crud_qc_work_order_qc_biz_type_label", "label": "_qc_biz_type_label()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L158"}, {"id": "crud_qc_work_order_work_order_qc_biz_type", "label": "_work_order_qc_biz_type()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L163"}, {"id": "crud_qc_work_order_validate_cell_product_id", "label": "_validate_cell_product_id()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L170"}, {"id": "crud_qc_work_order_enrich_work_order_cell_products", "label": "_enrich_work_order_cell_products()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L182"}, {"id": "crud_qc_work_order_enrich_work_order_step_outputs", "label": "_enrich_work_order_step_outputs()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L211"}, {"id": "crud_qc_work_order_enrich_work_order_qc_targets", "label": "_enrich_work_order_qc_targets()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L250"}, {"id": "crud_qc_work_order_enrich_outbound_work_orders", "label": "_enrich_outbound_work_orders()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L257"}, {"id": "crud_qc_work_order_outbound_qc_work_order_ids_by_keyword", "label": "_outbound_qc_work_order_ids_by_keyword()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L378"}, {"id": "crud_qc_work_order_inbound_qc_work_order_ids_by_mother_name", "label": "_inbound_qc_work_order_ids_by_mother_name()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L425"}, {"id": "crud_qc_work_order_accept_conclusion_label", "label": "_accept_conclusion_label()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L491"}, {"id": "crud_qc_work_order_load_sample_type_name_map", "label": "_load_sample_type_name_map()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L496"}, {"id": "crud_qc_work_order_effective_reception_source", "label": "_effective_reception_source()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L508"}, {"id": "crud_qc_work_order_effective_donation_sample_id", "label": "_effective_donation_sample_id()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L517"}, {"id": "crud_qc_work_order_effective_protocol_sample_id", "label": "_effective_protocol_sample_id()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L526"}, {"id": "crud_qc_work_order_sample_type_name_for_item", "label": "_sample_type_name_for_item()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L534"}, {"id": "crud_qc_work_order_sample_type_name_for_reception", "label": "_sample_type_name_for_reception()", "file_type": "code", "source_file": "/Users/wuzLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_qc_task_py", "label": "qc_task.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L1"}, {"id": "crud_qc_task_dec", "label": "_dec()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L38"}, {"id": "crud_qc_task_fmt_dt", "label": "_fmt_dt()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L44"}, {"id": "crud_qc_task_gen_task_no", "label": "_gen_task_no()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L48"}, {"id": "crud_qc_task_conclusion_label", "label": "_conclusion_label()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L61"}, {"id": "crud_qc_task_task_to_dict", "label": "_task_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L66"}, {"id": "crud_qc_task_task_work_order_context", "label": "_task_work_order_context()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L100"}, {"id": "crud_qc_task_merge_work_order_summary_into_task", "label": "_merge_work_order_summary_into_task()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L176"}, {"id": "crud_qc_task_enrich_mine_tasks_with_work_order_summaries", "label": "_enrich_mine_tasks_with_work_order_summaries()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L200"}, {"id": "crud_qc_task_enrich_tasks_reception_fields", "label": "_enrich_tasks_reception_fields()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L220"}, {"id": "crud_qc_task_task_row_to_dict", "label": "_task_row_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L367"}, {"id": "crud_qc_task_create_task_for_line", "label": "create_task_for_line()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L378"}, {"id": "crud_qc_task_list_tasks", "label": "list_tasks()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L425"}, {"id": "crud_qc_task_list_mine_tasks", "label": "list_mine_tasks()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L506"}, {"id": "crud_qc_task_assert_task_assignee", "label": "assert_task_assignee()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L598"}, {"id": "crud_qc_task_list_tasks_by_work_order", "label": "list_tasks_by_work_order()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L605"}, {"id": "crud_qc_task_list_tasks_by_work_order_ids", "label": "list_tasks_by_work_order_ids()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L612"}, {"id": "crud_qc_task_get_task", "label": "get_task()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L642"}, {"id": "crud_qc_task_get_task_detail", "label": "get_task_detail()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L651"}, {"id": "crud_qc_task_start_task", "label": "start_task()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L684"}, {"id": "crud_qc_task_set_task_remark", "label": "_set_task_remark()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L701"}, {"id": "crud_qc_task_complete_task", "label": "complete_task()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L705"}, {"id": "crud_qc_task_apply_task_result", "label": "apply_task_result()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L746"}, {"id": "crud_qc_task_update_task_attachments", "label": "update_task_attachments()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L798"}, {"id": "crud_qc_task_create_qc_task_manual", "label": "create_qc_task_manual()", "file_type": "code"Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_api_production_py", "label": "production.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/production.py", "source_location": "L1"}, {"id": "api_production_legacy_material_write_gone", "label": "_legacy_material_write_gone()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/production.py", "source_location": "L75"}, {"id": "api_production_get_tenant_no", "label": "_get_tenant_no()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/production.py", "source_location": "L79"}, {"id": "api_production_get_current_user_id", "label": "_get_current_user_id()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/production.py", "source_location": "L87"}, {"id": "api_production_consumablecreatebody", "label": "ConsumableCreateBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/production.py", "source_location": "L96"}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "api_production_consumableupdatebody", "label": "ConsumableUpdateBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/production.py", "source_location": "L110"}, {"id": "api_production_list_consumables", "label": "list_consumables()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/production.py", "source_location": "L125"}, {"id": "api_production_list_all_consumables", "label": "list_all_consumables()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/production.py", "source_location": "L139"}, {"id": "api_production_create_consumable", "label": "create_consumable()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/production.py", "source_location": "L149"}, {"id": "api_production_update_consumable", "label": "update_consumable()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/production.py", "source_location": "L158"}, {"id": "api_production_delete_consumable", "label": "delete_consumable()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/production.py", "source_location": "L168"}, {"id": "api_production_stockinbody", "label": "StockInBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/production.py", "source_location": "L176"}, {"id": "api_production_stockoutbody", "label": "StockOutBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/production.py", "source_location": "L182"}, {"id": "api_production_batchstockinitem", "label": "BatchStockInItem", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/production.py", "source_location": "L190"}, {"id": "api_production_batchstockinbody", "label": "BatchStockInBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/production.py", "source_location": "L197"}, {"id": "api_production_batchstockoutitem", "label": "BatchStockOutItem", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/production.py", "source_location": "L203"}, {"id": "api_production_batchstockoutbody", "label": "BatchStockOutBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/production.py", "source_location": "L209"}, {"id": "api_production_consumable_stock_in", "label": "consumable_stock_in()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/production.py", "source_location": "L218"}, {"id": "api_production_consumable_stock_out", "label": "consumable_stock_out()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/production.py", "source_location": "L240"}, {"id": "api_production_consumable_batch_stock_in", "label": "consumable_batch_stock_in()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/production.py", "source_location": "L264"}, {"id": "api_production_consumable_batch_stock_out", "label": "consumable_batch_stock_out()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/production.py", "source_location": "L282"}, {"id": "api_production_list_consumable_stock_logs", "label": "list_consumable_stock_logs()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/production.py", "source_location": "L301"}, {"id": "api_production_list_all_consumable_stock_logs", "label": "list_all_consumable_stock_logs()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/production.py", "source_location": "L320"}, {"id": "api_production_reagentcreatebody", "label": "ReagentCreateBody"Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_qc_task_py", "label": "qc_task.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L1"}, {"id": "crud_qc_task_dec", "label": "_dec()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L38"}, {"id": "crud_qc_task_fmt_dt", "label": "_fmt_dt()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L44"}, {"id": "crud_qc_task_gen_task_no", "label": "_gen_task_no()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L48"}, {"id": "crud_qc_task_conclusion_label", "label": "_conclusion_label()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L61"}, {"id": "crud_qc_task_task_to_dict", "label": "_task_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L66"}, {"id": "crud_qc_task_task_work_order_context", "label": "_task_work_order_context()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L100"}, {"id": "crud_qc_task_merge_work_order_summary_into_task", "label": "_merge_work_order_summary_into_task()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L176"}, {"id": "crud_qc_task_enrich_mine_tasks_with_work_order_summaries", "label": "_enrich_mine_tasks_with_work_order_summaries()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L200"}, {"id": "crud_qc_task_enrich_tasks_reception_fields", "label": "_enrich_tasks_reception_fields()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L220"}, {"id": "crud_qc_task_task_row_to_dict", "label": "_task_row_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L336"}, {"id": "crud_qc_task_create_task_for_line", "label": "create_task_for_line()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L347"}, {"id": "crud_qc_task_list_tasks", "label": "list_tasks()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L394"}, {"id": "crud_qc_task_list_mine_tasks", "label": "list_mine_tasks()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L475"}, {"id": "crud_qc_task_assert_task_assignee", "label": "assert_task_assignee()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L567"}, {"id": "crud_qc_task_list_tasks_by_work_order", "label": "list_tasks_by_work_order()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L574"}, {"id": "crud_qc_task_list_tasks_by_work_order_ids", "label": "list_tasks_by_work_order_ids()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L581"}, {"id": "crud_qc_task_get_task", "label": "get_task()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L611"}, {"id": "crud_qc_task_get_task_detail", "label": "get_task_detail()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L620"}, {"id": "crud_qc_task_start_task", "label": "start_task()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L653"}, {"id": "crud_qc_task_set_task_remark", "label": "_set_task_remark()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L670"}, {"id": "crud_qc_task_complete_task", "label": "complete_task()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L674"}, {"id": "crud_qc_task_apply_task_result", "label": "apply_task_result()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L715"}, {"id": "crud_qc_task_update_task_attachments", "label": "update_task_attachments()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L767"}, {"id": "crud_qc_task_create_qc_task_manual", "label": "create_qc_task_manual()", "file_type": "code"Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_research_donation_py", "label": "research_donation.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L1"}, {"id": "crud_research_donation_total_pages", "label": "total_pages()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L63"}, {"id": "crud_research_donation_donation_sample_code_seq", "label": "_donation_sample_code_seq()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L73"}, {"id": "crud_research_donation_next_donation_sample_code", "label": "next_donation_sample_code()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L85"}, {"id": "crud_research_donation_fmt_dt", "label": "_fmt_dt()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L146"}, {"id": "crud_research_donation_normalize_date_bound", "label": "_normalize_date_bound()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L150"}, {"id": "crud_research_donation_dec", "label": "_dec()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L157"}, {"id": "crud_research_donation_optional_decimal", "label": "_optional_decimal()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L165"}, {"id": "crud_research_donation_normalize_fields", "label": "_normalize_fields()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L177"}, {"id": "crud_research_donation_merge_comma_separated_urls", "label": "_merge_comma_separated_urls()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L188"}, {"id": "crud_research_donation_resolve_donation_payload", "label": "_resolve_donation_payload()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L204"}, {"id": "crud_research_donation_user_nick_name_map", "label": "_user_nick_name_map()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L222"}, {"id": "crud_research_donation_load_unit_name_map", "label": "_load_unit_name_map()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L230"}, {"id": "crud_research_donation_donation_to_dict", "label": "_donation_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L249"}, {"id": "crud_research_donation_audit_to_dict", "label": "_audit_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L284"}, {"id": "crud_research_donation_party_to_dict", "label": "_party_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L306"}, {"id": "crud_research_donation_collection_to_dict", "label": "_collection_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L340"}, {"id": "crud_research_donation_sample_to_dict", "label": "_sample_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L358"}, {"id": "crud_research_donation_transport_to_dict", "label": "_transport_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L382"}, {"id": "crud_research_donation_get_party", "label": "get_party()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L407"}, {"id": "crud_research_donation_get_collection", "label": "get_collection()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L423"}, {"id": "crud_research_donation_list_samples", "label": "list_samples()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L439"}, {"id": "crud_research_donation_list_sample_transports", "label": "list_sample_transports()", "file_type": "code", "source_file": "/UsLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_collection_protocol_py", "label": "collection_protocol.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L1"}, {"id": "crud_collection_protocol_get_protocol_nos_used_in_protocols", "label": "get_protocol_nos_used_in_protocols()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L69"}, {"id": "crud_collection_protocol_get_sample_codes_used_in_protocol_samples", "label": "get_sample_codes_used_in_protocol_samples()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L103"}, {"id": "crud_collection_protocol_validate_sample_codes_not_used", "label": "validate_sample_codes_not_used()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L137"}, {"id": "crud_collection_protocol_total_pages", "label": "total_pages()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L170"}, {"id": "crud_collection_protocol_fmt_dt", "label": "_fmt_dt()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L176"}, {"id": "crud_collection_protocol_dec", "label": "_dec()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L180"}, {"id": "crud_collection_protocol_optional_decimal", "label": "_optional_decimal()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L188"}, {"id": "crud_collection_protocol_today_yyyymmdd", "label": "_today_yyyymmdd()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L194"}, {"id": "crud_collection_protocol_normalize_yyyymmdd_date", "label": "_normalize_yyyymmdd_date()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L198"}, {"id": "crud_collection_protocol_normalize_fields", "label": "_normalize_fields()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L217"}, {"id": "crud_collection_protocol_pop_attachment_urls", "label": "_pop_attachment_urls()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L228"}, {"id": "crud_collection_protocol_attachments_to_urls", "label": "attachments_to_urls()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L239"}, {"id": "crud_collection_protocol_normalize_attachment_url_key", "label": "_normalize_attachment_url_key()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L258"}, {"id": "crud_collection_protocol_format_attachment_file_size", "label": "_format_attachment_file_size()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L267"}, {"id": "crud_collection_protocol_lookup_attachment_by_url", "label": "_lookup_attachment_by_url()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L275"}, {"id": "crud_collection_protocol_urls_to_attachment_list", "label": "urls_to_attachment_list()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L299"}, {"id": "crud_collection_protocol_user_nick_name_map", "label": "_user_nick_name_map()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L331"}, {"id": "crud_collection_protocol_protocol_to_dict", "label": "_protocol_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L339"}, {"id": "crud_collection_protocol_payment_to_dict", "label": "_payment_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L365"}, {"id": "crud_collection_protocol_detail_to_dict", "label": "_detail_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py", "source_location": "L386"}, {"id": "crud_collection_protocol_audit_to_dict", "label": "_audit_to_dict()", "file_type": "code", "sourceLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_qc_task_py", "label": "qc_task.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L1"}, {"id": "crud_qc_task_dec", "label": "_dec()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L38"}, {"id": "crud_qc_task_fmt_dt", "label": "_fmt_dt()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L44"}, {"id": "crud_qc_task_gen_task_no", "label": "_gen_task_no()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L48"}, {"id": "crud_qc_task_conclusion_label", "label": "_conclusion_label()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L61"}, {"id": "crud_qc_task_task_to_dict", "label": "_task_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L66"}, {"id": "crud_qc_task_task_work_order_context", "label": "_task_work_order_context()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L100"}, {"id": "crud_qc_task_merge_work_order_summary_into_task", "label": "_merge_work_order_summary_into_task()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L176"}, {"id": "crud_qc_task_enrich_mine_tasks_with_work_order_summaries", "label": "_enrich_mine_tasks_with_work_order_summaries()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L200"}, {"id": "crud_qc_task_enrich_tasks_reception_fields", "label": "_enrich_tasks_reception_fields()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L220"}, {"id": "crud_qc_task_task_row_to_dict", "label": "_task_row_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L336"}, {"id": "crud_qc_task_create_task_for_line", "label": "create_task_for_line()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L347"}, {"id": "crud_qc_task_list_tasks", "label": "list_tasks()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L394"}, {"id": "crud_qc_task_list_mine_tasks", "label": "list_mine_tasks()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L475"}, {"id": "crud_qc_task_assert_task_assignee", "label": "assert_task_assignee()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L567"}, {"id": "crud_qc_task_list_tasks_by_work_order", "label": "list_tasks_by_work_order()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L574"}, {"id": "crud_qc_task_list_tasks_by_work_order_ids", "label": "list_tasks_by_work_order_ids()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L581"}, {"id": "crud_qc_task_get_task", "label": "get_task()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L611"}, {"id": "crud_qc_task_get_task_detail", "label": "get_task_detail()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L620"}, {"id": "crud_qc_task_start_task", "label": "start_task()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L653"}, {"id": "crud_qc_task_set_task_remark", "label": "_set_task_remark()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L670"}, {"id": "crud_qc_task_complete_task", "label": "complete_task()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L674"}, {"id": "crud_qc_task_apply_task_result", "label": "apply_task_result()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L715"}, {"id": "crud_qc_task_update_task_attachments", "label": "update_task_attachments()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py", "source_location": "L767"}, {"id": "crud_qc_task_create_qc_task_manual", "label": "create_qc_task_manual()", "file_type": "code"Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_api_collection_protocol_py", "label": "collection_protocol.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/collection_protocol.py", "source_location": "L1"}, {"id": "api_collection_protocol_get_tenant_no", "label": "_get_tenant_no()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/collection_protocol.py", "source_location": "L29"}, {"id": "api_collection_protocol_get_current_user_id", "label": "_get_current_user_id()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/collection_protocol.py", "source_location": "L39"}, {"id": "api_collection_protocol_protocol_accessible", "label": "_protocol_accessible()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/collection_protocol.py", "source_location": "L46"}, {"id": "api_collection_protocol_parse_datetime_fields", "label": "_parse_datetime_fields()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/collection_protocol.py", "source_location": "L68"}, {"id": "api_collection_protocol_ensure_customer_for_mother", "label": "_ensure_customer_for_mother()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/collection_protocol.py", "source_location": "L82"}, {"id": "api_collection_protocol_list_collection_protocols", "label": "list_collection_protocols()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/collection_protocol.py", "source_location": "L131"}, {"id": "api_collection_protocol_get_collection_protocol_detail", "label": "get_collection_protocol_detail()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/collection_protocol.py", "source_location": "L162"}, {"id": "api_collection_protocol_protocolcreatebody", "label": "ProtocolCreateBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/collection_protocol.py", "source_location": "L176"}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "api_collection_protocol_protocolupdatebody", "label": "ProtocolUpdateBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/collection_protocol.py", "source_location": "L195"}, {"id": "api_collection_protocol_resolve_protocol_attachments", "label": "_resolve_protocol_attachments()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/collection_protocol.py", "source_location": "L222"}, {"id": "api_collection_protocol_persist_protocol_sub_resources", "label": "_persist_protocol_sub_resources()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/collection_protocol.py", "source_location": "L232"}, {"id": "api_collection_protocol_create_collection_protocol", "label": "create_collection_protocol()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/collection_protocol.py", "source_location": "L268"}, {"id": "api_collection_protocol_update_collection_protocol", "label": "update_collection_protocol()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/collection_protocol.py", "source_location": "L311"}, {"id": "api_collection_protocol_delete_collection_protocol", "label": "delete_collection_protocol()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/collection_protocol.py", "source_location": "L361"}, {"id": "api_collection_protocol_list_collection_protocol_audits", "label": "list_collection_protocol_audits()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/collection_protocol.py", "source_location": "L388"}, {"id": "api_collection_protocol_auditcreatebody", "label": "AuditCreateBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/collection_protocol.py", "source_location": "L412"}, {"id": "api_collection_protocol_submit_collection_protocol_audit", "label": "submit_collection_protocol_audit()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/collection_protocol.py", "source_location": "L420"}, {"id": "api_collection_protocol_list_payment_details", "label": "list_payment_details()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/collection_protocol.py", "source_location": "L449"}, {"id": "api_collection_protocol_batchdetailidsbody", "label": "BatchDetailIdsBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/collection_protocol.py", "source_location": "L477"}, {"id": "api_collection_protocol_paymentdetaildraftbody", "label": "PaymentDetailDraftBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_research_donation_py", "label": "research_donation.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L1"}, {"id": "crud_research_donation_total_pages", "label": "total_pages()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L63"}, {"id": "crud_research_donation_donation_sample_code_seq", "label": "_donation_sample_code_seq()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L73"}, {"id": "crud_research_donation_next_donation_sample_code", "label": "next_donation_sample_code()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L85"}, {"id": "crud_research_donation_fmt_dt", "label": "_fmt_dt()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L146"}, {"id": "crud_research_donation_normalize_date_bound", "label": "_normalize_date_bound()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L150"}, {"id": "crud_research_donation_dec", "label": "_dec()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L157"}, {"id": "crud_research_donation_optional_decimal", "label": "_optional_decimal()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L165"}, {"id": "crud_research_donation_normalize_fields", "label": "_normalize_fields()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L177"}, {"id": "crud_research_donation_merge_comma_separated_urls", "label": "_merge_comma_separated_urls()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L188"}, {"id": "crud_research_donation_resolve_donation_payload", "label": "_resolve_donation_payload()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L204"}, {"id": "crud_research_donation_user_nick_name_map", "label": "_user_nick_name_map()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L222"}, {"id": "crud_research_donation_load_unit_name_map", "label": "_load_unit_name_map()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L230"}, {"id": "crud_research_donation_donation_to_dict", "label": "_donation_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L249"}, {"id": "crud_research_donation_audit_to_dict", "label": "_audit_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L283"}, {"id": "crud_research_donation_party_to_dict", "label": "_party_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L305"}, {"id": "crud_research_donation_collection_to_dict", "label": "_collection_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L339"}, {"id": "crud_research_donation_sample_to_dict", "label": "_sample_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L357"}, {"id": "crud_research_donation_transport_to_dict", "label": "_transport_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L381"}, {"id": "crud_research_donation_get_party", "label": "get_party()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L406"}, {"id": "crud_research_donation_get_collection", "label": "get_collection()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L422"}, {"id": "crud_research_donation_list_samples", "label": "list_samples()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L438"}, {"id": "crud_research_donation_list_sample_transports", "label": "list_sample_transports()", "file_type": "code", "source_file": "/UsLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_models_material_py", "label": "material.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/material.py", "source_location": "L1"}, {"id": "models_material_bizmaterial", "label": "BizMaterial", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/material.py", "source_location": "L8"}, {"id": "base", "label": "Base", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "models_material_bizmaterialstockbatch", "label": "BizMaterialStockBatch", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/material.py", "source_location": "L32"}, {"id": "models_material_bizmaterialusage", "label": "BizMaterialUsage", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/material.py", "source_location": "L62"}, {"id": "models_material_bizmaterialstockcheck", "label": "BizMaterialStockCheck", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/material.py", "source_location": "L105"}, {"id": "models_material_bizmaterialstockcheckbatchline", "label": "BizMaterialStockCheckBatchLine", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/material.py", "source_location": "L124"}, {"id": "models_material_bizmaterialstockcheckunusedline", "label": "BizMaterialStockCheckUnusedLine", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/material.py", "source_location": "L155"}, {"id": "models_material_bizmaterialstocklog", "label": "BizMaterialStockLog", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/material.py", "source_location": "L186"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_backend_app_models_material_py", "target": "datetime", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/material.py", "source_location": "L1", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_models_material_py", "target": "sqlalchemy", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/material.py", "source_location": "L3", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_models_material_py", "target": "app_core_database", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/material.py", "source_location": "L5", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_models_material_py", "target": "models_material_bizmaterial", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/material.py", "source_location": "L8", "weight": 1.0}, {"source": "models_material_bizmaterial", "target": "base", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/material.py", "source_location": "L8", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_models_material_py", "target": "models_material_bizmaterialstockbatch", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/material.py", "source_location": "L32", "weight": 1.0}, {"source": "models_material_bizmaterialstockbatch", "target": "base", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/material.py", "source_location": "L32", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_models_material_py", "target": "models_material_bizmaterialusage", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/material.py", "source_location": "L62", "weight": 1.0}, {"source": "models_material_bizmaterialusage", "target": "base", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/material.py", "source_location": "L62", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_models_material_py", "target": "models_material_bizmaterialstockcheck", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/material.py", "source_location": "L105", "weight": 1.0}, {"source": "models_material_bizmaterialstockcheck", "target": "base", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/material.py", "source_location": "L105", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_models_material_py", "target": "models_material_bizmaterialstockcheckbatchline", "relation": "contains",Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_core_protocol_status_display_py", "label": "protocol_status_display.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/protocol_status_display.py", "source_location": "L1"}, {"id": "core_protocol_status_display_resolve_void_type_label", "label": "resolve_void_type_label()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/protocol_status_display.py", "source_location": "L35"}, {"id": "core_protocol_status_display_format_protocol_status_label", "label": "format_protocol_status_label()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/protocol_status_display.py", "source_location": "L59"}, {"id": "core_protocol_status_display_build_void_type_label_map", "label": "build_void_type_label_map()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/protocol_status_display.py", "source_location": "L78"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_backend_app_core_protocol_status_display_py", "target": "typing", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/protocol_status_display.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_core_protocol_status_display_py", "target": "sqlalchemy_orm", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/protocol_status_display.py", "source_location": "L6", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_core_protocol_status_display_py", "target": "app_models_models", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/protocol_status_display.py", "source_location": "L8", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_core_protocol_status_display_py", "target": "core_protocol_status_display_resolve_void_type_label", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/protocol_status_display.py", "source_location": "L35", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_core_protocol_status_display_py", "target": "core_protocol_status_display_format_protocol_status_label", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/protocol_status_display.py", "source_location": "L59", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_core_protocol_status_display_py", "target": "core_protocol_status_display_build_void_type_label_map", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/protocol_status_display.py", "source_location": "L78", "weight": 1.0}, {"source": "core_protocol_status_display_format_protocol_status_label", "target": "core_protocol_status_display_resolve_void_type_label", "relation": "calls", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/protocol_status_display.py", "source_location": "L72", "weight": 1.0}], "raw_calls": [{"caller_nid": "core_protocol_status_display_resolve_void_type_label", "callee": "strip", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/protocol_status_display.py", "source_location": "L40"}, {"caller_nid": "core_protocol_status_display_resolve_void_type_label", "callee": "first", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/protocol_status_display.py", "source_location": "L45"}, {"caller_nid": "core_protocol_status_display_resolve_void_type_label", "callee": "filter", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/protocol_status_display.py", "source_location": "L45"}, {"caller_nid": "core_protocol_status_display_resolve_void_type_label", "callee": "query", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/protocol_status_display.py", "source_location": "L45"}, {"caller_nid": "core_protocol_status_display_resolve_void_type_label", "callee": "strip", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/protocol_status_display.py", "source_location": "L54"}, {"caller_nid": "core_protocol_status_display_resolve_void_type_label", "callee": "strip", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/protocol_status_display.py", "source_location": "L55"}, {"caller_nid": "core_protocol_status_display_resolve_void_type_label", "callee": "get", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/protocol_status_display.py", "source_location": "L56"}, {"caller_nid": "core_protocol_status_display_format_protocol_status_label", "callee": "strip", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/protocol_status_displLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_material_usage_py", "label": "material_usage.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_usage.py", "source_location": "L1"}, {"id": "crud_material_usage_parse_receiver_purpose_from_remark", "label": "_parse_receiver_purpose_from_remark()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_usage.py", "source_location": "L14"}, {"id": "crud_material_usage_resolve_receiver_purpose", "label": "_resolve_receiver_purpose()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_usage.py", "source_location": "L25"}, {"id": "crud_material_usage_display_remark", "label": "_display_remark()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_usage.py", "source_location": "L35"}, {"id": "crud_material_usage_user_nick_name_map", "label": "_user_nick_name_map()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_usage.py", "source_location": "L50"}, {"id": "crud_material_usage_receiver_display_map", "label": "_receiver_display_map()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_usage.py", "source_location": "L58"}, {"id": "crud_material_usage_usage_unit_label", "label": "_usage_unit_label()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_usage.py", "source_location": "L69"}, {"id": "crud_material_usage_stock_in_date_for_row", "label": "_stock_in_date_for_row()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_usage.py", "source_location": "L78"}, {"id": "crud_material_usage_unit_price_for_row", "label": "_unit_price_for_row()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_usage.py", "source_location": "L84"}, {"id": "crud_material_usage_amount_for_row", "label": "_amount_for_row()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_usage.py", "source_location": "L92"}, {"id": "crud_material_usage_row_to_dict", "label": "_row_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_usage.py", "source_location": "L108"}, {"id": "crud_material_usage_batch_map", "label": "_batch_map()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_usage.py", "source_location": "L160"}, {"id": "crud_material_usage_list_usages_query", "label": "_list_usages_query()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_usage.py", "source_location": "L172"}, {"id": "crud_material_usage_paginate_usages", "label": "_paginate_usages()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_usage.py", "source_location": "L226"}, {"id": "crud_material_usage_list_usages", "label": "list_usages()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_usage.py", "source_location": "L257"}, {"id": "crud_material_usage_fmt_date_val", "label": "_fmt_date_val()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_usage.py", "source_location": "L285"}, {"id": "crud_material_usage_list_stock_check_requisitions", "label": "list_stock_check_requisitions()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_usage.py", "source_location": "L293"}, {"id": "crud_material_usage_mark_requisition_fully_used", "label": "mark_requisition_fully_used()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_usage.py", "source_location": "L382"}, {"id": "crud_material_usage_rationale_302", "label": "\u76d8\u70b9\u767b\u8bb0\u5f39\u7a97\uff1a\u5f85\u5904\u7406\u9886\u7528\u8bb0\u5f55\uff08\u672a\u6807\u8bb0\u5df2\u4f7f\u7528\u5b8c\uff09\u3002", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_usage.py", "source_location": "L302"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_material_usage_py", "target": "datetime", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_usage.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_material_usage_py", "target": "typing", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_usage.py", "source_location": "L5", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_crud_material_usage_py", "target": "sqlalchemy", "relation": "imports_Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_crud_research_donation_py", "label": "research_donation.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L1"}, {"id": "crud_research_donation_total_pages", "label": "total_pages()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L63"}, {"id": "crud_research_donation_donation_sample_code_seq", "label": "_donation_sample_code_seq()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L73"}, {"id": "crud_research_donation_next_donation_sample_code", "label": "next_donation_sample_code()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L85"}, {"id": "crud_research_donation_fmt_dt", "label": "_fmt_dt()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L146"}, {"id": "crud_research_donation_normalize_date_bound", "label": "_normalize_date_bound()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L150"}, {"id": "crud_research_donation_dec", "label": "_dec()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L157"}, {"id": "crud_research_donation_optional_decimal", "label": "_optional_decimal()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L165"}, {"id": "crud_research_donation_normalize_fields", "label": "_normalize_fields()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L177"}, {"id": "crud_research_donation_merge_comma_separated_urls", "label": "_merge_comma_separated_urls()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L188"}, {"id": "crud_research_donation_resolve_donation_payload", "label": "_resolve_donation_payload()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L204"}, {"id": "crud_research_donation_user_nick_name_map", "label": "_user_nick_name_map()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L222"}, {"id": "crud_research_donation_load_unit_name_map", "label": "_load_unit_name_map()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L230"}, {"id": "crud_research_donation_donation_to_dict", "label": "_donation_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L249"}, {"id": "crud_research_donation_audit_to_dict", "label": "_audit_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L283"}, {"id": "crud_research_donation_party_to_dict", "label": "_party_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L305"}, {"id": "crud_research_donation_collection_to_dict", "label": "_collection_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L339"}, {"id": "crud_research_donation_sample_to_dict", "label": "_sample_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L357"}, {"id": "crud_research_donation_transport_to_dict", "label": "_transport_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L381"}, {"id": "crud_research_donation_get_party", "label": "get_party()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L406"}, {"id": "crud_research_donation_get_collection", "label": "get_collection()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L422"}, {"id": "crud_research_donation_list_samples", "label": "list_samples()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py", "source_location": "L438"}, {"id": "crud_research_donation_list_sample_transports", "label": "list_sample_transports()", "file_type": "code", "source_file": "/UsLine truncated
+1
View File
@@ -79,6 +79,7 @@ class BizMaterialUsage(Base):
stock_before = Column(Numeric(18, 4), nullable=True, comment="变动前物资汇总库存")
stock_after = Column(Numeric(18, 4), nullable=False, comment="变动后库存量")
receiver = Column(String(64), nullable=True, comment="领用人(手动出库)")
operator_name = Column(String(100), nullable=True, comment="经办人姓名")
purpose = Column(String(512), nullable=True, comment="用途/事由(手动出库或废弃原因)")
requisition_status = Column(
String(16),
+3
View File
@@ -750,6 +750,7 @@ class BizCollectionProtocol(Base):
expire_desc = Column(String(512), nullable=True, comment="协议过期描述")
void_time = Column(DateTime, nullable=True, comment="协议作废时间")
void_desc = Column(String(512), nullable=True, comment="协议作废描述")
void_type = Column(String(32), nullable=True, comment="协议作废类型(字典 xyzflx)")
to_research_time = Column(DateTime, nullable=True, comment="协议转科研时间")
to_research_desc = Column(String(512), nullable=True, comment="协议转科研描述")
collector_user_id = Column(String(64), nullable=True, comment="采集专员用户ID")
@@ -1013,6 +1014,8 @@ class BizProtocolSample(Base):
detect_start_date = Column(CHAR(8), nullable=True, comment="检测开始日期YYYYMMDD")
void_date = Column(CHAR(8), nullable=True, comment="作废日期YYYYMMDD")
storage_expire_date = Column(CHAR(8), nullable=True, comment="存储到期日期YYYYMMDD")
is_special = Column(SmallInteger, nullable=False, default=0, comment="是否特殊样本:0否 1是")
special_remark = Column(String(256), nullable=True, comment="特殊说明")
tenant_no = Column(String(64), nullable=False, default="zkxw", comment="租户编号")
order_num = Column(Integer, nullable=True, comment="排序号")
remark = Column(String(512), nullable=True, comment="备注")
+4 -1
View File
@@ -13,7 +13,7 @@ class BizResearchDonation(Base):
id = Column(String(64), primary_key=True, comment="主键ID")
donation_no = Column(String(64), nullable=False, comment="捐赠协议编号")
donation_status = Column(String(16), nullable=False, default="dsx", comment="状态 dsx/sxz/ygq/yzf/zckc")
donation_status = Column(String(16), nullable=False, default="dsx", comment="状态 dsx/sxz/ygq/yzf/sdfq/zckc")
donation_date = Column(String(8), nullable=True, comment="捐赠日期YYYYMMDD")
source_type = Column(String(20), nullable=False, default="direct", comment="来源类型 direct/from_storage")
source_protocol_id = Column(String(64), nullable=True, comment="来源协议ID")
@@ -26,6 +26,7 @@ class BizResearchDonation(Base):
expire_desc = Column(String(512), nullable=True, comment="过期描述")
void_time = Column(DateTime, nullable=True, comment="作废时间")
void_desc = Column(String(512), nullable=True, comment="作废描述")
void_type = Column(String(32), nullable=True, comment="作废类型(字典 xyzflx)")
to_storage_time = Column(DateTime, nullable=True, comment="转存储时间")
to_storage_desc = Column(String(512), nullable=True, comment="转存储描述")
tenant_no = Column(String(64), nullable=False, default="zkxw", comment="租户编号")
@@ -142,6 +143,8 @@ class BizResearchDonationSample(Base):
detect_start_date = Column(String(8), nullable=True, comment="检测开始日期YYYYMMDD")
void_date = Column(String(8), nullable=True, comment="作废日期YYYYMMDD")
storage_expire_date = Column(String(8), nullable=True, comment="存储到期日期YYYYMMDD")
is_special = Column(SmallInteger, nullable=False, default=0, comment="是否特殊样本:0否 1是")
special_remark = Column(String(256), nullable=True, comment="特殊说明")
tenant_no = Column(String(64), nullable=False, default="zkxw", comment="租户编号")
order_num = Column(Integer, nullable=True, comment="排序号")
remark = Column(String(512), nullable=True, comment="备注")
+66
View File
@@ -0,0 +1,66 @@
"""协议/捐赠样本 · 特殊标记字段工具。"""
from __future__ import annotations
from typing import Any, Dict, Optional
def _truthy_flag(value: Any) -> bool:
if value is True or value == 1:
return True
if isinstance(value, str):
return value.strip().lower() in ("1", "true", "yes")
return False
def sample_special_to_dict(sample: Any) -> Dict[str, Any]:
if sample is None:
return {"isSpecial": False, "specialRemark": ""}
return {
"isSpecial": bool(getattr(sample, "is_special", 0)),
"specialRemark": (getattr(sample, "special_remark", None) or "").strip(),
}
def validate_sample_special_raw(raw: dict, *, index: Optional[int] = None) -> None:
is_special = _truthy_flag(raw.get("is_special"))
remark = (raw.get("special_remark") or "").strip()
prefix = f"样本第{index + 1}行:" if index is not None else ""
if is_special and not remark:
raise ValueError(f"{prefix}特殊样本须填写特殊说明")
if len(remark) > 256:
raise ValueError(f"{prefix}特殊说明不能超过256个字符")
def apply_sample_special_fields(obj: Any, raw: dict) -> None:
is_special = _truthy_flag(raw.get("is_special"))
remark = (raw.get("special_remark") or "").strip()
obj.is_special = 1 if is_special else 0
obj.special_remark = remark if is_special and remark else None
def apply_inbound_sample_special_mark_fields(obj: Any, raw: dict) -> None:
"""质检等场景:取消勾选时保留 special_remark,仅清除 is_special 标记。"""
is_special = _truthy_flag(raw.get("is_special"))
remark = (raw.get("special_remark") or "").strip()
obj.is_special = 1 if is_special else 0
if is_special:
obj.special_remark = remark if remark else None
elif remark:
obj.special_remark = remark
def apply_special_to_item_from_samples(
item: Dict[str, Any],
*,
source: str,
protocol_sample_id: str,
donation_sample_id: str,
protocol_samples: Dict[str, Any],
donation_samples: Dict[str, Any],
) -> None:
sample = None
if source == "research_donation":
sample = donation_samples.get(donation_sample_id or "")
else:
sample = protocol_samples.get(protocol_sample_id or "")
item.update(sample_special_to_dict(sample))
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+104 -139
View File
@@ -1,11 +1,11 @@
# Graph Report - app (2026-06-30)
# Graph Report - app (2026-07-01)
## Corpus Check
- Large corpus: 214 files · ~260,355 words. Semantic extraction will be expensive (many Claude tokens). Consider running on a subfolder, or use --no-semantic to run AST-only.
- Large corpus: 217 files · ~262,549 words. Semantic extraction will be expensive (many Claude tokens). Consider running on a subfolder, or use --no-semantic to run AST-only.
## Summary
- 4447 nodes · 23842 edges · 52 communities detected
- Extraction: 32% EXTRACTED · 68% INFERRED · 0% AMBIGUOUS · INFERRED: 16206 edges (avg confidence: 0.59)
- 4481 nodes · 24087 edges · 45 communities detected
- Extraction: 32% EXTRACTED · 68% INFERRED · 0% AMBIGUOUS · INFERRED: 16400 edges (avg confidence: 0.59)
- Token cost: 0 input · 0 output
## Community Hubs (Navigation)
@@ -48,26 +48,19 @@
- [[_COMMUNITY_Community 36|Community 36]]
- [[_COMMUNITY_Community 37|Community 37]]
- [[_COMMUNITY_Community 38|Community 38]]
- [[_COMMUNITY_Community 39|Community 39]]
- [[_COMMUNITY_Community 40|Community 40]]
- [[_COMMUNITY_Community 41|Community 41]]
- [[_COMMUNITY_Community 42|Community 42]]
- [[_COMMUNITY_Community 43|Community 43]]
- [[_COMMUNITY_Community 44|Community 44]]
- [[_COMMUNITY_Community 45|Community 45]]
- [[_COMMUNITY_Community 48|Community 48]]
- [[_COMMUNITY_Community 49|Community 49]]
- [[_COMMUNITY_Community 50|Community 50]]
- [[_COMMUNITY_Community 51|Community 51]]
- [[_COMMUNITY_Community 52|Community 52]]
- [[_COMMUNITY_Community 53|Community 53]]
- [[_COMMUNITY_Community 46|Community 46]]
## God Nodes (most connected - your core abstractions)
1. `success_response()` - 668 edges
2. `error_response()` - 552 edges
3. `SysUser` - 480 edges
4. `BizProductionMaterial` - 311 edges
5. `BizQcTaskResult` - 310 edges
1. `success_response()` - 670 edges
2. `error_response()` - 554 edges
3. `SysUser` - 500 edges
4. `BizQcTaskResult` - 314 edges
5. `BizProductionMaterial` - 311 edges
6. `BizProductionMaterialUsage` - 306 edges
7. `BizQcMaterialUsage` - 303 edges
8. `BizQcMaterial` - 294 edges
@@ -90,252 +83,224 @@
### Community 0 - "Community 0"
Cohesion: 0.01
Nodes (880): attachment_download_url(), create_dept(), create_dict_data(), create_dict_type(), create_express_company(), create_item_unit(), create_menu(), create_post() (+872 more)
Nodes (869): attachment_download_url(), create_dept(), create_dict_data(), create_dict_type(), create_express_company(), create_item_unit(), create_menu(), create_post() (+861 more)
### Community 1 - "Community 1"
Cohesion: 0.01
Nodes (568): AttachmentDownloadUrlBody, DeptCreateBody, DeptUpdateBody, DictDataCreateBody, DictDataUpdateBody, DictTypeCreateBody, DictTypeUpdateBody, ExpressCompanyCreateBody (+560 more)
Nodes (573): AttachmentDownloadUrlBody, DeptCreateBody, DeptUpdateBody, DictDataCreateBody, DictDataUpdateBody, DictTypeCreateBody, DictTypeUpdateBody, ExpressCompanyCreateBody (+565 more)
### Community 2 - "Community 2"
Cohesion: 0.08
Nodes (355): 环境检测 — 检测项维护 + 登记管理 API, 保险公司及险种价格管理 API(保险公司 + 开票信息 + 险种价格), AccessLogCreateBody, AccessLogUpdateBody, CleanRoomCreateBody, CleanRoomUpdateBody, ExhibitionAppointmentCreateBody, ExhibitionAppointmentUpdateBody (+347 more)
Cohesion: 0.01
Nodes (469): list_ethnics_for_select(), get_designer_data(), apply_data_scope(), _get_child_dept_ids(), get_user_dept_id(), _resolve_user_role_scopes(), generate_uuid(), ApiRequestLogCRUD (+461 more)
### Community 3 - "Community 3"
Cohesion: 0.01
Nodes (275): _normalize_date_bound(), _persist_protocol_sub_resources(), list_ethnics_for_select(), apply_data_scope(), _get_child_dept_ids(), get_user_dept_id(), _resolve_user_role_scopes(), format_date() (+267 more)
Cohesion: 0.08
Nodes (385): 环境检测 — 检测项维护 + 登记管理 API, 保险公司及险种价格管理 API(保险公司 + 开票信息 + 险种价格), AccessLogCreateBody, AccessLogUpdateBody, CleanRoomCreateBody, CleanRoomUpdateBody, ExhibitionAppointmentCreateBody, ExhibitionAppointmentUpdateBody (+377 more)
### Community 4 - "Community 4"
Cohesion: 0.01
Nodes (289): generate_uuid(), batch_stock_in(), batch_stock_out(), consumable_code_exists(), create_consumable(), _dec(), get_consumable(), _is_enabled_status() (+281 more)
Nodes (333): _normalize_date_bound(), _persist_protocol_sub_resources(), batch_delete_research_donations(), change_donation_status(), convert_from_storage(), convert_to_storage(), create_research_donation(), delete_research_donation() (+325 more)
### Community 5 - "Community 5"
Cohesion: 0.05
Nodes (229): CellSampleTypeCreateBody, CellSampleTypeUpdateBody, CollectionRegionCreateBody, CollectionRegionUpdateBody, CustomerCreateBody, CustomerUpdateBody, HospitalCreateBody, HospitalUpdateBody (+221 more)
Cohesion: 0.07
Nodes (262): CellSampleTypeCreateBody, CellSampleTypeUpdateBody, CollectionRegionCreateBody, CollectionRegionUpdateBody, CustomerCreateBody, CustomerUpdateBody, HospitalCreateBody, HospitalUpdateBody (+254 more)
### Community 6 - "Community 6"
Cohesion: 0.02
Nodes (201): eq_unicode(), like_unicode(), MySQL 字符串比较/模糊匹配时统一排序规则,避免 Illegal mix of collations。, 跨表字符串等值比较(JOIN / WHERE)时统一为 utf8mb4_unicode_ci。, 将列显式设为 utf8mb4_unicode_ci。, unicode_ci(), batch_review(), _dec() (+193 more)
Nodes (230): eq_unicode(), like_unicode(), MySQL 字符串比较/模糊匹配时统一排序规则,避免 Illegal mix of collations。, 跨表字符串等值比较(JOIN / WHERE)时统一为 utf8mb4_unicode_ci。, 将列显式设为 utf8mb4_unicode_ci。, unicode_ci(), build_void_type_label_map(), format_protocol_status_label() (+222 more)
### Community 7 - "Community 7"
Cohesion: 0.12
Nodes (193): BatchStockInBody, BatchStockInItem, BatchStockOutBody, BatchStockOutItem, ConsumableCreateBody, ConsumablePackCreateBody, ConsumablePackUpdateBody, ConsumableUpdateBody (+185 more)
Cohesion: 0.02
Nodes (199): _code_exists(), create_material(), _dec(), _fmt_dt(), get_material(), get_material_entity(), get_my_usages(), _is_enabled_status() (+191 more)
### Community 8 - "Community 8"
Cohesion: 0.02
Nodes (113): get_designer_data(), _error_json(), 数据库异常:返回 JSON 并保留 CORS 头,避免浏览器只报跨域错误, 未捕获异常:统一 JSON 500,确保跨域场景下仍有 Access-Control-Allow-Origin, sqlalchemy_exception_handler(), unhandled_exception_handler(), BaseHTTPMiddleware, ApiCryptoError (+105 more)
Cohesion: 0.03
Nodes (127): _jwt_user_payload(), Web 端登录用 RSA 公钥(PKCS#1 v1.5,与 JSEncrypt 一致), Web 端登录:账号为 sys_user.user_no,密码为 sys_user.password(bcrypt)。, refresh_token(), web_login(), web_login_rsa_public_key(), create_access_token(), create_refresh_token() (+119 more)
### Community 9 - "Community 9"
Cohesion: 0.02
Nodes (143): _jwt_user_payload(), logout(), Web 端登录用 RSA 公钥(PKCS#1 v1.5,与 JSEncrypt 一致), Web 端登录:账号为 sys_user.user_no,密码为 sys_user.password(bcrypt)。, 登出:吊销 Redis 会话(若已配置 REDIS_HOST)。, refresh_token(), web_login(), web_login_rsa_public_key() (+135 more)
Cohesion: 0.03
Nodes (128): get_next_cell_product_code(), _ancestor_link_from_cell_product_input(), _ancestor_sample_chain_link(), _apply_cell_product_status_change(), _build_ancestor_chain(), _build_descendant_chain(), _build_facility_path_label(), build_split_product_codes() (+120 more)
### Community 10 - "Community 10"
Cohesion: 0.03
Nodes (147): batch_discard(), batch_options(), _batch_row_to_dict(), batch_stock_in(), batch_stock_out(), _create_batch_and_usage(), delete_batch(), _discard_batch() (+139 more)
Nodes (73): _error_json(), lifespan(), 数据库异常:返回 JSON 并保留 CORS 头,避免浏览器只报跨域错误, 未捕获异常:统一 JSON 500,确保跨域场景下仍有 Access-Control-Allow-Origin, sqlalchemy_exception_handler(), unhandled_exception_handler(), BaseHTTPMiddleware, ApiCryptoError (+65 more)
### Community 11 - "Community 11"
Cohesion: 0.04
Nodes (105): _body_to_payload(), _get_current_user_id(), get_production_reception_by_sample_code(), get_production_reception_detail(), _get_tenant_no(), post_production_reception(), put_production_reception(), _resolve_reception_id() (+97 more)
Cohesion: 0.34
Nodes (73): BatchStockInBody, BatchStockInItem, BatchStockOutBody, BatchStockOutItem, ConsumableCreateBody, ConsumablePackCreateBody, ConsumablePackUpdateBody, ConsumableUpdateBody (+65 more)
### Community 12 - "Community 12"
Cohesion: 0.04
Nodes (108): complete_application(), create_basic_experiment_sale_schedules(), create_infusion_plan(), create_schedule(), _create_schedule_products(), _format_yyyy_mm_dd(), _generate_application_no(), get_application() (+100 more)
Cohesion: 0.06
Nodes (62): complete_application(), create_basic_experiment_sale_schedules(), create_infusion_plan(), create_schedule(), _create_schedule_products(), _format_yyyy_mm_dd(), _generate_application_no(), get_application() (+54 more)
### Community 13 - "Community 13"
Cohesion: 0.06
Nodes (64): aggregate_slot_stats_by_facility(), _apply_slot_select_base_filters(), _apply_slot_select_query_filters(), batch_create_slots(), _build_node_path_cache(), _build_slot_keyword_sql_filters(), clear_slots_by_facility_node(), collect_descendant_ids() (+56 more)
Cohesion: 0.07
Nodes (58): aggregate_slot_stats_by_facility(), _apply_slot_select_base_filters(), _apply_slot_select_query_filters(), batch_create_slots(), _build_node_path_cache(), _build_slot_keyword_sql_filters(), collect_descendant_ids(), _collect_slot_host_node_ids() (+50 more)
### Community 14 - "Community 14"
Cohesion: 0.07
Nodes (57): get_next_cell_product_code(), _ancestor_link_from_cell_product_input(), _ancestor_sample_chain_link(), _apply_cell_product_status_change(), _build_ancestor_chain(), _build_descendant_chain(), _build_facility_path_label(), build_split_product_codes() (+49 more)
### Community 15 - "Community 15"
Cohesion: 0.07
Nodes (31): create_cell_sample_type(), get_cell_sample_type(), list_cell_sample_types(), 细胞样本类型 CRUD(biz_cell_sample_type), _row_to_dict(), soft_delete_cell_sample_type(), type_code_exists(), update_cell_sample_type() (+23 more)
### Community 16 - "Community 16"
Cohesion: 0.11
Nodes (35): batch_create_sterilize_logs(), batch_create_wash_logs(), batch_discard_garments(), batch_soft_delete_garments(), _count_map(), create_garment(), create_sterilize_log(), create_wash_log() (+27 more)
### Community 17 - "Community 17"
### Community 15 - "Community 15"
Cohesion: 0.12
Nodes (10): get_wechat_pay_client(), get_wechat_pay_v2(), 微信支付工具模块 支持微信支付 V3 API 文档参考: https://pay.weixin.qq.com/docs/v3/apis/index.ht, 统一下单接口 (V3) Args: out_trade_no: 商户订单号 total, 小程序调起支付的二次签名参数(与公众号 JSAPI 规则一致), 统一下单 (V2 API) Args: out_trade_no: 商户订单号 tot, 生成签名 V3 (SHA256 with RSA), wechat_pay() (+2 more)
### Community 16 - "Community 16"
Cohesion: 0.18
Nodes (18): company_code_exists(), create_company(), get_company(), list_companies(), list_company_options(), _row_to_dict(), soft_delete_company(), update_company() (+10 more)
### Community 17 - "Community 17"
Cohesion: 0.21
Nodes (15): batch_generate_protocol_nos(), batch_issue_protocol_nos(), batch_revoke_protocol_nos(), create_protocol_no(), get_protocol_no(), list_protocol_nos(), _parse_issued_time(), protocol_no_exists() (+7 more)
### Community 18 - "Community 18"
Cohesion: 0.15
Nodes (20): _access_log_to_dict(), _calc_duration_minutes(), create_access_log(), create_clean_room(), create_uv_disinfect_log(), get_access_log(), get_clean_room(), get_uv_disinfect_log() (+12 more)
Cohesion: 0.22
Nodes (14): batch_generate_sample_codes(), batch_issue_sample_codes(), batch_revoke_sample_codes(), create_sample_code(), get_sample_code(), list_sample_codes(), _parse_issued_time(), 样本编码池 CRUD(biz_sample_code) (+6 more)
### Community 19 - "Community 19"
Cohesion: 0.2
Nodes (19): _code_exists(), create_material(), _dec(), _fmt_dt(), get_material(), get_material_entity(), get_my_usages(), _is_enabled_status() (+11 more)
### Community 20 - "Community 20"
Cohesion: 0.22
Nodes (13): create_collection_region(), create_hospital(), get_collection_region(), get_hospital(), _hospital_names_by_region_ids(), _hospital_to_dict(), list_collection_regions(), list_hospitals() (+5 more)
### Community 21 - "Community 21"
Cohesion: 0.25
Nodes (13): batch_issue_protocol_nos(), batch_revoke_protocol_nos(), create_protocol_no(), get_protocol_no(), list_protocol_nos(), _parse_issued_time(), protocol_no_exists(), 采集协议号池 CRUD(biz_collection_protocol_no) (+5 more)
### Community 22 - "Community 22"
Cohesion: 0.26
Nodes (12): batch_issue_sample_codes(), batch_revoke_sample_codes(), create_sample_code(), get_sample_code(), list_sample_codes(), _parse_issued_time(), 样本编码池 CRUD(biz_sample_code), _resolve_issued_user_display_name() (+4 more)
### Community 23 - "Community 23"
### Community 20 - "Community 20"
Cohesion: 0.27
Nodes (12): create_equipment(), _dec(), equipment_code_exists(), equipment_is_referenced(), get_equipment(), list_equipments(), _norm_status(), _parse_date() (+4 more)
### Community 24 - "Community 24"
### Community 21 - "Community 21"
Cohesion: 0.24
Nodes (9): 微信消息通知服务 支持微信小程序模板消息推送 使用方式: from app.core.wechat_message import Wech, 发送模板消息 Args: openid: 用户openid templ, send_delivery_notice(), send_delivery_warning(), send_order_status(), send_payment_success(), send_refund_result(), send_urge_notification() (+1 more)
### Community 25 - "Community 25"
Cohesion: 0.27
Nodes (11): create_consumable_pack(), get_consumable_pack(), get_pack_detail(), _item_row_to_dict(), list_all_packs(), list_consumable_packs(), pack_code_exists(), 耗材包 CRUD(biz_consumable_pack + biz_consumable_pack_item) (+3 more)
### Community 26 - "Community 26"
### Community 22 - "Community 22"
Cohesion: 0.24
Nodes (12): appointment_no_exists(), create_exhibition_appointment(), _format_visit_date(), _generate_appointment_no(), get_exhibition_appointment(), list_exhibition_appointments(), 展览预约 CRUD(biz_exhibition_appointment), 生成预约编号:YYYYMMDD + 6位序号(如 20260515000001) (+4 more)
### Community 27 - "Community 27"
### Community 23 - "Community 23"
Cohesion: 0.24
Nodes (11): deduct_for_step(), _display_remark(), list_stock_logs(), _parse_receiver_purpose_from_remark(), 试剂变动记录 CRUD(biz_reagent_stock_log), 撤销步骤此前 step_save 扣减,便于重新填报。, 扣减试剂库存并生成变动记录。调用方控制事务,本函数不 commit。, _resolve_receiver_purpose() (+3 more)
### Community 28 - "Community 28"
Cohesion: 0.23
Nodes (10): create_dict_data(), get_dict_data(), is_dict_value_valid(), list_dict_data(), list_dict_data_options(), normalize_transfer_type(), 字典数据 CRUD(sys_dict_data), _row_to_dict() (+2 more)
### Community 29 - "Community 29"
Cohesion: 0.24
Nodes (11): deduct_for_step(), _display_remark(), list_stock_logs(), _parse_receiver_purpose_from_remark(), 耗材变动记录 CRUD(biz_consumable_stock_log), 撤销步骤此前 step_save 扣减,便于重新填报。, 扣减耗材库存并生成变动记录。调用方控制事务,本函数不 commit。, _resolve_receiver_purpose() (+3 more)
### Community 30 - "Community 30"
Cohesion: 0.27
Nodes (11): _build_tree(), _cascade_soft_delete(), _collect_with_ancestors(), create_dept(), get_dept(), list_depts(), list_depts_tree(), 保留匹配节点及其全部上级,供关键词检索后仍能正确组树。 (+3 more)
### Community 31 - "Community 31"
### Community 24 - "Community 24"
Cohesion: 0.32
Nodes (11): create_env_detect_record(), _generate_record_no(), get_env_detect_record(), _join_csv(), list_env_detect_records(), _resolve_inspector_snapshots(), _resolve_item_snapshot(), _row_to_dict() (+3 more)
### Community 32 - "Community 32"
### Community 25 - "Community 25"
Cohesion: 0.24
Nodes (11): deduct_for_step(), _display_remark(), list_stock_logs(), _parse_receiver_purpose_from_remark(), 耗材变动记录 CRUD(biz_consumable_stock_log), 撤销步骤此前 step_save 扣减,便于重新填报。, 扣减耗材库存并生成变动记录。调用方控制事务,本函数不 commit。, _resolve_receiver_purpose() (+3 more)
### Community 26 - "Community 26"
Cohesion: 0.27
Nodes (11): _build_tree(), _cascade_soft_delete(), _collect_with_ancestors(), create_dept(), get_dept(), list_depts(), list_depts_tree(), 保留匹配节点及其全部上级,供关键词检索后仍能正确组树。 (+3 more)
### Community 27 - "Community 27"
Cohesion: 0.29
Nodes (9): _build_tree(), _cascade_soft_delete(), create_menu(), get_menu(), list_menus(), list_menus_tree(), _row_to_dict(), soft_delete_menu() (+1 more)
### Community 33 - "Community 33"
### Community 28 - "Community 28"
Cohesion: 0.27
Nodes (8): create_customer(), get_customer(), id_card_taken(), list_customers(), 客户 CRUD(biz_customer), _row_to_dict(), soft_delete_customer(), update_customer()
### Community 29 - "Community 29"
Cohesion: 0.38
Nodes (9): create_check_item(), get_check_item(), item_code_exists(), list_active_check_items(), list_check_items(), _order_query(), _row_to_dict(), soft_delete_check_item() (+1 more)
### Community 34 - "Community 34"
### Community 30 - "Community 30"
Cohesion: 0.38
Nodes (9): create_env_detect_item(), get_env_detect_item(), item_code_exists(), list_active_env_detect_items(), list_env_detect_items(), _order_query(), _row_to_dict(), soft_delete_env_detect_item() (+1 more)
### Community 35 - "Community 35"
### Community 31 - "Community 31"
Cohesion: 0.31
Nodes (8): create_item_unit(), get_item_unit(), list_item_units(), 物品单位 CRUD(biz_item_unit), _row_to_dict(), soft_delete_item_unit(), unit_code_exists(), update_item_unit()
### Community 36 - "Community 36"
Cohesion: 0.31
Nodes (8): create_output_type(), get_output_type(), list_output_types(), 工艺产出物类型 CRUD(biz_output_type), _row_to_dict(), soft_delete_output_type(), type_code_exists(), update_output_type()
### Community 37 - "Community 37"
Cohesion: 0.36
Nodes (7): create_tenant(), get_tenant(), list_tenants(), _row_to_dict(), soft_delete_tenant(), tenant_no_exists(), update_tenant()
### Community 38 - "Community 38"
Cohesion: 0.36
Nodes (7): create_site(), get_site(), list_sites(), _row_to_dict(), site_code_exists(), soft_delete_site(), update_site()
### Community 39 - "Community 39"
### Community 32 - "Community 32"
Cohesion: 0.29
Nodes (2): BaseModel, SoftDeleteModel
### Community 40 - "Community 40"
### Community 33 - "Community 33"
Cohesion: 0.38
Nodes (6): derive_legacy_status_from_three(), derive_three_status_from_legacy(), 阶段A兼容:从旧 status 推导三字段。 约束:旧 status 本身混合了支付/配送/订单生命周期,因此只能尽力推断; 若业务侧已有更精确, 阶段A兼容:从三字段反推旧 status(用于旧前端/旧筛选参数兼容)。, ThreeStatus, _to_decimal()
### Community 41 - "Community 41"
### Community 34 - "Community 34"
Cohesion: 0.5
Nodes (3): BaseSettings, Config, Settings
### Community 42 - "Community 42"
### Community 35 - "Community 35"
Cohesion: 0.5
Nodes (2): _auto_fill_create_dept_id(), ORM before_insert 钩子:当 create_dept_id 为空时,自动从请求上下文填充当前用户部门 ID
### Community 43 - "Community 43"
### Community 36 - "Community 36"
Cohesion: 0.67
Nodes (2): get_menu_list(), 运营端菜单接口(与 web-admin 前端静态路由 sqxp.ts 对齐,5 个一级菜单分组)
### Community 44 - "Community 44"
### Community 37 - "Community 37"
Cohesion: 1.0
Nodes (1): 请求级别的用户上下文变量 通过 contextvars 在请求处理链路中传递当前用户信息, 供 SQLAlchemy 事件监听器等底层机制使用,避免逐层手动传
### Community 45 - "Community 45"
### Community 38 - "Community 38"
Cohesion: 1.0
Nodes (1): API 路由包(骨架:公共鉴权 + 静态菜单 + 运营端占位)
### Community 48 - "Community 48"
### Community 41 - "Community 41"
Cohesion: 1.0
Nodes (1): 发送订单状态通知 Args: openid: 用户openid ord
### Community 49 - "Community 49"
### Community 42 - "Community 42"
Cohesion: 1.0
Nodes (1): 发送支付成功通知 Args: openid: 用户openid ord
### Community 50 - "Community 50"
### Community 43 - "Community 43"
Cohesion: 1.0
Nodes (1): 发送配送通知 Args: openid: 配送员openid task
### Community 51 - "Community 51"
### Community 44 - "Community 44"
Cohesion: 1.0
Nodes (1): 发送配送时效预警 Args: openid: 配送员openid ta
### Community 52 - "Community 52"
### Community 45 - "Community 45"
Cohesion: 1.0
Nodes (1): 发送退款结果通知 Args: openid: 用户openid ord
### Community 53 - "Community 53"
### Community 46 - "Community 46"
Cohesion: 1.0
Nodes (1): 发送催单通知给配送员 Args: deliver_openid: 配送员openid
## Knowledge Gaps
- **132 isolated node(s):** `刷新会话 TTL(refreshToken 续期;已登录用户每次 API 校验通过后滑动续期)`, `写入 refreshToken(用于 one-time 使用/吊销)`, `根据 token 获取当前用户(包含 Redis 会话校验;会话滑动续期)`, `登录凭据 RSA 解密(与前端 JSEncrypt PKCS#1 v1.5 兼容)。`, `加载 RSA 密钥对:优先环境变量,否则使用内置固定默认密钥。` (+127 more)
- **130 isolated node(s):** `刷新会话 TTL(refreshToken 续期;已登录用户每次 API 校验通过后滑动续期)`, `写入 refreshToken(用于 one-time 使用/吊销)`, `根据 token 获取当前用户(包含 Redis 会话校验;会话滑动续期)`, `登录凭据 RSA 解密(与前端 JSEncrypt PKCS#1 v1.5 兼容)。`, `加载 RSA 密钥对:优先环境变量,否则使用内置固定默认密钥。` (+125 more)
These have ≤1 connection - possible missing edges or undocumented components.
- **Thin community `Community 39`** (8 nodes): `BaseModel`, `.to_dict()`, `get_active()`, `base.py`, `SoftDeleteModel`, `.restore()`, `.soft_delete()`, `__tablename__()`
- **Thin community `Community 32`** (8 nodes): `BaseModel`, `.to_dict()`, `get_active()`, `base.py`, `SoftDeleteModel`, `.restore()`, `.soft_delete()`, `__tablename__()`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 42`** (4 nodes): `_auto_fill_create_dept_id()`, `get_db()`, `database.py`, `ORM before_insert 钩子:当 create_dept_id 为空时,自动从请求上下文填充当前用户部门 ID`
- **Thin community `Community 35`** (4 nodes): `_auto_fill_create_dept_id()`, `get_db()`, `database.py`, `ORM before_insert 钩子:当 create_dept_id 为空时,自动从请求上下文填充当前用户部门 ID`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 43`** (3 nodes): `get_menu_list()`, `menu.py`, `运营端菜单接口(与 web-admin 前端静态路由 sqxp.ts 对齐,5 个一级菜单分组)`
- **Thin community `Community 36`** (3 nodes): `get_menu_list()`, `menu.py`, `运营端菜单接口(与 web-admin 前端静态路由 sqxp.ts 对齐,5 个一级菜单分组)`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 44`** (2 nodes): `context.py`, `请求级别的用户上下文变量 通过 contextvars 在请求处理链路中传递当前用户信息, 供 SQLAlchemy 事件监听器等底层机制使用,避免逐层手动传`
- **Thin community `Community 37`** (2 nodes): `context.py`, `请求级别的用户上下文变量 通过 contextvars 在请求处理链路中传递当前用户信息, 供 SQLAlchemy 事件监听器等底层机制使用,避免逐层手动传`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 45`** (2 nodes): `__init__.py`, `API 路由包(骨架:公共鉴权 + 静态菜单 + 运营端占位)`
- **Thin community `Community 38`** (2 nodes): `__init__.py`, `API 路由包(骨架:公共鉴权 + 静态菜单 + 运营端占位)`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 48`** (1 nodes): `发送订单状态通知 Args: openid: 用户openid ord`
- **Thin community `Community 41`** (1 nodes): `发送订单状态通知 Args: openid: 用户openid ord`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 49`** (1 nodes): `发送支付成功通知 Args: openid: 用户openid ord`
- **Thin community `Community 42`** (1 nodes): `发送支付成功通知 Args: openid: 用户openid ord`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 50`** (1 nodes): `发送配送通知 Args: openid: 配送员openid task`
- **Thin community `Community 43`** (1 nodes): `发送配送通知 Args: openid: 配送员openid task`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 51`** (1 nodes): `发送配送时效预警 Args: openid: 配送员openid ta`
- **Thin community `Community 44`** (1 nodes): `发送配送时效预警 Args: openid: 配送员openid ta`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 52`** (1 nodes): `发送退款结果通知 Args: openid: 用户openid ord`
- **Thin community `Community 45`** (1 nodes): `发送退款结果通知 Args: openid: 用户openid ord`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 53`** (1 nodes): `发送催单通知给配送员 Args: deliver_openid: 配送员openid`
- **Thin community `Community 46`** (1 nodes): `发送催单通知给配送员 Args: deliver_openid: 配送员openid`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
## Suggested Questions
_Questions this graph is uniquely positioned to answer:_
- **Why does `SysUser` connect `Community 1` to `Community 2`, `Community 3`, `Community 5`, `Community 6`, `Community 7`, `Community 9`, `Community 10`, `Community 21`, `Community 22`, `Community 27`, `Community 29`?**
_High betweenness centrality (0.121) - this node is a cross-community bridge._
- **Why does `generate_uuid()` connect `Community 4` to `Community 0`, `Community 3`, `Community 5`, `Community 6`, `Community 7`, `Community 8`, `Community 9`, `Community 10`, `Community 11`, `Community 12`, `Community 13`, `Community 14`, `Community 15`, `Community 16`, `Community 18`, `Community 19`, `Community 20`, `Community 21`, `Community 22`, `Community 23`, `Community 25`, `Community 26`, `Community 27`, `Community 28`, `Community 29`, `Community 30`, `Community 31`, `Community 32`, `Community 33`, `Community 34`, `Community 35`, `Community 36`, `Community 37`, `Community 38`?**
_High betweenness centrality (0.060) - this node is a cross-community bridge._
- **Why does `success_response()` connect `Community 0` to `Community 1`, `Community 3`, `Community 5`, `Community 8`, `Community 9`, `Community 11`, `Community 43`, `Community 14`?**
_High betweenness centrality (0.057) - this node is a cross-community bridge._
- **Are the 729 inferred relationships involving `str` (e.g. with `unhandled_exception_handler()` and `get_current_user_by_token()`) actually correct?**
_`str` has 729 INFERRED edges - model-reasoned connections that need verification._
- **Are the 667 inferred relationships involving `success_response()` (e.g. with `list_storage_release_reviews()` and `get_storage_release_review_detail()`) actually correct?**
_`success_response()` has 667 INFERRED edges - model-reasoned connections that need verification._
- **Are the 551 inferred relationships involving `error_response()` (e.g. with `_json_error_response()` and `list_storage_release_reviews()`) actually correct?**
_`error_response()` has 551 INFERRED edges - model-reasoned connections that need verification._
- **Are the 478 inferred relationships involving `SysUser` (e.g. with `数据权限过滤(V0.3:基于角色 data_scope 的查询级行级过滤) data_scope 值: 1 = 全部数据 2 = 本部门数据 3` and `从 SysUser 读取用户的 dept_id。`) actually correct?**
_`SysUser` has 478 INFERRED edges - model-reasoned connections that need verification._
- **Why does `SysUser` connect `Community 1` to `Community 2`, `Community 3`, `Community 4`, `Community 5`, `Community 7`, `Community 8`, `Community 11`, `Community 17`, `Community 18`, `Community 23`, `Community 25`?**
_High betweenness centrality (0.108) - this node is a cross-community bridge._
- **Why does `generate_uuid()` connect `Community 2` to `Community 0`, `Community 3`, `Community 4`, `Community 5`, `Community 6`, `Community 7`, `Community 8`, `Community 9`, `Community 13`, `Community 14`, `Community 16`, `Community 17`, `Community 18`, `Community 19`, `Community 20`, `Community 22`, `Community 23`, `Community 24`, `Community 25`, `Community 26`, `Community 27`, `Community 28`, `Community 29`, `Community 30`, `Community 31`?**
_High betweenness centrality (0.059) - this node is a cross-community bridge._
- **Why does `success_response()` connect `Community 0` to `Community 1`, `Community 2`, `Community 36`, `Community 4`, `Community 8`, `Community 9`?**
_High betweenness centrality (0.047) - this node is a cross-community bridge._
- **Are the 737 inferred relationships involving `str` (e.g. with `unhandled_exception_handler()` and `get_current_user_by_token()`) actually correct?**
_`str` has 737 INFERRED edges - model-reasoned connections that need verification._
- **Are the 669 inferred relationships involving `success_response()` (e.g. with `list_storage_release_reviews()` and `get_storage_release_review_detail()`) actually correct?**
_`success_response()` has 669 INFERRED edges - model-reasoned connections that need verification._
- **Are the 553 inferred relationships involving `error_response()` (e.g. with `_json_error_response()` and `list_storage_release_reviews()`) actually correct?**
_`error_response()` has 553 INFERRED edges - model-reasoned connections that need verification._
- **Are the 498 inferred relationships involving `SysUser` (e.g. with `数据权限过滤(V0.3:基于角色 data_scope 的查询级行级过滤) data_scope 值: 1 = 全部数据 2 = 本部门数据 3` and `从 SysUser 读取用户的 dept_id。`) actually correct?**
_`SysUser` has 498 INFERRED edges - model-reasoned connections that need verification._
+4 -4
View File
@@ -57,12 +57,12 @@
</div>
<div id="legend"></div>
</div>
<div id="stats">4447 nodes &middot; 23842 edges &middot; 58 communities</div>
<div id="stats">4481 nodes &middot; 24087 edges &middot; 51 communities</div>
</div>
<script>
const RAW_NODES = [{"id": "init_py", "label": "__init__.py", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "__init__.py", "community": 46, "community_name": "Community 46", "source_file": "__init__.py", "file_type": "code", "degree": 0}, {"id": "main_py", "label": "main.py", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "main.py", "community": 8, "community_name": "Community 8", "source_file": "main.py", "file_type": "code", "degree": 7}, {"id": "app_main_lifespan", "label": "lifespan()", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "lifespan()", "community": 9, "community_name": "Community 9", "source_file": "main.py", "file_type": "code", "degree": 4}, {"id": "app_main_error_json", "label": "_error_json()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "_error_json()", "community": 8, "community_name": "Community 8", "source_file": "main.py", "file_type": "code", "degree": 3}, {"id": "app_main_sqlalchemy_exception_handler", "label": "sqlalchemy_exception_handler()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "sqlalchemy_exception_handler()", "community": 8, "community_name": "Community 8", "source_file": "main.py", "file_type": "code", "degree": 4}, {"id": "app_main_unhandled_exception_handler", "label": "unhandled_exception_handler()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "unhandled_exception_handler()", "community": 8, "community_name": "Community 8", "source_file": "main.py", "file_type": "code", "degree": 5}, {"id": "app_main_mask_secret", "label": "_mask_secret()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "_mask_secret()", "community": 8, "community_name": "Community 8", "source_file": "main.py", "file_type": "code", "degree": 1}, {"id": "app_main_root", "label": "root()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "root()", "community": 8, "community_name": "Community 8", "source_file": "main.py", "file_type": "code", "degree": 1}, {"id": "app_main_health_check", "label": "health_check()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "health_check()", "community": 8, "community_name": "Community 8", "source_file": "main.py", "file_type": "code", "degree": 1}, {"id": "app_main_rationale_81", "label": "\u6570\u636e\u5e93\u5f02\u5e38\uff1a\u8fd4\u56de JSON \u5e76\u4fdd\u7559 CORS \u5934\uff0c\u907f\u514d\u6d4f\u89c8\u5668\u53ea\u62a5\u8de8\u57df\u9519\u8bef", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "\u6570\u636e\u5e93\u5f02\u5e38\uff1a\u8fd4\u56de JSON \u5e76\u4fdd\u7559 CORS \u5934\uff0c\u907f\u514d\u6d4f\u89c8\u5668\u53ea\u62a5\u8de8\u57df\u9519\u8bef", "community": 8, "community_name": "Community 8", "source_file": "main.py", "file_type": "rationale", "degree": 3}, {"id": "app_main_rationale_92", "label": "\u672a\u6355\u83b7\u5f02\u5e38\uff1a\u7edf\u4e00 JSON 500\uff0c\u786e\u4fdd\u8de8\u57df\u573a\u666f\u4e0b\u4ecd\u6709 Access-Control-Allow-Origin", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "\u672a\u6355\u83b7\u5f02\u5e38\uff1a\u7edf\u4e00 JSON 500\uff0c\u786e\u4fdd\u8de8\u57df\u573a\u666f\u4e0b\u4ecd\u6709 Access-Control-Allow-Origin", "community": 8, "community_name": "Community 8", "source_file": "main.py", "file_type": "rationale", "degree": 3}, {"id": "tasks_init_py", "label": "__init__.py", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "__init__.py", "community": 9, "community_name": "Community 9", "source_file": "tasks/__init__.py", "file_type": "code", "degLine truncated
const RAW_EDGES = [{"from": "main_py", "to": "app_main_lifespan", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_py", "to": "app_main_error_json", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_py", "to": "app_main_sqlalchemy_exception_handler", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_py", "to": "app_main_unhandled_exception_handler", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_py", "to": "app_main_mask_secret", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_py", "to": "app_main_root", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_py", "to": "app_main_health_check", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_main_lifespan", "to": "core_login_crypto_ensure_initialized", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_lifespan", "to": "tasks_init_init_scheduled_tasks", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_lifespan", "to": "tasks_init_shutdown_scheduler", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_error_json", "to": "app_main_sqlalchemy_exception_handler", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_main_error_json", "to": "app_main_unhandled_exception_handler", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_main_sqlalchemy_exception_handler", "to": "app_main_rationale_81", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_main_sqlalchemy_exception_handler", "to": "exception", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_unhandled_exception_handler", "to": "app_main_rationale_92", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_main_unhandled_exception_handler", "to": "exception", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_unhandled_exception_handler", "to": "str", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_rationale_81", "to": "core_api_request_log_middleware_apirequestlogmiddleware", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_rationale_81", "to": "core_api_crypto_middleware_apicryptomiddleware", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_rationale_92", "to": "core_api_request_log_middleware_apirequestlogmiddleware", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_rationale_92", "to": "core_api_crypto_middleware_apicryptomiddleware", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "tasks_init_py", "to": "tasks_init_init_scheduled_tasks", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "tasks_init_py", "to": "tasks_init_shutdown_scheduler", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_redis_session_enabled", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_get_redis_client", "labeLine truncated
const LEGEND = [{"cid": 0, "color": "#4E79A7", "label": "Community 0", "count": 917}, {"cid": 1, "color": "#F28E2B", "label": "Community 1", "count": 614}, {"cid": 2, "color": "#E15759", "label": "Community 2", "count": 360}, {"cid": 3, "color": "#76B7B2", "label": "Community 3", "count": 315}, {"cid": 4, "color": "#59A14F", "label": "Community 4", "count": 314}, {"cid": 5, "color": "#EDC948", "label": "Community 5", "count": 238}, {"cid": 6, "color": "#B07AA1", "label": "Community 6", "count": 214}, {"cid": 7, "color": "#FF9DA7", "label": "Community 7", "count": 196}, {"cid": 8, "color": "#9C755F", "label": "Community 8", "count": 182}, {"cid": 9, "color": "#BAB0AC", "label": "Community 9", "count": 166}, {"cid": 10, "color": "#4E79A7", "label": "Community 10", "count": 157}, {"cid": 11, "color": "#F28E2B", "label": "Community 11", "count": 118}, {"cid": 12, "color": "#E15759", "label": "Community 12", "count": 114}, {"cid": 13, "color": "#76B7B2", "label": "Community 13", "count": 66}, {"cid": 14, "color": "#59A14F", "label": "Community 14", "count": 60}, {"cid": 15, "color": "#EDC948", "label": "Community 15", "count": 39}, {"cid": 16, "color": "#B07AA1", "label": "Community 16", "count": 38}, {"cid": 17, "color": "#FF9DA7", "label": "Community 17", "count": 29}, {"cid": 18, "color": "#9C755F", "label": "Community 18", "count": 22}, {"cid": 19, "color": "#BAB0AC", "label": "Community 19", "count": 20}, {"cid": 20, "color": "#4E79A7", "label": "Community 20", "count": 15}, {"cid": 21, "color": "#F28E2B", "label": "Community 21", "count": 15}, {"cid": 22, "color": "#E15759", "label": "Community 22", "count": 14}, {"cid": 23, "color": "#76B7B2", "label": "Community 23", "count": 14}, {"cid": 24, "color": "#59A14F", "label": "Community 24", "count": 13}, {"cid": 25, "color": "#EDC948", "label": "Community 25", "count": 13}, {"cid": 26, "color": "#B07AA1", "label": "Community 26", "count": 13}, {"cid": 27, "color": "#FF9DA7", "label": "Community 27", "count": 12}, {"cid": 28, "color": "#9C755F", "label": "Community 28", "count": 12}, {"cid": 29, "color": "#BAB0AC", "label": "Community 29", "count": 12}, {"cid": 30, "color": "#4E79A7", "label": "Community 30", "count": 12}, {"cid": 31, "color": "#F28E2B", "label": "Community 31", "count": 12}, {"cid": 32, "color": "#E15759", "label": "Community 32", "count": 11}, {"cid": 33, "color": "#76B7B2", "label": "Community 33", "count": 10}, {"cid": 34, "color": "#59A14F", "label": "Community 34", "count": 10}, {"cid": 35, "color": "#EDC948", "label": "Community 35", "count": 10}, {"cid": 36, "color": "#B07AA1", "label": "Community 36", "count": 10}, {"cid": 37, "color": "#FF9DA7", "label": "Community 37", "count": 9}, {"cid": 38, "color": "#9C755F", "label": "Community 38", "count": 9}, {"cid": 39, "color": "#BAB0AC", "label": "Community 39", "count": 8}, {"cid": 40, "color": "#4E79A7", "label": "Community 40", "count": 7}, {"cid": 41, "color": "#F28E2B", "label": "Community 41", "count": 4}, {"cid": 42, "color": "#E15759", "label": "Community 42", "count": 4}, {"cid": 43, "color": "#76B7B2", "label": "Community 43", "count": 3}, {"cid": 44, "color": "#59A14F", "label": "Community 44", "count": 2}, {"cid": 45, "color": "#EDC948", "label": "Community 45", "count": 2}, {"cid": 46, "color": "#B07AA1", "label": "Community 46", "count": 1}, {"cid": 47, "color": "#FF9DA7", "label": "Community 47", "count": 1}, {"cid": 48, "color": "#9C755F", "label": "Community 48", "count": 1}, {"cid": 49, "color": "#BAB0AC", "label": "Community 49", "count": 1}, {"cid": 50, "color": "#4E79A7", "label": "Community 50", "count": 1}, {"cid": 51, "color": "#F28E2B", "label": "Community 51", "count": 1}, {"cid": 52, "color": "#E15759", "label": "Community 52", "count": 1}, {"cid": 53, "color": "#76B7B2", "label": "Community 53", "count": 1}, {"cid": 54, "color": "#59A14F", "label": "Community 54", "count": 1}, {"cid": 55, "color": "#EDC948", "label": "Community 55", "count": 1}, {"cid": 56, "color": "#B07AA1", "label": "Community 56", "count": 1}, {"cid": 57, "color": "#FF9DA7", "label": "Community 57", "count": 1}, {"cid": 58, "color": "#9C755F", "label": "Community 58", "count": 0}];
const RAW_NODES = [{"id": "init_py", "label": "__init__.py", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "__init__.py", "community": 39, "community_name": "Community 39", "source_file": "__init__.py", "file_type": "code", "degree": 0}, {"id": "main_py", "label": "main.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "main.py", "community": 10, "community_name": "Community 10", "source_file": "main.py", "file_type": "code", "degree": 7}, {"id": "app_main_lifespan", "label": "lifespan()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "lifespan()", "community": 10, "community_name": "Community 10", "source_file": "main.py", "file_type": "code", "degree": 4}, {"id": "app_main_error_json", "label": "_error_json()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "_error_json()", "community": 10, "community_name": "Community 10", "source_file": "main.py", "file_type": "code", "degree": 3}, {"id": "app_main_sqlalchemy_exception_handler", "label": "sqlalchemy_exception_handler()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "sqlalchemy_exception_handler()", "community": 10, "community_name": "Community 10", "source_file": "main.py", "file_type": "code", "degree": 4}, {"id": "app_main_unhandled_exception_handler", "label": "unhandled_exception_handler()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "unhandled_exception_handler()", "community": 10, "community_name": "Community 10", "source_file": "main.py", "file_type": "code", "degree": 5}, {"id": "app_main_mask_secret", "label": "_mask_secret()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "_mask_secret()", "community": 10, "community_name": "Community 10", "source_file": "main.py", "file_type": "code", "degree": 1}, {"id": "app_main_root", "label": "root()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "root()", "community": 10, "community_name": "Community 10", "source_file": "main.py", "file_type": "code", "degree": 1}, {"id": "app_main_health_check", "label": "health_check()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "health_check()", "community": 10, "community_name": "Community 10", "source_file": "main.py", "file_type": "code", "degree": 1}, {"id": "app_main_rationale_81", "label": "\u6570\u636e\u5e93\u5f02\u5e38\uff1a\u8fd4\u56de JSON \u5e76\u4fdd\u7559 CORS \u5934\uff0c\u907f\u514d\u6d4f\u89c8\u5668\u53ea\u62a5\u8de8\u57df\u9519\u8bef", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "\u6570\u636e\u5e93\u5f02\u5e38\uff1a\u8fd4\u56de JSON \u5e76\u4fdd\u7559 CORS \u5934\uff0c\u907f\u514d\u6d4f\u89c8\u5668\u53ea\u62a5\u8de8\u57df\u9519\u8bef", "community": 10, "community_name": "Community 10", "source_file": "main.py", "file_type": "rationale", "degree": 3}, {"id": "app_main_rationale_92", "label": "\u672a\u6355\u83b7\u5f02\u5e38\uff1a\u7edf\u4e00 JSON 500\uff0c\u786e\u4fdd\u8de8\u57df\u573a\u666f\u4e0b\u4ecd\u6709 Access-Control-Allow-Origin", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "\u672a\u6355\u83b7\u5f02\u5e38\uff1a\u7edf\u4e00 JSON 500\uff0c\u786e\u4fdd\u8de8\u57df\u573a\u666f\u4e0b\u4ecd\u6709 Access-Control-Allow-Origin", "community": 10, "community_name": "Community 10", "source_file": "main.py", "file_type": "rationale", "degree": 3}, {"id": "tasks_init_py", "label": "__init__.py", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "__init__.py", "community": 10, "community_name": "Community 10", "source_file": "tasks/__init__.py", "fiLine truncated
const RAW_EDGES = [{"from": "main_py", "to": "app_main_lifespan", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_py", "to": "app_main_error_json", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_py", "to": "app_main_sqlalchemy_exception_handler", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_py", "to": "app_main_unhandled_exception_handler", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_py", "to": "app_main_mask_secret", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_py", "to": "app_main_root", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_py", "to": "app_main_health_check", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_main_lifespan", "to": "core_login_crypto_ensure_initialized", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_lifespan", "to": "tasks_init_init_scheduled_tasks", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_lifespan", "to": "tasks_init_shutdown_scheduler", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_error_json", "to": "app_main_sqlalchemy_exception_handler", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_main_error_json", "to": "app_main_unhandled_exception_handler", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_main_sqlalchemy_exception_handler", "to": "app_main_rationale_81", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_main_sqlalchemy_exception_handler", "to": "exception", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_unhandled_exception_handler", "to": "app_main_rationale_92", "label": "rationale_for", "title": "rationale_for [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_main_unhandled_exception_handler", "to": "exception", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_unhandled_exception_handler", "to": "str", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_rationale_81", "to": "core_api_request_log_middleware_apirequestlogmiddleware", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_rationale_81", "to": "core_api_crypto_middleware_apicryptomiddleware", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_rationale_92", "to": "core_api_request_log_middleware_apirequestlogmiddleware", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "app_main_rationale_92", "to": "core_api_crypto_middleware_apicryptomiddleware", "label": "uses", "title": "uses [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "tasks_init_py", "to": "tasks_init_init_scheduled_tasks", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "tasks_init_py", "to": "tasks_init_shutdown_scheduler", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_redis_session_enabled", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_get_redis_client", "labeLine truncated
const LEGEND = [{"cid": 0, "color": "#4E79A7", "label": "Community 0", "count": 906}, {"cid": 1, "color": "#F28E2B", "label": "Community 1", "count": 612}, {"cid": 2, "color": "#E15759", "label": "Community 2", "count": 536}, {"cid": 3, "color": "#76B7B2", "label": "Community 3", "count": 390}, {"cid": 4, "color": "#59A14F", "label": "Community 4", "count": 378}, {"cid": 5, "color": "#EDC948", "label": "Community 5", "count": 263}, {"cid": 6, "color": "#B07AA1", "label": "Community 6", "count": 245}, {"cid": 7, "color": "#FF9DA7", "label": "Community 7", "count": 213}, {"cid": 8, "color": "#9C755F", "label": "Community 8", "count": 147}, {"cid": 9, "color": "#BAB0AC", "label": "Community 9", "count": 136}, {"cid": 10, "color": "#4E79A7", "label": "Community 10", "count": 130}, {"cid": 11, "color": "#F28E2B", "label": "Community 11", "count": 82}, {"cid": 12, "color": "#E15759", "label": "Community 12", "count": 66}, {"cid": 13, "color": "#76B7B2", "label": "Community 13", "count": 60}, {"cid": 14, "color": "#59A14F", "label": "Community 14", "count": 38}, {"cid": 15, "color": "#EDC948", "label": "Community 15", "count": 29}, {"cid": 16, "color": "#B07AA1", "label": "Community 16", "count": 20}, {"cid": 17, "color": "#FF9DA7", "label": "Community 17", "count": 17}, {"cid": 18, "color": "#9C755F", "label": "Community 18", "count": 16}, {"cid": 19, "color": "#BAB0AC", "label": "Community 19", "count": 15}, {"cid": 20, "color": "#4E79A7", "label": "Community 20", "count": 14}, {"cid": 21, "color": "#F28E2B", "label": "Community 21", "count": 13}, {"cid": 22, "color": "#E15759", "label": "Community 22", "count": 13}, {"cid": 23, "color": "#76B7B2", "label": "Community 23", "count": 12}, {"cid": 24, "color": "#59A14F", "label": "Community 24", "count": 12}, {"cid": 25, "color": "#EDC948", "label": "Community 25", "count": 12}, {"cid": 26, "color": "#B07AA1", "label": "Community 26", "count": 12}, {"cid": 27, "color": "#FF9DA7", "label": "Community 27", "count": 11}, {"cid": 28, "color": "#9C755F", "label": "Community 28", "count": 11}, {"cid": 29, "color": "#BAB0AC", "label": "Community 29", "count": 10}, {"cid": 30, "color": "#4E79A7", "label": "Community 30", "count": 10}, {"cid": 31, "color": "#F28E2B", "label": "Community 31", "count": 10}, {"cid": 32, "color": "#E15759", "label": "Community 32", "count": 8}, {"cid": 33, "color": "#76B7B2", "label": "Community 33", "count": 7}, {"cid": 34, "color": "#59A14F", "label": "Community 34", "count": 4}, {"cid": 35, "color": "#EDC948", "label": "Community 35", "count": 4}, {"cid": 36, "color": "#B07AA1", "label": "Community 36", "count": 3}, {"cid": 37, "color": "#FF9DA7", "label": "Community 37", "count": 2}, {"cid": 38, "color": "#9C755F", "label": "Community 38", "count": 2}, {"cid": 39, "color": "#BAB0AC", "label": "Community 39", "count": 1}, {"cid": 40, "color": "#4E79A7", "label": "Community 40", "count": 1}, {"cid": 41, "color": "#F28E2B", "label": "Community 41", "count": 1}, {"cid": 42, "color": "#E15759", "label": "Community 42", "count": 1}, {"cid": 43, "color": "#76B7B2", "label": "Community 43", "count": 1}, {"cid": 44, "color": "#59A14F", "label": "Community 44", "count": 1}, {"cid": 45, "color": "#EDC948", "label": "Community 45", "count": 1}, {"cid": 46, "color": "#B07AA1", "label": "Community 46", "count": 1}, {"cid": 47, "color": "#FF9DA7", "label": "Community 47", "count": 1}, {"cid": 48, "color": "#9C755F", "label": "Community 48", "count": 1}, {"cid": 49, "color": "#BAB0AC", "label": "Community 49", "count": 1}, {"cid": 50, "color": "#4E79A7", "label": "Community 50", "count": 1}, {"cid": 51, "color": "#F28E2B", "label": "Community 51", "count": 0}, {"cid": 52, "color": "#E15759", "label": "Community 52", "count": 0}, {"cid": 53, "color": "#76B7B2", "label": "Community 53", "count": 0}, {"cid": 54, "color": "#59A14F", "label": "Community 54", "count": 0}, {"cid": 55, "color": "#EDC948", "label": "Community 55", "count": 0}, {"cid": 56, "color": "#B07AA1", "label": "Community 56", "count": 0}, {"cid": 57, "color": "#FF9DA7", "label": "Community 57", "count": 0}, {"cid": 58, "color": "#9C755F", "label": "Community 58", "count": 0}];
// HTML-escape helper — prevents XSS when injecting graph data into innerHTML
function esc(s) {
+26830 -23584
View File
File diff suppressed because it is too large. Load diff
+25 -22
View File
@@ -18,6 +18,7 @@
"/Users/wuzilong/work/00code/zkxw/backend/app/core/db_collation.py": 1779890253.2250955,
"/Users/wuzilong/work/00code/zkxw/backend/app/core/context.py": 1779242263.6923044,
"/Users/wuzilong/work/00code/zkxw/backend/app/core/utils.py": 1780305790.0009735,
"/Users/wuzilong/work/00code/zkxw/backend/app/core/protocol_status_display.py": 1782893588.4525878,
"/Users/wuzilong/work/00code/zkxw/backend/app/core/storage.py": 1782437555.6682527,
"/Users/wuzilong/work/00code/zkxw/backend/app/core/order_status_compat.py": 1778578258.0426462,
"/Users/wuzilong/work/00code/zkxw/backend/app/core/exceptions.py": 1778578258.0413945,
@@ -25,13 +26,14 @@
"/Users/wuzilong/work/00code/zkxw/backend/app/core/admin_request_json.py": 1778578258.038963,
"/Users/wuzilong/work/00code/zkxw/backend/app/core/api_crypto_middleware.py": 1778581508.2309763,
"/Users/wuzilong/work/00code/zkxw/backend/app/core/wechat_message.py": 1778578258.0458734,
"/Users/wuzilong/work/00code/zkxw/backend/app/models/material.py": 1781427174.243315,
"/Users/wuzilong/work/00code/zkxw/backend/app/utils/sample_special.py": 1782890474.0661302,
"/Users/wuzilong/work/00code/zkxw/backend/app/models/material.py": 1782894464.7972596,
"/Users/wuzilong/work/00code/zkxw/backend/app/models/production_material.py": 1782404882.9262497,
"/Users/wuzilong/work/00code/zkxw/backend/app/models/qc_param.py": 1782379593.174925,
"/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py": 1782803028.1079507,
"/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py": 1782893591.4107118,
"/Users/wuzilong/work/00code/zkxw/backend/app/models/cleanroom_garment.py": 1781347080.6165943,
"/Users/wuzilong/work/00code/zkxw/backend/app/models/__init__.py": 1781344070.5899634,
"/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py": 1780458012.8329656,
"/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py": 1782893591.5829172,
"/Users/wuzilong/work/00code/zkxw/backend/app/models/qc_material.py": 1781690312.7245836,
"/Users/wuzilong/work/00code/zkxw/backend/app/models/base.py": 1778578258.0821667,
"/Users/wuzilong/work/00code/zkxw/backend/app/models/clinical_payment.py": 1779834956.9588954,
@@ -72,15 +74,15 @@
"/Users/wuzilong/work/00code/zkxw/backend/app/schemas/outbound_handover.py": 1780455571.0749218,
"/Users/wuzilong/work/00code/zkxw/backend/app/schemas/category.py": 1778578258.0941947,
"/Users/wuzilong/work/00code/zkxw/backend/app/schemas/leave.py": 1778666088.7680702,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py": 1781536745.221194,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/storage_release_review.py": 1782893695.3771026,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/equipment.py": 1782717312.9816003,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py": 1782601942.7436867,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task.py": 1782893715.9240513,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/process_route.py": 1782717483.0699635,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_code.py": 1782709076.5173395,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task_result.py": 1782379630.9640372,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/outbound_release_review.py": 1781603141.940902,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_material_stock_check.py": 1781423988.9720724,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py": 1781521998.393167,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_batch.py": 1782894546.3479118,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/post.py": 1779265648.38155,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception_check_result.py": 1779255909.8554008,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_material_stock_batch.py": 1782404955.550011,
@@ -94,14 +96,15 @@
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_log.py": 1779281903.0942652,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/tenant.py": 1779265611.0532296,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/consumable.py": 1779512620.86979,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_usage.py": 1781427187.4456425,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_usage.py": 1782894641.0272896,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_material_usage.py": 1781513732.7796721,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/sop_document.py": 1779265721.9928973,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py": 1782720551.1688514,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py": 1782893738.0315711,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/inbound_sample_special.py": 1782890475.769446,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_third_party_item.py": 1779265661.482352,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_production_reception.py": 1782722028.9202535,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/reagent.py": 1779512669.9847593,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py": 1782719109.6706095,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py": 1782893636.34521,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/cleanroom_garment.py": 1782264452.4901433,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_material_usage.py": 1781423974.5969574,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/biz_no_generator.py": 1779882385.4674172,
@@ -116,30 +119,30 @@
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/express_company.py": 1781402091.5987046,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/pilot_application.py": 1781079895.8304482,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_lab_test_item.py": 1779265673.3888667,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py": 1782565687.6449032,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/pre_transit_sample.py": 1782891216.72219,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/role.py": 1779265616.3701816,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_material_stock_batch.py": 1781690315.173275,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/material_stock_check.py": 1781427194.5434632,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task_step_assignee.py": 1782469070.7380123,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_sms_notification.py": 1781590614.9654794,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_task_assignee.py": 1781233180.3766735,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation_sample_collection.py": 1781063441.5812025,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/cell_product.py": 1782752273.7485654,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation_sample_collection.py": 1782886678.892387,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/cell_product.py": 1782886679.0930216,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/menu.py": 1779265729.0381103,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_region.py": 1782181887.2821388,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/pilot_delivery.py": 1779935673.6808827,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception_check_item.py": 1779007909.2933013,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/site.py": 1781401290.6845422,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/api_request_log.py": 1778578258.0614743,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/dict_data.py": 1782713849.285536,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py": 1782719110.48261,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/dict_data.py": 1782893595.9312406,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/research_donation.py": 1782893608.9059234,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/ethnic.py": 1779265849.547566,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_material_formula.py": 1781344175.5871844,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/pilot_checkup.py": 1779935785.233911,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/env_detect_item.py": 1781145689.9525824,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/process_category.py": 1779265700.0606413,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/item_unit.py": 1779265653.7504313,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py": 1782802295.3748794,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py": 1782893677.4257812,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/outbound_handover_inventory.py": 1781598316.476379,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/env_detect_record.py": 1782376492.2365673,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/outbound_release_material.py": 1781612877.0137436,
@@ -148,7 +151,7 @@
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/customer.py": 1779686149.7508218,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/workflow.py": 1779265993.677624,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_sms_notification.py": 1781063495.0317714,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py": 1782719096.6028564,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py": 1782891223.4996026,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/consumable_pack.py": 1779265715.416005,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_inspection_batch.py": 1782569255.0879426,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_material_prep.py": 1781514953.3551314,
@@ -163,7 +166,7 @@
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/dept.py": 1779265637.7914758,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/base.py": 1778578258.062207,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/protocol_donation_convert.py": 1779161468.6582925,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/protocol_sample_collection.py": 1781063441.1529672,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/protocol_sample_collection.py": 1782886678.8686988,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_item_param.py": 1782380067.962216,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/leave.py": 1779265839.500242,
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/output_type.py": 1779265703.7363207,
@@ -172,12 +175,12 @@
"/Users/wuzilong/work/00code/zkxw/backend/app/api/storage_release_review.py": 1779526635.1455016,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/outbound_release_review.py": 1779968232.5759368,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/public.py": 1782122639.96012,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py": 1781522000.6097813,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py": 1782894532.006265,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/production_material.py": 1782404982.2474263,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/qc.py": 1782802297.5818124,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/qc.py": 1782889888.587752,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/market.py": 1781522283.6823432,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/sample_production_reception.py": 1782718998.90251,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/collection_protocol.py": 1782747504.4073274,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/collection_protocol.py": 1782893610.312771,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/cleanroom_garment.py": 1781347256.2326367,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/basic_info.py": 1782709076.3968658,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/pilot_infusion_confirm.py": 1779657043.1389203,
@@ -193,7 +196,7 @@
"/Users/wuzilong/work/00code/zkxw/backend/app/api/pilot_delivery.py": 1779655584.820777,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/admin.py": 1782469068.0578597,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/env_detect.py": 1782376501.8919773,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/research_donation.py": 1782195482.219445,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/research_donation.py": 1782893614.5041575,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/ethnic.py": 1779266243.9511197,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/pilot_checkup.py": 1779935751.2658868,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/pilot_service.py": 1781599314.0221174,
@@ -201,7 +204,7 @@
"/Users/wuzilong/work/00code/zkxw/backend/app/api/sample_sms_notification.py": 1780325524.907156,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/sample_reception.py": 1782719108.3741593,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/insurance_company.py": 1781410837.9443986,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/production.py": 1782711017.6634378,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/production.py": 1782882295.827764,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/protocol_sample_collection.py": 1780457788.2093296,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/leave.py": 1779266168.8693042,
"/Users/wuzilong/work/00code/zkxw/backend/app/api/clinical_payment.py": 1781750841.074568,
@@ -0,0 +1,5 @@
-- 市场物料变动记录:入库/出库/废弃经办人
-- 2026-07-01
ALTER TABLE `biz_material_usage`
ADD COLUMN `operator_name` varchar(100) DEFAULT NULL COMMENT '经办人姓名' AFTER `receiver`;
+29
View File
@@ -0,0 +1,29 @@
-- 协议作废类型(采集协议单 / 捐赠协议单)
-- 2026-07-01
ALTER TABLE `biz_collection_protocol`
ADD COLUMN `void_type` varchar(32) DEFAULT NULL COMMENT '协议作废类型(字典 xyzflx)' AFTER `void_desc`;
ALTER TABLE `biz_research_donation`
ADD COLUMN `void_type` varchar(32) DEFAULT NULL COMMENT '作废类型(字典 xyzflx)' AFTER `void_desc`;
INSERT INTO `sys_dict_type` (
`id`, `dict_name`, `dict_type`, `tenant_no`, `order_num`, `remark`,
`create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`
) VALUES (
'TDP000000000000000000000000000096', '协议作废类型', 'xyzflx', 'zkxw', 0, NULL,
NULL, '', NOW(), NULL, NOW(), 0
);
INSERT INTO `sys_dict_data` (
`id`, `dict_label`, `dict_value`, `dict_type`, `tenant_no`, `order_num`, `remark`,
`create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`
) VALUES
(
'DDP000000000000000000000000000201', '客户毁存', 'khhc', 'xyzflx', 'zkxw', 1, NULL,
NULL, '', NOW(), NULL, NOW(), 0
),
(
'DDP000000000000000000000000000202', '检测不合格', 'jcbhg', 'xyzflx', 'zkxw', 2, NULL,
NULL, '', NOW(), NULL, NOW(), 0
);
+10
View File
@@ -0,0 +1,10 @@
-- 样本特殊标记与特殊说明
-- 2026-07-01
ALTER TABLE `biz_protocol_sample`
ADD COLUMN `is_special` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否特殊样本:0否 1是' AFTER `storage_expire_date`,
ADD COLUMN `special_remark` varchar(256) DEFAULT NULL COMMENT '特殊说明' AFTER `is_special`;
ALTER TABLE `biz_research_donation_sample`
ADD COLUMN `is_special` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否特殊样本:0否 1是' AFTER `storage_expire_date`,
ADD COLUMN `special_remark` varchar(256) DEFAULT NULL COMMENT '特殊说明' AFTER `is_special`;
+7 -3
View File
@@ -6418,6 +6418,7 @@ CREATE TABLE `biz_material_usage` (
`stock_before` decimal(18,4) DEFAULT NULL COMMENT '变动前物资汇总库存',
`stock_after` decimal(18,4) NOT NULL COMMENT '变动后库存量',
`receiver` varchar(64) DEFAULT NULL COMMENT '领用人(手动出库)',
`operator_name` varchar(100) DEFAULT NULL COMMENT '经办人姓名',
`purpose` varchar(512) DEFAULT NULL COMMENT '用途/事由(手动出库或废弃原因)',
`requisition_status` varchar(16) NOT NULL DEFAULT 'open' COMMENT '领用状态:open-待登记/有剩余 closed-已使用完',
`source_type` varchar(32) NOT NULL COMMENT '来源:manual_in / manual_out / manual_discard',
@@ -10477,6 +10478,8 @@ CREATE TABLE `biz_protocol_sample` (
`detect_start_date` char(8) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '检测开始日期',
`void_date` char(8) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '作废日期',
`storage_expire_date` char(8) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '存储到期日期=入库+年限',
`is_special` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否特殊样本:0否 1是',
`special_remark` varchar(256) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '特殊说明',
`tenant_no` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
`remark` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注',
@@ -10494,7 +10497,7 @@ CREATE TABLE `biz_protocol_sample` (
-- Records of biz_protocol_sample
-- ----------------------------
BEGIN;
INSERT INTO `biz_protocol_sample` (`id`, `collection_protocol_id`, `sample_type_id`, `sample_code_id`, `sample_code`, `collect_amount`, `unit_id`, `price`, `original_price`, `storage_years`, `sample_status`, `storage_in_date`, `detect_start_date`, `void_date`, `storage_expire_date`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES ('B6E991CFCE3249AA919BA252123E0CA8', '152523729D3943A1B1EC0159129C28B3', '562040C071C44473AD3BCD7C84A70354', '9B15036F3C6444A8B24A1962FE50BB48', 'ZKZX34000930', NULL, NULL, 25880.00, 25880.00, 20, 'ycj', NULL, NULL, NULL, NULL, 'zkxw', 0, NULL, '21F593EF3DB648EDABFC48ED9042A5D5', 'b13f9389-4e71-11f1-9f47-00163e3bdd96', '2026-06-29 05:51:23', '21F593EF3DB648EDABFC48ED9042A5D5', '2026-06-29 05:51:23', 0);
INSERT INTO `biz_protocol_sample` (`id`, `collection_protocol_id`, `sample_type_id`, `sample_code_id`, `sample_code`, `collect_amount`, `unit_id`, `price`, `original_price`, `storage_years`, `sample_status`, `storage_in_date`, `detect_start_date`, `void_date`, `storage_expire_date`, `is_special`, `special_remark`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES ('B6E991CFCE3249AA919BA252123E0CA8', '152523729D3943A1B1EC0159129C28B3', '562040C071C44473AD3BCD7C84A70354', '9B15036F3C6444A8B24A1962FE50BB48', 'ZKZX34000930', NULL, NULL, 25880.00, 25880.00, 20, 'ycj', NULL, NULL, NULL, NULL, 0, NULL, 'zkxw', 0, NULL, '21F593EF3DB648EDABFC48ED9042A5D5', 'b13f9389-4e71-11f1-9f47-00163e3bdd96', '2026-06-29 05:51:23', '21F593EF3DB648EDABFC48ED9042A5D5', '2026-06-29 05:51:23', 0);
COMMIT;
-- ----------------------------
@@ -12130,6 +12133,8 @@ CREATE TABLE `biz_research_donation_sample` (
`detect_start_date` char(8) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '检测开始日期YYYYMMDD',
`void_date` char(8) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '作废日期YYYYMMDD',
`storage_expire_date` char(8) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '存储到期日期YYYYMMDD',
`is_special` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否特殊样本:0否 1是',
`special_remark` varchar(256) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '特殊说明',
`tenant_no` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
`remark` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注',
@@ -17382,5 +17387,4 @@ INSERT INTO `biz_storage_facility_slot` (`id`, `facility_node_id`, `slot_code`,
INSERT INTO `biz_storage_facility_slot` (`id`, `facility_node_id`, `slot_code`, `slot_status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`, `occupied_count`, `last_item_type`, `last_stored_at`) VALUES ('06DAE9C9391A42F18810921CFEF9053A', '38E4724959314DDFA1C26E7C8ADC1D08', '3', '空', 'zkxw', 1003, NULL, 'd3000000000000000000000000000001', 'b13c2be2-4e71-11f1-9f47-00163e3bdd96', '2026-06-26 04:20:32', 'd3000000000000000000000000000001', '2026-06-26 04:20:32', 0, 0, NULL, NULL);
INSERT INTO `biz_storage_facility_slot` (`id`, `facility_node_id`, `slot_code`, `slot_status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`, `occupied_count`, `last_item_type`, `last_stored_at`) VALUES ('06DE851FAABD4E07928BF7FB73A0C807', 'C530BD59EE934CCCAE12411679D5AF9A', '26', '占用', 'zkxw', 3006, NULL, 'd3000000000000000000000000000001', 'b13c2be2-4e71-11f1-9f47-00163e3bdd96', '2026-06-26 04:12:30', 'd3000000000000000000000000000001', '2026-06-30 00:53:30', 0, 1, 'cell_product', '2025-08-20 00:00:00');
INSERT INTO `biz_storage_facility_slot` (`id`, `facility_node_id`, `slot_code`, `slot_status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`, `occupied_count`, `last_item_type`, `last_stored_at`) VALUES ('06E019CD9A794C27842428ED073640B5', '22564DA268E44068AB159C551C815CE5', '97', '空', 'zkxw', 10007, NULL, 'd3000000000000000000000000000001', 'b13c2be2-4e71-11f1-9f47-00163e3bdd96', '2026-06-26 04:20:41', 'd3000000000000000000000000000001', '2026-06-26 04:20:41', 0, 0, NULL, NULL);
INSERT INTO `biz_storage_facility_slot` (`id`, `facility_node_id`, `slot_code`, `slot_status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`, `occupied_count`, `last_item_type`, `last_stored_at`) VALUES ('06E27C81FCE14EFB89B760E049D19505', 'EF5E0C22CE24494C87BD66064347B647', '31', '空', 'zkxw', 4004, NULL, 'd3000000000000000000000000000001', 'b13c2be2-4e71-11f1-9f47-00163e3bdd96', '2026-06-30 01:42:36', 'd3000000000000000000000000000001', '2026-06-30 01:42:36', 0, 0, NULL, NULL);
INSERT INTO `biz_storage_facility_slot` (`id`, `facility_node_id`, `slot_code`, `slot_status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`, `occupied_count`, `l
INSERT INTO `biz_storage_facility_slot` (`id`, `facility_node_id`, `slot_code`, `slot_status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`, `occupied_count`, `last_item_type`, `last_stored_at`) VALUES ('06E27C81FCE14EFB89B760E049D19505', 'EF5E0C22CE24494C87BD66064347B647', '31', '空', 'zkxw', 4004, NULL, 'd3000000000000000000000000000001', 'b13c2be2-4e71-
@@ -0,0 +1,378 @@
# 附件拖拽上传 Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 在方案 1 范围内(类型 A/B/C 附件上传)为所有上传区增加拖拽落文件能力,保留现有点击上传行为。
**Architecture:** 新增 `useAttachmentDropZone` composable 封装 dragenter/dragleave/dragover/drop;各页面在 `.attachment-upload`(或 C 类 `.paper-att-list`)独立挂载,drop 后复用现有 `handleAttachmentChange` / `handlePaperAttachmentChange`。类型 B 仅改 `ProtocolFinanceConfirmFields` 一处并回归 6 个消费页。全局 `.is-dragover` 样式放 `app.scss`。
**Tech Stack:** Vue 3 · Element Plus `el-upload` · TypeScript · SCSS · `fetchUploadAttachment`
**设计文档:** `docs/superpowers/specs/2026-07-01-attachment-drag-upload-design.md`
---
## 文件结构
| 路径 | 职责 |
|------|------|
| `web-admin/src/composables/useAttachmentDropZone.ts` | **新建** — drop zone 事件与 `isDragover` 状态 |
| `web-admin/src/assets/styles/core/app.scss` | **修改** — `.attachment-upload.is-dragover`、`.paper-att-list.is-dragover` |
| `web-admin/src/components/business/protocol-finance-confirm-fields/index.vue` | **修改** — 类型 B 共享上传 |
| `web-admin/src/components/business/outbound-material-form-sections/index.vue` | **修改** — 类型 C 行内上传 |
| 22 个类型 A `.vue` 文件 | **修改** — 各页独立挂载 composable |
| `openspec/changes/zkxw-engineering-standards/specs/ui-conventions/spec.md` | **修改** — 补充拖拽 SHALL |
---
## Task 0: 基础设施
**Files:**
- Create: `web-admin/src/composables/useAttachmentDropZone.ts`
- Modify: `web-admin/src/assets/styles/core/app.scss`
- Modify: `openspec/changes/zkxw-engineering-standards/specs/ui-conventions/spec.md`
- [ ] **Step 1: 创建 composable**
```ts
// web-admin/src/composables/useAttachmentDropZone.ts
import { ref, type Ref } from 'vue'
export type AttachmentDropZoneOptions = {
/** 收到有效文件列表时回调(已过滤空项) */
onFiles: (files: File[]) => void | Promise<void>
/** 为 true 时不响应拖拽 */
disabled?: Ref<boolean> | (() => boolean)
}
export function useAttachmentDropZone(options: AttachmentDropZoneOptions) {
const isDragover = ref(false)
let dragDepth = 0
function isDisabled() {
const d = options.disabled
if (!d) return false
return typeof d === 'function' ? d() : d.value
}
function onDragEnter(e: DragEvent) {
if (isDisabled()) return
e.preventDefault()
dragDepth += 1
isDragover.value = true
}
function onDragLeave(e: DragEvent) {
if (isDisabled()) return
e.preventDefault()
dragDepth = Math.max(0, dragDepth - 1)
if (dragDepth === 0) isDragover.value = false
}
function onDragOver(e: DragEvent) {
if (isDisabled()) return
e.preventDefault()
if (e.dataTransfer) e.dataTransfer.dropEffect = 'copy'
}
function onDrop(e: DragEvent) {
if (isDisabled()) return
e.preventDefault()
dragDepth = 0
isDragover.value = false
const list = e.dataTransfer?.files
if (!list?.length) return
const files = Array.from(list).filter((f) => f.size >= 0)
if (files.length) void options.onFiles(files)
}
const dropZoneHandlers = {
onDragenter: onDragEnter,
onDragleave: onDragLeave,
onDragover: onDragOver,
onDrop: onDrop
}
return { isDragover, dropZoneHandlers }
}
```
- [ ] **Step 2: 全局 dragover 样式(app.scss 附件相关区末尾追加)**
```scss
.attachment-upload.is-dragover {
border: 1px dashed var(--primary, #10b981);
border-radius: 8px;
background: var(--primary-bg, #ecfdf5);
box-shadow: inset 0 0 0 1px rgba(16, 185, 129, 0.15);
}
.paper-att-list.is-dragover {
border: 1px dashed var(--primary, #10b981);
border-radius: 8px;
background: var(--primary-bg, #ecfdf5);
}
```
- [ ] **Step 3: OpenSpec 补充**
在 `ui-conventions/spec.md`「附件上传卡片化布局」的 `el-upload` 配置表后增加:
- Drop zone SHALL 为 `.attachment-upload` 根容器(表格行内纸质材料为 `.paper-att-list`)
- SHALL 支持拖拽与点击两种方式;`.upload-hint` 含「支持拖拽或点击上传」
- dragover 时使用 `.is-dragover` 修饰类(Fresh Mint 虚线边框 + 浅绿底)
- [ ] **Step 4: 手工冒烟**
本地 `pnpm dev`,临时在任意页挂载 composable 验证 drop 能触发 `onFiles`(可在 Step 1 完成前跳过,于 Task 1 一并验)。
---
## Task 1: 试点 — ProtocolFormDialog(A1)
**Files:**
- Modify: `web-admin/src/views/cell-storage/protocol/ProtocolFormDialog.vue`
- [ ] **Step 1: 协议附件区挂载 composable**
在 `<script setup>` 中:
```ts
import { useAttachmentDropZone } from '@/composables/useAttachmentDropZone'
// 在 handleAttachmentChange 定义之后:
const { isDragover: isProtocolAttachDragover, dropZoneHandlers: protocolAttachDropHandlers } =
useAttachmentDropZone({
onFiles: (files) => {
for (const file of files) {
void handleAttachmentChange({ raw: file })
}
}
})
```
模板中协议附件的 `.attachment-upload` 改为:
```vue
<div
class="attachment-upload"
:class="{ 'is-dragover': isProtocolAttachDragover }"
v-bind="protocolAttachDropHandlers"
>
```
`.upload-hint` 文案改为含「支持拖拽或点击上传」。
- [ ] **Step 2: 缴费凭证区(第二处 upload-card--sm)**
新增独立 composable 实例(变量名如 `isPaymentVoucherDragover` / `paymentVoucherDropHandlers`),绑定到缴费明细内 `.attachment-upload` 容器;`onFiles` 调用现有缴费凭证 `handleXxxChange`(与 `@change` 同一函数)。
- [ ] **Step 3: 回归测试**
打开采集协议录入弹窗 → 协议附件:点击 1 文件、拖拽 1 文件、拖拽 3 文件、拖拽 >20MB 文件。缴费凭证区重复上述。确认提交拦截「上传中」仍有效。
- [ ] **Step 4: Commit**
```bash
git add web-admin/src/composables/useAttachmentDropZone.ts \
web-admin/src/assets/styles/core/app.scss \
web-admin/src/views/cell-storage/protocol/ProtocolFormDialog.vue \
openspec/changes/zkxw-engineering-standards/specs/ui-conventions/spec.md
git commit -m "feat(web-admin): 附件上传支持拖拽(试点 ProtocolFormDialog)"
```
---
## Task 2: 细胞存储域(A2–A5 + B0 + B2–B4)
**Files:**
- Modify: `web-admin/src/views/cell-storage/protocol-audit/PaymentInfoTab.vue`(A2,2 区)
- Modify: `web-admin/src/views/cell-storage/protocol-audit/StorageCertTab.vue`(A3)
- Modify: `web-admin/src/views/cell-storage/protocol-audit/FullmoonTodoTab.vue`(A4)
- Modify: `web-admin/src/views/research-donation/list/DonationFormDialog.vue`(A5,2 区)
- Modify: `web-admin/src/components/business/protocol-finance-confirm-fields/index.vue`(B0)
- Modify: `web-admin/src/views/cell-storage/payment-confirm/index.vue`(B2,回归)
- Modify: `web-admin/src/views/cell-storage/payment-confirm/RefundConfirmTab.vue`(B3,回归)
- Modify: `web-admin/src/views/cell-storage/payment-confirm/InvoiceRequestTab.vue`(B4,回归)
- [ ] **Step 1: 改 ProtocolFinanceConfirmFields(B0)**
```ts
import { useAttachmentDropZone } from '@/composables/useAttachmentDropZone'
const { isDragover, dropZoneHandlers } = useAttachmentDropZone({
onFiles: (files) => {
for (const file of files) {
void handleAttachmentChange({ raw: file })
}
}
})
```
`.attachment-upload` 加 `:class` 与 `v-bind="dropZoneHandlers"`;更新 `.upload-hint` 文案。
- [ ] **Step 2: A2–A5 各页按 Task 1 模式改**
每处 `.attachment-upload` 一个 composable 实例;多上传区 = 多实例。DonationFormDialog、PaymentInfoTab 各 2 实例。
- [ ] **Step 3: 回归 B2–B4 + A2–A5**
| 页面 | 入口 |
|------|------|
| 付款信息看板 PaymentInfoTab | 协议审核 |
| 储存证 StorageCertTab | 协议审核 |
| 满月待办 FullmoonTodoTab | 协议审核 |
| 捐赠 DonationFormDialog | 科研捐赠 |
| 付款确认 payment-confirm | 细胞存储-付款确认 三 Tab |
- [ ] **Step 4: Commit**
```bash
git commit -m "feat(web-admin): 细胞存储域附件上传支持拖拽"
```
---
## Task 3: 质检域(A6–A7 + B1 + B6)
**Files:**
- Modify: `web-admin/src/views/quality-inspection/env-detect-record/index.vue`(A6)
- Modify: `web-admin/src/views/quality-inspection/storage-release-review/StorageReleaseReviewDialog.vue`(A7)
- Modify: `web-admin/src/views/quality-inspection/sample-reception/index.vue`(B1,2 区 — 仅回归 hint 若 B0 已改)
- Modify: `web-admin/src/views/quality-inspection/qc-material/QcMaterialBatchAttachmentDialog.vue`(B6,回归)
- [ ] **Step 1: A6、A7 挂载 composable**(同 Task 1 模式)
- [ ] **Step 2: 确认 B1/B6 经 B0 已生效**
打开样本接收(单条 + 批量弹窗)、质检物料批次附件弹窗,测拖拽。
- [ ] **Step 3: Commit**
```bash
git commit -m "feat(web-admin): 质检域附件上传支持拖拽"
```
---
## Task 4: 中试服务(上)— 渠道与付款(A10–A15)
**Files:**
- Modify: `web-admin/src/views/pilot-service/channel/index.vue`(A10)
- Modify: `web-admin/src/views/pilot-service/channel/ChannelServiceOrderTab.vue`(A11,2 区)
- Modify: `web-admin/src/views/pilot-service/channel-service-order/ServiceOrderTxnDialog.vue`(A12)
- Modify: `web-admin/src/views/pilot-service/channel-service-order-finance/index.vue`(A13)
- Modify: `web-admin/src/views/pilot-service/clinical-payment-confirm/index.vue`(A14,2 区)
- Modify: `web-admin/src/views/pilot-service/clinical-payment-confirm/RefundConfirmTab.vue`(A15,2 区)
- [ ] **Step 1: 逐文件挂载 composable**(共 9 个上传区)
`ServiceOrderTxnDialog` / `ChannelServiceOrderTab` 若存在本地 `uploadAttachmentItem`,drop 的 `onFiles` 应调用同一入口。
- [ ] **Step 2: 回归**
渠道管理、渠道服务单、财务确认、临床付款确认(含退费 Tab)。
- [ ] **Step 3: Commit**
```bash
git commit -m "feat(web-admin): 中试渠道与临床付款确认附件支持拖拽"
```
---
## Task 5: 中试服务(下)— 临床申请与出库(A16–A22 + C1–C2)
**Files:**
- Modify: `web-admin/src/views/pilot-service/pilot-application/ApplicationFormDialog.vue`(A16,4 区)
- Modify: `web-admin/src/views/pilot-service/pilot-application/ApplicationDetailDialog.vue`(A17,5 区)
- Modify: `web-admin/src/views/pilot-service/pilot-application/ClinicalPaymentTab.vue`(A18,2 区)
- Modify: `web-admin/src/views/pilot-service/outbound-release-review/OutboundReleaseReviewDialog.vue`(A19)
- Modify: `web-admin/src/views/pilot-service/infusion-schedule-management/InfusionScheduleHandoverDialog.vue`(A20,交接附件区)
- Modify: `web-admin/src/views/pilot-service/checkup-management/CheckupDetailDialog.vue`(A21)
- Modify: `web-admin/src/views/pilot-service/checkup-management/CheckupMarkCheckedDialog.vue`(A22)
- Modify: `web-admin/src/components/business/outbound-material-form-sections/index.vue`(C1)
- Modify: `web-admin/src/views/pilot-service/outbound-release-review/OutboundReleaseMaterialDialog.vue`(C2)
- [ ] **Step 1: A16–A22 卡片化区**
`ApplicationDetailDialog` 中非标准 `attachment-trigger-card` 区域:drop zone 绑外层 `.attachment-upload` 或等价 flex 容器(5 处逐一改)。
- [ ] **Step 2: C1 行内纸质材料**
```ts
function usePaperRowDropZone(rowIndex: number) {
return useAttachmentDropZone({
onFiles: (files) => {
for (const file of files) {
void handlePaperAttachmentChange(rowIndex, { raw: file })
}
}
})
}
```
模板:每行 `.paper-att-list` 绑 `:class="{ 'is-dragover': ... }"` 与 handlers(可用 `v-for` 内联或按 index 数组存 ref)。
- [ ] **Step 3: C2 与 C1 对齐**
`OutboundReleaseMaterialDialog.vue` 行内上传逻辑与 C1 保持一致。
- [ ] **Step 4: 回归**
临床申请新建/详情、出库审核、输注交接(交接附件 + 物料纸质材料)、体检报告上传。
- [ ] **Step 5: Commit**
```bash
git commit -m "feat(web-admin): 临床申请与出库物料附件支持拖拽"
```
---
## Task 6: 生产域(A8–A9 + B5)
**Files:**
- Modify: `web-admin/src/views/production/sop/index.vue`(A8)
- Modify: `web-admin/src/views/production/cell-product/index.vue`(A9)
- Modify: `web-admin/src/views/production/production-work-order/TaskPaperAttachmentsPanel.vue`(B5,回归)
- [ ] **Step 1: A8、A9 挂载 composable**
- [ ] **Step 2: 回归 B5**
生产工单 → 任务执行 → 线下纸质文档 Tab。
- [ ] **Step 3: 全量收尾**
`./scripts/update-graph.sh frontend`(若 composable 被大量引用)
- [ ] **Step 4: Commit**
```bash
git commit -m "feat(web-admin): 生产域附件上传支持拖拽"
```
---
## 验收总表(方案 1 完成标准)
| 类别 | 文件数 | 上传区约数 | 状态 |
|------|--------|------------|------|
| A 内联卡片 | 22 | ~33 | Task 1–6 |
| B 共享组件 + 回归 | 1 + 6 | ~8 | Task 2–3、6 |
| C 行内纸质 | 2 | 动态 | Task 5 |
| **合计** | **~31 文件** | **~40+** | |
**不在范围(二期):** 类型 D 8 文件、类型 E 3 文件 — 见设计文档 §2.4。
---
## 执行选项
Plan 已保存至 `docs/superpowers/plans/2026-07-01-attachment-drag-upload.md`。
1. **Subagent 驱动(推荐)** — 按 Task 0→6 逐批派发,每批独立 PR/提交
2. **同会话连续执行** — 从 Task 0 开始直接改代码
请确认是否从 **Task 0(composable + 样式 + OpenSpec)** 开始实施。
@@ -0,0 +1,45 @@
# 质检工单批量导出任务附件 Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 在【质检工单】【我的质检任务】支持多选工单,将各工单全部批次/任务附件按三层目录打包 ZIP 下载,并展示三阶段进度弹窗。
**Architecture:** 纯前端 JSZip;`fetchQcInspectionBatchesBatch` 聚合元数据;`attachment-zip.ts` 负责 blob 下载与路径去重;`qc-work-order-attachment-export.ts` 构建目录并执行打包;`provide/inject` 传递卡片勾选状态,避免多层 prop drilling。
**Tech Stack:** Vue 3、Element Plus、JSZip、file-saver、现有预签名下载 API
**Spec:** `docs/superpowers/specs/2026-07-01-qc-work-order-attachment-export-design.md`
---
### Task 1: 公共 ZIP 工具
**Files:**
- Create: `web-admin/src/utils/attachment-zip.ts`
- [ ] 实现 `sanitizeZipPathSegment`、`ensureUniqueZipEntryName`、`fetchAttachmentBlob`、`formatZipDateStamp`
### Task 2: 质检工单导出核心
**Files:**
- Create: `web-admin/src/utils/qc-work-order-attachment-export.ts`
- [ ] 实现 `buildQcWorkOrderZipEntries`、`runAttachmentZipExport`(三阶段进度回调 + AbortSignal)
### Task 3: 进度弹窗与 composable
**Files:**
- Create: `web-admin/src/components/business/attachment-zip-progress-dialog/index.vue`
- Create: `web-admin/src/views/quality-inspection/qc-work-order/composables/useQcWorkOrderAttachmentExport.ts`
- Create: `web-admin/src/views/quality-inspection/qc-work-order/composables/qc-work-order-selection.ts`
### Task 4: 卡片勾选与工具栏
**Files:**
- Modify: `QcWorkOrderSingleCard.vue` — checkbox + inject
- Modify: `QcWorkOrderTabPanel.vue` — provide 选择态、工具栏、导出按钮、翻页清空
### Task 5: 验证
- [ ] `pnpm lint` 相关文件
- [ ] `./scripts/update-graph.sh frontend`
@@ -0,0 +1,150 @@
# 样本特殊标记 Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 在采集/捐赠协议单样本上维护 `isSpecial` + `specialRemark`,并在 web-admin 全链路只读展示红色加粗警示。
**Architecture:** 字段仅存 `biz_protocol_sample` / `biz_research_donation_sample`;下游 API JOIN 源表补字段;前端 `SpecialSampleDisplay` 统一渲染。
**Tech Stack:** FastAPI + SQLAlchemy + Vue 3 + Element Plus
**Spec:** `docs/superpowers/specs/2026-07-01-special-sample-mark-design.md`
---
## File Map
| 文件 | 职责 |
|------|------|
| `docs/sql/migrate-special-sample-mark.sql` | DDL 增量脚本 |
| `backend/app/utils/sample_special.py` | 校验 + dict 转换工具 |
| `backend/app/models/models.py` | `BizProtocolSample` 新列 |
| `backend/app/models/research_donation.py` | `BizResearchDonationSample` 新列 |
| `backend/app/crud/collection_protocol.py` | `_sample_to_dict` / `save_samples` / list sampleItems |
| `backend/app/crud/research_donation.py` | 同上 + 转存储复制 |
| `backend/app/crud/qc_work_order.py` | `_enrich_work_order_list_items` 补字段 |
| `backend/app/crud/sample_reception.py` | 待/已接收 list item |
| `backend/app/crud/protocol_sample_collection.py` | 样本采集信息 list |
| `backend/app/crud/research_donation_sample_collection.py` | 捐赠样本采集 list |
| `backend/app/crud/pre_transit_sample.py` | 转运前样本卡片 items |
| `backend/app/crud/storage_release_review.py` | 入库审核 detail |
| `backend/app/crud/cell_product.py` | 溯源链样本信息 |
| `web-admin/src/components/business/special-sample-display/index.vue` | 公共展示组件 |
| `web-admin/src/components/business/sample-transport-form-section/index.vue` | 录入 |
| `web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue` | 采集查看 |
| `web-admin/src/views/research-donation/list/DonationViewDialog.vue` | 捐赠查看 |
| 下游 15+ vue 页面 | 样本编码旁 inline 展示 |
---
## Task 1: 数据库与 Model
**Files:**
- Create: `docs/sql/migrate-special-sample-mark.sql`
- Modify: `backend/app/models/models.py`, `backend/app/models/research_donation.py`
- [ ] **Step 1:** 执行 DDL(两表对称)
```sql
ALTER TABLE `biz_protocol_sample`
ADD COLUMN `is_special` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否特殊样本:0否 1是' AFTER `storage_expire_date`,
ADD COLUMN `special_remark` varchar(256) DEFAULT NULL COMMENT '特殊说明' AFTER `is_special`;
ALTER TABLE `biz_research_donation_sample`
ADD COLUMN `is_special` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否特殊样本:0否 1是' AFTER `storage_expire_date`,
ADD COLUMN `special_remark` varchar(256) DEFAULT NULL COMMENT '特殊说明' AFTER `is_special`;
```
- [ ] **Step 2:** ORM 增加 `is_special = Column(SmallInteger...)` 与 `special_remark = Column(String(256)...)`
---
## Task 2: 后端工具与核心 CRUD
**Files:**
- Create: `backend/app/utils/sample_special.py`
- Modify: `backend/app/crud/collection_protocol.py`, `backend/app/crud/research_donation.py`
- [ ] **Step 1:** 创建工具函数
```python
def sample_special_to_dict(sample) -> Dict[str, Any]: ...
def validate_sample_special_raw(raw: dict, *, index: Optional[int] = None) -> None: ...
def apply_sample_special_fields(obj, raw: dict) -> None: ...
```
- [ ] **Step 2:** `_sample_to_dict` 增加 `isSpecial` / `specialRemark`
- [ ] **Step 3:** `save_samples` / `_create_samples` 循环内调用 `validate_sample_special_raw` + `apply_sample_special_fields`
- [ ] **Step 4:** `research_donation.py` 转存储复制 `is_special`、`special_remark`
- [ ] **Step 5:** `collection_protocol.py` 列表 `sampleItems` 构建补字段
---
## Task 3: 下游 CRUD API
**Files:** `sample_reception.py`, `protocol_sample_collection.py`, `research_donation_sample_collection.py`, `pre_transit_sample.py`, `qc_work_order.py`, `storage_release_review.py`, `cell_product.py`
- [ ] **Step 1:** 凡已有 `BizProtocolSample` / `BizResearchDonationSample` 对象处,`item.update(sample_special_to_dict(sample))`
- [ ] **Step 2:** `qc_work_order._enrich_work_order_list_items` 在 `sampleTypeName` 赋值后补 special 字段(覆盖质检+生产工单)
---
## Task 4: 前端公共组件与录入
**Files:**
- Create: `web-admin/src/components/business/special-sample-display/index.vue`
- Modify: `web-admin/src/components/business/sample-transport-form-section/index.vue`
- [ ] **Step 1:** 创建 `SpecialSampleDisplay`(`v-if="isSpecial"`,danger 色加粗)
- [ ] **Step 2:** 样本子弹窗增加 checkbox + textarea;取消勾选清空说明
- [ ] **Step 3:** `confirmSampleDialog` 校验:`isSpecial && !specialRemark.trim()` → warning
- [ ] **Step 4:** 列表增加「特殊样本」列;`openAddSampleDialog` 初始化 `isSpecial: false, specialRemark: ''`
- [ ] **Step 5:** `normalizeSampleRow` 保留 `isSpecial` / `specialRemark`
---
## Task 5: 协议查看弹窗
**Files:** `ProtocolViewDialog.vue`, `DonationViewDialog.vue`
- [ ] **Step 1:** 样本卡片 header inline 展示 `SpecialSampleDisplay`
---
## Task 6: 下游展示页面(P1 全量)
在样本编码列/标题行旁接入 `SpecialSampleDisplay`:
- [ ] `ProtocolAuditTab.vue`, `PreTransitProtocolCardList.vue`
- [ ] `research-donation/audit/index.vue`
- [ ] `SampleCollectionInfoTab.vue`, `DonationSampleCollectionInfoTab.vue`
- [ ] `sample-reception/index.vue`, `SampleReceptionCardList.vue`
- [ ] `QcWorkOrderProtocolGroup.vue`, `QcWorkOrderSampleGroup.vue`, `QcWorkOrderTaskSubList.vue`
- [ ] `storage-release-review/index.vue`, `StorageReleaseReviewDialog.vue`, `StorageReleaseViewDialog.vue`
- [ ] `ProductionWorkOrderCardList.vue`, `SampleReceptionDialog.vue`, `DispatchTaskDialog.vue`
- [ ] `SampleCustomerViewDialog.vue`
---
## Task 7: 验证
- [ ] 本地执行 `docs/sql/migrate-special-sample-mark.sql`
- [ ] `python scripts/check_field_consistency.py`
- [ ] `./scripts/update-graph.sh frontend` + `backend`
- [ ] 手工:协议单录入特殊样本 → 查看弹窗 → 样本接收/质检卡片可见红色标记
---
## 部署前
1. 执行 `docs/sql/migrate-special-sample-mark.sql`
2. 重启 backend
3. 刷新 web-admin
@@ -0,0 +1,234 @@
# 附件上传支持拖拽 — 功能设计文档
> 日期:2026-07-01
> 状态:待实现
> 需求来源:客户希望在保留「点击选择文件」的前提下,增加「拖拽文件到上传区」能力
> 已确认范围:**方案 1** — 仅附件类上传(类型 A + B + C);Logo/商品媒体/头像等(类型 D、E)留二期
---
## 1. 背景与目标
### 1.1 背景
`web-admin` 中约 30 个页面/组件使用 `fetchUploadAttachment` 实现附件上传,UI 以 OpenSpec「附件上传卡片化布局」为准(权威参考:`ProtocolFormDialog.vue`「协议附件」)。当前均仅支持点击 140×96 上传卡片触发文件选择,不支持拖拽。
### 1.2 目标
1. 在**不改变**现有点击上传交互的前提下,为方案 1 范围内所有上传区增加拖拽落文件能力。
2. 拖拽与点击共用同一套上传逻辑(校验 → 占位 → `fetchUploadAttachment` → 回填/失败移除)。
3. 按业务域**分批独立改造**,每批改完可单独回归,降低全站一次性改动风险。
### 1.3 非目标(一期不做)
- 单图/Logo 按钮上传(快递 Logo、站点图片、机构 Logo 等)
- 商品主图/轮播/详情媒体(`system/product`)
- 订单取消佐证 `picture-card`、用户头像
- 后端 API 变更
- 抽成全站统一 `AttachmentUploadField` 组件(本期各页独立加 drop 能力,避免大范围重构)
- 文件夹拖拽、剪贴板粘贴上传
---
## 2. 改造范围清单
### 2.1 类型 A — 页面内联卡片化附件(22 文件,约 33 个上传区)
| ID | 文件 | 上传区数 | 说明 |
|----|------|----------|------|
| A1 | `web-admin/src/views/cell-storage/protocol/ProtocolFormDialog.vue` | 2 | 协议附件、缴费凭证(`upload-card--sm`) |
| A2 | `web-admin/src/views/cell-storage/protocol-audit/PaymentInfoTab.vue` | 2 | 上传凭证、上传附件 |
| A3 | `web-admin/src/views/cell-storage/protocol-audit/StorageCertTab.vue` | 1 | 储存证附件 |
| A4 | `web-admin/src/views/cell-storage/protocol-audit/FullmoonTodoTab.vue` | 1 | 附件 |
| A5 | `web-admin/src/views/research-donation/list/DonationFormDialog.vue` | 2 | 两处附件 |
| A6 | `web-admin/src/views/quality-inspection/env-detect-record/index.vue` | 1 | 检测附件 |
| A7 | `web-admin/src/views/quality-inspection/storage-release-review/StorageReleaseReviewDialog.vue` | 1 | 审核附件 |
| A8 | `web-admin/src/views/production/sop/index.vue` | 1 | SOP 附件 |
| A9 | `web-admin/src/views/production/cell-product/index.vue` | 1 | 产品图片(卡片布局) |
| A10 | `web-admin/src/views/pilot-service/channel/index.vue` | 1 | 渠道协议附件 |
| A11 | `web-admin/src/views/pilot-service/channel/ChannelServiceOrderTab.vue` | 2 | 充值/退款附件 |
| A12 | `web-admin/src/views/pilot-service/channel-service-order/ServiceOrderTxnDialog.vue` | 1 | 流水附件 |
| A13 | `web-admin/src/views/pilot-service/channel-service-order-finance/index.vue` | 1 | 财务确认附件 |
| A14 | `web-admin/src/views/pilot-service/clinical-payment-confirm/index.vue` | 2 | 附件 ×2 |
| A15 | `web-admin/src/views/pilot-service/clinical-payment-confirm/RefundConfirmTab.vue` | 2 | 附件 ×2 |
| A16 | `web-admin/src/views/pilot-service/pilot-application/ApplicationFormDialog.vue` | 4 | 知情同意/诊断等 |
| A17 | `web-admin/src/views/pilot-service/pilot-application/ApplicationDetailDialog.vue` | 5 | 诊断/交付等(含非标准 `attachment-trigger-card` 样式,需对齐 drop 区) |
| A18 | `web-admin/src/views/pilot-service/pilot-application/ClinicalPaymentTab.vue` | 2 | 附件、退费附件 |
| A19 | `web-admin/src/views/pilot-service/outbound-release-review/OutboundReleaseReviewDialog.vue` | 1 | 审核附件 |
| A20 | `web-admin/src/views/pilot-service/infusion-schedule-management/InfusionScheduleHandoverDialog.vue` | 1 | 交接附件(与 C 类物料区并存) |
| A21 | `web-admin/src/views/pilot-service/checkup-management/CheckupDetailDialog.vue` | 1 | 上传报告 |
| A22 | `web-admin/src/views/pilot-service/checkup-management/CheckupMarkCheckedDialog.vue` | 1 | 上传报告 |
### 2.2 类型 B — `ProtocolFinanceConfirmFields` 共享组件(1 组件 + 6 消费页,约 8 个上传区)
| ID | 文件 | 上传区数 | 说明 |
|----|------|----------|------|
| B0 | `web-admin/src/components/business/protocol-finance-confirm-fields/index.vue` | 1 | **改组件即覆盖下列引用** |
| B1 | `web-admin/src/views/quality-inspection/sample-reception/index.vue` | 2 | 单条接收 + 批量接收 |
| B2 | `web-admin/src/views/cell-storage/payment-confirm/index.vue` | 1 | 确认收款附件 |
| B3 | `web-admin/src/views/cell-storage/payment-confirm/RefundConfirmTab.vue` | 1 | 退费财务附件 |
| B4 | `web-admin/src/views/cell-storage/payment-confirm/InvoiceRequestTab.vue` | 1 | 开票附件 |
| B5 | `web-admin/src/views/production/production-work-order/TaskPaperAttachmentsPanel.vue` | 1 | 线下纸质文档 |
| B6 | `web-admin/src/views/quality-inspection/qc-material/QcMaterialBatchAttachmentDialog.vue` | 1 | 质检附件 |
### 2.3 类型 C — 表格行内纸质材料(2 文件)
| ID | 文件 | 说明 |
|----|------|------|
| C1 | `web-admin/src/components/business/outbound-material-form-sections/index.vue` | 出库/交接物料弹窗复用;每行 `paper-att-card--trigger` |
| C2 | `web-admin/src/views/pilot-service/outbound-release-review/OutboundReleaseMaterialDialog.vue` | 独立实现同类行内上传,需与 C1 同步改法 |
**引用 C1 的页面(改 C1 后需回归)**:`OutboundReleaseMaterialDialog.vue`、`InfusionScheduleHandoverDialog.vue`(物料区)。
### 2.4 二期范围(本期不改)
类型 D(8 文件):`express`、`site`、`clean-room`、`cell-sample-type`、`insurance-company`、`checkup-institution`、`ThirdPartyCompanyTab`、`category`。
类型 E(3 文件):`system/product`、`system/order`、`UserProfileDialog`。
---
## 3. 交互与视觉规范
### 3.1 Drop Zone 范围
| 类型 | Drop Zone 元素 | 说明 |
|------|----------------|------|
| A / B | `.attachment-upload` 根容器 | 包含 `.attachment-list`(上传卡片 + 已传附件卡片)及下方 `.upload-hint` 所在整块区域 |
| C | 该行 `.paper-att-list` 或附件 cell 容器 | 行内空间较小,drop 高亮仅作用于当前行的附件列表 flex 区 |
**不采用** Element Plus `el-upload` 的 `drag` 大区域模式(会替换 slot、破坏 140×96 卡片布局)。
### 3.2 拖拽态视觉
在 `.attachment-upload` 上增加修饰类 `.is-dragover`(类型 C 对应 `.paper-att-list.is-dragover`):
- `border: 1px dashed #10b981`
- `background: #ecfdf5`
- `border-radius: 8px`
- 可选:`padding: 8px`(仅 dragover 时,避免布局跳动用 `outline` 或 `box-shadow` 代替 padding 亦可)
`.upload-hint` 默认文案追加:**「支持拖拽或点击上传」**(保留原有格式/大小限制说明)。
### 3.3 行为规则
1. **dragenter / dragover**:`preventDefault()`,设置 `is-dragover = true`(需在 `dragleave` 时判断 `relatedTarget` 仍在容器内再清除,避免闪烁)。
2. **drop**:`preventDefault()`,清除 `is-dragover`,读取 `event.dataTransfer.files`。
3. **多文件**:按文件顺序逐个调用与 `@change` 相同的上传处理(与 `:multiple="true"` 一致)。
4. **校验**:单文件 ≤ 20MB、`accept` 类型与现有点击上传一致;失败项 `ElMessage.error` 并跳过,不影响其他文件。
5. **重复文件**:与点击上传相同,依赖现有 `clearFiles` / 数组 push 逻辑。
6. **上传中**:dragover 期间若存在 `_uploading`,仍允许 drop(排队上传);提交拦截逻辑不变。
7. **禁用/只读**:只读态(如 `TaskPaperAttachmentsPanel` 的 `disabled`)不绑 drop 事件。
### 3.4 与 OpenSpec 关系
实现后 SHALL 在 `openspec/changes/zkxw-engineering-standards/specs/ui-conventions/spec.md`「附件上传卡片化布局」章节补充:
- Drop zone 为 `.attachment-upload`
- `.is-dragover` 视觉
- `.upload-hint` 文案含「拖拽或点击」
- 表格行内纸质材料 drop 区约定
---
## 4. 技术方案
### 4.1 推荐:轻量 composable + 各页独立挂载
新增 `web-admin/src/composables/useAttachmentDropZone.ts`(仅工具,非 UI 组件):
```ts
// 伪代码示意
export function useAttachmentDropZone(options: {
onFiles: (files: File[]) => void
disabled?: Ref<boolean>
}) {
const isDragover = ref(false)
// dragenter, dragleave, dragover, drop handlers
return { isDragover, dropZoneHandlers }
}
```
各页在 `.attachment-upload` 上:
```vue
<div
class="attachment-upload"
:class="{ 'is-dragover': isDragover }"
v-bind="dropZoneHandlers"
>
```
`onFiles` 内对每个 `File` 调用现有 `handleAttachmentChange({ raw: file })` 或等价函数。
**理由**:满足「每处独立修改」——各文件显式挂载 composable,diff 清晰;逻辑 DRY 但不引入新 Vue 组件,回归面可控。
### 4.2 类型 B 实施策略
改 `ProtocolFinanceConfirmFields` **一处**,对 B1–B6 做**全量回归**(视为独立一批 PR,不与 A 类混在同一 PR)。
### 4.3 类型 C 实施策略
在 `handlePaperAttachmentChange` 同级增加 drop 处理;drop zone 为行级 `.paper-att-list`。C1、C2 同批修改,并回归出库物料弹窗与输注交接弹窗。
### 4.4 全局样式(可选)
若多页重复 `.is-dragover` 样式,可在 `web-admin/src/assets/styles/core/app.scss` 增加:
```scss
.attachment-upload.is-dragover { ... }
.paper-att-list.is-dragover { ... }
```
各页 scoped 样式可省略重复定义。
---
## 5. 分批实施顺序
| 批次 | 范围 | 文件数 | 验收重点 |
|------|------|--------|----------|
| **0** | composable + 全局 dragover 样式 + OpenSpec 补充 | 2–3 | 单元/手工验证 composable |
| **1 试点** | A1 `ProtocolFormDialog` | 1 | 定稿交互,2 个上传区 |
| **2 细胞存储** | A2–A5 + B0 + B2–B4 | 6 + 组件 | 协议审核、付款确认、捐赠 |
| **3 质检** | A6–A7 + B1 + B6 | 4 + 组件已含 | 样本接收、环境检测、放行 |
| **4 中试上** | A10–A15 | 6 | 渠道、临床付款确认 |
| **5 中试下** | A16–A22 + C1–C2 | 9 + 2 | 临床申请、出库、体检、纸质材料 |
| **6 生产** | A8–A9 + B5 | 3 | SOP、细胞产品、工单纸质文档 |
每批:**仅改该批文件 → 手工测试 → 合并**,再进入下一批。
---
## 6. 测试要点(每批通用)
| 场景 | 预期 |
|------|------|
| 点击上传卡片选 1 个文件 | 与改前一致 |
| 拖拽 1 个合法文件到 upload 区 | 出现占位卡片 → 上传成功 → 可预览/下载/删除 |
| 拖拽多个文件 | 全部入队上传 |
| 拖拽超大文件(>20MB) | 提示错误,不上传 |
| 拖拽不支持类型 | 浏览器/业务校验拒绝或跳过 |
| dragover 视觉 | 进入区域高亮,离开恢复 |
| 上传中提交表单 | 仍提示「附件上传中,请稍候」 |
| 只读/禁用 | 无 drop 响应 |
---
## 7. 风险与缓解
| 风险 | 缓解 |
|------|------|
| 多文件 drop 与 `@change` 并发竞态 | 复用 `ProtocolFinanceConfirmFields` 已有 `_pendingList` 模式;A 类页面若存在竞态可参考 |
| `ApplicationDetailDialog` 样式不统一 | 该页单独测试 5 个上传区 |
| C1/C2 行内区域过小 | drop 高亮整行附件 flex 区,不要求拖到小卡片上 |
| 浏览器 dragleave 闪烁 | composable 内 counter 或 `relatedTarget` 检查 |
---
## 8. 相关文档
- OpenSpec:`openspec/changes/zkxw-engineering-standards/specs/ui-conventions/spec.md` §附件上传卡片化布局
- UI 规范:`docs/web-admin-ui-spec-fresh-mint.md`
- 权威参考页:`web-admin/src/views/cell-storage/protocol/ProtocolFormDialog.vue`
- 实施计划:`docs/superpowers/plans/2026-07-01-attachment-drag-upload.md`
@@ -0,0 +1,193 @@
# 质检工单批量导出任务附件 — 设计文档
> 日期:2026-07-01
> 状态:待实现
> 范围:`web-admin` 【质检工单】【我的质检任务】
> 已确认:**方案 A — 纯前端 JSZip 打包下载**
> 已确认:导出过程需**可见进度反馈**(任务较慢)
---
## 1. 背景与目标
### 1.1 业务需求
用户在【质检工单】或【我的质检任务】中勾选一条或多条质检工单,将该工单下**所有检测批次、所有质检任务**的附件打包为 ZIP 下载。
目录结构:
```
{工单}/
{批次}/
{任务}/
附件文件…
```
### 1.2 目标
1. 工单卡片支持多选(checkbox)。
2. 工具栏提供「导出附件」按钮(`btn-ghost` + Download 图标)。
3. 浏览器端聚合附件、按层级建目录、生成 ZIP 并触发下载。
4. 导出过程展示**进度弹窗**(阶段 + 百分比 + 当前文件名),避免用户误以为卡死。
### 1.3 非目标(一期不做)
- 后端流式 ZIP / 异步任务中心
- 跨分页保留勾选
- 工单级其他附件(诊断附件、样本接收附件等)
- 【我的质检任务】仅导出「本人负责任务」的子集模式(与 manage 一致,导出工单下全部任务附件)
---
## 2. 技术方案
### 2.1 方案选定:纯前端 JSZip
| 步骤 | 说明 |
|------|------|
| 1 | 收集已选 `workOrderId[]` |
| 2 | `POST /web/admin/qc-work-orders/inspection-batches/batch` 获取批次及内嵌 `tasks[].attachmentFiles` |
| 3 | 扁平化附件清单,计算 ZIP 内路径 |
| 4 | 逐个 `fetchAttachmentBlob`(预签名 URL)写入 JSZip |
| 5 | `zip.generateAsync({ type: 'blob' }, onUpdate)` 生成压缩包 |
| 6 | `FileSaver.saveAs` 下载 |
依赖:`jszip`、`file-saver`(已存在于 `package.json`)。
### 2.2 附件数据来源
- 表字段:`biz_qc_task.third_party_attachments`(逗号分隔 URL)
- API 字段:`attachmentFiles`(含 `fileUrl`、`fileName`)
- 实验室自检与第三方检测共用该字段
### 2.3 目录命名
| 层级 | 规则 |
|------|------|
| 工单 | `{workOrderNo}`;若重名追加 `_样本{sampleCode}` 等短标识 |
| 批次 | `{batchNo}_{batchName}`;无 `batchNo` 时用 `批次{orderNum}` |
| 任务 | `{taskNo}_{itemName}` |
| 文件 | 优先 `fileName`;同目录重名用 `(2)` 后缀 |
无附件的任务/批次不创建空目录。所选工单均无附件时提示「所选工单暂无附件」。
### 2.4 安全与权限
- 批次批量接口已受 `QC_TASK_READONLY_MENU_CODES` 与租户隔离约束。
- 两菜单共用实现;导出范围为工单下**全部任务**附件(非仅当前用户任务)。
---
## 3. 进度弹窗 UX(核心补充)
环境检测页的「批量下载附件」仅按钮 `loading`,无细粒度进度。本功能附件量大、耗时长,**必须**使用独立进度弹窗。
### 3.1 组件
新建:`web-admin/src/components/business/attachment-zip-progress-dialog/index.vue`
- `el-dialog`,`append-to-body`,`modal-class="protocol-dialog-mask"`(无背景模糊)
- `close-on-click-modal="false"`,`show-close="false"`(进行中不可点遮罩关闭)
- 宽度约 `480px`,单栏居中
### 3.2 三阶段进度
整体进度条 `0–100%`,按阶段加权:
| 阶段 | 权重 | 说明 |
|------|------|------|
| `preparing` | 0–5% | 请求批次/任务元数据 |
| `downloading` | 5–85% | 逐个拉取附件 blob 并 `zip.file()` |
| `zipping` | 85–100% | `generateAsync` 压缩(使用 JSZip `metadata.percent`) |
展示文案示例:
- 准备中:正在加载工单附件清单…
- 下载中:正在下载附件(12/48)— `报告.pdf`
- 压缩中:正在生成压缩包…
副文案:当前工单 `ZJGD…` / 批次 `首批检测`(可选,简短一行 `text-muted`)。
### 3.3 进度条
- `el-progress`:`stroke-width="8"`,`:percentage="overallPercent"`,`:status` 完成时 `success`
- 数字百分比与「已完成 N / 共 M 个文件」并列
### 3.4 完成与失败
| 结果 | 行为 |
|------|------|
| 全部成功 | 进度 100%,状态 success,1s 后自动关闭弹窗;`ElMessage.success('已打包下载 N 个附件')` |
| 部分失败 | 仍生成 ZIP(跳过失败项);关闭后 `ElMessage.warning('已下载 N 个,M 个失败')` |
| 全部失败 | 不下载;`ElMessage.error('附件下载失败,请稍后重试')` |
| 无附件 | 不打开进度弹窗;`ElMessage.warning('所选工单暂无附件')` |
### 3.5 取消
- 底部提供「取消」按钮(`Close` 图标 + 文案)
- 使用 `AbortController` 中断进行中的 `fetch`;设置 `cancelled` 标志跳过后续文件
- 取消后关闭弹窗,`ElMessage.info('已取消导出')`
- 已写入 ZIP 的 blob 丢弃,不触发 `saveAs`
### 3.6 并发与性能
- 附件下载**串行**(与环境检测一致),避免浏览器连接数耗尽;进度更准确
- 可选:限制单次最多 **50 个工单** 或 **500 个文件**,超出时 `ElMessageBox.confirm` 二次确认
---
## 4. 页面改动
### 4.1 勾选
在 `QcWorkOrderSingleCard` 卡片头部左侧增加 `el-checkbox`:
- `QcWorkOrderProtocolGroup` / `QcWorkOrderSampleGroup` 内每张工单卡片各自可勾选
- 状态由 `QcWorkOrderTabPanel` 持有:`selectedWorkOrderIds: Set<string>`
- 翻页或重新搜索时清空选择
### 4.2 工具栏
`QcWorkOrderTabPanel.vue` 在卡片列表上方增加(manage / mine 均显示):
```
已选 N 项 | [导出附件](btn-ghost,N=0 时 disabled)
```
### 4.3 逻辑抽离
| 文件 | 职责 |
|------|------|
| `@/utils/attachment-zip.ts` | 从 `env-detect-record` 抽出 `fetchAttachmentBlob`、`ensureUniqueZipEntryName`、`sanitizeZipPathSegment` |
| `@/utils/qc-work-order-attachment-export.ts` | 构建导出清单、ZIP 路径、`runQcWorkOrderAttachmentExport()` |
| `attachment-zip-progress-dialog` | 进度 UI |
| `useQcWorkOrderAttachmentExport.ts` | 组合 API + 进度回调 + 弹窗显隐 |
---
## 5. 接口
一期**不新增**后端接口,复用:
- `POST /web/admin/qc-work-orders/inspection-batches/batch`
- `POST /web/admin/attachment/download-url`
---
## 6. 测试要点
| # | 场景 | 预期 |
|---|------|------|
| 1 | 勾选 1 个工单,含多批次多任务附件 | ZIP 目录三层正确,文件可打开 |
| 2 | 勾选多个工单 | 根目录下多个工单文件夹 |
| 3 | 工单无附件 | 提示暂无附件,不弹进度窗 |
| 4 | 导出中取消 | 中断下载,无文件落盘 |
| 5 | 单个文件 404 | 其余正常打包,warning 提示失败数 |
| 6 | 【我的质检任务】与【质检工单】 | 行为一致 |
| 7 | 协议组 / 样本组 | 各工单独立勾选、导出 |
---
## 7. 后续演进
若生产反馈单次导出经常超过 500 文件或超时,再评估**方案 B**(后端 `StreamingResponse` ZIP)并保留相同目录规范与进度语义(改为轮询任务状态)。
@@ -0,0 +1,293 @@
# 样本特殊标记与特殊说明
> 日期:2026-07-01
> 状态:待审核
> 关联:`2026-05-19-protocol-donation-convert-design.md`(捐赠转细胞存储样本复制)
> 关联模块:采集协议单、捐赠协议单、样本信息、质检、生产、入库审核
---
## 1. 背景与目标
### 1.1 业务诉求
在**采集协议单**与**捐赠协议单**的样本信息中,增加「特殊样本」标记及「特殊说明」文本字段。例如样本为小三阳时:勾选特殊样本,特殊说明填写「小三阳」。
凡展示样本数据的界面,若该样本为特殊样本,须**醒目展示**:
- 红色加粗 **【特殊样本】**
- 红色加粗 **特殊说明** 内容
### 1.2 目标
1. 两种协议单的样本录入弹窗支持维护 `isSpecial` + `specialRemark`。
2. 勾选特殊样本时,特殊说明**必填**(已确认:选项 A)。
3. 所有 web-admin 展示样本数据的页面/弹窗/卡片,特殊样本信息只读展示,样式统一。
4. 捐赠转细胞存储时,特殊标记随样本复制到新 `biz_protocol_sample` 行。
5. 历史数据默认非特殊样本,兼容现有流程。
### 1.3 非目标(本期不做)
- 小程序端展示
- 按特殊样本筛选列表
- 导出 Excel 增加特殊说明列
- 下游业务表(接收、质检工单等)冗余存储特殊字段
---
## 2. 业务规则
### 2.1 字段语义
| 字段 | API 名 | 类型 | 说明 |
|------|--------|------|------|
| 特殊样本标记 | `isSpecial` | `boolean` | `true` 表示特殊样本 |
| 特殊说明 | `specialRemark` | `string` | 自由文本,如「小三阳」 |
与现有 `remark`(普通备注)**语义分离**:`remark` 为通用备注;`specialRemark` 为结构化警示说明,仅在 `isSpecial=true` 时有效。
### 2.2 校验规则(已确认)
| 条件 | 规则 |
|------|------|
| `isSpecial = true` | `specialRemark` **必填**,trim 后非空,最大 256 字符 |
| `isSpecial = false` | `specialRemark` 保存时**清空**为 `null` / 空字符串 |
| 未勾选却填写了说明 | 前端保存前清空;后端以 `isSpecial` 为准,忽略 `specialRemark` |
前后端均须校验;后端为最终门禁。
### 2.3 编辑与展示
- **可编辑**:采集/捐赠协议单新增、编辑样本(`SampleTransportFormSection` 子弹窗)。
- **只读展示**:协议查看弹窗、下游质检/生产/接收等所有样本展示位。
- **编辑时机**:协议单保存样本时一并持久化;下游模块通过 JOIN 源样本表读取最新值。
### 2.4 捐赠转细胞存储
`research_donation.py` 复制 `BizResearchDonationSample` → `BizProtocolSample` 时,须同步复制:
- `is_special` ← 源样本 `is_special`
- `special_remark` ← 源样本 `special_remark`
---
## 3. 数据模型
### 3.1 表结构变更
两张样本表**对称**增加字段(位于业务字段末尾、`tenant_no` 之前):
**`biz_protocol_sample`**
```sql
ALTER TABLE `biz_protocol_sample`
ADD COLUMN `is_special` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否特殊样本:0否 1是' AFTER `storage_expire_date`,
ADD COLUMN `special_remark` varchar(256) DEFAULT NULL COMMENT '特殊说明' AFTER `is_special`;
```
**`biz_research_donation_sample`**
```sql
ALTER TABLE `biz_research_donation_sample`
ADD COLUMN `is_special` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否特殊样本:0否 1是' AFTER `storage_expire_date`,
ADD COLUMN `special_remark` varchar(256) DEFAULT NULL COMMENT '特殊说明' AFTER `is_special`;
```
同步更新 `docs/sql/zkxw.sql` 基线。
### 3.2 ORM
- `backend/app/models/models.py` → `BizProtocolSample`
- `backend/app/models/research_donation.py` → `BizResearchDonationSample`
### 3.3 API 字段(camelCase)
`_sample_to_dict` 统一输出:
```python
"isSpecial": bool(s.is_special),
"specialRemark": (s.special_remark or "").strip(),
```
`save_samples` 写入时:
- `is_special = 1 if raw.get("isSpecial") else 0`
- `special_remark` 仅在 `is_special=1` 时写入 trim 后文本,否则 `None`
---
## 4. 架构方案
### 4.1 选定方案:样本表唯一数据源 + 读取 JOIN
特殊标记仅存于 `biz_protocol_sample` / `biz_research_donation_sample`,下游模块在 list/detail API 中 JOIN 或复用已有样本查询补出 `isSpecial`、`specialRemark`。
**不**在 `biz_sample_reception`、`biz_qc_work_order` 等子表冗余。
### 4.2 后端改造模式
凡构建样本相关 dict 的位置,按 `_sample_to_dict` 模式补字段。重点文件:
| 文件 | 改动 |
|------|------|
| `crud/collection_protocol.py` | `_sample_to_dict`、`save_samples` |
| `crud/research_donation.py` | `_sample_to_dict`、`save_samples`、转存储复制 |
| `crud/protocol_sample_collection.py` | list item 构建 |
| `crud/research_donation_sample_collection.py` | list item 构建 |
| `crud/sample_reception.py` | 待接收/已接收/批量 list |
| `crud/qc_work_order.py` | 工单 list/detail 中样本信息 |
| `crud/production_work_order.py` | 同上 |
| `crud/storage_release_review.py` | 入库审核 list/detail |
| 转运前样本等相关 CRUD | 协议卡片内样本 list |
Pydantic Create/Update body 中 samples 数组项增加可选字段 `isSpecial`、`specialRemark`;后端 save 时校验。
运行 `python scripts/check_field_consistency.py` 验证 CRUD ↔ Schema ↔ 前端字段一致。
---
## 5. 前端设计
### 5.1 录入 UI — `SampleTransportFormSection`
**位置**:添加/编辑样本子弹窗,「样本状态」表单项之后。
**控件**:
1. `el-checkbox` — 标签「特殊样本」,绑定 `sampleDraft.isSpecial`
2. `el-input` type="textarea" — 标签「特殊说明」,`:disabled="!sampleDraft.isSpecial"`,`maxlength=256`,`show-word-limit`
**交互**:
- 取消勾选 → 清空 `specialRemark`
- 确定时:`isSpecial=true` 且 `specialRemark` 为空 → `ElMessage.warning` + 表单校验失败
**列表表格**:新增列「特殊样本」(`min-width` ≥ 120):
- 非特殊:显示 `—`
- 特殊:inline 展示 `SpecialSampleDisplay` 组件内容
`createEmptySample()` / `sampleDraft` 初始化增加 `isSpecial: false`、`specialRemark: ''`。
采集协议单、捐赠协议单共用此组件,**改一处覆盖两种协议**。
### 5.2 展示 UI — 公共组件
新建 `web-admin/src/components/business/special-sample-display/index.vue`:
```vue
<!-- props: isSpecial, specialRemark, layout?: 'inline' | 'block' -->
<template v-if="isSpecial">
<span class="special-sample-mark">【特殊样本】</span>
<span v-if="specialRemark" class="special-sample-remark">{{ specialRemark }}</span>
</template>
```
样式(scoped + 可全局复用 class):
```scss
.special-sample-mark,
.special-sample-remark {
color: var(--el-color-danger);
font-weight: 700;
}
.special-sample-remark {
margin-left: 4px;
}
```
- **非特殊样本**:组件不渲染任何 DOM(不占位、不显示「—」)。
- **不使用 `el-tag`**:此为警示文本,非状态枚举。
### 5.3 查看弹窗
**`ProtocolViewDialog` / `DonationViewDialog`** 样本卡片:
- 卡片 header 标题行:样本类型名旁 inline 展示 `SpecialSampleDisplay`
- 样本信息 data-grid:独立一行「特殊说明」(仅 `isSpecial` 时显示,block 布局)
### 5.4 下游展示接入点(P1 全量)
| 模块 | 文件 |
|------|------|
| 协议管理 | `ProtocolAuditTab.vue`、`PreTransitProtocolCardList.vue` |
| 捐赠审核 | `research-donation/audit/index.vue` |
| 样本采集信息 | `SampleCollectionInfoTab.vue`、`DonationSampleCollectionInfoTab.vue` |
| 样本接收 | `sample-reception/index.vue`、`SampleReceptionCardList.vue` |
| 质检工单 | `QcWorkOrderProtocolGroup.vue`、`QcWorkOrderSampleGroup.vue`、`QcWorkOrderTaskSubList.vue` |
| 入库审核 | `storage-release-review/index.vue`、`StorageReleaseReviewDialog.vue`、`StorageReleaseViewDialog.vue` |
| 生产工单 | `ProductionWorkOrderCardList.vue`、`SampleReceptionDialog.vue`、`DispatchTaskDialog.vue` 等 |
| 溯源 | `SampleCustomerViewDialog.vue` |
**展示策略**:
1. 列表/卡片:**样本编码列或标题行**旁 inline 展示(最醒目)
2. 详情弹窗:样本编码下方或信息区独立一行
3. 统一使用 `SpecialSampleDisplay`,禁止各页复制样式
### 5.5 TypeScript 类型
`web-admin/src/types/api.d.ts` 中协议/捐赠样本相关类型补充 `isSpecial?: boolean`、`specialRemark?: string`。
---
## 6. 实施阶段
| 阶段 | 范围 | 交付标准 |
|------|------|----------|
| **P0** | DB + Model + 两协议 CRUD + 录入组件 + 两协议查看弹窗 | 可在协议单录入/查看特殊样本 |
| **P1** | 公共展示组件 + 下游全部展示点 + 转存储复制 | 质检/生产/接收等链路可见红色警示 |
| **P2**(可选) | 筛选、导出、小程序 | 产品另行排期 |
建议 P0、P1 **同一 PR 或连续 PR** 交付,避免下游看不到标记造成业务风险。
---
## 7. 测试要点
### 7.1 录入校验
- [ ] 勾选特殊样本、说明为空 → 前端拦截
- [ ] 勾选特殊样本、说明为空 → 后端 API 返回 422/400
- [ ] 未勾选、说明有值 → 保存后 `specialRemark` 为空
- [ ] 说明超 256 字 → 校验失败
### 7.2 持久化
- [ ] 采集协议单编辑保存后 detail 回显正确
- [ ] 捐赠协议单同上
- [ ] 历史样本(无新字段)→ `isSpecial=false`
### 7.3 展示
- [ ] 协议查看弹窗:红色加粗【特殊样本】+ 说明
- [ ] 非特殊样本:各页无多余占位
- [ ] 样本接收、质检工单、生产工单卡片可见特殊标记
### 7.4 转存储
- [ ] 捐赠单特殊样本转细胞存储后,新采集协议单样本保留 `isSpecial` + `specialRemark`
### 7.5 字段一致性
- [ ] `python scripts/check_field_consistency.py` 通过
---
## 8. 风险与约束
1. **双表对称**:采集与捐赠样本表、CRUD、UI 须同步改动,避免只改一侧。
2. **改动面大**:下游展示点 15+,须用公共组件收敛样式。
3. **与普通 remark 区分**:文档与 UI 文案明确,避免用户把特殊说明写入备注。
4. **警示色**:使用 Element Plus danger 色 + `font-weight: 700`,符合 Fresh Mint 规范中对强提醒的使用场景。
---
## 9. 决策记录
| 议题 | 决策 |
|------|------|
| 勾选特殊样本时特殊说明是否必填 | **A. 必填**(前后端校验) |
| 数据存储位置 | 样本源表唯一数据源,下游 JOIN |
| 展示组件 | 新建 `SpecialSampleDisplay`,红色加粗文本,非 Tag |
| 本期范围 | web-admin 全链路展示;不含筛选/导出/小程序 |
@@ -381,7 +381,7 @@ watchDebounced(
4. **预览区**(`.attachment-preview`):背景 `#f8fafc`;图片已上传且 `fileUrl` 存在时显示缩略图(`object-fit: cover`),可点击预览;图片上传中无 URL 时显示 `Loading`;视频显示 `.attachment-preview__icon--video`(`#ede9fe` / `#7c3aed` + `VideoPlay`);其他文件显示 `.attachment-preview__icon--doc`(`#e0f2fe` / `#0284c7` + `Document`)。
5. **卡片底部**(`.attachment-footer`):文件名 `.attachment-name`(11px `#334155`,最多 2 行省略,`title` 为完整文件名);`.attachment-actions` 居中排列 **下载**(`Download`)、**删除**(`Delete`,`.action-btn--danger` hover 红色)。
6. **上传中**:`.attachment-item.is-uploading` → `opacity: 0.6`、`pointer-events: none`。
7. **提示**:`.upload-hint` — 11px `#94a3b8`,`margin-top: 8px`;默认文案:「支持图片、视频、PDF、Word、Excel等文件,单文件不超过 20MB」。
7. **提示**:`.upload-hint` — 11px `#94a3b8`,`margin-top: 8px`;默认文案:「支持拖拽或点击上传图片、视频、PDF、Word、Excel等文件,单文件不超过 20MB」。
8. **色板**:SHALL 使用 Fresh Mint(`#10b981`、`#a7f3d0`、`#f0fdf4`、`#ecfdf5`);SHALL NOT 使用小程序主色 `#0a9f6d`。
9. **禁止**:SHALL NOT 使用 `el-upload` 的 `list-type="picture-card"`、默认 `file-list` 展示,或单独一行纯文字「选择文件」按钮替代上传卡片。
@@ -397,6 +397,15 @@ watchDebounced(
上传卡片 SHALL 作为 `.attachment-list` 的**第一个子元素**,且始终渲染(不因已有附件数量而隐藏)。
#### 拖拽上传
1. **Drop zone**:卡片化附件 SHALL 以 `.attachment-upload` 根容器为拖拽落区(含 `.attachment-list` 与 `.upload-hint` 所在整块);表格行内纸质材料 SHALL 以 `.paper-att-list` 为落区。SHALL NOT 使用 `el-upload` 的 `drag` 属性替代上述布局(避免破坏 140×96 上传卡片结构)。
2. **双通道**:SHALL 同时支持**点击上传卡片选文件**与**拖拽文件到 drop zone**;两种方式 SHALL 复用同一套 `@change` / `handleAttachmentChange` 上传逻辑(校验 → 占位 → `fetchUploadAttachment` → 回填或失败移除)。
3. **多文件**:拖拽 `dataTransfer.files` 中多个文件时,SHALL 按顺序逐个走与 `:multiple="true"` 点击选择相同的上传流程。
4. **dragover 视觉**:落区 dragover 时 SHALL 添加修饰类 `.is-dragover`(全局样式见 `web-admin/src/assets/styles/core/app.scss`):Fresh Mint 虚线边框 `#10b981`、浅绿底 `#ecfdf5`、圆角 8px。
5. **实现**:SHALL 使用 `web-admin/src/composables/useAttachmentDropZone.ts` 在各页面/组件的 drop zone 上独立挂载(`v-bind="dropZoneHandlers"` + `:class="{ 'is-dragover': isDragover }"`);只读/禁用态 SHALL 传入 `disabled` 且不响应 drop。
6. **校验与提交**:拖拽文件的类型、单文件 20MB 限制、上传中提交拦截 SHALL 与点击上传一致。
#### 数据模型与上传逻辑
附件列表 SHALL 为响应式数组,元素至少包含:`id`、`fileName`、`fileUrl`、`fileType`(可选)、`_uploading`(可选布尔)。
@@ -554,6 +563,16 @@ watchDebounced(
- **WHEN** 用户提交表单且仍有 `_uploading` 项
- **THEN** SHALL 阻止提交并提示等待上传完成
#### Scenario: 拖拽文件到附件落区
- **WHEN** 用户将合法文件拖拽到 `.attachment-upload`(或纸质材料 `.paper-att-list`)
- **THEN** 落区 SHALL 显示 `.is-dragover` 高亮
- **THEN** 松手后 SHALL 与点击选文件相同:立即上传、展示卡片、支持预览/下载/删除
- **WHEN** 用户拖拽多个文件
- **THEN** SHALL 逐个上传
- **WHEN** 落区为只读或 `disabled`
- **THEN** SHALL NOT 响应 drop
#### Scenario: Code review 附件上传
- **WHEN** PR 新增或修改附件上传 UI
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+129 -137
View File
@@ -1,11 +1,11 @@
# Graph Report - src (2026-06-30)
# Graph Report - src (2026-07-01)
## Corpus Check
- Large corpus: 828 files · ~549,493 words. Semantic extraction will be expensive (many Claude tokens). Consider running on a subfolder, or use --no-semantic to run AST-only.
- Large corpus: 845 files · ~556,744 words. Semantic extraction will be expensive (many Claude tokens). Consider running on a subfolder, or use --no-semantic to run AST-only.
## Summary
- 2719 nodes · 3738 edges · 61 communities detected
- Extraction: 78% EXTRACTED · 22% INFERRED · 0% AMBIGUOUS · INFERRED: 821 edges (avg confidence: 0.8)
- 2767 nodes · 3805 edges · 61 communities detected
- Extraction: 78% EXTRACTED · 22% INFERRED · 0% AMBIGUOUS · INFERRED: 848 edges (avg confidence: 0.8)
- Token cost: 0 input · 0 output
## Community Hubs (Navigation)
@@ -46,14 +46,14 @@
- [[_COMMUNITY_Community 34|Community 34]]
- [[_COMMUNITY_Community 35|Community 35]]
- [[_COMMUNITY_Community 36|Community 36]]
- [[_COMMUNITY_Community 37|Community 37]]
- [[_COMMUNITY_Community 38|Community 38]]
- [[_COMMUNITY_Community 39|Community 39]]
- [[_COMMUNITY_Community 40|Community 40]]
- [[_COMMUNITY_Community 41|Community 41]]
- [[_COMMUNITY_Community 42|Community 42]]
- [[_COMMUNITY_Community 44|Community 44]]
- [[_COMMUNITY_Community 45|Community 45]]
- [[_COMMUNITY_Community 47|Community 47]]
- [[_COMMUNITY_Community 48|Community 48]]
- [[_COMMUNITY_Community 49|Community 49]]
- [[_COMMUNITY_Community 50|Community 50]]
- [[_COMMUNITY_Community 51|Community 51]]
- [[_COMMUNITY_Community 52|Community 52]]
@@ -62,20 +62,20 @@
- [[_COMMUNITY_Community 55|Community 55]]
- [[_COMMUNITY_Community 56|Community 56]]
- [[_COMMUNITY_Community 58|Community 58]]
- [[_COMMUNITY_Community 60|Community 60]]
- [[_COMMUNITY_Community 62|Community 62]]
- [[_COMMUNITY_Community 61|Community 61]]
- [[_COMMUNITY_Community 63|Community 63]]
- [[_COMMUNITY_Community 64|Community 64]]
- [[_COMMUNITY_Community 67|Community 67]]
- [[_COMMUNITY_Community 69|Community 69]]
- [[_COMMUNITY_Community 77|Community 77]]
- [[_COMMUNITY_Community 79|Community 79]]
- [[_COMMUNITY_Community 80|Community 80]]
## God Nodes (most connected - your core abstractions)
1. `get()` - 277 edges
2. `push()` - 69 edges
1. `get()` - 278 edges
2. `push()` - 70 edges
3. `WebSocketClient` - 26 edges
4. `emit()` - 22 edges
4. `emit()` - 21 edges
5. `set()` - 19 edges
6. `handleDynamicRoutes()` - 18 edges
7. `MenuProcessor` - 16 edges
@@ -84,14 +84,14 @@
10. `withFullscreenLoading()` - 13 edges
## Surprising Connections (you probably didn't know these)
- `handleBatchDelete()` --calls--> `withFullscreenLoading()` [INFERRED]
views/basic-info/customer/index.vue → utils/fullscreen-loading.ts
- `buildInboundMetaFields()` --calls--> `push()` [INFERRED]
utils/production-work-order-card-meta.ts → views/operations/storage-facility/index.vue
- `dash()` --calls--> `formatDisplayOrDash()` [INFERRED]
components/business/infusion-schedule-outbound-chain-view/index.vue → utils/datetime-display.ts
- `dash()` --calls--> `formatDisplayOrDash()` [INFERRED]
components/business/clinical-schedule-payment-detail/index.vue → utils/datetime-display.ts
- `fmtMoney()` --calls--> `formatMoneyDisplay()` [INFERRED]
components/business/clinical-schedule-payment-detail/index.vue → utils/money-format.ts
- `resolveBatchSectionTasks()` --calls--> `set()` [INFERRED]
utils/qc-inspection-batch.ts → views/production/process/ProcessRouteTab.vue
- `defaultInstallmentRatios()` --calls--> `push()` [INFERRED]
utils/protocol-payment-installment.ts → views/operations/storage-facility/index.vue
@@ -99,112 +99,112 @@
### Community 0 - "Community 0"
Cohesion: 0.01
Nodes (154): fetchAccessLogList(), fetchActiveRegions(), fetchCategoryList(), fetchCategoryParameters(), fetchCellProductPriceList(), fetchCellProductSpecList(), fetchCellProductTypeList(), fetchChannelAccount() (+146 more)
Nodes (152): fetchAccessLogList(), fetchActiveRegions(), fetchCategoryList(), fetchCategoryParameters(), fetchCellProductPriceList(), fetchCellProductSpecList(), fetchCellProductTypeList(), fetchChannelAccount() (+144 more)
### Community 1 - "Community 1"
Cohesion: 0.03
Nodes (87): batchSavePilotCheckup(), deletePilotCheckupActualItem(), fetchCheckupInstitutionList(), fetchCheckupInstitutionPackageDetail(), fetchCheckupInstitutionPackages(), fetchPilotCheckupDetail(), fetchPilotCheckupList(), markPilotCheckupChecked() (+79 more)
Cohesion: 0.02
Nodes (73): fetchUploadAttachment(), FireworkSystem, collectIds(), handleReportUpload(), handleReportUpload(), walk(), buildTemporaryViewSections(), if() (+65 more)
### Community 2 - "Community 2"
Cohesion: 0.03
Nodes (61): fetchUploadAttachment(), handleReportUpload(), handleReportUpload(), walk(), buildInboundBasicSection(), buildInboundCellStorageViewSections(), buildInboundResearchDonationViewSections(), buildReceptionSection() (+53 more)
Nodes (83): batchSavePilotCheckup(), deletePilotCheckupActualItem(), fetchCheckupInstitutionPackageDetail(), fetchCheckupInstitutionPackages(), fetchPilotCheckupDetail(), markPilotCheckupChecked(), savePilotCheckup(), savePilotCheckupActualItems() (+75 more)
### Community 3 - "Community 3"
Cohesion: 0.03
Nodes (33): fetchGetMenuList(), ComponentLoader, IframeRouteManager, MenuProcessor, RouteRegistry, RouteTransformer, useAppMode(), useAuth() (+25 more)
Nodes (60): fetchCheckupInstitutionInvoices(), fetchCheckupInstitutionProjects(), fetchCreateCheckupInstitution(), fetchCreateCheckupInstitutionInvoice(), fetchCreateCheckupInstitutionProject(), fetchUpdateCheckupInstitution(), fetchUpdateCheckupInstitutionInvoice(), fetchUpdateCheckupInstitutionProject() (+52 more)
### Community 4 - "Community 4"
Cohesion: 0.03
Nodes (58): fetchMyProductionTasks(), fetchMyQcTaskList(), fetchQcTaskDetail(), fetchQcTaskList(), shouldApplyTriggerSourceFilter(), buildMineTableRows(), buildPresetTasksMap(), buildWorkOrderFromTasks() (+50 more)
Nodes (34): fetchGetMenuList(), ComponentLoader, IframeRouteManager, MenuProcessor, RoutePermissionValidator, RouteRegistry, RouteTransformer, useAppMode() (+26 more)
### Community 5 - "Community 5"
Cohesion: 0.03
Nodes (50): fetchCheckupInstitutionInvoices(), fetchCheckupInstitutionProjects(), fetchCreateCheckupInstitution(), fetchCreateCheckupInstitutionInvoice(), fetchCreateCheckupInstitutionProject(), fetchUpdateCheckupInstitution(), fetchUpdateCheckupInstitutionInvoice(), fetchUpdateCheckupInstitutionProject() (+42 more)
Nodes (58): fetchFullmoonTodoList(), fetchUpdateFullmoonTodoInsurance(), fetchCollectionProtocolAuditList(), fetchCollectionProtocolDetail(), fetchCollectionProtocolList(), fetchCreateProtocolInvoiceRequest(), fetchInvoiceEligiblePayments(), fetchPaymentDetailList() (+50 more)
### Community 6 - "Community 6"
Cohesion: 0.05
Nodes (50): fetchProductionReceptionBySampleCode(), fetchProductionReceptionSubmit(), fetchProductionReceptionUpdate(), onUserSelectVisible(), remoteSearchUsers(), buildPayload(), ensureDefaultHandler(), initDialog() (+42 more)
Cohesion: 0.02
Nodes (28): fetchAllConsumablePacks(), fetchAllConsumables(), fetchAllConsumableStockLogs(), fetchAllEquipments(), fetchAllOutputTypes(), fetchAllProcessCategories(), fetchAllProcesses(), fetchAllReagents() (+20 more)
### Community 7 - "Community 7"
Cohesion: 0.04
Nodes (44): fetchFullmoonTodoList(), fetchUpdateFullmoonTodoInsurance(), fetchCollectionProtocolAuditList(), fetchCollectionProtocolDetail(), fetchCollectionProtocolList(), fetchCreateProtocolInvoiceRequest(), fetchInvoiceEligiblePayments(), fetchPaymentDetailList() (+36 more)
Nodes (50): fetchMyProductionTasks(), fetchMyQcTaskList(), fetchQcTaskDetail(), fetchQcTaskList(), shouldApplyTriggerSourceFilter(), buildMineTableRows(), buildPresetTasksMap(), buildWorkOrderFromTasks() (+42 more)
### Community 8 - "Community 8"
Cohesion: 0.04
Nodes (35): useSettingsHandlers(), useSettingsPanel(), useSettingsState(), RoutePermissionValidator, useCeremony(), useTheme(), if(), walk() (+27 more)
Cohesion: 0.03
Nodes (26): handleBlur(), handleFocus(), handleInput(), fetchQcMaterialBatchList(), fetchQcMaterialBatchOptions(), fetchQcMaterialList(), fetchQcMaterialOptions(), fetchUpdateQcMaterialBatch() (+18 more)
### Community 9 - "Community 9"
Cohesion: 0.04
Nodes (30): handleBlur(), handleFocus(), handleInput(), fetchDeleteMaterialBatch(), fetchMaterialBatchList(), fetchMaterialBatchOptions(), fetchMaterialList(), fetchMaterialOptions() (+22 more)
Nodes (45): buildBaseFields(), buildInboundBasicSection(), buildInboundCellStorageProductionViewSections(), buildInboundResearchDonationProductionViewSections(), buildOutboundBasicExperimentProductionViewSections(), buildOutboundClinicalProductionViewSections(), buildOutboundDetail(), buildOutboundPilotProductionViewSections() (+37 more)
### Community 10 - "Community 10"
Cohesion: 0.04
Nodes (34): fetchEthnicList(), applyDonationBundleToForm(), createEmptyTransport(), ensureEthnicOptionInList(), handleOpenForAdd(), loadEthnicOptions(), normalizeSampleRow(), resetForm() (+26 more)
Nodes (40): fetchRoleOptions(), buildInboundBasicSection(), buildInboundCellStorageViewSections(), buildInboundResearchDonationViewSections(), buildReceptionSection(), buildTransportSection(), resolveInboundProtocolStatus(), appendTaskResultSections() (+32 more)
### Community 11 - "Community 11"
Cohesion: 0.05
Nodes (34): fetchClinicalPaymentDetail(), fetchClinicalPayments(), fetchClinicalReceiptConfirmed(), fetchClinicalReceiptPending(), fetchClinicalRefundConfirmed(), fetchClinicalRefundPending(), fetchOrderAdjusts(), fetchOrderDetail() (+26 more)
Nodes (40): fetchCheckupInstitutionList(), fetchCreateCustomer(), fetchCustomerList(), fetchDeleteCustomer(), fetchPilotCheckupList(), fetchUpdateCustomer(), updateInfusionScheduleStatus(), handleAdd() (+32 more)
### Community 12 - "Community 12"
Cohesion: 0.06
Nodes (36): buildBaseFields(), buildFeeSection(), buildInboundBasicSection(), buildInboundCellStorageProductionViewSections(), buildInboundResearchDonationProductionViewSections(), buildOutboundBasicExperimentProductionViewSections(), buildOutboundClinicalProductionViewSections(), buildOutboundDetail() (+28 more)
Cohesion: 0.04
Nodes (34): fetchEthnicList(), applyDonationBundleToForm(), createEmptyTransport(), ensureEthnicOptionInList(), handleOpenForAdd(), loadEthnicOptions(), normalizeSampleRow(), resetForm() (+26 more)
### Community 13 - "Community 13"
Cohesion: 0.05
Nodes (36): fetchCreateCustomer(), fetchCustomerList(), fetchDeleteCustomer(), fetchUpdateCustomer(), updateInfusionScheduleStatus(), handleAdd(), handleDelete(), handleDropdownCommand() (+28 more)
Nodes (34): fetchClinicalPaymentDetail(), fetchClinicalPayments(), fetchClinicalReceiptConfirmed(), fetchClinicalReceiptPending(), fetchClinicalRefundConfirmed(), fetchClinicalRefundPending(), fetchOrderAdjusts(), fetchOrderDetail() (+26 more)
### Community 14 - "Community 14"
Cohesion: 0.05
Nodes (34): fetchAttachmentDownloadUrl(), qcAttachmentFullUrl(), qcDownloadAttachment(), qcPreviewAttachment(), formatHandoverUserLabel(), formatNowDatetime(), fullFileUrl(), handleDownloadAttachment() (+26 more)
Cohesion: 0.06
Nodes (37): fetchUserList(), fetchAddTaskStep(), fetchCopyTaskStep(), fetchDeleteTaskStep(), fetchDispatchProductionTaskSteps(), fetchForwardProductionTask(), fetchProductionTaskDetail(), fetchProductionTaskEditorInit() (+29 more)
### Community 15 - "Community 15"
Cohesion: 0.06
Nodes (14): dash(), fmtMoney(), auditorDisplay(), dash(), ensureUnitsInOptions(), expressName(), formatYm(), formatYmd() (+6 more)
### Community 16 - "Community 16"
Cohesion: 0.04
Nodes (21): fetchAvailableMaterialBatches(), fetchMyProductionMaterialConsumptions(), fetchMyProductionMaterialUsageList(), fetchProductionMaterialBatchList(), fetchProductionMaterialBatchOptions(), fetchProductionMaterialConsumptions(), fetchProductionMaterialFormula(), fetchProductionMaterialLinkedStepUsages() (+13 more)
### Community 17 - "Community 17"
Cohesion: 0.09
Nodes (41): applyFqParamsChange(), buildFqAmounts(), countByStatus(), evaluateFqParamsChange(), formatMoneySummary(), generateInitialFqDetails(), getPaidInstallmentRows(), isSameFqParams() (+33 more)
### Community 18 - "Community 18"
Cohesion: 0.06
Nodes (20): fetchQcMaterialBatchList(), fetchQcMaterialBatchOptions(), fetchQcMaterialList(), fetchQcMaterialOptions(), fetchUpdateQcMaterialBatch(), fetchMarkQcMaterialUsageFullyUsed(), financeAttachmentsToUrlString(), ensureTabMounted() (+12 more)
### Community 19 - "Community 19"
Cohesion: 0.06
Nodes (22): fetchCreateMenu(), fetchDeleteMenu(), fetchMenuTree(), fetchRoleOptions(), fetchUpdateMenu(), collectIds(), postorder(), preorder() (+14 more)
### Community 20 - "Community 20"
### Community 16 - "Community 16"
Cohesion: 0.1
Nodes (2): WebSocketClient, TableCache
### Community 21 - "Community 21"
### Community 17 - "Community 17"
Cohesion: 0.08
Nodes (32): toLogin(), base64ToBytes(), bytesToBase64(), decryptJson(), deriveKey(), encryptJson(), fromBase64Url(), hexToBytes() (+24 more)
### Community 22 - "Community 22"
### Community 18 - "Community 18"
Cohesion: 0.07
Nodes (24): fetchMineProductionWorkOrderTabStepCounts(), fetchMineProductionWorkOrderTabStepCountsDeduped(), fetchProductionWorkOrderCellProductOptions(), fetchProductionWorkOrderDetail(), fetchProductionWorkOrderList(), fetchProductionWorkOrderQcDispatchOptions(), fetchProductionWorkOrderQcInfo(), fetchProductionWorkOrderTabStepCounts() (+16 more)
### Community 19 - "Community 19"
Cohesion: 0.09
Nodes (8): getDefaultLanguage(), checkStorageCompatibility(), StorageConfig, getSystemStorage(), getSysVersion(), StorageKeyManager, StorageCompatibilityManager, validateStorageData()
### Community 23 - "Community 23"
### Community 20 - "Community 20"
Cohesion: 0.08
Nodes (31): fetchUserList(), fetchAddTaskStep(), fetchCopyTaskStep(), fetchDeleteTaskStep(), fetchDispatchProductionTaskSteps(), fetchForwardProductionTask(), fetchProductionTaskDetail(), fetchProductionTaskEditorInit() (+23 more)
Nodes (18): fetchProductionReceptionBySampleCode(), fetchProductionReceptionSubmit(), fetchProductionReceptionUpdate(), onUserSelectVisible(), remoteSearchUsers(), buildPayload(), ensureDefaultHandler(), initDialog() (+10 more)
### Community 24 - "Community 24"
### Community 21 - "Community 21"
Cohesion: 0.07
Nodes (16): fetchDeleteMaterialBatch(), fetchMaterialBatchList(), fetchMaterialBatchOptions(), fetchMaterialList(), fetchMaterialOptions(), fetchUpdateMaterialBatch(), fetchMaterialUsageList(), fetchMyMaterialUsageList() (+8 more)
### Community 22 - "Community 22"
Cohesion: 0.08
Nodes (18): createEmptySnapshots(), normalizeConfiguredReagents(), normalizeConsumables(), normalizeDataCollections(), normalizeReagents(), normalizeStepOutputs(), serializeAttachments(), serializeEquipmentIds() (+10 more)
### Community 25 - "Community 25"
Cohesion: 0.09
Nodes (27): completePilotApplication(), deletePilotApplication(), fetchPilotApplicationList(), startPilotApplication(), voidPilotApplication(), handleBatchComplete(), handleBatchStart(), handleBatchVoid() (+19 more)
### Community 23 - "Community 23"
Cohesion: 0.07
Nodes (11): gateWorkOrder(), sampleTabStatusLabel(), sampleTabStatusTagType(), sampleTypeLabel(), workOrderStatusTagType(), canEditInboundSampleSpecialMark(), resolveInboundSampleSpecialMarkTarget(), resolveInboundSampleSpecialMarkTargetFromRow() (+3 more)
### Community 26 - "Community 26"
### Community 24 - "Community 24"
Cohesion: 0.11
Nodes (21): fetchGetMenuCodes(), fetchGetUserInfo(), fetchLogin(), fetchRefreshToken(), fetchUpdateProfile(), fetchUploadProfileAvatar(), fetchUserInfo(), buildWebEncryptedLoginBody() (+13 more)
### Community 25 - "Community 25"
Cohesion: 0.11
Nodes (24): completePilotApplication(), deletePilotApplication(), fetchPilotApplicationList(), startPilotApplication(), voidPilotApplication(), handleBatchComplete(), handleBatchStart(), handleBatchVoid() (+16 more)
### Community 26 - "Community 26"
Cohesion: 0.13
Nodes (19): fetchCreateMenu(), fetchDeleteMenu(), fetchMenuTree(), fetchUpdateMenu(), postorder(), preorder(), applyTreeExpand(), handleAdd() (+11 more)
### Community 27 - "Community 27"
Cohesion: 0.09
Nodes (11): fetchMineQcWorkOrderTabUnfinishedCounts(), fetchOutboundQcDetail(), fetchQcWorkOrderDetail(), fetchQcWorkOrderList(), fetchQcWorkOrderTabUnfinishedCounts(), reload(), reloadTabCounts(), handleMenuJump() (+3 more)
@@ -214,24 +214,24 @@ Cohesion: 0.12
Nodes (15): addCopyButton(), highlightCode(), insertLineNumbers(), isBlockProcessed(), markBlockAsProcessed(), processBlock(), setupHighlightDirective(), setupRippleDirective() (+7 more)
### Community 29 - "Community 29"
Cohesion: 0.11
Nodes (10): fetchMineProductionWorkOrderTabStepCounts(), fetchMineProductionWorkOrderTabStepCountsDeduped(), fetchProductionWorkOrderCellProductOptions(), fetchProductionWorkOrderDetail(), fetchProductionWorkOrderList(), fetchProductionWorkOrderQcDispatchOptions(), fetchProductionWorkOrderTabStepCounts(), fetchProductionWorkOrderTabStepCountsDeduped() (+2 more)
### Community 30 - "Community 30"
Cohesion: 0.11
Nodes (11): fetchOutboundReleaseMaterial(), fetchOutboundReleaseReviewDetail(), fetchOutboundReleaseReviewList(), fetchReleaseReviewList(), handleReset(), handleSearch(), handleToggleSelect(), loadData() (+3 more)
### Community 31 - "Community 31"
Cohesion: 0.13
Nodes (18): fetchCellSampleTypeList(), fetchCreateCellSampleType(), fetchDeleteCellSampleType(), fetchUpdateCellSampleType(), handleAdd(), handleDelete(), handleDropdownCommand(), handleEdit() (+10 more)
### Community 32 - "Community 32"
### Community 30 - "Community 30"
Cohesion: 0.16
Nodes (14): fetchCreateEnvDetectItem(), fetchDeleteEnvDetectItem(), fetchEnvDetectItemDetail(), fetchEnvDetectItemList(), fetchEnvDetectItemsActive(), fetchUpdateEnvDetectItem(), handleAdd(), handleBatchDelete() (+6 more)
### Community 31 - "Community 31"
Cohesion: 0.12
Nodes (12): fetchApproveTask(), fetchBusinessAllTasks(), fetchCompletedTasks(), fetchDesignerData(), fetchInstanceDetail(), fetchMyInstances(), fetchPendingTasks(), fetchProcessDefList() (+4 more)
### Community 32 - "Community 32"
Cohesion: 0.19
Nodes (13): fetchAttachmentDownloadUrl(), attachmentFullUrl(), ensureUniqueZipEntryName(), fetchAttachmentBlob(), getAttachmentExtension(), resolveAttachmentFileName(), sanitizeZipPathSegment(), batchFolderName() (+5 more)
### Community 33 - "Community 33"
Cohesion: 0.16
Nodes (14): fetchCreateEnvDetectItem(), fetchDeleteEnvDetectItem(), fetchEnvDetectItemDetail(), fetchEnvDetectItemList(), fetchEnvDetectItemsActive(), fetchUpdateEnvDetectItem(), handleAdd(), handleBatchDelete() (+6 more)
Cohesion: 0.2
Nodes (11): fetchMarkQcMaterialUsageFullyUsed(), canMarkFullyUsed(), displayPurpose(), displayReceiver(), displayUseTime(), getChangeTypeLabel(), getChangeTypeTagType(), handleMarkFullyUsed() (+3 more)
### Community 34 - "Community 34"
Cohesion: 0.16
@@ -242,60 +242,60 @@ Cohesion: 0.27
Nodes (14): useChart(), useChartComponent(), useChartOps(), colourBlend(), getCssVar(), getDarkColor(), getLightColor(), handleElementThemeColor() (+6 more)
### Community 36 - "Community 36"
Cohesion: 0.14
Nodes (8): useSettingsHandlers(), useSettingsPanel(), useSettingsState(), useCeremony(), useTheme(), themeAnimation(), toggleTheme(), toggleTransition()
### Community 37 - "Community 37"
Cohesion: 0.33
Nodes (13): buildProtocolPaymentFlowSteps(), dash(), financeReceiptTime(), formatAmount(), hasFinanceReceipt(), hasFinanceRefund(), hasReceiptSubmit(), hasRefundSubmit() (+5 more)
### Community 38 - "Community 38"
Cohesion: 0.22
Nodes (9): fullFileUrl(), handleDownloadAttachment(), handlePreviewAttachment(), isVideoFile(), normalizeDisplayValue(), resolveReviewCellType(), resolveReviewQuantity(), resolveReviewSpecText() (+1 more)
### Community 39 - "Community 39"
Cohesion: 0.19
Nodes (6): fetchServiceOrderTxnList(), handleReset(), handleSearch(), handleTabChange(), loadData(), switchTab()
### Community 38 - "Community 38"
### Community 41 - "Community 41"
Cohesion: 0.15
Nodes (4): fetchNextDonationSampleCode(), fetchResearchDonationAuditList(), fetchResearchDonationDetail(), fetchResearchDonationList()
### Community 39 - "Community 39"
### Community 42 - "Community 42"
Cohesion: 0.25
Nodes (2): handleTouchEnd(), setTransition()
### Community 40 - "Community 40"
Cohesion: 0.28
Nodes (1): FireworkSystem
### Community 44 - "Community 44"
Cohesion: 0.31
Nodes (4): annotateForkEdges(), chainApiToElements(), walkAncestorBranch(), walkAncestorParents()
### Community 47 - "Community 47"
Cohesion: 0.39
Nodes (6): isIgnorableScriptError(), normalizeErrorMessage(), registerPromiseErrorHandler(), registerResourceErrorHandler(), scriptErrorHandler(), setupErrorHandle()
### Community 45 - "Community 45"
### Community 48 - "Community 48"
Cohesion: 0.36
Nodes (1): TableHeightCalculator
### Community 47 - "Community 47"
### Community 50 - "Community 50"
Cohesion: 0.33
Nodes (2): logApiCryptoBootInfo(), maskSecret()
### Community 48 - "Community 48"
### Community 51 - "Community 51"
Cohesion: 0.38
Nodes (4): handleFocus(), handleInput(), parseDecimalToNumber(), sanitizeDecimalInput()
### Community 49 - "Community 49"
### Community 52 - "Community 52"
Cohesion: 0.48
Nodes (5): buildPrefilledLabStorageCode(), formatYear(), formatYm(), normalizeSampleTypeName(), normalizeSourceType()
### Community 50 - "Community 50"
Cohesion: 0.29
Nodes (2): fetchLeaveDetail(), fetchLeaveList()
### Community 51 - "Community 51"
Cohesion: 0.47
Nodes (3): isPaymentDueWithinWarnWindow(), parsePaymentDueYmd(), startOfLocalDay()
### Community 52 - "Community 52"
Cohesion: 0.33
Nodes (2): fetchSampleReceptionCheckItemList(), fetchSampleReceptionCheckItemsActive()
### Community 53 - "Community 53"
Cohesion: 0.33
Nodes (2): fetchEnvDetectRecordDetail(), fetchEnvDetectRecordList()
Cohesion: 0.4
Nodes (2): isUnfinishedQcWorkOrder(), resolveQcWorkOrderUnfinishedBadgeCount()
### Community 54 - "Community 54"
Cohesion: 0.33
Nodes (2): fetchQcLabTestItemList(), fetchQcLabTestItemsActive()
Cohesion: 0.47
Nodes (3): isPaymentDueWithinWarnWindow(), parsePaymentDueYmd(), startOfLocalDay()
### Community 55 - "Community 55"
Cohesion: 0.5
@@ -309,21 +309,17 @@ Nodes (2): parseEquipmentIds(), syncEquipmentNamesFromOptions()
Cohesion: 0.5
Nodes (2): focusInput(), handleKeydown()
### Community 60 - "Community 60"
### Community 61 - "Community 61"
Cohesion: 0.67
Nodes (2): if(), logSidebarMenu()
### Community 62 - "Community 62"
### Community 63 - "Community 63"
Cohesion: 0.5
Nodes (1): fetchStorageEntrySmsList()
### Community 63 - "Community 63"
Cohesion: 0.5
Nodes (1): fetchSampleSmsNotificationList()
### Community 64 - "Community 64"
Cohesion: 0.5
Nodes (1): fetchQcSmsList()
Nodes (1): fetchSampleSmsNotificationList()
### Community 67 - "Community 67"
Cohesion: 1.0
@@ -339,26 +335,22 @@ Nodes (2): emptyTabCounts(), useProductionWorkOrderTabStepCounts()
### Community 79 - "Community 79"
Cohesion: 1.0
Nodes (2): initialProgress(), useQcWorkOrderAttachmentExport()
### Community 80 - "Community 80"
Cohesion: 1.0
Nodes (2): emptyTabCounts(), useQcWorkOrderTabUnfinishedCounts()
## Knowledge Gaps
- **Thin community `Community 20`** (42 nodes): `WebSocketClient`, `.calculateReconnectDelay()`, `.clearAllTimers()`, `.clearConnectionTimers()`, `.clearTimer()`, `.close()`, `.closeCurrentSocketForReconnect()`, `.connect()`, `.connectionStatusText()`, `.constructor()`, `.destroyInstance()`, `.flushMessageQueue()`, `.getInstance()`, `.getReadyStateText()`, `.handleClose()`, `.handleConnectionTimeout()`, `.handleError()`, `.handleMessage()`, `.handleOpen()`, `.init()`, `.isWebSocketConnected()`, `.reconnect()`, `.resetHeartbeat()`, `.send()`, `.startHeartbeat()`, `.startPing()`, `TableCache`, `.cleanupExpired()`, `.clear()`, `.clearByTags()`, `.clearCurrentSearch()`, `.clearPagination()`, `.constructor()`, `.evictLRU()`, `.generateKey()`, `.generateTags()`, `.get()`, `.getStats()`, `.log()`, `.set()`, `index.ts`, `tableCache.ts`
- **Thin community `Community 16`** (42 nodes): `WebSocketClient`, `.calculateReconnectDelay()`, `.clearAllTimers()`, `.clearConnectionTimers()`, `.clearTimer()`, `.close()`, `.closeCurrentSocketForReconnect()`, `.connect()`, `.connectionStatusText()`, `.constructor()`, `.destroyInstance()`, `.flushMessageQueue()`, `.getInstance()`, `.getReadyStateText()`, `.handleClose()`, `.handleConnectionTimeout()`, `.handleError()`, `.handleMessage()`, `.handleOpen()`, `.init()`, `.isWebSocketConnected()`, `.reconnect()`, `.resetHeartbeat()`, `.send()`, `.startHeartbeat()`, `.startPing()`, `TableCache`, `.cleanupExpired()`, `.clear()`, `.clearByTags()`, `.clearCurrentSearch()`, `.clearPagination()`, `.constructor()`, `.evictLRU()`, `.generateKey()`, `.generateTags()`, `.get()`, `.getStats()`, `.log()`, `.set()`, `index.ts`, `tableCache.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 39`** (9 nodes): `cleanupEventListeners()`, `handleTouchEnd()`, `handleTouchMove()`, `handleTouchStart()`, `handleWheelScroll()`, `if()`, `setTransition()`, `setupEventListeners()`, `index.vue`
- **Thin community `Community 42`** (9 nodes): `cleanupEventListeners()`, `handleTouchEnd()`, `handleTouchMove()`, `handleTouchStart()`, `handleWheelScroll()`, `if()`, `setTransition()`, `setupEventListeners()`, `index.vue`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 40`** (9 nodes): `FireworkSystem`, `.constructor()`, `.createFirework()`, `.createParticle()`, `.getAvailableParticle()`, `.initializePool()`, `.preloadAllImages()`, `.preloadImage()`, `index.vue`
- **Thin community `Community 48`** (8 nodes): `TableHeightCalculator`, `.calculate()`, `.calculateOffset()`, `.calculatePaginationOffset()`, `.constructor()`, `.getHeaderHeight()`, `useTableHeight()`, `useTableHeight.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 45`** (8 nodes): `TableHeightCalculator`, `.calculate()`, `.calculateOffset()`, `.calculatePaginationOffset()`, `.constructor()`, `.getHeaderHeight()`, `useTableHeight()`, `useTableHeight.ts`
- **Thin community `Community 50`** (7 nodes): `App.vue`, `main.ts`, `refreshButtonAutoIcons()`, `refreshPanelTitleIcons()`, `logApiCryptoBootInfo()`, `maskSecret()`, `console.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 47`** (7 nodes): `App.vue`, `main.ts`, `refreshButtonAutoIcons()`, `refreshPanelTitleIcons()`, `logApiCryptoBootInfo()`, `maskSecret()`, `console.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 50`** (7 nodes): `fetchCreateLeave()`, `fetchDeleteLeave()`, `fetchLeaveDetail()`, `fetchLeaveList()`, `fetchSubmitLeave()`, `fetchUpdateLeave()`, `leave.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 52`** (6 nodes): `fetchCreateSampleReceptionCheckItem()`, `fetchDeleteSampleReceptionCheckItem()`, `fetchSampleReceptionCheckItemList()`, `fetchSampleReceptionCheckItemsActive()`, `fetchUpdateSampleReceptionCheckItem()`, `sample-reception-check-item.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 53`** (6 nodes): `fetchCreateEnvDetectRecord()`, `fetchDeleteEnvDetectRecord()`, `fetchEnvDetectRecordDetail()`, `fetchEnvDetectRecordList()`, `fetchUpdateEnvDetectRecord()`, `env-detect-record.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 54`** (6 nodes): `fetchCreateQcLabTestItem()`, `fetchDeleteQcLabTestItem()`, `fetchQcLabTestItemList()`, `fetchQcLabTestItemsActive()`, `fetchUpdateQcLabTestItem()`, `qc-lab-test-item.ts`
- **Thin community `Community 53`** (6 nodes): `formatQcWorkOrderUnfinishedBadgeCount()`, `isUnfinishedQcWorkOrder()`, `qcWorkOrderUnfinishedBadgeTitle()`, `resolveQcWorkOrderUnfinishedBadgeCount()`, `sumQcWorkOrderGroupUnfinishedBadgeCount()`, `qc-work-order-unfinished-badge.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 55`** (5 nodes): `formatProtocolDocBatchDeleteConfirm()`, `formatProtocolDocDeleteConfirm()`, `formatProtocolDocSubject()`, `getProtocolDocTypeLabel()`, `protocol-doc-label.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
@@ -366,13 +358,11 @@ Nodes (2): emptyTabCounts(), useQcWorkOrderTabUnfinishedCounts()
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 58`** (5 nodes): `focusInput()`, `handleKeydown()`, `if()`, `search()`, `index.vue`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 60`** (4 nodes): `if()`, `logSidebarMenu()`, `index.vue`, `SidebarSubmenu.vue`
- **Thin community `Community 61`** (4 nodes): `if()`, `logSidebarMenu()`, `index.vue`, `SidebarSubmenu.vue`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 62`** (4 nodes): `fetchGenerateStorageEntrySms()`, `fetchStorageEntrySmsList()`, `fetchToggleStorageEntrySmsNotified()`, `storage-entry-sms-notification.ts`
- **Thin community `Community 63`** (4 nodes): `fetchGenerateStorageEntrySms()`, `fetchStorageEntrySmsList()`, `fetchToggleStorageEntrySmsNotified()`, `storage-entry-sms-notification.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 63`** (4 nodes): `fetchGenerateSms()`, `fetchSampleSmsNotificationList()`, `fetchToggleSmsNotified()`, `sample-sms-notification.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 64`** (4 nodes): `fetchGenerateQcSms()`, `fetchQcSmsList()`, `fetchToggleQcSmsNotified()`, `qc-sms-notification.ts`
- **Thin community `Community 64`** (4 nodes): `fetchGenerateSms()`, `fetchSampleSmsNotificationList()`, `fetchToggleSmsNotified()`, `sample-sms-notification.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 67`** (3 nodes): `getSettingDefaults()`, `resetToDefaults()`, `setting.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
@@ -380,23 +370,25 @@ Nodes (2): emptyTabCounts(), useQcWorkOrderTabUnfinishedCounts()
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 77`** (3 nodes): `emptyTabCounts()`, `useProductionWorkOrderTabStepCounts()`, `useProductionWorkOrderTabStepCounts.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 79`** (3 nodes): `emptyTabCounts()`, `useQcWorkOrderTabUnfinishedCounts()`, `useQcWorkOrderTabUnfinishedCounts.ts`
- **Thin community `Community 79`** (3 nodes): `initialProgress()`, `useQcWorkOrderAttachmentExport()`, `useQcWorkOrderAttachmentExport.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 80`** (3 nodes): `emptyTabCounts()`, `useQcWorkOrderTabUnfinishedCounts()`, `useQcWorkOrderTabUnfinishedCounts.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
## Suggested Questions
_Questions this graph is uniquely positioned to answer:_
- **Why does `get()` connect `Community 0` to `Community 1`, `Community 2`, `Community 4`, `Community 5`, `Community 6`, `Community 7`, `Community 8`, `Community 9`, `Community 10`, `Community 11`, `Community 13`, `Community 16`, `Community 17`, `Community 18`, `Community 19`, `Community 23`, `Community 25`, `Community 26`, `Community 27`, `Community 29`, `Community 30`, `Community 31`, `Community 32`, `Community 33`, `Community 36`, `Community 38`, `Community 50`, `Community 52`, `Community 53`, `Community 54`, `Community 62`, `Community 63`, `Community 64`?**
_High betweenness centrality (0.299) - this node is a cross-community bridge._
- **Why does `push()` connect `Community 2` to `Community 0`, `Community 1`, `Community 4`, `Community 5`, `Community 6`, `Community 7`, `Community 8`, `Community 10`, `Community 12`, `Community 14`, `Community 15`, `Community 17`, `Community 20`, `Community 21`, `Community 23`, `Community 25`, `Community 27`, `Community 29`, `Community 40`?**
_High betweenness centrality (0.211) - this node is a cross-community bridge._
- **Why does `handleDynamicRoutes()` connect `Community 3` to `Community 8`, `Community 26`, `Community 27`, `Community 29`?**
_High betweenness centrality (0.044) - this node is a cross-community bridge._
- **Are the 276 inferred relationships involving `get()` (e.g. with `buildNodeCodePathFromFlat()` and `collectLeafFacilityNodesInTreeOrder()`) actually correct?**
_`get()` has 276 INFERRED edges - model-reasoned connections that need verification._
- **Are the 68 inferred relationships involving `push()` (e.g. with `refreshQcMenuBadges()` and `collectLeafFacilityNodesInTreeOrder()`) actually correct?**
_`push()` has 68 INFERRED edges - model-reasoned connections that need verification._
- **Are the 21 inferred relationships involving `emit()` (e.g. with `handleSubmit()` and `handleBlur()`) actually correct?**
_`emit()` has 21 INFERRED edges - model-reasoned connections that need verification._
- **Why does `get()` connect `Community 0` to `Community 1`, `Community 2`, `Community 3`, `Community 5`, `Community 6`, `Community 7`, `Community 8`, `Community 10`, `Community 11`, `Community 12`, `Community 13`, `Community 14`, `Community 15`, `Community 18`, `Community 20`, `Community 21`, `Community 24`, `Community 25`, `Community 26`, `Community 27`, `Community 29`, `Community 30`, `Community 31`, `Community 39`, `Community 41`, `Community 44`, `Community 63`, `Community 64`?**
_High betweenness centrality (0.303) - this node is a cross-community bridge._
- **Why does `push()` connect `Community 1` to `Community 32`, `Community 0`, `Community 2`, `Community 3`, `Community 5`, `Community 7`, `Community 9`, `Community 10`, `Community 12`, `Community 14`, `Community 15`, `Community 16`, `Community 17`, `Community 18`, `Community 27`?**
_High betweenness centrality (0.179) - this node is a cross-community bridge._
- **Why does `handleDynamicRoutes()` connect `Community 4` to `Community 24`, `Community 18`, `Community 27`?**
_High betweenness centrality (0.031) - this node is a cross-community bridge._
- **Are the 277 inferred relationships involving `get()` (e.g. with `buildNodeCodePathFromFlat()` and `collectLeafFacilityNodesInTreeOrder()`) actually correct?**
_`get()` has 277 INFERRED edges - model-reasoned connections that need verification._
- **Are the 69 inferred relationships involving `push()` (e.g. with `refreshQcMenuBadges()` and `collectLeafFacilityNodesInTreeOrder()`) actually correct?**
_`push()` has 69 INFERRED edges - model-reasoned connections that need verification._
- **Are the 20 inferred relationships involving `emit()` (e.g. with `handleSubmit()` and `handleDialogClose()`) actually correct?**
_`emit()` has 20 INFERRED edges - model-reasoned connections that need verification._
- **Are the 18 inferred relationships involving `set()` (e.g. with `buildNodeCodePathFromFlat()` and `collectLeafFacilityNodesInTreeOrder()`) actually correct?**
_`set()` has 18 INFERRED edges - model-reasoned connections that need verification._
+4 -4
View File
@@ -57,12 +57,12 @@
</div>
<div id="legend"></div>
</div>
<div id="stats">2719 nodes &middot; 3738 edges &middot; 334 communities</div>
<div id="stats">2767 nodes &middot; 3805 edges &middot; 342 communities</div>
</div>
<script>
const RAW_NODES = [{"id": "app_vue", "label": "App.vue", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "App.vue", "community": 47, "community_name": "Community 47", "source_file": "App.vue", "file_type": "code", "degree": 3}, {"id": "src_app_refreshbuttonautoicons", "label": "refreshButtonAutoIcons()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "refreshButtonAutoIcons()", "community": 47, "community_name": "Community 47", "source_file": "App.vue", "file_type": "code", "degree": 1}, {"id": "src_app_refreshpaneltitleicons", "label": "refreshPanelTitleIcons()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "refreshPanelTitleIcons()", "community": 47, "community_name": "Community 47", "source_file": "App.vue", "file_type": "code", "degree": 1}, {"id": "main_ts", "label": "main.ts", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.4, "font": {"size": 0, "color": "#ffffff"}, "title": "main.ts", "community": 47, "community_name": "Community 47", "source_file": "main.ts", "file_type": "code", "degree": 4}, {"id": "src_main_masksecret", "label": "maskSecret()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "maskSecret()", "community": 47, "community_name": "Community 47", "source_file": "main.ts", "file_type": "code", "degree": 2}, {"id": "src_main_logapicryptobootinfo", "label": "logApiCryptoBootInfo()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "logApiCryptoBootInfo()", "community": 47, "community_name": "Community 47", "source_file": "main.ts", "file_type": "code", "degree": 2}, {"id": "env_d_ts", "label": "env.d.ts", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "env.d.ts", "community": 113, "community_name": "Community 113", "source_file": "env.d.ts", "file_type": "code", "degree": 0}, {"id": "shims_loose_d_ts", "label": "shims-loose.d.ts", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "shims-loose.d.ts", "community": 114, "community_name": "Community 114", "source_file": "shims-loose.d.ts", "file_type": "code", "degree": 0}, {"id": "directives_index_ts", "label": "index.ts", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "index.ts", "community": 28, "community_name": "Community 28", "source_file": "directives/index.ts", "file_type": "code", "degree": 1}, {"id": "directives_index_setupglobdirectives", "label": "setupGlobDirectives()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.5, "font": {"size": 0, "color": "#ffffff"}, "title": "setupGlobDirectives()", "community": 28, "community_name": "Community 28", "source_file": "directives/index.ts", "file_type": "code", "degree": 5}, {"id": "directives_core_roles_ts", "label": "roles.ts", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "roles.ts", "community": 28, "community_name": "Community 28", "source_file": "directives/core/roles.ts", "file_type": "code", "degree": 3}, {"id": "core_roles_checkrolepermission", "label": "checkRolePermission()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "checkRolePermission()", "community": 28, "community_name": "Community 28", "source_file": "directives/core/roles.ts", "file_type": "code", "degree": 2}, {"id": "core_roles_removeelement", "label": "removeElement()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "removeElement()", "community": 28, "community_name": "Community 28", "source_file": "directives/core/roles.ts", "file_type": "code", "degree": 2}, {"id": "core_roles_setuprolesdirective",Line truncated
const RAW_EDGES = [{"from": "app_vue", "to": "src_app_refreshbuttonautoicons", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_vue", "to": "src_app_refreshpaneltitleicons", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_vue", "to": "main_ts", "label": "imports_from", "title": "imports_from [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_ts", "to": "utils_sys_console_ts", "label": "imports_from", "title": "imports_from [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_ts", "to": "src_main_masksecret", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_ts", "to": "src_main_logapicryptobootinfo", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "src_main_masksecret", "to": "src_main_logapicryptobootinfo", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_index_ts", "to": "directives_index_setupglobdirectives", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_index_setupglobdirectives", "to": "core_auth_setupauthdirective", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "directives_index_setupglobdirectives", "to": "core_roles_setuprolesdirective", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "directives_index_setupglobdirectives", "to": "business_highlight_setuphighlightdirective", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "directives_index_setupglobdirectives", "to": "business_ripple_setuprippledirective", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "directives_core_roles_ts", "to": "core_roles_checkrolepermission", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_roles_ts", "to": "core_roles_removeelement", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_roles_ts", "to": "core_roles_setuprolesdirective", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_roles_checkrolepermission", "to": "core_roles_removeelement", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_auth_ts", "to": "core_auth_checkauthpermission", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_auth_ts", "to": "core_auth_removeelement", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_auth_ts", "to": "core_auth_setupauthdirective", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_checkauthpermission", "to": "core_auth_removeelement", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_business_ripple_ts", "to": "business_ripple_setuprippledirective", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_business_highlight_ts", "to": "business_highlight_highlightcode", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_business_highlight_ts", "to": "business_highlight_insertlinenumbers", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_business_highlight_ts", "to": "business_highlight_addcopybutton", "label": "contains", "title": "contains [EXTRACTED]", "dLine truncated
const LEGEND = [{"cid": 0, "color": "#4E79A7", "label": "Community 0", "count": 441}, {"cid": 1, "color": "#F28E2B", "label": "Community 1", "count": 119}, {"cid": 2, "color": "#E15759", "label": "Community 2", "count": 111}, {"cid": 3, "color": "#76B7B2", "label": "Community 3", "count": 94}, {"cid": 4, "color": "#59A14F", "label": "Community 4", "count": 92}, {"cid": 5, "color": "#EDC948", "label": "Community 5", "count": 89}, {"cid": 6, "color": "#B07AA1", "label": "Community 6", "count": 74}, {"cid": 7, "color": "#FF9DA7", "label": "Community 7", "count": 69}, {"cid": 8, "color": "#9C755F", "label": "Community 8", "count": 64}, {"cid": 9, "color": "#BAB0AC", "label": "Community 9", "count": 64}, {"cid": 10, "color": "#4E79A7", "label": "Community 10", "count": 61}, {"cid": 11, "color": "#F28E2B", "label": "Community 11", "count": 61}, {"cid": 12, "color": "#E15759", "label": "Community 12", "count": 59}, {"cid": 13, "color": "#76B7B2", "label": "Community 13", "count": 58}, {"cid": 14, "color": "#59A14F", "label": "Community 14", "count": 54}, {"cid": 15, "color": "#EDC948", "label": "Community 15", "count": 49}, {"cid": 16, "color": "#B07AA1", "label": "Community 16", "count": 48}, {"cid": 17, "color": "#FF9DA7", "label": "Community 17", "count": 47}, {"cid": 18, "color": "#9C755F", "label": "Community 18", "count": 44}, {"cid": 19, "color": "#BAB0AC", "label": "Community 19", "count": 44}, {"cid": 20, "color": "#4E79A7", "label": "Community 20", "count": 42}, {"cid": 21, "color": "#F28E2B", "label": "Community 21", "count": 40}, {"cid": 22, "color": "#E15759", "label": "Community 22", "count": 37}, {"cid": 23, "color": "#76B7B2", "label": "Community 23", "count": 37}, {"cid": 24, "color": "#59A14F", "label": "Community 24", "count": 34}, {"cid": 25, "color": "#EDC948", "label": "Community 25", "count": 34}, {"cid": 26, "color": "#B07AA1", "label": "Community 26", "count": 29}, {"cid": 27, "color": "#FF9DA7", "label": "Community 27", "count": 24}, {"cid": 28, "color": "#9C755F", "label": "Community 28", "count": 22}, {"cid": 29, "color": "#BAB0AC", "label": "Community 29", "count": 22}, {"cid": 30, "color": "#4E79A7", "label": "Community 30", "count": 22}, {"cid": 31, "color": "#F28E2B", "label": "Community 31", "count": 22}, {"cid": 32, "color": "#E15759", "label": "Community 32", "count": 19}, {"cid": 33, "color": "#76B7B2", "label": "Community 33", "count": 19}, {"cid": 34, "color": "#59A14F", "label": "Community 34", "count": 17}, {"cid": 35, "color": "#EDC948", "label": "Community 35", "count": 16}, {"cid": 36, "color": "#B07AA1", "label": "Community 36", "count": 14}, {"cid": 37, "color": "#FF9DA7", "label": "Community 37", "count": 13}, {"cid": 38, "color": "#9C755F", "label": "Community 38", "count": 13}, {"cid": 39, "color": "#BAB0AC", "label": "Community 39", "count": 9}, {"cid": 40, "color": "#4E79A7", "label": "Community 40", "count": 9}, {"cid": 41, "color": "#F28E2B", "label": "Community 41", "count": 9}, {"cid": 42, "color": "#E15759", "label": "Community 42", "count": 9}, {"cid": 43, "color": "#76B7B2", "label": "Community 43", "count": 9}, {"cid": 44, "color": "#59A14F", "label": "Community 44", "count": 8}, {"cid": 45, "color": "#EDC948", "label": "Community 45", "count": 8}, {"cid": 46, "color": "#B07AA1", "label": "Community 46", "count": 8}, {"cid": 47, "color": "#FF9DA7", "label": "Community 47", "count": 7}, {"cid": 48, "color": "#9C755F", "label": "Community 48", "count": 7}, {"cid": 49, "color": "#BAB0AC", "label": "Community 49", "count": 7}, {"cid": 50, "color": "#4E79A7", "label": "Community 50", "count": 7}, {"cid": 51, "color": "#F28E2B", "label": "Community 51", "count": 6}, {"cid": 52, "color": "#E15759", "label": "Community 52", "count": 6}, {"cid": 53, "color": "#76B7B2", "label": "Community 53", "count": 6}, {"cid": 54, "color": "#59A14F", "label": "Community 54", "count": 6}, {"cid": 55, "color": "#EDC948", "label": "Community 55", "count": 5}, {"cid": 56, "color": "#B07AA1", "label": "Community 56", "count": 5}, {"cid": 57, "color": "#FF9DA7", "label": "Community 57", "count": 5}, {"cid": 58, "color": "#9C755F", "label": "Community 58", "count": 5}, {"cid": 59, "color": "#BAB0AC", "label": "Community 59", "count": 5}, {"cid": 60, "color": "#4E79A7", "label": "Community 60", "count": 4}, {"cid": 61, "color": "#F28E2B", "label": "Community 61", "count": 4}, {"cid": 62, "color": "#E15759", "label": "Community 62", "count": 4}, {"cid": 63, "color": "#76B7B2", "label": "Community 63", "count": 4}, {"cid": 64, "color": "#59A14F", "label": "Community 64", "count": 4}, {"cid": 65, "color": "#EDC948", "label": "Community 65", "count": 4}, {"cid": 66, "color": "#B07AA1", "label": "Community 66", "count": 4}, {"cid": 67, "color": "#FF9DA7", "label": "Community 67", "count": 3}, {"cid": 68, "color": "#9C755F", "label": "Community 68", "count": 3}, {"cid": 69, "color": "#BAB0AC", "label": "Community 69", "count": 3}, {"cid": 70, "color": "#4E79A7", "label": "Community 70", "couLine truncated
const RAW_NODES = [{"id": "app_vue", "label": "App.vue", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "App.vue", "community": 50, "community_name": "Community 50", "source_file": "App.vue", "file_type": "code", "degree": 3}, {"id": "src_app_refreshbuttonautoicons", "label": "refreshButtonAutoIcons()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "refreshButtonAutoIcons()", "community": 50, "community_name": "Community 50", "source_file": "App.vue", "file_type": "code", "degree": 1}, {"id": "src_app_refreshpaneltitleicons", "label": "refreshPanelTitleIcons()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "refreshPanelTitleIcons()", "community": 50, "community_name": "Community 50", "source_file": "App.vue", "file_type": "code", "degree": 1}, {"id": "main_ts", "label": "main.ts", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.4, "font": {"size": 0, "color": "#ffffff"}, "title": "main.ts", "community": 50, "community_name": "Community 50", "source_file": "main.ts", "file_type": "code", "degree": 4}, {"id": "src_main_masksecret", "label": "maskSecret()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "maskSecret()", "community": 50, "community_name": "Community 50", "source_file": "main.ts", "file_type": "code", "degree": 2}, {"id": "src_main_logapicryptobootinfo", "label": "logApiCryptoBootInfo()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "logApiCryptoBootInfo()", "community": 50, "community_name": "Community 50", "source_file": "main.ts", "file_type": "code", "degree": 2}, {"id": "env_d_ts", "label": "env.d.ts", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "env.d.ts", "community": 116, "community_name": "Community 116", "source_file": "env.d.ts", "file_type": "code", "degree": 0}, {"id": "shims_loose_d_ts", "label": "shims-loose.d.ts", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "shims-loose.d.ts", "community": 117, "community_name": "Community 117", "source_file": "shims-loose.d.ts", "file_type": "code", "degree": 0}, {"id": "directives_index_ts", "label": "index.ts", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "index.ts", "community": 28, "community_name": "Community 28", "source_file": "directives/index.ts", "file_type": "code", "degree": 1}, {"id": "directives_index_setupglobdirectives", "label": "setupGlobDirectives()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.5, "font": {"size": 0, "color": "#ffffff"}, "title": "setupGlobDirectives()", "community": 28, "community_name": "Community 28", "source_file": "directives/index.ts", "file_type": "code", "degree": 5}, {"id": "directives_core_roles_ts", "label": "roles.ts", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "roles.ts", "community": 28, "community_name": "Community 28", "source_file": "directives/core/roles.ts", "file_type": "code", "degree": 3}, {"id": "core_roles_checkrolepermission", "label": "checkRolePermission()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "checkRolePermission()", "community": 28, "community_name": "Community 28", "source_file": "directives/core/roles.ts", "file_type": "code", "degree": 2}, {"id": "core_roles_removeelement", "label": "removeElement()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "removeElement()", "community": 28, "community_name": "Community 28", "source_file": "directives/core/roles.ts", "file_type": "code", "degree": 2}, {"id": "core_roles_setuprolesdirective",Line truncated
const RAW_EDGES = [{"from": "app_vue", "to": "src_app_refreshbuttonautoicons", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_vue", "to": "src_app_refreshpaneltitleicons", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_vue", "to": "main_ts", "label": "imports_from", "title": "imports_from [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_ts", "to": "utils_sys_console_ts", "label": "imports_from", "title": "imports_from [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_ts", "to": "src_main_masksecret", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_ts", "to": "src_main_logapicryptobootinfo", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "src_main_masksecret", "to": "src_main_logapicryptobootinfo", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_index_ts", "to": "directives_index_setupglobdirectives", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_index_setupglobdirectives", "to": "core_auth_setupauthdirective", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "directives_index_setupglobdirectives", "to": "core_roles_setuprolesdirective", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "directives_index_setupglobdirectives", "to": "business_highlight_setuphighlightdirective", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "directives_index_setupglobdirectives", "to": "business_ripple_setuprippledirective", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "directives_core_roles_ts", "to": "core_roles_checkrolepermission", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_roles_ts", "to": "core_roles_removeelement", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_roles_ts", "to": "core_roles_setuprolesdirective", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_roles_checkrolepermission", "to": "core_roles_removeelement", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_auth_ts", "to": "core_auth_checkauthpermission", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_auth_ts", "to": "core_auth_removeelement", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_auth_ts", "to": "core_auth_setupauthdirective", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_checkauthpermission", "to": "core_auth_removeelement", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_business_ripple_ts", "to": "business_ripple_setuprippledirective", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_business_highlight_ts", "to": "business_highlight_highlightcode", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_business_highlight_ts", "to": "business_highlight_insertlinenumbers", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_business_highlight_ts", "to": "business_highlight_addcopybutton", "label": "contains", "title": "contains [EXTRACTED]", "dLine truncated
const LEGEND = [{"cid": 0, "color": "#4E79A7", "label": "Community 0", "count": 421}, {"cid": 1, "color": "#F28E2B", "label": "Community 1", "count": 130}, {"cid": 2, "color": "#E15759", "label": "Community 2", "count": 120}, {"cid": 3, "color": "#76B7B2", "label": "Community 3", "count": 103}, {"cid": 4, "color": "#59A14F", "label": "Community 4", "count": 102}, {"cid": 5, "color": "#EDC948", "label": "Community 5", "count": 89}, {"cid": 6, "color": "#B07AA1", "label": "Community 6", "count": 88}, {"cid": 7, "color": "#FF9DA7", "label": "Community 7", "count": 79}, {"cid": 8, "color": "#9C755F", "label": "Community 8", "count": 78}, {"cid": 9, "color": "#BAB0AC", "label": "Community 9", "count": 77}, {"cid": 10, "color": "#4E79A7", "label": "Community 10", "count": 71}, {"cid": 11, "color": "#F28E2B", "label": "Community 11", "count": 62}, {"cid": 12, "color": "#E15759", "label": "Community 12", "count": 61}, {"cid": 13, "color": "#76B7B2", "label": "Community 13", "count": 61}, {"cid": 14, "color": "#59A14F", "label": "Community 14", "count": 50}, {"cid": 15, "color": "#EDC948", "label": "Community 15", "count": 47}, {"cid": 16, "color": "#B07AA1", "label": "Community 16", "count": 42}, {"cid": 17, "color": "#FF9DA7", "label": "Community 17", "count": 40}, {"cid": 18, "color": "#9C755F", "label": "Community 18", "count": 38}, {"cid": 19, "color": "#BAB0AC", "label": "Community 19", "count": 37}, {"cid": 20, "color": "#4E79A7", "label": "Community 20", "count": 36}, {"cid": 21, "color": "#F28E2B", "label": "Community 21", "count": 34}, {"cid": 22, "color": "#E15759", "label": "Community 22", "count": 34}, {"cid": 23, "color": "#76B7B2", "label": "Community 23", "count": 33}, {"cid": 24, "color": "#59A14F", "label": "Community 24", "count": 29}, {"cid": 25, "color": "#EDC948", "label": "Community 25", "count": 29}, {"cid": 26, "color": "#B07AA1", "label": "Community 26", "count": 24}, {"cid": 27, "color": "#FF9DA7", "label": "Community 27", "count": 24}, {"cid": 28, "color": "#9C755F", "label": "Community 28", "count": 22}, {"cid": 29, "color": "#BAB0AC", "label": "Community 29", "count": 22}, {"cid": 30, "color": "#4E79A7", "label": "Community 30", "count": 19}, {"cid": 31, "color": "#F28E2B", "label": "Community 31", "count": 19}, {"cid": 32, "color": "#E15759", "label": "Community 32", "count": 18}, {"cid": 33, "color": "#76B7B2", "label": "Community 33", "count": 18}, {"cid": 34, "color": "#59A14F", "label": "Community 34", "count": 17}, {"cid": 35, "color": "#EDC948", "label": "Community 35", "count": 16}, {"cid": 36, "color": "#B07AA1", "label": "Community 36", "count": 15}, {"cid": 37, "color": "#FF9DA7", "label": "Community 37", "count": 14}, {"cid": 38, "color": "#9C755F", "label": "Community 38", "count": 14}, {"cid": 39, "color": "#BAB0AC", "label": "Community 39", "count": 14}, {"cid": 40, "color": "#4E79A7", "label": "Community 40", "count": 13}, {"cid": 41, "color": "#F28E2B", "label": "Community 41", "count": 13}, {"cid": 42, "color": "#E15759", "label": "Community 42", "count": 9}, {"cid": 43, "color": "#76B7B2", "label": "Community 43", "count": 9}, {"cid": 44, "color": "#59A14F", "label": "Community 44", "count": 9}, {"cid": 45, "color": "#EDC948", "label": "Community 45", "count": 9}, {"cid": 46, "color": "#B07AA1", "label": "Community 46", "count": 9}, {"cid": 47, "color": "#FF9DA7", "label": "Community 47", "count": 8}, {"cid": 48, "color": "#9C755F", "label": "Community 48", "count": 8}, {"cid": 49, "color": "#BAB0AC", "label": "Community 49", "count": 8}, {"cid": 50, "color": "#4E79A7", "label": "Community 50", "count": 7}, {"cid": 51, "color": "#F28E2B", "label": "Community 51", "count": 7}, {"cid": 52, "color": "#E15759", "label": "Community 52", "count": 7}, {"cid": 53, "color": "#76B7B2", "label": "Community 53", "count": 6}, {"cid": 54, "color": "#59A14F", "label": "Community 54", "count": 6}, {"cid": 55, "color": "#EDC948", "label": "Community 55", "count": 5}, {"cid": 56, "color": "#B07AA1", "label": "Community 56", "count": 5}, {"cid": 57, "color": "#FF9DA7", "label": "Community 57", "count": 5}, {"cid": 58, "color": "#9C755F", "label": "Community 58", "count": 5}, {"cid": 59, "color": "#BAB0AC", "label": "Community 59", "count": 5}, {"cid": 60, "color": "#4E79A7", "label": "Community 60", "count": 4}, {"cid": 61, "color": "#F28E2B", "label": "Community 61", "count": 4}, {"cid": 62, "color": "#E15759", "label": "Community 62", "count": 4}, {"cid": 63, "color": "#76B7B2", "label": "Community 63", "count": 4}, {"cid": 64, "color": "#59A14F", "label": "Community 64", "count": 4}, {"cid": 65, "color": "#EDC948", "label": "Community 65", "count": 4}, {"cid": 66, "color": "#B07AA1", "label": "Community 66", "count": 4}, {"cid": 67, "color": "#FF9DA7", "label": "Community 67", "count": 3}, {"cid": 68, "color": "#9C755F", "label": "Community 68", "count": 3}, {"cid": 69, "color": "#BAB0AC", "label": "Community 69", "count": 3}, {"cid": 70, "color": "#4E79A7", "label": "Community 70",Line truncated
// HTML-escape helper — prevents XSS when injecting graph data into innerHTML
function esc(s) {
File diff suppressed because it is too large. Load diff
+379 -362
View File
@@ -1,5 +1,5 @@
{
"/Users/wuzilong/work/00code/zkxw/web-admin/src/App.vue": 1782802580.8673093,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/App.vue": 1782893851.4905877,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/main.ts": 1782442850.965947,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/env.d.ts": 1781272556.3788364,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/shims-loose.d.ts": 1781272556.417826,
@@ -17,10 +17,11 @@
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/common/index.ts": 1781272556.3597305,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/directive/directive.d.ts": 1781272556.3601494,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/api/api.d.ts": 1781272556.3606477,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts": 1782822357.223359,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/auto-imports.d.ts": 1782822355.049375,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts": 1782894443.0741875,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/auto-imports.d.ts": 1782894408.0549,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/store/index.ts": 1781272556.364766,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/router/index.ts": 1782394569.8806834,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/composables/useAttachmentDropZone.ts": 1782873161.9839864,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/locales/index.ts": 1781272556.3657222,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/config/pilot-biz-type.ts": 1781682539.4897008,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/config/setting.ts": 1781406298.257571,
@@ -49,18 +50,21 @@
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/sample-production-reception-fields.ts": 1782806741.4880455,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/qc-material-ui.ts": 1781525352.6976836,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/qc-work-order-tabs.ts": 1782802260.7327676,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/qc-work-order-card-meta.ts": 1782806522.9861114,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/qc-work-order-unfinished-badge.ts": 1782878267.729195,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/qc-work-order-card-meta.ts": 1782893963.9922342,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/qc-work-order-category.ts": 1782393809.3917818,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/router.ts": 1781272556.3875713,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-mine-task-groups.ts": 1782703027.2893605,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/qc-mine-task-groups.ts": 1782802288.7511663,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/qc-mine-task-groups.ts": 1782888808.4986835,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/expected-cell-count.ts": 1782705039.2515786,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-labels.ts": 1782713885.8380322,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/status-tag-registry.ts": 1782713884.4535882,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-work-order-card-meta.ts": 1782806522.9871194,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-labels.ts": 1782893910.9937537,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/status-tag-registry.ts": 1782893988.0240471,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-work-order-card-meta.ts": 1782894000.6502283,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/fetch-paged-list.ts": 1781272556.3903377,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/decimal-input-format.ts": 1782807247.117702,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/sort-order.ts": 1781272556.3913012,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/void-type-dict.ts": 1782893754.3565452,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/qc-work-order-attachment-export.ts": 1782875352.75266,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/datetime-display.ts": 1782806208.3904786,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/sample-reception-lab-storage-code.ts": 1782378453.1031013,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/outbound-qc-pilot-view-sections.ts": 1781566346.7618802,
@@ -69,14 +73,17 @@
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/equipment-select.ts": 1781524048.96866,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/qc-item-param-options.ts": 1782446792.147386,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/clinical-payment-flow-steps.ts": 1782806499.3105526,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-work-order-step-badge.ts": 1782881450.5731556,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/donation-standard-import-parse.ts": 1782564663.323319,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/copy-text.ts": 1781272556.4018052,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/tree-path.ts": 1781272556.402468,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/mask-sensitive.ts": 1781272556.4029639,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/sample-reception-view-sections.ts": 1782806513.145186,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-labels.ts": 1782605793.6179895,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/inbound-sample-special-mark.ts": 1782889894.1376855,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-work-order-category.ts": 1782703985.4586673,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-menu-badge.ts": 1782703040.9438033,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/attachment-zip.ts": 1782875325.855345,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/numeric-input-parse.ts": 1782179343.5953708,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/index.ts": 1781272556.410244,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/cell-product-type.ts": 1782706056.1567264,
@@ -129,114 +136,118 @@
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/http/error.ts": 1781272556.4091117,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/socket/index.ts": 1781272556.4146817,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/router/sidebar-menu-filter.ts": 1781272556.4163456,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/tables/art-table/index.vue": 1781272556.4191,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/tables/art-table-header/index.vue": 1781272556.4209464,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/forms/art-search-bar/index.vue": 1781272556.422587,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/forms/art-form/index.vue": 1781272556.4241018,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/forms/art-button-more/index.vue": 1781272556.4245436,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/forms/art-excel-import/index.vue": 1781272556.425213,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/forms/art-excel-export/index.vue": 1781272556.426595,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/forms/art-drag-verify/index.vue": 1781272556.427947,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/forms/art-wang-editor/index.vue": 1781272556.430018,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/forms/art-button-table/index.vue": 1781272556.4313827,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/widget/art-icon-button/index.vue": 1781272556.431638,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/cards/art-bar-chart-card/index.vue": 1781272556.432135,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/cards/art-data-list-card/index.vue": 1781272556.4327755,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/cards/art-timeline-list-card/index.vue": 1781272556.4341109,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/cards/art-stats-card/index.vue": 1781272556.4348192,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/cards/art-image-card/index.vue": 1781272556.4353764,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/cards/art-donut-chart-card/index.vue": 1781272556.4359744,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/cards/art-progress-card/index.vue": 1781272556.4369423,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/cards/art-line-chart-card/index.vue": 1781272556.437633,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/charts/art-scatter-chart/index.vue": 1781272556.4388356,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/charts/art-k-line-chart/index.vue": 1781272556.4413047,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/charts/art-dual-bar-compare-chart/index.vue": 1781272556.4511123,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/charts/art-bar-chart/index.vue": 1781272556.463116,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/charts/art-line-chart/index.vue": 1781272556.469253,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/charts/art-ring-chart/index.vue": 1781272556.4716287,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/charts/art-radar-chart/index.vue": 1781272556.4735081,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/charts/art-h-bar-chart/index.vue": 1781272556.481099,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/others/art-watermark/index.vue": 1781272556.4826052,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/others/art-menu-right/index.vue": 1781272556.483974,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/banners/art-card-banner/index.vue": 1781272556.4851887,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/banners/art-basic-banner/index.vue": 1781272556.4864144,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-global-component/index.vue": 1781272556.4869678,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/index.vue": 1781272556.4875474,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/tables/art-table/index.vue": 1782893852.037499,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/tables/art-table-header/index.vue": 1782893852.0053234,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/forms/art-search-bar/index.vue": 1782893851.915658,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/forms/art-form/index.vue": 1782893851.6923792,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/forms/art-button-more/index.vue": 1782893851.6535888,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/forms/art-excel-import/index.vue": 1782893851.6998997,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/forms/art-excel-export/index.vue": 1782893851.6742005,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/forms/art-drag-verify/index.vue": 1782893851.6500359,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/forms/art-wang-editor/index.vue": 1782893851.6251311,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/forms/art-button-table/index.vue": 1782893851.6097448,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/widget/art-icon-button/index.vue": 1782893851.5548317,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/cards/art-bar-chart-card/index.vue": 1782893852.157002,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/cards/art-data-list-card/index.vue": 1782893852.1262074,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/cards/art-timeline-list-card/index.vue": 1782893852.1727722,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/cards/art-stats-card/index.vue": 1782893852.1468773,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/cards/art-image-card/index.vue": 1782893852.1106105,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/cards/art-donut-chart-card/index.vue": 1782893852.0094585,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/cards/art-progress-card/index.vue": 1782893851.9591472,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/cards/art-line-chart-card/index.vue": 1782893851.9381645,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/charts/art-scatter-chart/index.vue": 1782893851.8783045,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/charts/art-k-line-chart/index.vue": 1782893851.9770455,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/charts/art-dual-bar-compare-chart/index.vue": 1782893851.9422753,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/charts/art-bar-chart/index.vue": 1782893851.7151058,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/charts/art-line-chart/index.vue": 1782893851.666113,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/charts/art-ring-chart/index.vue": 1782893851.646269,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/charts/art-radar-chart/index.vue": 1782893851.6165102,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/charts/art-h-bar-chart/index.vue": 1782893851.6032681,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/others/art-watermark/index.vue": 1782893851.5813904,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/others/art-menu-right/index.vue": 1782893851.5580697,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/banners/art-card-banner/index.vue": 1782893851.5446744,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/banners/art-basic-banner/index.vue": 1782893851.519256,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-global-component/index.vue": 1782893853.4671311,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/index.vue": 1782893853.4277167,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/composables/useSettingsPanel.ts": 1781661158.6601012,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/composables/useSettingsConfig.ts": 1781272556.4908195,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/composables/useSettingsState.ts": 1781272556.491559,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/composables/useSettingsHandlers.ts": 1781272556.4939222,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/ThemeSettings.vue": 1781272556.4955838,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/SettingHeader.vue": 1781272556.496231,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/SettingItem.vue": 1781272556.4978695,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/MenuStyleSettings.vue": 1781272556.5011399,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/BasicSettings.vue": 1781272556.5070302,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/SettingDrawer.vue": 1781272556.51664,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/SettingActions.vue": 1781272556.5243568,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/ColorSettings.vue": 1781272556.5299892,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/MenuLayoutSettings.vue": 1781272556.539038,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/SectionTitle.vue": 1781272556.547113,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/BoxStyleSettings.vue": 1781272556.5547402,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/ContainerSettings.vue": 1781272556.5589046,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-work-tab/index.vue": 1781351189.0380108,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-chat-window/index.vue": 1781272556.562926,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-page-content/index.vue": 1781272556.56442,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-horizontal-menu/index.vue": 1781272556.5652099,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-horizontal-menu/widget/HorizontalSubmenu.vue": 1782404678.3207965,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-mixed-menu/index.vue": 1781401124.1983705,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue": 1781406299.7525744,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-sidebar-menu/widget/SidebarSubmenu.vue": 1782404695.2500448,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-fireworks-effect/index.vue": 1781272556.5941117,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-global-search/index.vue": 1781272556.597667,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-notification/index.vue": 1781272556.6005983,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-fast-enter/index.vue": 1781272556.6020403,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-screen-lock/index.vue": 1781272556.6039116,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-breadcrumb/index.vue": 1781272556.6048281,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-header-bar/index.vue": 1781272556.6058884,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-header-bar/widget/ArtUserMenu.vue": 1782122644.9109273,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-header-bar/widget/UserProfileDialog.vue": 1781563767.298543,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/theme/theme-svg/index.vue": 1781272556.6095326,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/views/result/ArtResultPage.vue": 1781272556.610506,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/views/exception/ExceptionIllustration.vue": 1781272556.6118734,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/views/exception/ArtException.vue": 1781272556.6129858,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/views/login/AuthTopBar.vue": 1781272556.6135185,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/views/login/LoginLeftView.vue": 1781272556.6147635,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/text-effect/art-text-scroll/index.vue": 1781272556.6165035,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/text-effect/art-count-to/index.vue": 1781272556.6178985,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/text-effect/art-festival-text-scroll/index.vue": 1781272556.6184907,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/base/art-svg-icon/index.vue": 1781272556.61891,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/base/art-back-to-top/index.vue": 1781272556.6195998,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/base/art-logo/index.vue": 1781272556.6201615,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/media/art-video-player/index.vue": 1781272556.6210992,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/media/art-cutter-img/index.vue": 1781272556.6223109,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-transport-form-section/index.vue": 1782565160.7818007,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/protocol-finance-confirm-fields/index.vue": 1781585388.6311953,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/ThemeSettings.vue": 1782893853.2473464,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/SettingHeader.vue": 1782893853.2139003,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/SettingItem.vue": 1782893853.1873887,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/MenuStyleSettings.vue": 1782893853.1573272,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/BasicSettings.vue": 1782893853.1193702,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/SettingDrawer.vue": 1782893853.0867703,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/SettingActions.vue": 1782893853.028656,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/ColorSettings.vue": 1782893852.967135,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/MenuLayoutSettings.vue": 1782893852.8678243,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/SectionTitle.vue": 1782893852.8545432,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/BoxStyleSettings.vue": 1782893852.8381548,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/ContainerSettings.vue": 1782893852.8006544,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-work-tab/index.vue": 1782893852.7315974,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-chat-window/index.vue": 1782893852.684171,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-page-content/index.vue": 1782893852.6055937,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-horizontal-menu/index.vue": 1782893852.4847596,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-horizontal-menu/widget/HorizontalSubmenu.vue": 1782893852.4173005,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-mixed-menu/index.vue": 1782893852.3397176,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue": 1782893852.3144279,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-sidebar-menu/widget/SidebarSubmenu.vue": 1782893852.2933555,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-fireworks-effect/index.vue": 1782893852.2444534,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-global-search/index.vue": 1782893852.3260999,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-notification/index.vue": 1782893852.2745683,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-fast-enter/index.vue": 1782893852.238584,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-screen-lock/index.vue": 1782893852.30928,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-breadcrumb/index.vue": 1782893852.2839568,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-header-bar/index.vue": 1782893852.248846,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-header-bar/widget/ArtUserMenu.vue": 1782893852.11496,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-header-bar/widget/UserProfileDialog.vue": 1782893852.021898,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/theme/theme-svg/index.vue": 1782893852.0473835,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/views/result/ArtResultPage.vue": 1782893852.0002468,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/views/exception/ExceptionIllustration.vue": 1782893851.954999,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/views/exception/ArtException.vue": 1782893851.9232078,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/views/login/AuthTopBar.vue": 1782893851.7064636,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/views/login/LoginLeftView.vue": 1782893851.6700354,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/text-effect/art-text-scroll/index.vue": 1782893851.6424026,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/text-effect/art-count-to/index.vue": 1782893851.6069484,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/text-effect/art-festival-text-scroll/index.vue": 1782893851.5910752,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/base/art-svg-icon/index.vue": 1782893851.5707386,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/base/art-back-to-top/index.vue": 1782893851.5419092,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/base/art-logo/index.vue": 1782893851.5285249,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/media/art-video-player/index.vue": 1782893851.5118508,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/media/art-cutter-img/index.vue": 1782893851.4950457,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-transport-form-section/index.vue": 1782893852.3610222,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/protocol-finance-confirm-fields/index.vue": 1782893852.350682,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/protocol-finance-confirm-fields/finance-attachments.ts": 1781272556.6256514,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/qc-task-view-dialog/index.vue": 1782719572.323183,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/clinical-payment-confirm-timeline/index.vue": 1782806499.3062413,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/outbound-material-readonly-panel/index.vue": 1782709501.7382262,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-reception-dual-readonly-panel/index.vue": 1782806452.899446,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/dialog-form-body/index.vue": 1781272556.6276903,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/clinical-payment-submit-readonly/index.vue": 1782806499.3111098,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-qc-info-cards/index.vue": 1782528795.4248698,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/order-operate-local-dialog/index.vue": 1781272556.6297834,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/product-view-dialog/index.vue": 1781563767.2879,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-production-info-cards/index.vue": 1781585388.6388853,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-storage-release-info/index.vue": 1781585388.6396642,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/infusion-schedule-outbound-chain-view/index.vue": 1782806499.3070076,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/work-order-remark-dialog/index.vue": 1781563767.2910764,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-qc-info-grouped-panel/index.vue": 1781596014.9588113,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/clinical-schedule-payment-detail/index.vue": 1782806499.3090854,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-qc-batch-readonly/index.vue": 1782398610.3519263,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/outbound-material-form-sections/index.vue": 1782807285.0492923,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/protocol-payment-detail-readonly/index.vue": 1782806499.3052359,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/qc-item-param-select-editor/index.vue": 1782380052.8264449,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/system-view-dialog/index.vue": 1782806391.4480581,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/production-task-view-dialog/index.vue": 1782806582.4408069,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/order-operate-dialog-bridge/index.vue": 1781272556.644745,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/common/list-datetime-column.vue": 1782806394.0347686,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/common/amount-input/index.vue": 1782807269.934999,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/common/decimal-input/index.vue": 1782807254.2058113,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/qc-task-view-dialog/index.vue": 1782893852.3308268,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/clinical-payment-confirm-timeline/index.vue": 1782893888.54253,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/outbound-material-readonly-panel/index.vue": 1782893852.2706735,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-reception-dual-readonly-panel/index.vue": 1782893852.235278,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/dialog-form-body/index.vue": 1782893852.1647537,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/clinical-payment-submit-readonly/index.vue": 1782893852.1397598,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-qc-info-cards/index.vue": 1782893852.4513032,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/special-sample-display/index.vue": 1782893852.3469865,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/order-operate-local-dialog/index.vue": 1782893852.4089837,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/product-view-dialog/index.vue": 1782893852.3441794,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-production-info-cards/index.vue": 1782893852.297569,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-storage-release-info/index.vue": 1782893852.266822,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/infusion-schedule-outbound-chain-view/index.vue": 1782893852.19879,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/work-order-remark-dialog/index.vue": 1782893852.1691496,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-qc-info-grouped-panel/index.vue": 1782893852.0546591,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/clinical-schedule-payment-detail/index.vue": 1782893852.0159285,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-qc-batch-readonly/index.vue": 1782893851.9487352,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/outbound-material-form-sections/index.vue": 1782893851.934857,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/attachment-zip-progress-dialog/index.vue": 1782893851.6959429,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/protocol-payment-detail-readonly/index.vue": 1782893922.525934,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-code-with-special-display/index.vue": 1782893851.6283524,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/qc-item-param-select-editor/index.vue": 1782893851.5957565,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/system-view-dialog/index.vue": 1782893851.578115,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/production-task-view-dialog/index.vue": 1782893851.5322437,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/order-operate-dialog-bridge/index.vue": 1782893851.5162861,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-special-mark-dialog/index.vue": 1782893851.5019739,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/common/list-datetime-column.vue": 1782893851.4989195,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/common/amount-input/index.vue": 1782893851.5061834,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/common/decimal-input/index.vue": 1782893851.5090024,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/hooks/index.ts": 1781272556.653748,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/hooks/core/useFastEnter.ts": 1781272556.6454022,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/hooks/core/useTableColumns.ts": 1781272556.6461287,
@@ -258,14 +269,14 @@
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/outbound-release-review.ts": 1782398621.3842177,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-third-party-item.ts": 1781272556.6567156,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/env-detect-record.ts": 1782375300.5909576,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/storage-release-review.ts": 1782398606.4492025,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/storage-release-review.ts": 1782894235.5504115,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-material.ts": 1782404996.1897874,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/workflow.ts": 1781272556.6579714,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-work-order.ts": 1782719457.5865517,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-work-order.ts": 1782886679.692672,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/sample-production-reception.ts": 1782719155.415783,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-task-result.ts": 1782379634.2324347,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/protocol-sample-collection.ts": 1781272556.659353,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/material-usage.ts": 1781517319.838243,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/material-usage.ts": 1782894613.493449,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/pre-transit-sample.ts": 1782204427.8344586,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-third-party-company.ts": 1781415389.1483624,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/collection-protocol.ts": 1781750452.7497737,
@@ -273,14 +284,15 @@
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/storage-entry-sms-notification.ts": 1781272556.660898,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/business.ts": 1781750847.0646322,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts": 1782600949.367371,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/inbound-sample.ts": 1782889889.452178,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/ethnic.ts": 1781272556.6658764,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/research-donation-sample-collection.ts": 1781272556.6660974,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-lab-test-item.ts": 1781272556.666375,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/cell-product.ts": 1782710852.6608956,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/sample-sms-notification.ts": 1781272556.666838,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/material-stock-check.ts": 1781427280.4992144,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/research-donation.ts": 1782182859.3901165,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-task.ts": 1782601945.343417,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/research-donation.ts": 1782893816.502791,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-task.ts": 1782886913.2524905,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-item-param.ts": 1782446790.5508618,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/env-detect-item.ts": 1781272556.668322,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts": 1782602751.262628,
@@ -289,271 +301,276 @@
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material.ts": 1781690334.9639037,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-sms-notification.ts": 1781272556.670129,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/system.ts": 1782802585.0325377,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/material.ts": 1781346022.817811,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/material.ts": 1782894613.4934483,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/sample-reception.ts": 1782719389.581961,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/auth.ts": 1782122651.4628098,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-work-order.ts": 1782802289.7619758,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/auth/login/index.vue": 1781272556.6735966,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/refund-confirm/index.vue": 1781272556.6742516,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/my-material-usage/index.vue": 1781518736.690082,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/index.vue": 1782806765.0429902,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolStatusChangeDialog.vue": 1781440943.514069,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue": 1782806765.0452983,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolAttachmentReadonly.vue": 1781585388.6583154,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolFormDialog.vue": 1782713916.8767238,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolAuditDialog.vue": 1781440939.3081548,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/sample-info/index.vue": 1781599990.94571,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/sample-reception-info/index.vue": 1781272556.6985002,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/payment-info/index.vue": 1781272556.6988573,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/storage-cert/index.vue": 1781272556.6992679,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/index.vue": 1781599996.9031687,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/StorageEntryInfoTab.vue": 1781600376.7402449,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/SampleCollectionInfoTab.vue": 1781272556.7014923,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/SampleQcInfoTab.vue": 1781600375.004251,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/SampleReceptionInfoTab.vue": 1781600372.1736586,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/StorageCertTab.vue": 1781600388.1296115,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/FullmoonTodoTab.vue": 1782713950.6410708,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/ProtocolAuditTab.vue": 1782806731.7479634,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/PaymentInfoTab.vue": 1782806424.3613796,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/index.vue": 1782821645.0234518,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/MaterialUsageTab.vue": 1782806765.0634851,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/MaterialStockCheckTab.vue": 1782807285.11373,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/fullmoon-todo/index.vue": 1781272556.719875,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/storage-entry-info/index.vue": 1781272556.7201529,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/payment-confirm/index.vue": 1782806765.0713005,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/payment-confirm/RefundConfirmTab.vue": 1782806765.0721004,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/payment-confirm/InvoiceRequestTab.vue": 1782806457.7086182,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material-stock-log/index.vue": 1781346115.5701284,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/outside/Iframe.vue": 1781272556.7246568,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/operations/demo/index.vue": 1781272556.7266567,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/operations/clean-room/index.vue": 1781585388.6729288,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/operations/storage-facility/index.vue": 1782711208.922378,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/operations/exhibition-appointment/index.vue": 1782806765.079744,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/audit/index.vue": 1782806731.2692585,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/sample-info/index.vue": 1781518738.227001,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/sample-info/DonationSampleCollectionInfoTab.vue": 1781272556.7362974,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/index.vue": 1782806765.0853424,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationAuditDialog.vue": 1781563767.3746796,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue": 1782806765.0878375,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationFormDialog.vue": 1782564662.0706358,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationStatusChangeDialog.vue": 1781563767.3753123,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/dashboard/console/index.vue": 1781272556.7480726,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/tenant/index.vue": 1782806765.0964973,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/order/index.vue": 1781599786.579335,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/unit/index.vue": 1782806855.0186646,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/role/index.vue": 1782806765.1067045,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/post/index.vue": 1782806765.1116176,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/category/index.vue": 1781563806.3563867,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/express/index.vue": 1782806746.9292443,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/index.vue": 1782806855.1333377,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/detail.vue": 1781563806.885495,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/modules/user-dialog.vue": 1781272556.7718394,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/modules/user-search.vue": 1781272556.7723653,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/product/index.vue": 1781563806.8376303,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/workflow/my-applications/index.vue": 1782806765.142289,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/workflow/task-pending/index.vue": 1782806765.1441183,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/workflow/task-completed/index.vue": 1782806765.1503403,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/workflow/components/ProcessStatusTag.vue": 1781272556.7858772,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/workflow/components/ApprovalDialog.vue": 1781585388.6863859,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/workflow/designer/FlowDesigner.vue": 1781563767.3844852,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/workflow/process/index.vue": 1782806765.1535223,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/menu/index.vue": 1781563767.3785298,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/site/index.vue": 1781585388.688801,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/dept/index.vue": 1781563767.377147,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/dict/index.vue": 1782806765.1589515,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/leave/index.vue": 1782806765.1608179,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/output-type/index.vue": 1781515464.8433418,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/cell-product/index.vue": 1782807332.6971986,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/cell-product/SourceChainGraph.vue": 1781585388.6912124,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/cell-product/source-chain/ChainLinkEdge.vue": 1781585388.6915958,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-work-order.ts": 1782886679.6424742,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/auth/login/index.vue": 1782893854.347133,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/refund-confirm/index.vue": 1782893854.3402505,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/my-material-usage/index.vue": 1782893854.311591,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/index.vue": 1782893888.5451498,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolStatusChangeDialog.vue": 1782893854.4271934,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue": 1782894143.3529377,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolAttachmentReadonly.vue": 1782893854.403395,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolFormDialog.vue": 1782893854.4430473,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolAuditDialog.vue": 1782893854.3675368,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/sample-info/index.vue": 1782893854.321358,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/sample-reception-info/index.vue": 1782893854.265202,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/payment-info/index.vue": 1782893854.372695,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/storage-cert/index.vue": 1782893854.380672,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/index.vue": 1782893854.4304602,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/StorageEntryInfoTab.vue": 1782893888.546743,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/SampleCollectionInfoTab.vue": 1782893888.5469391,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/SampleQcInfoTab.vue": 1782893888.5471184,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/SampleReceptionInfoTab.vue": 1782893888.547302,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/StorageCertTab.vue": 1782893888.5475702,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/FullmoonTodoTab.vue": 1782893888.5482585,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/ProtocolAuditTab.vue": 1782893888.5485528,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/PaymentInfoTab.vue": 1782893920.0282564,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/index.vue": 1782894640.107094,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/MaterialUsageTab.vue": 1782894623.5755792,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/MaterialStockCheckTab.vue": 1782893854.1554854,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/fullmoon-todo/index.vue": 1782893854.0469422,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/storage-entry-info/index.vue": 1782893854.0034747,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/payment-confirm/index.vue": 1782893920.7943869,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/payment-confirm/RefundConfirmTab.vue": 1782893932.9908028,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/payment-confirm/InvoiceRequestTab.vue": 1782893853.8783379,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material-stock-log/index.vue": 1782893853.8275082,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/outside/Iframe.vue": 1782893853.8888595,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/operations/demo/index.vue": 1782893853.8571184,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/operations/clean-room/index.vue": 1782893853.8198242,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/operations/storage-facility/index.vue": 1782893853.715029,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/operations/exhibition-appointment/index.vue": 1782893853.5207253,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/audit/index.vue": 1782893913.7167647,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/sample-info/index.vue": 1782893854.018205,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/sample-info/DonationSampleCollectionInfoTab.vue": 1782893918.3749776,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/index.vue": 1782893912.746235,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationAuditDialog.vue": 1782893853.885547,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue": 1782894167.3038042,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationFormDialog.vue": 1782893853.7512953,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationStatusChangeDialog.vue": 1782893853.688078,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/dashboard/console/index.vue": 1782893853.5152776,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/tenant/index.vue": 1782893853.6602998,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/order/index.vue": 1782893853.5040941,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/unit/index.vue": 1782893853.4396129,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/role/index.vue": 1782893854.095696,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/post/index.vue": 1782893854.0815024,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/category/index.vue": 1782893854.1658938,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/express/index.vue": 1782893854.1084614,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/index.vue": 1782893854.0087445,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/detail.vue": 1782893853.853974,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/modules/user-dialog.vue": 1782893853.9540384,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/modules/user-search.vue": 1782893853.8827589,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/product/index.vue": 1782893853.7838233,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/workflow/my-applications/index.vue": 1782893853.9951289,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/workflow/task-pending/index.vue": 1782893853.9475517,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/workflow/task-completed/index.vue": 1782893853.8960793,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/workflow/components/ProcessStatusTag.vue": 1782893853.8633924,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/workflow/components/ApprovalDialog.vue": 1782893853.836738,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/workflow/designer/FlowDesigner.vue": 1782893853.8128686,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/workflow/process/index.vue": 1782893853.6662621,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/menu/index.vue": 1782893853.4886823,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/site/index.vue": 1782893853.416447,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/dept/index.vue": 1782893853.1672907,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/dict/index.vue": 1782893853.0456495,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/leave/index.vue": 1782893852.9582078,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/output-type/index.vue": 1782893852.8585393,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/cell-product/index.vue": 1782893852.8117232,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/cell-product/SourceChainGraph.vue": 1782893852.699336,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/cell-product/source-chain/ChainLinkEdge.vue": 1782893852.6166403,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/cell-product/source-chain/chainInject.ts": 1781272556.806028,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/cell-product/source-chain/chain-types.ts": 1781272556.8063247,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/cell-product/source-chain/chain-types.ts": 1782886682.0493002,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/cell-product/source-chain/chainFlowTheme.ts": 1781272556.806551,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/cell-product/source-chain/ChainNodeCard.vue": 1781585388.691913,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/cell-product/source-chain/SampleCustomerViewDialog.vue": 1781272556.8079684,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/cell-product/source-chain/ChainNodeCard.vue": 1782893852.5977921,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/cell-product/source-chain/SampleCustomerViewDialog.vue": 1782893852.4629574,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/cell-product/source-chain/chainToFlow.ts": 1781272556.808583,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/my-production-material-usage/index.vue": 1781519341.8139238,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/process-route/index.vue": 1781272556.8092766,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/sop/index.vue": 1782806765.1719818,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-task/index.vue": 1781272556.812188,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/reagent/index.vue": 1782807607.3540442,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/index.vue": 1782472598.0379121,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/my-production-material-usage/index.vue": 1782893852.8452,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/process-route/index.vue": 1782893852.7870154,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/sop/index.vue": 1782893852.719772,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-task/index.vue": 1782893852.6013515,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/reagent/index.vue": 1782893852.5094585,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/index.vue": 1782893853.82419,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/ProductionStepBadge.vue": 1782893853.410545,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts": 1782822330.679258,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue": 1782802994.9180765,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/CompleteProductionTaskDialog.vue": 1781563767.3525257,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskInputEnhancedTable.vue": 1782709493.924029,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchQcWorkOrderDialog.vue": 1782359900.6139107,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/SampleReceptionDialog.vue": 1782807285.1607049,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskEquipmentPanel.vue": 1782720192.2193718,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue": 1782822349.7374394,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/EditTaskInfoDialog.vue": 1781577178.2471955,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskOutputList.vue": 1782806579.0832028,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue": 1782717441.142722,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskPaperAttachmentsPanel.vue": 1782483404.2007074,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/WorkOrderTaskSubList.vue": 1782808939.1268015,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskOutputProductDialog.vue": 1782807317.1565738,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/ProductionWorkOrderCardList.vue": 1782807939.7824953,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/ForwardTaskDialog.vue": 1781563767.3550124,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/WorkOrderTaskStepSubList.vue": 1782808941.5863082,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailActionBar.vue": 1782811786.5727916,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/ProductionWorkOrderTabBar.vue": 1782403774.1374023,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue": 1782893853.2023683,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/CompleteProductionTaskDialog.vue": 1782893853.1254928,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskInputEnhancedTable.vue": 1782893853.0951817,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchQcWorkOrderDialog.vue": 1782893852.9989007,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/SampleReceptionDialog.vue": 1782894085.3789353,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskEquipmentPanel.vue": 1782893853.803821,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue": 1782893853.724633,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/EditTaskInfoDialog.vue": 1782893853.6561613,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskOutputList.vue": 1782893853.4938636,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue": 1782893853.4321866,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskPaperAttachmentsPanel.vue": 1782893853.2361045,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/WorkOrderTaskSubList.vue": 1782893853.2094715,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskOutputProductDialog.vue": 1782893853.1137185,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/ProductionWorkOrderCardList.vue": 1782893852.9759836,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/ForwardTaskDialog.vue": 1782893852.8302743,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/ProductionWorkOrderQcViewDialog.vue": 1782893852.7941833,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/WorkOrderTaskStepSubList.vue": 1782893852.736343,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailActionBar.vue": 1782893852.7041657,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/ProductionWorkOrderTabBar.vue": 1782893852.6336923,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/task-step-editor-persistence.ts": 1782811944.10899,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchStepDialog.vue": 1782472889.9876838,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/tabs/OutboundPilotTab.vue": 1781583381.1088736,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/tabs/ProductionWorkOrderTabPanel.vue": 1782703212.9716113,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/tabs/InboundCellStorageTab.vue": 1781583380.9191706,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/tabs/OutboundBasicExperimentTab.vue": 1781583381.738445,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/tabs/InboundResearchDonationTab.vue": 1781583380.9646196,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/tabs/TemporaryTab.vue": 1781583382.5206525,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchStepDialog.vue": 1782893852.5906737,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/tabs/OutboundPilotTab.vue": 1782893853.79892,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/tabs/ProductionWorkOrderTabPanel.vue": 1782893853.7061236,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/tabs/InboundCellStorageTab.vue": 1782893853.6783733,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/tabs/OutboundBasicExperimentTab.vue": 1782893853.643957,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/tabs/InboundResearchDonationTab.vue": 1782893853.5110183,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/tabs/TemporaryTab.vue": 1782893853.4739556,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/tabs/tab-registry.ts": 1781583377.0075235,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/tabs/OutboundClinicalTab.vue": 1781583382.4319067,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/composables/production-view-sections.ts": 1782719454.9569902,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/composables/useProductionViewDialog.ts": 1782804077.1251862,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/tabs/OutboundClinicalTab.vue": 1782893853.4355772,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/composables/production-view-sections.ts": 1782894016.9828084,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/composables/useProductionViewDialog.ts": 1782893377.8080904,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/composables/useProductionWorkOrderTabStepCounts.ts": 1782703040.673378,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/composables/useProductionWorkOrderTabPage.ts": 1782703027.661491,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/view-dialogs/InboundResearchDonationProductionViewDialog.vue": 1782804087.1839645,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/view-dialogs/OutboundClinicalProductionViewDialog.vue": 1782804098.0982833,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/view-dialogs/InboundCellStorageProductionViewDialog.vue": 1782804083.03463,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/composables/useProductionWorkOrderTabPage.ts": 1782881469.5639377,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/view-dialogs/InboundResearchDonationProductionViewDialog.vue": 1782893853.8921535,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/view-dialogs/OutboundClinicalProductionViewDialog.vue": 1782893853.8665204,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/view-dialogs/InboundCellStorageProductionViewDialog.vue": 1782893853.844183,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/view-dialogs/view-dialog-registry.ts": 1781583337.2398212,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/view-dialogs/OutboundPilotProductionViewDialog.vue": 1782804090.4785566,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/view-dialogs/OutboundBasicExperimentProductionViewDialog.vue": 1782804094.8326685,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/view-dialogs/ProductionWorkOrderViewDialogFrame.vue": 1781604410.6211355,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/view-dialogs/TemporaryProductionViewDialog.vue": 1782804101.4998384,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/consumable-pack/index.vue": 1781272556.8373108,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/consumable/index.vue": 1782807600.2611506,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/consumable/ConsumablePackTab.vue": 1782806765.2088249,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/cleanroom-garment/index.vue": 1782806466.559312,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-material/index.vue": 1782807688.9650154,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-material/MaterialConsumptionTab.vue": 1782806424.5374637,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-material/ProductionMaterialConfiguredCatalogDialog.vue": 1782807285.1564362,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-material/ProductionMaterialUsageTab.vue": 1782806765.2171237,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-material/ProductionMaterialStockCheckTab.vue": 1782807285.1576262,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-material/ProductionMaterialPrepTab.vue": 1782807285.1570644,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/sample-reception-completion/index.vue": 1781272556.844081,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/my-production-task/index.vue": 1782807942.2348688,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/equipment/index.vue": 1782807285.1538954,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/process/index.vue": 1782806765.2282925,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/process/ProcessRouteTab.vue": 1782806765.2317605,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/process-category/index.vue": 1781585388.7112913,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/process-category/OutputTypeTab.vue": 1782806765.2330196,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/index/index.vue": 1781272556.8548205,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/index.vue": 1782569794.1409402,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderTaskResultPanel.vue": 1782571024.398393,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderProtocolGroup.vue": 1782601949.6612926,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderSingleCard.vue": 1782709503.4541216,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderConfigureBatches.vue": 1782569795.7830539,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderFeeSummaryBar.vue": 1781585388.7152023,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderSampleGroup.vue": 1782569111.7000496,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderBatchResultTabs.vue": 1782527293.5294008,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderTaskSubList.vue": 1782807311.4193377,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderTabBar.vue": 1782394192.4055598,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderBatchSubList.vue": 1782569501.6892183,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderCardList.vue": 1782569103.9185495,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderProtocolPaymentPanel.vue": 1782806424.6486642,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/OutboundPilotTab.vue": 1781582034.0446215,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/InboundCellStorageTab.vue": 1781582031.9110096,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/QcWorkOrderTabPanel.vue": 1782802285.344359,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/OutboundBasicExperimentTab.vue": 1781582033.9975233,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/InboundResearchDonationTab.vue": 1781582033.9975069,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/AllTab.vue": 1782393769.7060475,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/TemporaryTab.vue": 1781582036.0799434,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/view-dialogs/OutboundPilotProductionViewDialog.vue": 1782893853.96219,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/view-dialogs/OutboundBasicExperimentProductionViewDialog.vue": 1782893853.9010103,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/view-dialogs/ProductionWorkOrderViewDialogFrame.vue": 1782893853.8742938,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/view-dialogs/TemporaryProductionViewDialog.vue": 1782893853.8400733,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/consumable-pack/index.vue": 1782893852.5431323,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/consumable/index.vue": 1782893852.7799647,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/consumable/ConsumablePackTab.vue": 1782893852.689723,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/cleanroom-garment/index.vue": 1782893852.58252,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-material/index.vue": 1782893852.391863,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-material/MaterialConsumptionTab.vue": 1782893852.3221345,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-material/ProductionMaterialConfiguredCatalogDialog.vue": 1782893852.288642,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-material/ProductionMaterialUsageTab.vue": 1782893852.263329,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-material/ProductionMaterialStockCheckTab.vue": 1782893852.1908164,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-material/ProductionMaterialPrepTab.vue": 1782893852.1329908,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/sample-reception-completion/index.vue": 1782893851.986683,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/my-production-task/index.vue": 1782893851.9189324,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/equipment/index.vue": 1782893851.7107234,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/process/index.vue": 1782893851.6625698,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/process/ProcessRouteTab.vue": 1782893851.6356437,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/process-category/index.vue": 1782893851.5846715,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/process-category/OutputTypeTab.vue": 1782893851.5618722,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/index/index.vue": 1782893851.535544,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/index.vue": 1782893854.1761613,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderTaskResultPanel.vue": 1782893853.990059,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderProtocolGroup.vue": 1782893854.0760326,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderSingleCard.vue": 1782893854.0393713,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderConfigureBatches.vue": 1782893853.9850519,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderFeeSummaryBar.vue": 1782893853.9414947,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderSampleGroup.vue": 1782893854.1439548,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderBatchResultTabs.vue": 1782893854.2285423,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcUnfinishedBadge.vue": 1782893854.1479301,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderTaskSubList.vue": 1782894082.652902,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderTabBar.vue": 1782893854.0314786,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderBatchSubList.vue": 1782893854.0134735,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderCardList.vue": 1782893853.9724226,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/QcWorkOrderProtocolPaymentPanel.vue": 1782893853.9119349,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/OutboundPilotTab.vue": 1782893854.159883,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/InboundCellStorageTab.vue": 1782893854.1357596,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/QcWorkOrderTabPanel.vue": 1782893854.0690873,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/OutboundBasicExperimentTab.vue": 1782893854.2442567,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/InboundResearchDonationTab.vue": 1782893854.1390157,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/AllTab.vue": 1782893854.1312714,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/TemporaryTab.vue": 1782893854.0570166,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/tab-registry.ts": 1782393772.4243252,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/OutboundClinicalTab.vue": 1781582035.6614258,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/tabs/OutboundClinicalTab.vue": 1782893854.022184,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/composables/useQcWorkOrderAttachmentExport.ts": 1782875325.8554192,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/composables/useOutboundQcViewDialog.ts": 1782398591.849214,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/composables/useQcWorkOrderTaskViewSections.ts": 1782527340.2357967,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/composables/useQcWorkOrderTabUnfinishedCounts.ts": 1782394182.2860413,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/composables/useInboundQcViewDialog.ts": 1782398606.799624,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/composables/useQcViewAttachmentHelpers.ts": 1781581579.8782947,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/composables/inbound-view-sections.ts": 1782719456.2815473,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/composables/qc-work-order-selection.ts": 1782875325.8554592,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/composables/inbound-view-sections.ts": 1782894008.6336527,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/composables/useQcWorkOrderTabPage.ts": 1782802279.1326668,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/view-dialogs/QcWorkOrderSystemViewDialog.vue": 1782527303.4342577,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/view-dialogs/OutboundQcProductTable.vue": 1781604200.1464918,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/view-dialogs/OutboundQcDiagnosisAttachments.vue": 1781581843.4276094,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/view-dialogs/QcWorkOrderSystemViewDialog.vue": 1782893854.2724051,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/view-dialogs/OutboundQcProductTable.vue": 1782893854.2596574,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/view-dialogs/OutboundQcDiagnosisAttachments.vue": 1782893854.2985036,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/view-dialogs/view-dialog-registry.ts": 1782393780.8839016,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/view-dialogs/InboundResearchDonationViewDialog.vue": 1782568343.8739738,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/view-dialogs/OutboundBasicExperimentViewDialog.vue": 1782568344.859248,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/view-dialogs/OutboundClinicalViewDialog.vue": 1782568345.2663684,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/view-dialogs/InboundCellStorageViewDialog.vue": 1782568343.409268,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/view-dialogs/TemporaryQcViewDialog.vue": 1782568345.6685846,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/view-dialogs/OutboundPilotViewDialog.vue": 1782568344.3903468,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/sample-reception-check-item/index.vue": 1782806765.2492979,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/lab-test-item/index.vue": 1782446811.4107797,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/lab-test-item/ThirdPartyCompanyTab.vue": 1782446800.711475,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/my-qc-material-usage/index.vue": 1781518516.1543977,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/index.vue": 1782807687.8569708,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/QcMaterialStockCheckTab.vue": 1782807285.1703076,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/QcMaterialUsageTab.vue": 1782806765.2571297,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/QcMaterialBatchAttachmentDialog.vue": 1781690342.0885053,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/pre-transit-sample/index.vue": 1782206029.583706,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/pre-transit-sample/PreTransitProtocolCardList.vue": 1782806424.693305,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/sample-reception/index.vue": 1782806471.8828664,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/sample-reception/SampleReceptionCardList.vue": 1782806424.7032602,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/my-qc-task/index.vue": 1782394624.819391,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/env-detect-record/index.vue": 1782377015.4291072,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/env-detect-item/index.vue": 1782806765.2688828,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-task/index.vue": 1781272556.8975937,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/storage-release-review/index.vue": 1782806424.713873,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/storage-release-review/StorageReleaseReviewDialog.vue": 1781585388.7405016,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/storage-release-review/StorageReleaseViewDialog.vue": 1782719629.6514444,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material-usage/index.vue": 1781272556.9013255,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/third-party-company/index.vue": 1781415011.0881364,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/exception/500/index.vue": 1781272556.902236,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/exception/403/index.vue": 1781272556.9027894,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/exception/404/index.vue": 1781272556.9030628,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/cell-product-type/index.vue": 1781602131.352225,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/cell-product-type/CellProductPriceTab.vue": 1782806765.2868826,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/cell-product-type/ProjectPriceSystemTab.vue": 1782806765.288243,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/cell-product-type/CellProductSpecTab.vue": 1782806765.2891116,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/checkup-institution/index.vue": 1781563767.334401,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/checkup-institution/CheckupPackagePanel.vue": 1781563767.3335872,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/infusion-schedule-management/index.vue": 1781272556.9129293,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/infusion-schedule-management/InfusionScheduleHandoverDialog.vue": 1781598379.1921296,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/infusion-schedule-management/ScheduleViewDialog.vue": 1781604365.0831292,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/infusion-schedule-management/ScheduleCancelDialog.vue": 1781566676.0091887,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/infusion-schedule-management/ScheduleEditDialog.vue": 1782807285.131992,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/channel-service-order/index.vue": 1781272556.9223943,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/channel-service-order/ServiceOrderTxnTable.vue": 1782806765.3084352,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/channel-service-order/ServiceOrderTxnDialog.vue": 1782807285.1278553,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/channel/index.vue": 1782806765.3169377,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/channel/ChannelViewDialog.vue": 1782806499.307967,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/channel/ChannelServiceOrderTab.vue": 1782807285.1263318,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/clinical-refund-confirm/index.vue": 1781272556.946893,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/clinical-payment-confirm/index.vue": 1782806765.327235,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/clinical-payment-confirm/RefundConfirmTab.vue": 1782806765.328616,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/outbound-release-review/index.vue": 1781603476.7874172,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/outbound-release-review/OutboundReleaseViewDialog.vue": 1781604292.523926,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/outbound-release-review/OutboundReleaseReviewDialog.vue": 1781603474.5398026,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/outbound-release-review/OutboundReleaseMaterialDialog.vue": 1782807285.1330345,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/outbound-release-review/OutboundReleaseReviewCardList.vue": 1782806424.8038495,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/pilot-application/index.vue": 1781600006.408287,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/pilot-application/ApplicationDetailDialog.vue": 1782807285.134655,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/pilot-application/PilotApplicationTab.vue": 1782806765.33439,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/pilot-application/ApplicationViewDialog.vue": 1781682542.890803,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/pilot-application/InfusionScheduleTab.vue": 1782806424.8367257,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/pilot-application/ApplicationFormDialog.vue": 1782807285.135783,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/pilot-application/CheckupManagementTab.vue": 1782806424.8579202,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/pilot-application/ClinicalPaymentTab.vue": 1782807285.1399512,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/cell-product-price/index.vue": 1781272557.4568446,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/checkup-management/index.vue": 1781272557.4618897,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/checkup-management/CheckupReserveItemsTable.vue": 1781272557.4705725,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/checkup-management/CheckupViewDialog.vue": 1781585388.7666178,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/checkup-management/CheckupRegisterDialog.vue": 1781585388.7670863,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/checkup-management/CheckupDetailDialog.vue": 1782807285.129314,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/view-dialogs/InboundResearchDonationViewDialog.vue": 1782893854.249279,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/view-dialogs/OutboundBasicExperimentViewDialog.vue": 1782893854.332497,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/view-dialogs/OutboundClinicalViewDialog.vue": 1782893854.316651,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/view-dialogs/InboundCellStorageViewDialog.vue": 1782893854.3284824,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/view-dialogs/TemporaryQcViewDialog.vue": 1782893854.3063695,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/view-dialogs/OutboundPilotViewDialog.vue": 1782893854.200392,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/sample-reception-check-item/index.vue": 1782893853.86999,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/lab-test-item/index.vue": 1782893853.832618,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/lab-test-item/ThirdPartyCompanyTab.vue": 1782893853.7928631,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/my-qc-material-usage/index.vue": 1782893853.6503608,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/index.vue": 1782893853.482704,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/QcMaterialStockCheckTab.vue": 1782893853.4241662,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/QcMaterialUsageTab.vue": 1782893853.162949,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/QcMaterialBatchAttachmentDialog.vue": 1782893853.076457,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/pre-transit-sample/index.vue": 1782893853.0101395,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/pre-transit-sample/PreTransitProtocolCardList.vue": 1782894112.8165123,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/sample-reception/index.vue": 1782894068.248391,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/sample-reception/SampleReceptionCardList.vue": 1782894078.8557267,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/my-qc-task/index.vue": 1782893853.507648,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/env-detect-record/index.vue": 1782893853.44988,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/env-detect-item/index.vue": 1782893853.1796434,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-task/index.vue": 1782893853.146115,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/storage-release-review/index.vue": 1782894202.6907072,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/storage-release-review/StorageReleaseReviewDialog.vue": 1782893853.0158439,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/storage-release-review/StorageReleaseViewDialog.vue": 1782894179.409189,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material-usage/index.vue": 1782893852.8511324,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/third-party-company/index.vue": 1782893852.8158212,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/exception/500/index.vue": 1782893852.7265046,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/exception/403/index.vue": 1782893852.6942284,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/exception/404/index.vue": 1782893852.624851,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/cell-product-type/index.vue": 1782893853.037768,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/cell-product-type/CellProductPriceTab.vue": 1782893852.9823923,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/cell-product-type/ProjectPriceSystemTab.vue": 1782893852.8638844,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/cell-product-type/CellProductSpecTab.vue": 1782893852.8212717,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/checkup-institution/index.vue": 1782893852.743487,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/checkup-institution/CheckupPackagePanel.vue": 1782893852.611682,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/infusion-schedule-management/index.vue": 1782893852.4317713,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/infusion-schedule-management/InfusionScheduleHandoverDialog.vue": 1782893852.3551466,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/infusion-schedule-management/ScheduleViewDialog.vue": 1782893852.3188872,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/infusion-schedule-management/ScheduleCancelDialog.vue": 1782893852.2808146,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/infusion-schedule-management/ScheduleEditDialog.vue": 1782893852.2546618,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/channel-service-order/index.vue": 1782893852.1531374,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/channel-service-order/ServiceOrderTxnTable.vue": 1782893852.1199427,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/channel-service-order/ServiceOrderTxnDialog.vue": 1782893852.0296383,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/channel/index.vue": 1782893851.968867,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/channel/ChannelViewDialog.vue": 1782893851.910507,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/channel/ChannelServiceOrderTab.vue": 1782893851.6874495,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/clinical-refund-confirm/index.vue": 1782893851.613325,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/clinical-payment-confirm/index.vue": 1782893853.444681,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/clinical-payment-confirm/RefundConfirmTab.vue": 1782893853.2308147,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/outbound-release-review/index.vue": 1782893853.1534364,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/outbound-release-review/OutboundReleaseViewDialog.vue": 1782893853.1006944,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/outbound-release-review/OutboundReleaseReviewDialog.vue": 1782893853.242398,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/outbound-release-review/OutboundReleaseMaterialDialog.vue": 1782893853.1737905,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/outbound-release-review/OutboundReleaseReviewCardList.vue": 1782893853.0584636,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/pilot-application/index.vue": 1782893852.991473,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/pilot-application/ApplicationDetailDialog.vue": 1782893852.9339294,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/pilot-application/PilotApplicationTab.vue": 1782893852.8262732,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/pilot-application/ApplicationViewDialog.vue": 1782893852.7602282,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/pilot-application/InfusionScheduleTab.vue": 1782893852.6786568,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/pilot-application/ApplicationFormDialog.vue": 1782893852.5596623,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/pilot-application/CheckupManagementTab.vue": 1782893852.365706,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/pilot-application/ClinicalPaymentTab.vue": 1782893852.3358445,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/cell-product-price/index.vue": 1782893852.3049684,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/checkup-management/index.vue": 1782893852.2775676,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/checkup-management/CheckupReserveItemsTable.vue": 1782893852.2584097,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/checkup-management/CheckupViewDialog.vue": 1782893852.231232,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/checkup-management/CheckupRegisterDialog.vue": 1782893852.176913,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/checkup-management/CheckupDetailDialog.vue": 1782893852.1057308,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/checkup-management/checkup-reserve-items.ts": 1781272557.5954251,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/checkup-management/CheckupFillDialog.vue": 1781594573.8421357,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/checkup-management/CheckupMarkCheckedDialog.vue": 1781594629.8261228,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/clinical-payment-info/index.vue": 1781272558.0460358,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/channel-service-order-finance/index.vue": 1782806765.3620505,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/project-price-system/index.vue": 1781272558.2950988,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/cell-product-spec/index.vue": 1781272558.3464932,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/sample-code/index.vue": 1781272558.356484,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/cell-sample-type/index.vue": 1781747673.1194487,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/cell-sample-type/SampleCodeTab.vue": 1782806765.3995123,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/insurance-company/index.vue": 1781563767.3120062,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/collection-protocol-no/index.vue": 1781272558.4055521,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/customer/index.vue": 1782806765.4357877,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/collection-region/index.vue": 1782806765.436434,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/collection-region/CollectionProtocolNoTab.vue": 1782806765.438883,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/checkup-management/CheckupFillDialog.vue": 1782893851.993419,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/checkup-management/CheckupMarkCheckedDialog.vue": 1782893851.9295256,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/clinical-payment-info/index.vue": 1782893851.7028527,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/channel-service-order-finance/index.vue": 1782893851.6796,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/project-price-system/index.vue": 1782893851.639349,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/cell-product-spec/index.vue": 1782893851.5999632,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/sample-code/index.vue": 1782893851.5876079,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/cell-sample-type/index.vue": 1782893851.5657287,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/cell-sample-type/SampleCodeTab.vue": 1782893851.5487845,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/insurance-company/index.vue": 1782893851.6212523,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/collection-protocol-no/index.vue": 1782893851.573797,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/customer/index.vue": 1782893851.5518563,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/collection-region/index.vue": 1782893851.539197,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/collection-region/CollectionProtocolNoTab.vue": 1782893851.5241253,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/assets/svg/loading.ts": 1781272558.486104,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/store/index.ts": 1781272559.227605,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/qc-menu-badge.ts": 1782394567.2213001,
+20
View File
@@ -0,0 +1,20 @@
import request from '@/utils/http'
export type InboundSampleSpecialMarkPayload = {
receptionSource: 'cell_storage' | 'research_donation'
protocolSampleId: string
isSpecial: boolean
specialRemark?: string
}
export type InboundSampleSpecialMarkResult = {
isSpecial: boolean
specialRemark: string
}
export function fetchUpdateInboundSampleSpecialMark(data: InboundSampleSpecialMarkPayload) {
return request.put<InboundSampleSpecialMarkResult>({
url: '/web/admin/inbound-samples/special-mark',
data
})
}
+1
View File
@@ -28,6 +28,7 @@ export type MaterialUsage = {
stockBefore?: number
stockAfter: number
receiver?: string
operatorName?: string
purpose?: string
useTime?: string
sourceType: string
+13 -9
View File
@@ -88,17 +88,18 @@ export type MaterialBatchOption = {
}
export type StockInPayload = {
stockInNo: string
stockInDate: string
expireDate: string
catalogNo: string
batchNo: string
manufacturer: string
unitPrice: number
amount: number
qty: number
stockInNo?: string
stockInDate?: string
expireDate?: string
catalogNo?: string
batchNo?: string
manufacturer?: string
unitPrice?: number
amount?: number
qty?: number
remark?: string
stockInTime?: string
operatorName?: string
}
export type BatchStockInLine = StockInPayload & {
@@ -184,6 +185,7 @@ export function fetchBatchStockInMaterial(data: {
items: BatchStockInLine[]
remark?: string
stockInTime?: string
operatorName?: string
}) {
return request.post<{ count: number }>({
url: '/web/admin/material-batches/batch-stock-in',
@@ -210,6 +212,7 @@ export function fetchBatchStockOutMaterial(data: {
purpose?: string
remark?: string
stockOutTime?: string
operatorName?: string
}) {
return request.post<{ count: number }>({
url: '/web/admin/material-batches/batch-stock-out',
@@ -222,6 +225,7 @@ export function fetchBatchDiscardMaterial(data: {
discardReason: string
remark?: string
discardTime?: string
operatorName?: string
}) {
return request.post<{ count: number }>({
url: '/web/admin/material-batches/batch-discard',
@@ -20,6 +20,8 @@ export interface ProductionWorkOrderItem {
receptionSource?: string
receptionSourceLabel?: string
sampleTypeName?: string
isSpecial?: boolean
specialRemark?: string
handlerName?: string
receptionTime?: string
workOrderStatus: string
@@ -195,6 +197,19 @@ export function fetchCreateQcFromProduction(
})
}
export type ProductionWorkOrderQcInfoDetail = {
showGateSection?: boolean
gateQcInfo?: import('@/components/business/sample-qc-info-cards/index.vue').SampleQcInfo | null
processQcInfoList?: import('@/components/business/sample-qc-info-cards/index.vue').SampleQcInfo[]
sampleReception?: import('@/components/business/sample-qc-info-cards/index.vue').SampleReceptionBrief | null
}
export function fetchProductionWorkOrderQcInfo(workOrderId: string) {
return request.get<ProductionWorkOrderQcInfoDetail>({
url: `/web/admin/production-work-orders/${workOrderId}/qc-info`
})
}
export type ProductionWorkOrderTabStepCount = {
overdueIncomplete: number
unassigned: number
Loaded 100 of 478 files, more files were not shown because too many files have changed in this diff. Show more