提交
This commit is contained in:
1 parent
15ed25e33b
commit
dc31968204
143 files changed
+15823
-9989
No files matched your search
@@ -0,0 +1,5 @@
|
||||
# 交互规范
|
||||
|
||||
- 所有回复和思考必须使用中文
|
||||
- 每次回复开头称呼用户为"龙舞"
|
||||
- 视觉读取(图片分析、截图识别等)优先使用自身能力
|
||||
@@ -28,7 +28,7 @@ Full specs: `openspec/changes/zkxw-engineering-standards/specs/*/spec.md`. Below
|
||||
- **Sidebar menu icons**: First-level menu items SHALL show icons before the name; second-level and deeper items SHALL NOT show icons (text only). Implemented via `level === 0` check in `SidebarSubmenu.vue`.
|
||||
- **Tab bar (WorkTab) icons**: Tab bar tabs SHALL NOT show icons — only text titles. `meta.icon` is for sidebar only.
|
||||
- **Form field annotations**: Field hints (e.g. "数值越小越靠前") SHALL appear as small text after the label via `<template #label>字段名<span class="form-label-tip">注释</span></template>`, NOT beside the input control. Style class: `.form-label-tip` (12px, `--mint-text-muted`).
|
||||
- **Attachment upload card layout**: Upload trigger SHALL be a card (120×96px, dashed border `#a7f3d0`) placed inline as the first item in the same flex row as uploaded attachment cards. Hint text below the row. See `openspec/.../ui-conventions/spec.md` "附件上传卡片化布局" for full spec + CSS reference.
|
||||
- **Attachment upload card layout**: Upload trigger SHALL be a card (140×96px, dashed border `#a7f3d0`) inline as the first item in the same flex row as uploaded attachment cards; select file → immediate upload via `fetchUploadAttachment`; preview/download/delete on cards; hint below the row. Authority: `ProtocolFormDialog.vue` «协议附件». See `openspec/changes/zkxw-engineering-standards/specs/ui-conventions/spec.md` §「附件上传卡片化布局」for full Vue template + SCSS + interaction rules.
|
||||
- **Sort fields (sort_order/orderNum)**: web-admin 列表、新增弹窗、编辑弹窗中默认不展示排序字段。后续根据功能需要自行添加。
|
||||
- **Status/conclusion/type fields as Tags**: All status, conclusion, and type fields in table columns and view dialogs SHALL render as `<el-tag>` with semantic colors. Tables: use `<el-tag :type="..." size="small">` in column templates. SystemViewDialog: use `tagType` property on `ViewField`. Semantic colors: `success`=正常/启用/已完成/通过, `warning`=进行中/待确认/已过期, `danger`=异常/已作废/拒绝/不通过, `info`=待执行/待生效/停用/默认, `primary`=特殊分类/来源类型. SHALL NOT use plain text or custom `<span class="tag">`. See `openspec/.../ui-conventions/spec.md` "状态、结论与类型字段使用 Tag 标签展示".
|
||||
- **Template pages** — new pages SHALL match these exactly:
|
||||
@@ -40,6 +40,7 @@ Full specs: `openspec/changes/zkxw-engineering-standards/specs/*/spec.md`. Below
|
||||
|
||||
### API Conventions (backend)
|
||||
|
||||
- **Cell-storage sample cross-table key**: Matching `biz_protocol_sample` to downstream rows (sample reception, QC work orders, etc.) SHALL use `tenant_no` + `sample_code` only—not `collection_protocol_id` or `protocol_sample_id` (protocol may change; sample code does not). See `openspec/changes/zkxw-engineering-standards/specs/api-conventions/spec.md` §「细胞存储样本跨表关联键」.
|
||||
- **Tenant isolation**: All business data queries SHALL filter by current user's `tenant_no`. All write/update endpoints SHALL set `tenant_no` to the current user's tenant. MUST NOT trust client-submitted tenant overrides (unless multi-tenant admin API with security review).
|
||||
- **Data permission**: All business queries SHALL apply data scope filtering based on the union of all roles assigned to the current user (menu + data permissions both use union semantics).
|
||||
- **Default sort**: Lists SHALL sort by `create_time DESC` when no custom sort is specified.
|
||||
|
||||
@@ -27,6 +27,7 @@ DATABASE_URL=mysql+pymysql://root:password@localhost:3306/zkxw
|
||||
# LOGIN_ENCRYPT_TS_SKEW_SEC=300
|
||||
|
||||
# Redis 配置(用于会话/Token 吊销;需在后端运行时配置)
|
||||
# 启用后:已登录用户每次 API 校验通过会滑动续期会话(7 天无操作则会话失效);未配置则仅校验 JWT。
|
||||
# REDIS_HOST=127.0.0.1
|
||||
# REDIS_PORT=6379
|
||||
# REDIS_DB=0
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
94150
|
||||
87270
|
||||
@@ -681,101 +681,16 @@ async def list_storage_certs(
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
tenant_no = _get_tenant_no(db, user)
|
||||
q = (
|
||||
db.query(BizCollectionProtocol)
|
||||
.filter(
|
||||
BizCollectionProtocol.del_flag == 0,
|
||||
BizCollectionProtocol.tenant_no == tenant_no,
|
||||
BizCollectionProtocol.protocol_status == "sxz",
|
||||
)
|
||||
page_items, total = cp_svc.list_storage_certs(
|
||||
db,
|
||||
tenant_no=tenant_no,
|
||||
keyword=keyword,
|
||||
make_status=makeStatus,
|
||||
page=page,
|
||||
page_size=pageSize,
|
||||
)
|
||||
kw = (keyword or "").strip()
|
||||
if kw:
|
||||
like = f"%{kw}%"
|
||||
q = q.filter(BizCollectionProtocol.protocol_no.like(like))
|
||||
|
||||
protocol_ids_sub = q.with_entities(BizCollectionProtocol.id).subquery()
|
||||
|
||||
sample_exists = (
|
||||
db.query(BizProtocolSample)
|
||||
.filter(
|
||||
BizProtocolSample.collection_protocol_id == protocol_ids_sub.c.id,
|
||||
BizProtocolSample.del_flag == 0,
|
||||
BizProtocolSample.sample_status == "yrk",
|
||||
)
|
||||
.limit(1)
|
||||
.exists()
|
||||
)
|
||||
|
||||
q = q.filter(sample_exists)
|
||||
rows_all = q.order_by(BizCollectionProtocol.create_time.desc()).all()
|
||||
|
||||
protocol_ids = [r.id for r in rows_all]
|
||||
pc_map: Dict[str, Any] = {}
|
||||
sc_map: Dict[str, Any] = {}
|
||||
sample_map: Dict[str, List[Dict[str, Any]]] = {}
|
||||
if protocol_ids:
|
||||
pc_rows = (
|
||||
db.query(BizProtocolPartyCustomer)
|
||||
.filter(
|
||||
BizProtocolPartyCustomer.collection_protocol_id.in_(protocol_ids),
|
||||
BizProtocolPartyCustomer.del_flag == 0,
|
||||
)
|
||||
.all()
|
||||
)
|
||||
for pc in pc_rows:
|
||||
pc_map[pc.collection_protocol_id] = pc
|
||||
|
||||
sc_rows = (
|
||||
db.query(BizProtocolStorageCert)
|
||||
.filter(
|
||||
BizProtocolStorageCert.collection_protocol_id.in_(protocol_ids),
|
||||
BizProtocolStorageCert.del_flag == 0,
|
||||
)
|
||||
.all()
|
||||
)
|
||||
for sc in sc_rows:
|
||||
sc_map[sc.collection_protocol_id] = sc
|
||||
|
||||
s_rows = (
|
||||
db.query(BizProtocolSample)
|
||||
.filter(
|
||||
BizProtocolSample.collection_protocol_id.in_(protocol_ids),
|
||||
BizProtocolSample.del_flag == 0,
|
||||
BizProtocolSample.sample_status == "yrk",
|
||||
)
|
||||
.all()
|
||||
)
|
||||
for s in s_rows:
|
||||
sample_map.setdefault(s.collection_protocol_id, []).append(
|
||||
cp_svc._sample_to_dict(s)
|
||||
)
|
||||
|
||||
items: List[Dict[str, Any]] = []
|
||||
for r in rows_all:
|
||||
sc = sc_map.get(r.id)
|
||||
ms = (sc.make_status or "0") if sc else "0"
|
||||
if makeStatus and makeStatus.strip() and ms != makeStatus.strip():
|
||||
continue
|
||||
pc = pc_map.get(r.id)
|
||||
d: Dict[str, Any] = {
|
||||
"id": r.id,
|
||||
"protocolNo": r.protocol_no or "",
|
||||
"protocolStatus": r.protocol_status or "",
|
||||
"motherName": (pc.mother_name or "") if pc else "",
|
||||
"newbornDeliveryTime": cp_svc._fmt_dt(pc.newborn_delivery_time) if pc else "",
|
||||
"samples": sample_map.get(r.id, []),
|
||||
"makeStatus": ms,
|
||||
"certImageUrls": (sc.cert_image_urls or "") if sc else "",
|
||||
"makeDate": ((sc.make_date or "").strip() if sc.make_date else "") if sc else "",
|
||||
}
|
||||
items.append(d)
|
||||
|
||||
total = len(items)
|
||||
page_safe = max(1, page)
|
||||
page_size_safe = min(max(1, pageSize), 100)
|
||||
start = (page_safe - 1) * page_size_safe
|
||||
page_items = items[start : start + page_size_safe]
|
||||
tp = cp_svc.total_pages(total, page_size_safe)
|
||||
return success_response(
|
||||
{"list": page_items, "total": total, "page": page_safe, "pageSize": page_size_safe, "totalPages": tp}
|
||||
@@ -792,20 +707,18 @@ async def list_fullmoon_todos(
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
tenant_no = _get_tenant_no(db, user)
|
||||
party_join = sa_and(
|
||||
BizProtocolPartyCustomer.collection_protocol_id == BizCollectionProtocol.id,
|
||||
BizProtocolPartyCustomer.del_flag == 0,
|
||||
BizProtocolPartyCustomer.tenant_no == tenant_no,
|
||||
)
|
||||
q = (
|
||||
db.query(BizCollectionProtocol, BizProtocolPartyCustomer)
|
||||
.join(
|
||||
BizProtocolPartyCustomer,
|
||||
sa_and(
|
||||
BizProtocolPartyCustomer.collection_protocol_id == BizCollectionProtocol.id,
|
||||
BizProtocolPartyCustomer.del_flag == 0,
|
||||
),
|
||||
)
|
||||
.outerjoin(BizProtocolPartyCustomer, party_join)
|
||||
.filter(
|
||||
BizCollectionProtocol.del_flag == 0,
|
||||
BizCollectionProtocol.tenant_no == tenant_no,
|
||||
BizCollectionProtocol.protocol_status == "sxz",
|
||||
BizProtocolPartyCustomer.tenant_no == tenant_no,
|
||||
)
|
||||
)
|
||||
kw = (keyword or "").strip()
|
||||
@@ -837,33 +750,49 @@ async def list_fullmoon_todos(
|
||||
ft_map[ft.collection_protocol_id] = ft
|
||||
|
||||
now = datetime.now()
|
||||
_empty_ft: Dict[str, Any] = {
|
||||
"todoStatus": "0",
|
||||
"handleDate": "",
|
||||
"handleRemark": "",
|
||||
"insuranceAttachments": "",
|
||||
"insuranceCompanyId": "",
|
||||
"insuranceCompanyName": "",
|
||||
"insuranceType": "",
|
||||
"insurancePolicyNo": "",
|
||||
"insuranceEffectiveDate": "",
|
||||
"insuranceExpiryDate": "",
|
||||
"insuranceSubscribed": "0",
|
||||
"insuranceFee": None,
|
||||
}
|
||||
items: List[Dict[str, Any]] = []
|
||||
for proto, pc in rows:
|
||||
dt = pc.newborn_delivery_time
|
||||
if not dt:
|
||||
continue
|
||||
fullmoon_date = dt + timedelta(days=30)
|
||||
if fullmoon_date > now:
|
||||
continue
|
||||
dt = pc.newborn_delivery_time if pc else None
|
||||
fullmoon_date_str = ""
|
||||
is_fullmoon_passed = False
|
||||
if dt:
|
||||
fullmoon_date = dt + timedelta(days=30)
|
||||
fullmoon_date_str = fullmoon_date.strftime("%Y-%m-%d")
|
||||
is_fullmoon_passed = fullmoon_date <= now
|
||||
ft = ft_map.get(proto.id)
|
||||
ts = (ft.todo_status or "0") if ft else "0"
|
||||
if todoStatus and todoStatus.strip() and ts != todoStatus.strip():
|
||||
continue
|
||||
d: Dict[str, Any] = {
|
||||
"id": proto.id,
|
||||
"protocolNo": proto.protocol_no or "",
|
||||
"protocolStatus": proto.protocol_status or "",
|
||||
"motherName": pc.mother_name or "",
|
||||
"motherPhone": pc.mother_phone or "",
|
||||
"newbornName": pc.newborn_name or "",
|
||||
"newbornDeliveryTime": cp_svc._fmt_dt(dt),
|
||||
"fullmoonDate": fullmoon_date.strftime("%Y-%m-%d"),
|
||||
}
|
||||
if ft:
|
||||
d["fullmoonTodo"] = cp_svc._fullmoon_todo_to_dict(ft)
|
||||
else:
|
||||
d["fullmoonTodo"] = None
|
||||
items.append(d)
|
||||
ft_dict = cp_svc._fullmoon_todo_to_dict(ft) if ft else dict(_empty_ft)
|
||||
items.append(
|
||||
{
|
||||
"protocolId": proto.id,
|
||||
"id": proto.id,
|
||||
"protocolNo": proto.protocol_no or "",
|
||||
"protocolStatus": proto.protocol_status or "",
|
||||
"motherName": (pc.mother_name if pc else "") or "",
|
||||
"motherPhone": (pc.mother_phone if pc else "") or "",
|
||||
"newbornName": (pc.newborn_name if pc else "") or "",
|
||||
"newbornDeliveryTime": cp_svc._fmt_dt(dt) if dt else "",
|
||||
"fullmoonDate": fullmoon_date_str,
|
||||
"isFullmoonPassed": is_fullmoon_passed,
|
||||
**ft_dict,
|
||||
}
|
||||
)
|
||||
|
||||
total = len(items)
|
||||
page_safe = max(1, page)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"""保险公司管理 API(保险公司 + 开票信息 + 项目价格)"""
|
||||
"""保险公司及险种价格管理 API(保险公司 + 开票信息 + 险种价格)"""
|
||||
import math
|
||||
import uuid
|
||||
from datetime import datetime
|
||||
@@ -18,7 +18,7 @@ from app.models.models import (
|
||||
SysUser,
|
||||
)
|
||||
|
||||
router = APIRouter(prefix="/web/admin", tags=["保险公司管理"])
|
||||
router = APIRouter(prefix="/web/admin", tags=["保险公司及险种价格管理"])
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
@@ -238,7 +238,7 @@ def _soft_delete_insurance_company(db: Session, row_id: str, *, tenant_no: str):
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Inline CRUD — 保险公司开票信息
|
||||
# Inline CRUD — 险种开票信息
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -376,7 +376,7 @@ def _soft_delete_insurance_company_invoice(db: Session, row_id: str, *, tenant_n
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Inline CRUD — 保险项目价格
|
||||
# Inline CRUD — 险种价格
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -729,7 +729,7 @@ async def delete_insurance_company_invoice(
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# 3. 保险项目价格(子表)
|
||||
# 3. 险种价格(子表)
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@ async def create_leave(
|
||||
):
|
||||
tenant_no = _user.get("tenant_no", "")
|
||||
user_id = _user.get("user_id") or _user.get("id", "")
|
||||
dept_id = _user.get("deptId", "")
|
||||
dept_id = _user.get("region_id", "")
|
||||
row = leave_crud.create_leave(
|
||||
db,
|
||||
leave_type=body.leaveType,
|
||||
|
||||
@@ -88,7 +88,7 @@ STATIC_MENU_TREE = [
|
||||
"name": "Unit",
|
||||
"path": "unit",
|
||||
"component": "/system/unit/index",
|
||||
"meta": {"title": "物品单位", "keepAlive": True, "menuCode": "system:unit:list"},
|
||||
"meta": {"title": "物品单位管理", "keepAlive": True, "menuCode": "system:unit:list"},
|
||||
},
|
||||
{
|
||||
"id": "110",
|
||||
|
||||
@@ -264,10 +264,25 @@ class ReceptionCheckSubmit(BaseModel):
|
||||
checked: bool = False
|
||||
|
||||
|
||||
class SampleReceptionUpdateBody(BaseModel):
|
||||
model_config = ConfigDict(populate_by_name=True)
|
||||
|
||||
reception_time: str = Field(..., alias="receptionTime")
|
||||
handler_user_id: Optional[str] = Field(None, alias="handlerUserId")
|
||||
handler_name: Optional[str] = Field(None, alias="handlerName")
|
||||
receive_temperature: Optional[str] = Field(None, alias="receiveTemperature")
|
||||
volume_ml: Optional[float] = Field(None, alias="volumeMl")
|
||||
net_weight_g: Optional[float] = Field(None, alias="netWeightG")
|
||||
checks: List[ReceptionCheckSubmit] = Field(default_factory=list)
|
||||
accept_conclusion: str = Field(..., alias="acceptConclusion")
|
||||
receive_attachments: Optional[str] = Field(None, alias="receiveAttachments")
|
||||
remark: Optional[str] = None
|
||||
|
||||
|
||||
class SampleReceptionCreateBody(BaseModel):
|
||||
model_config = ConfigDict(populate_by_name=True)
|
||||
|
||||
protocol_sample_id: str = Field(..., alias="protocolSampleId")
|
||||
protocol_sample_id: Optional[str] = Field(None, alias="protocolSampleId")
|
||||
reception_time: str = Field(..., alias="receptionTime")
|
||||
handler_user_id: Optional[str] = Field(None, alias="handlerUserId")
|
||||
handler_name: Optional[str] = Field(None, alias="handlerName")
|
||||
@@ -326,3 +341,87 @@ async def post_sample_reception(
|
||||
return error_response(str(e))
|
||||
except Exception as e:
|
||||
return error_response(str(e))
|
||||
|
||||
|
||||
@router.put("/sample-receptions/{reception_id}")
|
||||
async def put_sample_reception(
|
||||
reception_id: str,
|
||||
body: SampleReceptionUpdateBody,
|
||||
db: Session = Depends(get_db),
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
):
|
||||
try:
|
||||
tenant_no = _get_tenant_no(db, user)
|
||||
user_id = _get_current_user_id(user)
|
||||
rt = parse_datetime(body.reception_time)
|
||||
if not rt:
|
||||
return error_response("样本接收时间格式无效")
|
||||
checks_payload = [
|
||||
{"checkItemId": c.check_item_id, "checked": c.checked} for c in body.checks
|
||||
]
|
||||
obj = sr_svc.update_sample_reception(
|
||||
db,
|
||||
reception_id=reception_id,
|
||||
tenant_no=tenant_no,
|
||||
user_id=user_id,
|
||||
reception_time=rt,
|
||||
handler_user_id=body.handler_user_id or user_id,
|
||||
handler_name=body.handler_name,
|
||||
receive_temperature=body.receive_temperature,
|
||||
volume_ml=body.volume_ml,
|
||||
net_weight_g=body.net_weight_g,
|
||||
checks=checks_payload,
|
||||
accept_conclusion=body.accept_conclusion,
|
||||
receive_attachments=body.receive_attachments,
|
||||
remark=body.remark,
|
||||
)
|
||||
detail = sr_svc.get_reception_by_id(db, obj.id, tenant_no)
|
||||
return success_response(detail or {"id": obj.id})
|
||||
except PermissionError as e:
|
||||
return error_response(str(e), code=403)
|
||||
except ValueError as e:
|
||||
return error_response(str(e))
|
||||
except Exception as e:
|
||||
return error_response(str(e))
|
||||
|
||||
|
||||
@router.put("/sample-receptions/{reception_id}")
|
||||
async def put_sample_reception(
|
||||
reception_id: str,
|
||||
body: SampleReceptionUpdateBody,
|
||||
db: Session = Depends(get_db),
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
):
|
||||
try:
|
||||
tenant_no = _get_tenant_no(db, user)
|
||||
user_id = _get_current_user_id(user)
|
||||
rt = parse_datetime(body.reception_time)
|
||||
if not rt:
|
||||
return error_response("样本接收时间格式无效")
|
||||
checks_payload = [
|
||||
{"checkItemId": c.check_item_id, "checked": c.checked} for c in body.checks
|
||||
]
|
||||
obj = sr_svc.update_sample_reception(
|
||||
db,
|
||||
reception_id=reception_id,
|
||||
tenant_no=tenant_no,
|
||||
user_id=user_id,
|
||||
reception_time=rt,
|
||||
handler_user_id=body.handler_user_id or user_id,
|
||||
handler_name=body.handler_name,
|
||||
receive_temperature=body.receive_temperature,
|
||||
volume_ml=body.volume_ml,
|
||||
net_weight_g=body.net_weight_g,
|
||||
checks=checks_payload,
|
||||
accept_conclusion=body.accept_conclusion,
|
||||
receive_attachments=body.receive_attachments,
|
||||
remark=body.remark,
|
||||
)
|
||||
detail = sr_svc.get_reception_by_id(db, obj.id, tenant_no)
|
||||
return success_response(detail or {"id": obj.id})
|
||||
except PermissionError as e:
|
||||
return error_response(str(e), code=403)
|
||||
except ValueError as e:
|
||||
return error_response(str(e))
|
||||
except Exception as e:
|
||||
return error_response(str(e))
|
||||
@@ -8,6 +8,8 @@ from redis import exceptions as redis_exceptions
|
||||
from fastapi import Depends, HTTPException, status, Request
|
||||
from fastapi.security import OAuth2PasswordBearer
|
||||
from jose import JWTError, jwt
|
||||
|
||||
from app.core.context import current_user_dept_id
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.core.config import settings
|
||||
@@ -71,11 +73,19 @@ async def revoke_session(session_id: str) -> None:
|
||||
|
||||
|
||||
async def extend_session(session_id: str) -> None:
|
||||
"""刷新会话 TTL(用于 refreshToken 延长会话)"""
|
||||
"""刷新会话 TTL(refreshToken 续期;已登录用户每次 API 校验通过后滑动续期)"""
|
||||
if not session_id:
|
||||
return
|
||||
r = _get_redis_client()
|
||||
if r is None:
|
||||
return
|
||||
await r.expire(_session_key(session_id), REFRESH_TOKEN_EXPIRE_SECONDS)
|
||||
try:
|
||||
await asyncio.wait_for(
|
||||
r.expire(_session_key(session_id), REFRESH_TOKEN_EXPIRE_SECONDS),
|
||||
timeout=3.0,
|
||||
)
|
||||
except (asyncio.TimeoutError, redis_exceptions.TimeoutError, redis_exceptions.ConnectionError):
|
||||
pass
|
||||
|
||||
|
||||
async def is_session_valid(session_id: str) -> bool:
|
||||
@@ -177,7 +187,7 @@ async def get_current_user_by_token(
|
||||
token: str,
|
||||
db: Session,
|
||||
) -> dict:
|
||||
"""根据 token 获取当前用户(包含 Redis 会话校验)"""
|
||||
"""根据 token 获取当前用户(包含 Redis 会话校验;会话滑动续期)"""
|
||||
payload = decode_token(token)
|
||||
|
||||
user_id: str = payload.get("sub")
|
||||
@@ -189,6 +199,9 @@ async def get_current_user_by_token(
|
||||
detail="Token无效或已过期",
|
||||
)
|
||||
|
||||
# 方案 C:有操作时延长 Redis 会话,连续 7 天无请求则会话过期
|
||||
await extend_session(session_id)
|
||||
|
||||
if user_id is None:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_401_UNAUTHORIZED,
|
||||
@@ -214,6 +227,8 @@ async def get_current_user_by_token(
|
||||
email = (getattr(user, "email", None) or "").strip() or None
|
||||
avatar = getattr(user, "avatar", None)
|
||||
|
||||
current_user_dept_id.set(user.dept_id or "")
|
||||
|
||||
return {
|
||||
"user_id": user.id,
|
||||
"username": user.user_no,
|
||||
@@ -244,6 +259,7 @@ async def get_current_user_simple(token: str = Depends(oauth2_scheme)) -> dict:
|
||||
status_code=status.HTTP_401_UNAUTHORIZED,
|
||||
detail="无效的认证凭据",
|
||||
)
|
||||
current_user_dept_id.set(payload.get("region_id") or "")
|
||||
return {
|
||||
"user_id": user_id,
|
||||
"username": payload.get("username"),
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
"""请求级别的用户上下文变量
|
||||
|
||||
通过 contextvars 在请求处理链路中传递当前用户信息,
|
||||
供 SQLAlchemy 事件监听器等底层机制使用,避免逐层手动传参。
|
||||
"""
|
||||
from contextvars import ContextVar
|
||||
|
||||
# 当前登录用户的部门 ID(对应 SysUser.dept_id,在 user dict 中键名为 region_id)
|
||||
current_user_dept_id: ContextVar[str] = ContextVar("current_user_dept_id", default="")
|
||||
@@ -1,4 +1,4 @@
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy import create_engine, event
|
||||
from sqlalchemy.ext.declarative import declarative_base
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
|
||||
@@ -24,3 +24,13 @@ def get_db():
|
||||
yield db
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
|
||||
@event.listens_for(Base, "before_insert", propagate=True)
|
||||
def _auto_fill_create_dept_id(mapper, connection, target):
|
||||
"""ORM before_insert 钩子:当 create_dept_id 为空时,自动从请求上下文填充当前用户部门 ID"""
|
||||
if hasattr(target, "create_dept_id") and not getattr(target, "create_dept_id", None):
|
||||
from app.core.context import current_user_dept_id
|
||||
dept_id = current_user_dept_id.get("")
|
||||
if dept_id:
|
||||
target.create_dept_id = dept_id
|
||||
@@ -29,11 +29,22 @@ from app.models.models import (
|
||||
BizProtocolSample,
|
||||
BizProtocolSampleTransport,
|
||||
BizProtocolStorageCert,
|
||||
BizQcWorkOrder,
|
||||
BizSampleReception,
|
||||
BizCollectionRegion,
|
||||
BizCollectionHospital,
|
||||
BizCellSampleType,
|
||||
SysUser,
|
||||
)
|
||||
|
||||
_NEWBORN_SEX_LABEL = {"1": "男", "0": "女"}
|
||||
_SAMPLE_STATUS_LABEL = {
|
||||
"ycj": "已采集",
|
||||
"jcz": "检测中",
|
||||
"yrk": "已入库",
|
||||
"yzf": "已作废",
|
||||
}
|
||||
|
||||
|
||||
def get_protocol_nos_used_in_protocols(
|
||||
db: Session,
|
||||
@@ -525,6 +536,176 @@ def _storage_cert_to_dict(s: BizProtocolStorageCert) -> Dict[str, Any]:
|
||||
}
|
||||
|
||||
|
||||
def _format_newborn_info(pc: Optional[BizProtocolPartyCustomer]) -> str:
|
||||
if not pc:
|
||||
return ""
|
||||
parts: List[str] = []
|
||||
name = (pc.newborn_name or "").strip()
|
||||
if name:
|
||||
parts.append(name)
|
||||
sex = _NEWBORN_SEX_LABEL.get((pc.newborn_sex or "").strip(), "")
|
||||
if sex:
|
||||
parts.append(sex)
|
||||
if pc.newborn_weight_gram is not None:
|
||||
parts.append(f"{pc.newborn_weight_gram}g")
|
||||
if pc.newborn_delivery_time:
|
||||
parts.append(_fmt_dt(pc.newborn_delivery_time))
|
||||
return " / ".join(parts)
|
||||
|
||||
|
||||
def _format_storage_cert_sample_info(
|
||||
samples: List[Dict[str, Any]], type_map: Dict[str, str]
|
||||
) -> str:
|
||||
parts: List[str] = []
|
||||
for s in samples:
|
||||
type_name = type_map.get(s.get("sampleTypeId") or "", "") or "样本"
|
||||
code = (s.get("sampleCode") or "").strip()
|
||||
status = (s.get("sampleStatus") or "").strip()
|
||||
seg = type_name
|
||||
if code:
|
||||
seg += f"({code})"
|
||||
if status:
|
||||
seg += f"[{_SAMPLE_STATUS_LABEL.get(status, status)}]"
|
||||
parts.append(seg)
|
||||
return ";".join(parts)
|
||||
|
||||
|
||||
def _pick_storage_in_date(samples: List[Dict[str, Any]]) -> str:
|
||||
for s in samples:
|
||||
d = (s.get("storageInDate") or "").strip()
|
||||
if d:
|
||||
return d
|
||||
return ""
|
||||
|
||||
|
||||
def _load_sample_type_name_map(db: Session, samples: List[BizProtocolSample]) -> Dict[str, str]:
|
||||
type_ids = list({s.sample_type_id for s in samples if s.sample_type_id})
|
||||
if not type_ids:
|
||||
return {}
|
||||
type_map: Dict[str, str] = {}
|
||||
for t in (
|
||||
db.query(BizCellSampleType)
|
||||
.filter(BizCellSampleType.id.in_(type_ids), BizCellSampleType.del_flag == 0)
|
||||
.all()
|
||||
):
|
||||
type_map[t.id] = t.type_name or ""
|
||||
return type_map
|
||||
|
||||
|
||||
def list_storage_certs(
|
||||
db: Session,
|
||||
*,
|
||||
tenant_no: str,
|
||||
keyword: Optional[str] = None,
|
||||
make_status: Optional[str] = None,
|
||||
page: int = 1,
|
||||
page_size: int = 10,
|
||||
) -> Tuple[List[Dict[str, Any]], int]:
|
||||
"""储存证管理列表:生效中协议 + 当事人/样本/储存证信息(不要求样本已入库)。"""
|
||||
q = db.query(BizCollectionProtocol).filter(
|
||||
BizCollectionProtocol.del_flag == 0,
|
||||
BizCollectionProtocol.tenant_no == tenant_no,
|
||||
BizCollectionProtocol.protocol_status == "sxz",
|
||||
)
|
||||
kw = (keyword or "").strip()
|
||||
if kw:
|
||||
like = f"%{kw}%"
|
||||
party_ids = (
|
||||
db.query(BizProtocolPartyCustomer.collection_protocol_id)
|
||||
.filter(
|
||||
BizProtocolPartyCustomer.del_flag == 0,
|
||||
BizProtocolPartyCustomer.tenant_no == tenant_no,
|
||||
BizProtocolPartyCustomer.mother_name.like(like),
|
||||
)
|
||||
)
|
||||
q = q.filter(
|
||||
or_(
|
||||
BizCollectionProtocol.protocol_no.like(like),
|
||||
BizCollectionProtocol.id.in_(party_ids),
|
||||
)
|
||||
)
|
||||
|
||||
rows_all = q.order_by(BizCollectionProtocol.create_time.desc()).all()
|
||||
protocol_ids = [r.id for r in rows_all]
|
||||
pc_map: Dict[str, BizProtocolPartyCustomer] = {}
|
||||
sc_map: Dict[str, BizProtocolStorageCert] = {}
|
||||
sample_map: Dict[str, List[Dict[str, Any]]] = {}
|
||||
type_map: Dict[str, str] = {}
|
||||
if protocol_ids:
|
||||
for pc in (
|
||||
db.query(BizProtocolPartyCustomer)
|
||||
.filter(
|
||||
BizProtocolPartyCustomer.collection_protocol_id.in_(protocol_ids),
|
||||
BizProtocolPartyCustomer.del_flag == 0,
|
||||
)
|
||||
.all()
|
||||
):
|
||||
pc_map[pc.collection_protocol_id] = pc
|
||||
|
||||
for sc in (
|
||||
db.query(BizProtocolStorageCert)
|
||||
.filter(
|
||||
BizProtocolStorageCert.collection_protocol_id.in_(protocol_ids),
|
||||
BizProtocolStorageCert.del_flag == 0,
|
||||
)
|
||||
.all()
|
||||
):
|
||||
sc_map[sc.collection_protocol_id] = sc
|
||||
|
||||
s_rows = (
|
||||
db.query(BizProtocolSample)
|
||||
.filter(
|
||||
BizProtocolSample.collection_protocol_id.in_(protocol_ids),
|
||||
BizProtocolSample.del_flag == 0,
|
||||
)
|
||||
.all()
|
||||
)
|
||||
type_map = _load_sample_type_name_map(db, s_rows)
|
||||
for s in s_rows:
|
||||
sample_map.setdefault(s.collection_protocol_id, []).append(_sample_to_dict(s))
|
||||
|
||||
items: List[Dict[str, Any]] = []
|
||||
ms_filter = (make_status or "").strip()
|
||||
for r in rows_all:
|
||||
sc = sc_map.get(r.id)
|
||||
cert_ms = (sc.make_status or "0") if sc else "0"
|
||||
if ms_filter and cert_ms != ms_filter:
|
||||
continue
|
||||
pc = pc_map.get(r.id)
|
||||
samples = sample_map.get(r.id, [])
|
||||
cert_dict = _storage_cert_to_dict(sc) if sc else {"makeStatus": "0", "certImageUrls": "", "makeDate": "", "remark": ""}
|
||||
items.append(
|
||||
{
|
||||
"id": r.id,
|
||||
"protocolId": r.id,
|
||||
"protocolNo": r.protocol_no or "",
|
||||
"protocolStatus": r.protocol_status or "",
|
||||
"motherName": (pc.mother_name or "") if pc else "",
|
||||
"motherPhone": (pc.mother_phone or "") if pc else "",
|
||||
"motherIdCard": (pc.mother_id_card or "") if pc else "",
|
||||
"newbornName": (pc.newborn_name or "") if pc else "",
|
||||
"newbornIdCard": (pc.newborn_id_card or "") if pc else "",
|
||||
"newbornDeliveryTime": _fmt_dt(pc.newborn_delivery_time) if pc and pc.newborn_delivery_time else "",
|
||||
"newbornSex": (pc.newborn_sex or "") if pc else "",
|
||||
"newbornWeightGram": pc.newborn_weight_gram if pc else None,
|
||||
"newbornInfo": _format_newborn_info(pc),
|
||||
"sampleInfo": _format_storage_cert_sample_info(samples, type_map),
|
||||
"storageInDate": _pick_storage_in_date(samples),
|
||||
"samples": samples,
|
||||
"makeStatus": cert_dict.get("makeStatus", "0"),
|
||||
"certImageUrls": cert_dict.get("certImageUrls", ""),
|
||||
"makeDate": cert_dict.get("makeDate", ""),
|
||||
"remark": cert_dict.get("remark", ""),
|
||||
}
|
||||
)
|
||||
|
||||
total = len(items)
|
||||
page_safe = max(1, page)
|
||||
page_size_safe = min(max(1, page_size), 100)
|
||||
start = (page_safe - 1) * page_size_safe
|
||||
return items[start : start + page_size_safe], total
|
||||
|
||||
|
||||
def list_collection_protocols(
|
||||
db: Session,
|
||||
*,
|
||||
@@ -749,14 +930,19 @@ def get_protocol_detail_bundle(
|
||||
transport_by_sample = {t.sample_id: _transport_to_dict(t) for t in transport_rows}
|
||||
from app.crud import sample_reception as sample_reception_svc
|
||||
|
||||
sample_ids = [s.id for s in s_rows]
|
||||
sample_code_by_id = {s.id: s.sample_code or "" for s in s_rows}
|
||||
reception_by_sample = sample_reception_svc.get_receptions_map_for_samples(
|
||||
db, sample_ids, tenant_no
|
||||
db,
|
||||
tenant_no,
|
||||
sample_code_by_id=sample_code_by_id,
|
||||
)
|
||||
from app.crud import qc_work_order as qc_work_order_svc
|
||||
|
||||
qc_by_sample = qc_work_order_svc.get_qc_info_map_for_samples(
|
||||
db, sample_ids, tenant_no
|
||||
db,
|
||||
[s.id for s in s_rows],
|
||||
tenant_no,
|
||||
sample_code_by_id=sample_code_by_id,
|
||||
)
|
||||
samples_out: List[Dict[str, Any]] = []
|
||||
for s in s_rows:
|
||||
@@ -1716,6 +1902,41 @@ def list_samples(db: Session, collection_protocol_id: str, tenant_no: str) -> Li
|
||||
)
|
||||
|
||||
|
||||
def _migrate_sample_child_refs_on_replace(
|
||||
db: Session,
|
||||
*,
|
||||
tenant_no: str,
|
||||
old_id_to_code: Dict[str, str],
|
||||
new_code_to_id: Dict[str, str],
|
||||
user_id: Optional[str],
|
||||
) -> None:
|
||||
"""协议样本行重建后,将接收/质检工单的 protocol_sample_id 迁移到新样本 ID。"""
|
||||
if not old_id_to_code or not new_code_to_id:
|
||||
return
|
||||
old_ids = list(old_id_to_code.keys())
|
||||
now = datetime.now()
|
||||
for model in (BizSampleReception, BizQcWorkOrder):
|
||||
rows = (
|
||||
db.query(model)
|
||||
.filter(
|
||||
model.protocol_sample_id.in_(old_ids),
|
||||
model.tenant_no == tenant_no,
|
||||
model.del_flag == 0,
|
||||
)
|
||||
.all()
|
||||
)
|
||||
for row in rows:
|
||||
old_sid = (row.protocol_sample_id or "").strip()
|
||||
code = old_id_to_code.get(old_sid) or (row.sample_code or "").strip()
|
||||
new_sid = new_code_to_id.get(code) if code else None
|
||||
if not new_sid:
|
||||
continue
|
||||
row.protocol_sample_id = new_sid
|
||||
row.update_by = user_id
|
||||
row.update_time = now
|
||||
db.add(row)
|
||||
|
||||
|
||||
def save_samples(
|
||||
db: Session,
|
||||
collection_protocol_id: str,
|
||||
@@ -1724,6 +1945,11 @@ def save_samples(
|
||||
samples: list,
|
||||
) -> List[BizProtocolSample]:
|
||||
existing = list_samples(db, collection_protocol_id, tenant_no)
|
||||
old_id_to_code = {
|
||||
s.id: (s.sample_code or "").strip()
|
||||
for s in existing
|
||||
if (s.sample_code or "").strip()
|
||||
}
|
||||
for s in existing:
|
||||
s.del_flag = 1
|
||||
s.update_by = user_id
|
||||
@@ -1779,6 +2005,18 @@ def save_samples(
|
||||
setattr(obj, k, raw[k])
|
||||
db.add(obj)
|
||||
result.append(obj)
|
||||
new_code_to_id = {
|
||||
(o.sample_code or "").strip(): o.id
|
||||
for o in result
|
||||
if (o.sample_code or "").strip()
|
||||
}
|
||||
_migrate_sample_child_refs_on_replace(
|
||||
db,
|
||||
tenant_no=tenant_no,
|
||||
old_id_to_code=old_id_to_code,
|
||||
new_code_to_id=new_code_to_id,
|
||||
user_id=user_id,
|
||||
)
|
||||
db.commit()
|
||||
for o in result:
|
||||
db.refresh(o)
|
||||
|
||||
@@ -431,13 +431,72 @@ def _third_lines(db: Session, work_order_id: str) -> List[Dict[str, Any]]:
|
||||
]
|
||||
|
||||
|
||||
def _qc_info_item(db: Session, wo: BizQcWorkOrder, tenant_no: str) -> Dict[str, Any]:
|
||||
tasks = task_svc.list_tasks_by_work_order(db, wo.id, tenant_no)
|
||||
for t in tasks:
|
||||
tt = (t.get("taskType") or "").strip()
|
||||
ts = (t.get("taskStatus") or "").strip()
|
||||
tc = (t.get("conclusion") or "").strip()
|
||||
t["taskTypeLabel"] = _TASK_TYPE_LABELS.get(tt, tt)
|
||||
t["taskStatusLabel"] = _TASK_STATUS_LABELS.get(ts, ts)
|
||||
t["conclusionLabel"] = t.get("conclusionLabel") or _CONCLUSION_LABELS.get(tc, tc or "—")
|
||||
wo_status = (wo.work_order_status or "").strip()
|
||||
biz = _work_order_qc_biz_type(wo)
|
||||
return {
|
||||
**_wo_to_dict(wo),
|
||||
"workOrderStatusLabel": _WORK_ORDER_STATUS_LABELS.get(wo_status, wo_status),
|
||||
"qcBizTypeLabel": _qc_biz_type_label(biz),
|
||||
"labItems": _lab_lines(db, wo.id),
|
||||
"thirdPartyItems": _third_lines(db, wo.id),
|
||||
"tasks": tasks,
|
||||
}
|
||||
|
||||
|
||||
def get_qc_info_map_for_samples(
|
||||
db: Session,
|
||||
sample_ids: List[str],
|
||||
tenant_no: str,
|
||||
*,
|
||||
sample_code_by_id: Optional[Dict[str, str]] = None,
|
||||
) -> Dict[str, Dict[str, Any]]:
|
||||
"""按协议/捐赠样本 ID 批量返回质检工单及检测任务摘要,供协议/捐赠查看弹窗使用。"""
|
||||
if not sample_ids or not tenant_no:
|
||||
"""按样本批量返回质检工单摘要,供协议/捐赠查看弹窗使用。
|
||||
|
||||
细胞存储:传入 sample_code_by_id 时,按租户 + 样本编码关联。
|
||||
科研捐赠等:仅传 sample_ids 时,仍按 protocol_sample_id(存捐赠样本 id)关联。
|
||||
"""
|
||||
if not tenant_no:
|
||||
return {}
|
||||
|
||||
if sample_code_by_id:
|
||||
codes = list({(c or "").strip() for c in sample_code_by_id.values() if (c or "").strip()})
|
||||
if not codes:
|
||||
return {}
|
||||
wos = (
|
||||
db.query(BizQcWorkOrder)
|
||||
.filter(
|
||||
BizQcWorkOrder.tenant_no == tenant_no,
|
||||
BizQcWorkOrder.del_flag == 0,
|
||||
BizQcWorkOrder.reception_source == "cell_storage",
|
||||
BizQcWorkOrder.sample_code.in_(codes),
|
||||
)
|
||||
.all()
|
||||
)
|
||||
code_to_wo: Dict[str, BizQcWorkOrder] = {}
|
||||
for wo in wos:
|
||||
code = (wo.sample_code or "").strip()
|
||||
if code and code not in code_to_wo:
|
||||
code_to_wo[code] = wo
|
||||
out: Dict[str, Dict[str, Any]] = {}
|
||||
for sid, raw_code in sample_code_by_id.items():
|
||||
code = (raw_code or "").strip()
|
||||
if not code:
|
||||
continue
|
||||
wo = code_to_wo.get(code)
|
||||
if wo:
|
||||
out[sid] = _qc_info_item(db, wo, tenant_no)
|
||||
return out
|
||||
|
||||
if not sample_ids:
|
||||
return {}
|
||||
wos = (
|
||||
db.query(BizQcWorkOrder)
|
||||
@@ -448,29 +507,11 @@ def get_qc_info_map_for_samples(
|
||||
)
|
||||
.all()
|
||||
)
|
||||
out: Dict[str, Dict[str, Any]] = {}
|
||||
out = {}
|
||||
for wo in wos:
|
||||
sid = wo.protocol_sample_id
|
||||
if not sid:
|
||||
continue
|
||||
tasks = task_svc.list_tasks_by_work_order(db, wo.id, tenant_no)
|
||||
for t in tasks:
|
||||
tt = (t.get("taskType") or "").strip()
|
||||
ts = (t.get("taskStatus") or "").strip()
|
||||
tc = (t.get("conclusion") or "").strip()
|
||||
t["taskTypeLabel"] = _TASK_TYPE_LABELS.get(tt, tt)
|
||||
t["taskStatusLabel"] = _TASK_STATUS_LABELS.get(ts, ts)
|
||||
t["conclusionLabel"] = t.get("conclusionLabel") or _CONCLUSION_LABELS.get(tc, tc or "—")
|
||||
wo_status = (wo.work_order_status or "").strip()
|
||||
biz = _work_order_qc_biz_type(wo)
|
||||
out[sid] = {
|
||||
**_wo_to_dict(wo),
|
||||
"workOrderStatusLabel": _WORK_ORDER_STATUS_LABELS.get(wo_status, wo_status),
|
||||
"qcBizTypeLabel": _qc_biz_type_label(biz),
|
||||
"labItems": _lab_lines(db, wo.id),
|
||||
"thirdPartyItems": _third_lines(db, wo.id),
|
||||
"tasks": tasks,
|
||||
}
|
||||
sid = (wo.protocol_sample_id or "").strip()
|
||||
if sid:
|
||||
out[sid] = _qc_info_item(db, wo, tenant_no)
|
||||
return out
|
||||
|
||||
|
||||
|
||||
@@ -251,20 +251,25 @@ def _donation_rows_to_sample_list_items(
|
||||
|
||||
|
||||
def _sample_pending_query(db: Session, tenant_no: str, keyword: Optional[str] = None):
|
||||
"""待接收:协议样本且尚无有效接收记录。"""
|
||||
received_ids = (
|
||||
db.query(BizSampleReception.protocol_sample_id)
|
||||
"""待接收:协议样本且尚无有效接收记录(仅按租户 + 样本编码判定)。"""
|
||||
rec = BizSampleReception
|
||||
received_exists = (
|
||||
db.query(rec.id)
|
||||
.filter(
|
||||
BizSampleReception.tenant_no == tenant_no,
|
||||
BizSampleReception.del_flag == 0,
|
||||
rec.tenant_no == tenant_no,
|
||||
rec.del_flag == 0,
|
||||
rec.reception_source == "cell_storage",
|
||||
rec.sample_code.isnot(None),
|
||||
rec.sample_code != "",
|
||||
rec.sample_code == BizProtocolSample.sample_code,
|
||||
)
|
||||
.subquery()
|
||||
.exists()
|
||||
)
|
||||
q = _sample_detail_rows_query(db).filter(
|
||||
BizProtocolSample.del_flag == 0,
|
||||
BizProtocolSample.tenant_no == tenant_no,
|
||||
BizCollectionProtocol.tenant_no == tenant_no,
|
||||
~BizProtocolSample.id.in_(received_ids),
|
||||
~received_exists,
|
||||
)
|
||||
if keyword and keyword.strip():
|
||||
kw = f"%{keyword.strip()}%"
|
||||
@@ -311,11 +316,16 @@ def _rows_to_sample_list_items(
|
||||
):
|
||||
express_map[e.id] = e.express_name or ""
|
||||
|
||||
reception_ids = (
|
||||
[reception_map[s.id].id for s, *_ in rows if s.id in reception_map]
|
||||
if reception_map
|
||||
else []
|
||||
)
|
||||
def _map_rec(sample: BizProtocolSample) -> Optional[BizSampleReception]:
|
||||
if not reception_map:
|
||||
return None
|
||||
code = (sample.sample_code or "").strip()
|
||||
if code and code in reception_map:
|
||||
return reception_map[code]
|
||||
return None
|
||||
|
||||
matched_recs = [_map_rec(s) for s, *_ in rows]
|
||||
reception_ids = [r.id for r in matched_recs if r]
|
||||
results_map = (
|
||||
check_result_svc.list_results_by_reception_ids(db, reception_ids, tenant_no)
|
||||
if reception_ids
|
||||
@@ -348,8 +358,8 @@ def _rows_to_sample_list_items(
|
||||
"sourceType": "cell_storage",
|
||||
"sourceTypeLabel": "细胞存储",
|
||||
}
|
||||
if reception_map and sample.id in reception_map:
|
||||
rec = reception_map[sample.id]
|
||||
rec = _map_rec(sample)
|
||||
if rec:
|
||||
cr = results_map.get(rec.id)
|
||||
if not cr:
|
||||
cr = check_result_svc.get_check_results_for_reception(db, rec, tenant_no)
|
||||
@@ -501,16 +511,31 @@ def list_received_protocol_samples(
|
||||
items: List[Dict[str, Any]] = []
|
||||
|
||||
if cell_receptions:
|
||||
cell_sample_ids = [r.protocol_sample_id for r in cell_receptions]
|
||||
cell_reception_map = {r.protocol_sample_id: r for r in cell_receptions}
|
||||
cell_rows = (
|
||||
_sample_detail_rows_query(db)
|
||||
.filter(BizProtocolSample.id.in_(cell_sample_ids))
|
||||
.all()
|
||||
cell_reception_map: Dict[str, BizSampleReception] = {}
|
||||
seen_codes: set = set()
|
||||
cell_rows: list = []
|
||||
for rec in cell_receptions:
|
||||
code = _reception_sample_code(db, rec)
|
||||
if not code:
|
||||
continue
|
||||
cell_reception_map[code] = rec
|
||||
if code in seen_codes:
|
||||
continue
|
||||
seen_codes.add(code)
|
||||
rows = (
|
||||
_sample_detail_rows_query(db)
|
||||
.filter(
|
||||
BizProtocolSample.sample_code == code,
|
||||
BizProtocolSample.del_flag == 0,
|
||||
BizProtocolSample.tenant_no == tenant_no,
|
||||
BizCollectionProtocol.tenant_no == tenant_no,
|
||||
)
|
||||
.all()
|
||||
)
|
||||
cell_rows.extend(rows)
|
||||
items.extend(
|
||||
_rows_to_sample_list_items(db, cell_rows, tenant_no, reception_map=cell_reception_map)
|
||||
)
|
||||
cell_row_by_sample = {row[0].id: row for row in cell_rows}
|
||||
cell_ordered = [cell_row_by_sample[sid] for sid in cell_sample_ids if sid in cell_row_by_sample]
|
||||
items.extend(_rows_to_sample_list_items(db, cell_ordered, tenant_no, reception_map=cell_reception_map))
|
||||
|
||||
if donation_receptions:
|
||||
donation_sample_ids = [r.donation_sample_id for r in donation_receptions]
|
||||
@@ -573,37 +598,28 @@ def get_reception_by_id(
|
||||
)
|
||||
return items[0] if items else None
|
||||
|
||||
sample = (
|
||||
db.query(BizProtocolSample)
|
||||
.filter(
|
||||
BizProtocolSample.id == rec.protocol_sample_id,
|
||||
BizProtocolSample.del_flag == 0,
|
||||
code = _reception_sample_code(db, rec)
|
||||
if code:
|
||||
rows = (
|
||||
_sample_detail_rows_query(db)
|
||||
.filter(
|
||||
BizProtocolSample.sample_code == code,
|
||||
BizProtocolSample.del_flag == 0,
|
||||
BizProtocolSample.tenant_no == tenant_no,
|
||||
)
|
||||
.all()
|
||||
)
|
||||
.first()
|
||||
if rows:
|
||||
items = _rows_to_sample_list_items(
|
||||
db, rows, tenant_no, reception_map={code: rec}
|
||||
)
|
||||
return items[0] if items else None
|
||||
cr = check_result_svc.get_check_results_for_reception(db, rec, tenant_no)
|
||||
out = _reception_to_dict(rec, check_results=cr)
|
||||
out["receiveAttachmentFiles"] = urls_to_attachment_list(
|
||||
rec.receive_attachments, db, tenant_no
|
||||
)
|
||||
if not sample:
|
||||
cr = check_result_svc.get_check_results_for_reception(db, rec, tenant_no)
|
||||
out = _reception_to_dict(rec, check_results=cr)
|
||||
out["receiveAttachmentFiles"] = urls_to_attachment_list(
|
||||
rec.receive_attachments, db, tenant_no
|
||||
)
|
||||
return out
|
||||
rows = (
|
||||
_sample_detail_rows_query(db)
|
||||
.filter(BizProtocolSample.id == sample.id)
|
||||
.all()
|
||||
)
|
||||
if not rows:
|
||||
cr = check_result_svc.get_check_results_for_reception(db, rec, tenant_no)
|
||||
out = _reception_to_dict(rec, check_results=cr)
|
||||
out["receiveAttachmentFiles"] = urls_to_attachment_list(
|
||||
rec.receive_attachments, db, tenant_no
|
||||
)
|
||||
return out
|
||||
items = _rows_to_sample_list_items(
|
||||
db, rows, tenant_no, reception_map={rec.protocol_sample_id: rec}
|
||||
)
|
||||
return items[0] if items else _reception_to_dict(rec)
|
||||
return out
|
||||
|
||||
|
||||
def create_sample_reception(
|
||||
@@ -646,12 +662,16 @@ def create_sample_reception(
|
||||
)
|
||||
if not sample:
|
||||
raise ValueError("样本不存在")
|
||||
_sample_code = (sample.sample_code or "").strip()
|
||||
if not _sample_code:
|
||||
raise ValueError("样本编码不能为空")
|
||||
exists = (
|
||||
db.query(BizSampleReception)
|
||||
.filter(
|
||||
BizSampleReception.protocol_sample_id == protocol_sample_id,
|
||||
BizSampleReception.tenant_no == tenant_no,
|
||||
BizSampleReception.del_flag == 0,
|
||||
BizSampleReception.reception_source == "cell_storage",
|
||||
BizSampleReception.sample_code == _sample_code,
|
||||
)
|
||||
.first()
|
||||
)
|
||||
@@ -778,37 +798,163 @@ def create_sample_reception(
|
||||
return obj
|
||||
|
||||
|
||||
def update_sample_reception(
|
||||
db: Session,
|
||||
*,
|
||||
reception_id: str,
|
||||
tenant_no: str,
|
||||
user_id: Optional[str],
|
||||
reception_time: datetime,
|
||||
handler_user_id: Optional[str],
|
||||
handler_name: Optional[str],
|
||||
receive_temperature: Optional[str],
|
||||
volume_ml: Optional[float] = None,
|
||||
net_weight_g: Optional[float] = None,
|
||||
checks: List[Dict[str, Any]],
|
||||
accept_conclusion: str,
|
||||
receive_attachments: Optional[str],
|
||||
remark: Optional[str],
|
||||
) -> BizSampleReception:
|
||||
"""更新已登记样本接收信息(不重复创建质检/生产工单)。"""
|
||||
rec = (
|
||||
db.query(BizSampleReception)
|
||||
.filter(
|
||||
BizSampleReception.id == reception_id,
|
||||
BizSampleReception.tenant_no == tenant_no,
|
||||
BizSampleReception.del_flag == 0,
|
||||
)
|
||||
.first()
|
||||
)
|
||||
if not rec:
|
||||
raise ValueError("接收记录不存在")
|
||||
|
||||
conclusion = (accept_conclusion or "").strip()
|
||||
if conclusion not in ("js", "bj"):
|
||||
raise ValueError("接收结论无效")
|
||||
|
||||
handler_display = (handler_name or "").strip()
|
||||
if handler_user_id and not handler_display:
|
||||
u = db.query(SysUser).filter(SysUser.id == handler_user_id).first()
|
||||
if u:
|
||||
handler_display = u.nick_name or ""
|
||||
|
||||
rec.reception_time = reception_time
|
||||
rec.handler_user_id = handler_user_id
|
||||
rec.handler_name = handler_display or None
|
||||
rec.receive_temperature = (receive_temperature or "").strip() or None
|
||||
rec.volume_ml = volume_ml
|
||||
rec.net_weight_g = net_weight_g
|
||||
rec.accept_conclusion = conclusion
|
||||
rec.receive_attachments = (receive_attachments or "").strip() or None
|
||||
rec.remark = (remark or "").strip() or None
|
||||
rec.update_by = user_id
|
||||
rec.update_time = datetime.now()
|
||||
|
||||
check_result_svc.soft_delete_reception_check_results(
|
||||
db,
|
||||
reception_id=reception_id,
|
||||
tenant_no=tenant_no,
|
||||
user_id=user_id,
|
||||
)
|
||||
check_result_svc.save_reception_check_results(
|
||||
db,
|
||||
reception_id=reception_id,
|
||||
tenant_no=tenant_no,
|
||||
user_id=user_id,
|
||||
create_dept_id=rec.create_dept_id or "",
|
||||
checks=checks,
|
||||
)
|
||||
from app.models.models import BizSampleReceptionCheckResult
|
||||
|
||||
saved_rows = (
|
||||
db.query(BizSampleReceptionCheckResult)
|
||||
.filter(
|
||||
BizSampleReceptionCheckResult.reception_id == reception_id,
|
||||
BizSampleReceptionCheckResult.del_flag == 0,
|
||||
)
|
||||
.all()
|
||||
)
|
||||
check_result_svc.sync_legacy_columns_from_results(db, rec, saved_rows)
|
||||
db.add(rec)
|
||||
db.commit()
|
||||
db.refresh(rec)
|
||||
return rec
|
||||
|
||||
|
||||
def _reception_detail_item(
|
||||
db: Session,
|
||||
rec: BizSampleReception,
|
||||
tenant_no: str,
|
||||
*,
|
||||
results_map: Optional[Dict[str, List[Dict[str, Any]]]] = None,
|
||||
) -> Dict[str, Any]:
|
||||
cr = (results_map or {}).get(rec.id)
|
||||
if not cr:
|
||||
cr = check_result_svc.get_check_results_for_reception(db, rec, tenant_no)
|
||||
item = _reception_to_dict(rec, check_results=cr)
|
||||
item["receiveAttachmentFiles"] = urls_to_attachment_list(
|
||||
rec.receive_attachments, db, tenant_no
|
||||
)
|
||||
return item
|
||||
|
||||
|
||||
def _reception_sample_code(db: Session, rec: BizSampleReception) -> str:
|
||||
code = (rec.sample_code or "").strip()
|
||||
if code:
|
||||
return code
|
||||
sid = (rec.protocol_sample_id or "").strip()
|
||||
if not sid:
|
||||
return ""
|
||||
row = (
|
||||
db.query(BizProtocolSample.sample_code)
|
||||
.filter(BizProtocolSample.id == sid)
|
||||
.first()
|
||||
)
|
||||
return (row.sample_code or "").strip() if row else ""
|
||||
|
||||
|
||||
def get_receptions_map_for_samples(
|
||||
db: Session,
|
||||
sample_ids: List[str],
|
||||
tenant_no: str,
|
||||
*,
|
||||
sample_code_by_id: Dict[str, str],
|
||||
) -> Dict[str, Dict[str, Any]]:
|
||||
"""按协议样本 ID 批量查询接收记录(含检查项明细、附件列表),供协议单查看弹窗使用。"""
|
||||
if not sample_ids or not tenant_no:
|
||||
"""按租户 + 样本编码关联接收记录(key 为当前协议样本 id),供协议单查看弹窗使用。"""
|
||||
if not tenant_no or not sample_code_by_id:
|
||||
return {}
|
||||
codes = list({(c or "").strip() for c in sample_code_by_id.values() if (c or "").strip()})
|
||||
if not codes:
|
||||
return {}
|
||||
rows = (
|
||||
db.query(BizSampleReception)
|
||||
.filter(
|
||||
BizSampleReception.protocol_sample_id.in_(sample_ids),
|
||||
BizSampleReception.tenant_no == tenant_no,
|
||||
BizSampleReception.del_flag == 0,
|
||||
BizSampleReception.reception_source == "cell_storage",
|
||||
BizSampleReception.sample_code.in_(codes),
|
||||
)
|
||||
.all()
|
||||
)
|
||||
if not rows:
|
||||
return {}
|
||||
reception_ids = [r.id for r in rows]
|
||||
results_map = check_result_svc.list_results_by_reception_ids(db, reception_ids, tenant_no)
|
||||
out: Dict[str, Dict[str, Any]] = {}
|
||||
code_to_rec: Dict[str, BizSampleReception] = {}
|
||||
for rec in rows:
|
||||
cr = results_map.get(rec.id)
|
||||
if not cr:
|
||||
cr = check_result_svc.get_check_results_for_reception(db, rec, tenant_no)
|
||||
item = _reception_to_dict(rec, check_results=cr)
|
||||
item["receiveAttachmentFiles"] = urls_to_attachment_list(
|
||||
rec.receive_attachments, db, tenant_no
|
||||
)
|
||||
out[rec.protocol_sample_id] = item
|
||||
code = _reception_sample_code(db, rec)
|
||||
if code and code not in code_to_rec:
|
||||
code_to_rec[code] = rec
|
||||
reception_ids = [r.id for r in code_to_rec.values()]
|
||||
results_map = check_result_svc.list_results_by_reception_ids(
|
||||
db, reception_ids, tenant_no
|
||||
)
|
||||
out: Dict[str, Dict[str, Any]] = {}
|
||||
for sid, raw_code in sample_code_by_id.items():
|
||||
code = (raw_code or "").strip()
|
||||
if not code:
|
||||
continue
|
||||
rec = code_to_rec.get(code)
|
||||
if not rec:
|
||||
continue
|
||||
out[sid] = _reception_detail_item(db, rec, tenant_no, results_map=results_map)
|
||||
return out
|
||||
|
||||
|
||||
|
||||
@@ -98,6 +98,29 @@ def get_check_results_for_reception(
|
||||
return _legacy_results_from_reception(rec)
|
||||
|
||||
|
||||
def soft_delete_reception_check_results(
|
||||
db: Session,
|
||||
*,
|
||||
reception_id: str,
|
||||
tenant_no: str,
|
||||
user_id: Optional[str],
|
||||
) -> None:
|
||||
"""软删除某次接收的全部检查项结果(编辑接收时先清空再重写)。"""
|
||||
now = datetime.now()
|
||||
(
|
||||
db.query(BizSampleReceptionCheckResult)
|
||||
.filter(
|
||||
BizSampleReceptionCheckResult.reception_id == reception_id,
|
||||
BizSampleReceptionCheckResult.tenant_no == tenant_no,
|
||||
BizSampleReceptionCheckResult.del_flag == 0,
|
||||
)
|
||||
.update(
|
||||
{"del_flag": 1, "update_by": user_id, "update_time": now},
|
||||
synchronize_session=False,
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def save_reception_check_results(
|
||||
db: Session,
|
||||
*,
|
||||
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_api_menu_py", "label": "menu.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/menu.py", "source_location": "L1"}, {"id": "api_menu_get_menu_list", "label": "get_menu_list()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/menu.py", "source_location": "L260"}, {"id": "api_menu_rationale_1", "label": "\u8fd0\u8425\u7aef\u83dc\u5355\u63a5\u53e3\uff08\u4e0e web-admin \u524d\u7aef\u9759\u6001\u8def\u7531 sqxp.ts \u5bf9\u9f50\uff0c\u4f9b\u540e\u7aef\u83dc\u5355\u6a21\u5f0f\u8054\u8c03\uff09", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/menu.py", "source_location": "L1"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_backend_app_api_menu_py", "target": "fastapi", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/menu.py", "source_location": "L2", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_api_menu_py", "target": "app_core_menu_guard", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/menu.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_api_menu_py", "target": "app_core_response", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/menu.py", "source_location": "L5", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_api_menu_py", "target": "api_menu_get_menu_list", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/menu.py", "source_location": "L260", "weight": 1.0}, {"source": "api_menu_rationale_1", "target": "users_wuzilong_work_00code_zkxw_backend_app_api_menu_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/menu.py", "source_location": "L1", "weight": 1.0}], "raw_calls": [{"caller_nid": "api_menu_get_menu_list", "callee": "success_response", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/menu.py", "source_location": "L262"}]}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_core_database_py", "label": "database.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/database.py", "source_location": "L1"}, {"id": "core_database_get_db", "label": "get_db()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/database.py", "source_location": "L20"}, {"id": "core_database_auto_fill_create_dept_id", "label": "_auto_fill_create_dept_id()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/database.py", "source_location": "L30"}, {"id": "core_database_rationale_31", "label": "ORM before_insert \u94a9\u5b50\uff1a\u5f53 create_dept_id \u4e3a\u7a7a\u65f6\uff0c\u81ea\u52a8\u4ece\u8bf7\u6c42\u4e0a\u4e0b\u6587\u586b\u5145\u5f53\u524d\u7528\u6237\u90e8\u95e8 ID", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/database.py", "source_location": "L31"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_backend_app_core_database_py", "target": "sqlalchemy", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/database.py", "source_location": "L1", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_core_database_py", "target": "sqlalchemy_ext_declarative", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/database.py", "source_location": "L2", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_core_database_py", "target": "sqlalchemy_orm", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/database.py", "source_location": "L3", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_core_database_py", "target": "app_core_config", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/database.py", "source_location": "L5", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_core_database_py", "target": "core_database_get_db", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/database.py", "source_location": "L20", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_core_database_py", "target": "core_database_auto_fill_create_dept_id", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/database.py", "source_location": "L30", "weight": 1.0}, {"source": "core_database_rationale_31", "target": "core_database_auto_fill_create_dept_id", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/database.py", "source_location": "L31", "weight": 1.0}], "raw_calls": [{"caller_nid": "core_database_get_db", "callee": "SessionLocal", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/database.py", "source_location": "L22"}, {"caller_nid": "core_database_get_db", "callee": "close", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/database.py", "source_location": "L26"}, {"caller_nid": "core_database_auto_fill_create_dept_id", "callee": "hasattr", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/database.py", "source_location": "L32"}, {"caller_nid": "core_database_auto_fill_create_dept_id", "callee": "getattr", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/database.py", "source_location": "L32"}, {"caller_nid": "core_database_auto_fill_create_dept_id", "callee": "get", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/database.py", "source_location": "L34"}]}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_core_auth_py", "label": "auth.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/auth.py", "source_location": "L1"}, {"id": "core_auth_redis_session_enabled", "label": "_redis_session_enabled()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/auth.py", "source_location": "L29"}, {"id": "core_auth_get_redis_client", "label": "_get_redis_client()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/auth.py", "source_location": "L34"}, {"id": "core_auth_session_key", "label": "_session_key()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/auth.py", "source_location": "L51"}, {"id": "core_auth_refresh_key", "label": "_refresh_key()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/auth.py", "source_location": "L55"}, {"id": "core_auth_store_session", "label": "store_session()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/auth.py", "source_location": "L59"}, {"id": "core_auth_revoke_session", "label": "revoke_session()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/auth.py", "source_location": "L67"}, {"id": "core_auth_extend_session", "label": "extend_session()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/auth.py", "source_location": "L75"}, {"id": "core_auth_is_session_valid", "label": "is_session_valid()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/auth.py", "source_location": "L91"}, {"id": "core_auth_store_refresh_token", "label": "store_refresh_token()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/auth.py", "source_location": "L106"}, {"id": "core_auth_is_refresh_token_valid", "label": "is_refresh_token_valid()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/auth.py", "source_location": "L114"}, {"id": "core_auth_revoke_refresh_token", "label": "revoke_refresh_token()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/auth.py", "source_location": "L126"}, {"id": "core_auth_create_access_token", "label": "create_access_token()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/auth.py", "source_location": "L133"}, {"id": "core_auth_create_refresh_token", "label": "create_refresh_token()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/auth.py", "source_location": "L157"}, {"id": "core_auth_decode_token", "label": "decode_token()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/auth.py", "source_location": "L173"}, {"id": "core_auth_get_current_user_by_token", "label": "get_current_user_by_token()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/auth.py", "source_location": "L186"}, {"id": "core_auth_get_current_user", "label": "get_current_user()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/auth.py", "source_location": "L245"}, {"id": "core_auth_get_current_user_simple", "label": "get_current_user_simple()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/auth.py", "source_location": "L253"}, {"id": "core_auth_get_client_ip", "label": "get_client_ip()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/auth.py", "source_location": "L272"}, {"id": "core_auth_rationale_76", "label": "\u5237\u65b0\u4f1a\u8bdd TTL\uff08refreshToken \u7eed\u671f\uff1b\u5df2\u767b\u5f55\u7528\u6237\u6bcf\u6b21 API \u6821\u9a8c\u901a\u8fc7\u540e\u6ed1\u52a8\u7eed\u671f\uff09", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/auth.py", "source_location": "L76"}, {"id": "core_auth_rationale_107", "label": "\u5199\u5165 refreshToken\uff08\u7528\u4e8e one-time \u4f7f\u7528/\u540a\u9500\uff09", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/auth.py", "source_location": "L107"}, {"id": "core_auth_rationale_190", "label": "\u6839\u636e token \u83b7\u53d6\u5f53\u524d\u7528\u6237\uff08\u5305\u542b Redis \u4f1a\u8bdd\u6821\u9a8c\uff1b\u4f1a\u8bdd\u6ed1\u52a8\u7eed\u671f\uff09", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/auth.py", "source_location": "L190"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_backend_app_core_auth_py", "target": "asyncio", "relation": "imports", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/auth.py", "source_location": "L2", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_core_auth_pLine truncated
|
||||
+1
@@ -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": "L49"}, {"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": "L83"}, {"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": "L117"}, {"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": "L150"}, {"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": "L156"}, {"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": "L160"}, {"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": "L168"}, {"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": "L174"}, {"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": "L178"}, {"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": "L197"}, {"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": "L208"}, {"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": "L219"}, {"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": "L238"}, {"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": "L247"}, {"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": "L255"}, {"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": "L279"}, {"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": "L311"}, {"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": "L319"}, {"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": "L344"}, {"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": "L362"}, {"id": "crud_collection_protocol_audit_to_dict", "label": "_audit_to_dict()", "file_type": "code", "source_Line truncated
|
||||
+1
@@ -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_dec", "label": "_dec()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L49"}, {"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": "L55"}, {"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": "L59"}, {"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": "L64"}, {"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": "L69"}, {"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": "L73"}, {"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": "L78"}, {"id": "crud_qc_work_order_sample_type_name_for_reception", "label": "_sample_type_name_for_reception()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L90"}, {"id": "crud_qc_work_order_enrich_work_order_list_items", "label": "_enrich_work_order_list_items()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L107"}, {"id": "crud_qc_work_order_gen_daily_no", "label": "_gen_daily_no()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L179"}, {"id": "crud_qc_work_order_wo_to_dict", "label": "_wo_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L193"}, {"id": "crud_qc_work_order_create_work_order_from_reception", "label": "create_work_order_from_reception()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L223"}, {"id": "crud_qc_work_order_list_work_orders", "label": "list_work_orders()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L338"}, {"id": "crud_qc_work_order_get_work_order", "label": "get_work_order()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L380"}, {"id": "crud_qc_work_order_lab_lines", "label": "_lab_lines()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L389"}, {"id": "crud_qc_work_order_third_lines", "label": "_third_lines()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L410"}, {"id": "crud_qc_work_order_qc_info_item", "label": "_qc_info_item()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L434"}, {"id": "crud_qc_work_order_get_qc_info_map_for_samples", "label": "get_qc_info_map_for_samples()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L455"}, {"id": "crud_qc_work_order_get_work_order_detail", "label": "get_work_order_detail()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L521"}, {"id": "crud_qc_work_order_soft_delete_pending_work_order_tasks", "label": "_soft_delete_pending_work_order_tasks()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L571"}, {"id": "crud_qc_work_order_configure_work_order", "label": "configure_work_order()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L605"}, {"id": "crud_qc_work_order_try_complete_work_order", "label": "try_complete_work_order()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.pLine truncated
|
||||
+1
@@ -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": "L49"}, {"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": "L83"}, {"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": "L117"}, {"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": "L150"}, {"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": "L156"}, {"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": "L160"}, {"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": "L168"}, {"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": "L174"}, {"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": "L178"}, {"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": "L197"}, {"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": "L208"}, {"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": "L219"}, {"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": "L238"}, {"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": "L247"}, {"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": "L255"}, {"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": "L279"}, {"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": "L311"}, {"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": "L319"}, {"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": "L344"}, {"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": "L362"}, {"id": "crud_collection_protocol_audit_to_dict", "label": "_audit_to_dict()", "file_type": "code", "source_Line truncated
|
||||
+1
@@ -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": "L49"}, {"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": "L83"}, {"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": "L117"}, {"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": "L150"}, {"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": "L156"}, {"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": "L160"}, {"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": "L168"}, {"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": "L174"}, {"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": "L178"}, {"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": "L197"}, {"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": "L208"}, {"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": "L219"}, {"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": "L238"}, {"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": "L247"}, {"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": "L255"}, {"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": "L279"}, {"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": "L311"}, {"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": "L319"}, {"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": "L344"}, {"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": "L362"}, {"id": "crud_collection_protocol_audit_to_dict", "label": "_audit_to_dict()", "file_type": "code", "source_Line truncated
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_api_leave_py", "label": "leave.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/leave.py", "source_location": "L1"}, {"id": "api_leave_leave_local_callback", "label": "_leave_local_callback()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/leave.py", "source_location": "L24"}, {"id": "api_leave_list_leaves", "label": "list_leaves()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/leave.py", "source_location": "L39"}, {"id": "api_leave_create_leave", "label": "create_leave()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/leave.py", "source_location": "L62"}, {"id": "api_leave_submit_leave", "label": "submit_leave()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/leave.py", "source_location": "L87"}, {"id": "api_leave_leave_workflow_callback", "label": "leave_workflow_callback()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/leave.py", "source_location": "L142"}, {"id": "api_leave_get_leave", "label": "get_leave()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/leave.py", "source_location": "L161"}, {"id": "api_leave_delete_leave", "label": "delete_leave()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/leave.py", "source_location": "L174"}, {"id": "api_leave_update_leave", "label": "update_leave()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/leave.py", "source_location": "L191"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_backend_app_api_leave_py", "target": "logging", "relation": "imports", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/leave.py", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_api_leave_py", "target": "typing", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/leave.py", "source_location": "L5", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_api_leave_py", "target": "fastapi", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/leave.py", "source_location": "L7", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_api_leave_py", "target": "sqlalchemy_orm", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/leave.py", "source_location": "L8", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_api_leave_py", "target": "app_core_menu_guard", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/leave.py", "source_location": "L10", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_api_leave_py", "target": "app_core_database", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/leave.py", "source_location": "L11", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_api_leave_py", "target": "app_core_response", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/leave.py", "source_location": "L12", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_api_leave_py", "target": "app_crud", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/leave.py", "source_location": "L13", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_api_leave_py", "target": "app_crud_leave", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/leave.py", "source_location": "L14", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_api_leave_py", "target": "app_schemas_leave", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/leave.py", "source_location": "L15", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_api_leave_py", "target": "api_leave_leave_local_callback", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/leave.py", "source_location": "L24", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_backend_app_api_leave_py", "target": "app_services_workflow_callback", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/leave.py", "source_location": "L34", "weighLine truncated
|
||||
+1
@@ -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": "L34"}, {"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": "L39"}, {"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": "L43"}, {"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": "L49"}, {"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": "L73"}, {"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": "L107"}, {"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": "L141"}, {"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": "L172"}, {"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": "L253"}, {"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": "L287"}, {"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": "L374"}, {"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": "L430"}, {"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": "L557"}, {"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": "L625"}, {"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": "L801"}, {"id": "crud_sample_reception_reception_sample_code", "label": "_reception_sample_code()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L818"}, {"id": "crud_sample_reception_get_receptions_map_for_samples", "label": "get_receptions_map_for_samples()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L833"}, {"id": "crud_sample_reception_get_receptions_map_for_donation_samples", "label": "get_receptions_map_for_donation_samples()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L878"}, {"id": "crud_sample_reception_rationale_35", "label": "\u6350\u8d60\u6837\u672c ID \u4e0e biz_sample_reception.donation_sample_id \u6bd4\u8f83\u65f6\u7edf\u4e00\u6392\u5e8f\u89c4\u5219\u3002", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L35"}, {"id": "crud_sample_reception_rationale_74", "label": "\u534f\u8bae\u6837\u672c + \u534f\u8bae\u5355 + \u5ba2\u6237 + \u8fd0\u8f93\uff08\u663e\u5f0f select_from \u907f\u514d\u591a\u8868 join \u6b67\u4e49\uff09\u3002", "fiLine truncated
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_core_context_py", "label": "context.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/context.py", "source_location": "L1"}, {"id": "core_context_rationale_1", "label": "\u8bf7\u6c42\u7ea7\u522b\u7684\u7528\u6237\u4e0a\u4e0b\u6587\u53d8\u91cf \u901a\u8fc7 contextvars \u5728\u8bf7\u6c42\u5904\u7406\u94fe\u8def\u4e2d\u4f20\u9012\u5f53\u524d\u7528\u6237\u4fe1\u606f\uff0c \u4f9b SQLAlchemy \u4e8b\u4ef6\u76d1\u542c\u5668\u7b49\u5e95\u5c42\u673a\u5236\u4f7f\u7528\uff0c\u907f\u514d\u9010\u5c42\u624b\u52a8\u4f20", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/context.py", "source_location": "L1"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_backend_app_core_context_py", "target": "contextvars", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/context.py", "source_location": "L6", "weight": 1.0}, {"source": "core_context_rationale_1", "target": "users_wuzilong_work_00code_zkxw_backend_app_core_context_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/core/context.py", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
|
||||
+1
@@ -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_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": "L53"}, {"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": "L67"}, {"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": "L116"}, {"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": "L140"}, {"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": "L155"}, {"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": "L174"}, {"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": "L200"}, {"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": "L210"}, {"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": "L246"}, {"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": "L289"}, {"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": "L338"}, {"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": "L364"}, {"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": "L385"}, {"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": "L393"}, {"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": "L422"}, {"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": "L445"}, {"id": "api_collection_protocol_refundfinancesubmitbody", "label": "RefundFinanceSubmitBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/collection_protocol.py", "source_location": "L451"}, {"id": "api_collection_protocol_batchrefundfinancesubmitbody", "label": "BatchRefundFinanceSubmitBody", "file_type": "code", "source_file": "/Users/wuzilongLine truncated
|
||||
+1
@@ -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_dec", "label": "_dec()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L49"}, {"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": "L55"}, {"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": "L59"}, {"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": "L64"}, {"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": "L69"}, {"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": "L73"}, {"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": "L78"}, {"id": "crud_qc_work_order_sample_type_name_for_reception", "label": "_sample_type_name_for_reception()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L90"}, {"id": "crud_qc_work_order_enrich_work_order_list_items", "label": "_enrich_work_order_list_items()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L107"}, {"id": "crud_qc_work_order_gen_daily_no", "label": "_gen_daily_no()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L179"}, {"id": "crud_qc_work_order_wo_to_dict", "label": "_wo_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L193"}, {"id": "crud_qc_work_order_create_work_order_from_reception", "label": "create_work_order_from_reception()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L223"}, {"id": "crud_qc_work_order_list_work_orders", "label": "list_work_orders()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L338"}, {"id": "crud_qc_work_order_get_work_order", "label": "get_work_order()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L380"}, {"id": "crud_qc_work_order_lab_lines", "label": "_lab_lines()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L389"}, {"id": "crud_qc_work_order_third_lines", "label": "_third_lines()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L410"}, {"id": "crud_qc_work_order_qc_info_item", "label": "_qc_info_item()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L434"}, {"id": "crud_qc_work_order_get_qc_info_map_for_samples", "label": "get_qc_info_map_for_samples()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L455"}, {"id": "crud_qc_work_order_get_work_order_detail", "label": "get_work_order_detail()", "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_soft_delete_pending_work_order_tasks", "label": "_soft_delete_pending_work_order_tasks()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L568"}, {"id": "crud_qc_work_order_configure_work_order", "label": "configure_work_order()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L602"}, {"id": "crud_qc_work_order_try_complete_work_order", "label": "try_complete_work_order()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.pLine truncated
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_backend_app_api_insurance_company_py", "label": "insurance_company.py", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/insurance_company.py", "source_location": "L1"}, {"id": "api_insurance_company_get_tenant_no", "label": "_get_tenant_no()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/insurance_company.py", "source_location": "L29"}, {"id": "api_insurance_company_generate_uuid", "label": "_generate_uuid()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/insurance_company.py", "source_location": "L39"}, {"id": "api_insurance_company_fmt_dt", "label": "_fmt_dt()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/insurance_company.py", "source_location": "L43"}, {"id": "api_insurance_company_total_pages", "label": "_total_pages()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/insurance_company.py", "source_location": "L51"}, {"id": "api_insurance_company_row_to_dict_company", "label": "_row_to_dict_company()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/insurance_company.py", "source_location": "L60"}, {"id": "api_insurance_company_row_to_dict_invoice", "label": "_row_to_dict_invoice()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/insurance_company.py", "source_location": "L79"}, {"id": "api_insurance_company_row_to_dict_project_price", "label": "_row_to_dict_project_price()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/insurance_company.py", "source_location": "L100"}, {"id": "api_insurance_company_list_insurance_companies", "label": "_list_insurance_companies()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/insurance_company.py", "source_location": "L123"}, {"id": "api_insurance_company_create_insurance_company", "label": "_create_insurance_company()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/insurance_company.py", "source_location": "L142"}, {"id": "api_insurance_company_update_insurance_company", "label": "_update_insurance_company()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/insurance_company.py", "source_location": "L178"}, {"id": "api_insurance_company_soft_delete_insurance_company", "label": "_soft_delete_insurance_company()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/insurance_company.py", "source_location": "L224"}, {"id": "api_insurance_company_list_insurance_company_invoices", "label": "_list_insurance_company_invoices()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/insurance_company.py", "source_location": "L245"}, {"id": "api_insurance_company_create_insurance_company_invoice", "label": "_create_insurance_company_invoice()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/insurance_company.py", "source_location": "L273"}, {"id": "api_insurance_company_update_insurance_company_invoice", "label": "_update_insurance_company_invoice()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/insurance_company.py", "source_location": "L313"}, {"id": "api_insurance_company_soft_delete_insurance_company_invoice", "label": "_soft_delete_insurance_company_invoice()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/insurance_company.py", "source_location": "L362"}, {"id": "api_insurance_company_list_insurance_project_prices", "label": "_list_insurance_project_prices()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/insurance_company.py", "source_location": "L383"}, {"id": "api_insurance_company_create_insurance_project_price", "label": "_create_insurance_project_price()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/insurance_company.py", "source_location": "L411"}, {"id": "api_insurance_company_update_insurance_project_price", "label": "_update_insurance_project_price()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/insurance_company.py", "source_location": "L445"}, {"id": "api_insurance_company_soft_delete_insurance_project_price", "label": "_soft_delete_insurance_project_price()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/insurance_company.py", "source_location": "L485"}, {"id": "api_insurance_company_insurancecompanycreatebody", "label": "InsuranceCompanyCreateBody", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/api/insurance_company.py", "source_location": "L506"}, {"id": "basemodel", "label": "BaseModel", "file_typeLine truncated
|
||||
+1
@@ -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_dec", "label": "_dec()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L49"}, {"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": "L55"}, {"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": "L59"}, {"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": "L64"}, {"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": "L69"}, {"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": "L73"}, {"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": "L78"}, {"id": "crud_qc_work_order_sample_type_name_for_reception", "label": "_sample_type_name_for_reception()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L90"}, {"id": "crud_qc_work_order_enrich_work_order_list_items", "label": "_enrich_work_order_list_items()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L107"}, {"id": "crud_qc_work_order_gen_daily_no", "label": "_gen_daily_no()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L179"}, {"id": "crud_qc_work_order_wo_to_dict", "label": "_wo_to_dict()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L193"}, {"id": "crud_qc_work_order_create_work_order_from_reception", "label": "create_work_order_from_reception()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L223"}, {"id": "crud_qc_work_order_list_work_orders", "label": "list_work_orders()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L338"}, {"id": "crud_qc_work_order_get_work_order", "label": "get_work_order()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L380"}, {"id": "crud_qc_work_order_lab_lines", "label": "_lab_lines()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L389"}, {"id": "crud_qc_work_order_third_lines", "label": "_third_lines()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L410"}, {"id": "crud_qc_work_order_qc_info_item", "label": "_qc_info_item()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L434"}, {"id": "crud_qc_work_order_get_qc_info_map_for_samples", "label": "get_qc_info_map_for_samples()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L455"}, {"id": "crud_qc_work_order_get_work_order_detail", "label": "get_work_order_detail()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L516"}, {"id": "crud_qc_work_order_soft_delete_pending_work_order_tasks", "label": "_soft_delete_pending_work_order_tasks()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L566"}, {"id": "crud_qc_work_order_configure_work_order", "label": "configure_work_order()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py", "source_location": "L600"}, {"id": "crud_qc_work_order_try_complete_work_order", "label": "try_complete_work_order()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.pLine truncated
|
||||
+1
@@ -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": "L34"}, {"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": "L39"}, {"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": "L43"}, {"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": "L49"}, {"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": "L73"}, {"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": "L107"}, {"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": "L141"}, {"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": "L172"}, {"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": "L253"}, {"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": "L282"}, {"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": "L364"}, {"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": "L420"}, {"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": "L532"}, {"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": "L609"}, {"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": "L781"}, {"id": "crud_sample_reception_reception_sample_code", "label": "_reception_sample_code()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L798"}, {"id": "crud_sample_reception_get_receptions_map_for_samples", "label": "get_receptions_map_for_samples()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L813"}, {"id": "crud_sample_reception_get_receptions_map_for_donation_samples", "label": "get_receptions_map_for_donation_samples()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L894"}, {"id": "crud_sample_reception_rationale_35", "label": "\u6350\u8d60\u6837\u672c ID \u4e0e biz_sample_reception.donation_sample_id \u6bd4\u8f83\u65f6\u7edf\u4e00\u6392\u5e8f\u89c4\u5219\u3002", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L35"}, {"id": "crud_sample_reception_rationale_74", "label": "\u534f\u8bae\u6837\u672c + \u534f\u8bae\u5355 + \u5ba2\u6237 + \u8fd0\u8f93\uff08\u663e\u5f0f select_from \u907f\u514d\u591a\u8868 join \u6b67\u4e49\uff09\u3002", "fiLine truncated
|
||||
+1
@@ -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": "L47"}, {"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": "L81"}, {"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": "L115"}, {"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": "L148"}, {"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": "L154"}, {"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": "L158"}, {"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": "L166"}, {"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": "L172"}, {"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": "L176"}, {"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": "L195"}, {"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": "L206"}, {"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": "L217"}, {"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": "L236"}, {"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": "L245"}, {"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": "L253"}, {"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": "L277"}, {"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": "L309"}, {"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": "L317"}, {"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": "L342"}, {"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": "L360"}, {"id": "crud_collection_protocol_audit_to_dict", "label": "_audit_to_dict()", "file_type": "code", "source_Line truncated
|
||||
+1
@@ -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": "L34"}, {"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": "L39"}, {"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": "L43"}, {"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": "L49"}, {"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": "L73"}, {"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": "L107"}, {"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": "L141"}, {"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": "L172"}, {"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": "L253"}, {"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": "L293"}, {"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": "L380"}, {"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": "L436"}, {"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": "L570"}, {"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": "L647"}, {"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": "L823"}, {"id": "crud_sample_reception_reception_sample_code", "label": "_reception_sample_code()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L840"}, {"id": "crud_sample_reception_get_receptions_map_for_samples", "label": "get_receptions_map_for_samples()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L855"}, {"id": "crud_sample_reception_get_receptions_map_for_donation_samples", "label": "get_receptions_map_for_donation_samples()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L898"}, {"id": "crud_sample_reception_rationale_35", "label": "\u6350\u8d60\u6837\u672c ID \u4e0e biz_sample_reception.donation_sample_id \u6bd4\u8f83\u65f6\u7edf\u4e00\u6392\u5e8f\u89c4\u5219\u3002", "file_type": "rationale", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py", "source_location": "L35"}, {"id": "crud_sample_reception_rationale_74", "label": "\u534f\u8bae\u6837\u672c + \u534f\u8bae\u5355 + \u5ba2\u6237 + \u8fd0\u8f93\uff08\u663e\u5f0f select_from \u907f\u514d\u591a\u8868 join \u6b67\u4e49\uff09\u3002", "fiLine truncated
|
||||
+1
@@ -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": "L220"}, {"id": "models_models_sysuserpost", "label": "SysUserPost", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L240"}, {"id": "models_models_bizitemunit", "label": "BizItemUnit", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L259"}, {"id": "models_models_bizexpresscompany", "label": "BizExpressCompany", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L278"}, {"id": "models_models_bizcustomer", "label": "BizCustomer", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L297"}, {"id": "models_models_bizcellsampletype", "label": "BizCellSampleType", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L320"}, {"id": "models_models_bizcollectionregion", "label": "BizCollectionRegion", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L341"}, {"id": "models_models_bizcollectionhospital", "label": "BizCollectionHospital", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L359"}, {"id": "models_models_bizcollectionprotocolno", "label": "BizCollectionProtocolNo", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L378"}, {"id": "models_models_bizsamplecode", "label": "BizSampleCode", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L400"}, {"id": "models_models_sysdicttype", "label": "SysDictType", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L428"}, {"id": "models_models_sysethnic", "label": "SysEthnic", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L447"}, {"id": "models_models_sysdictdata", "label": "SysDictData", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location": "L466"}, {"id": "models_models_sysapirequestlog", "label": "SysApiRequestLog", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py", "source_location"Line truncated
|
||||
@@ -2378,12 +2378,12 @@ class BizProtocolFullmoonTodo(Base):
|
||||
|
||||
id = Column(String(64), primary_key=True, comment="主键ID")
|
||||
collection_protocol_id = Column(String(64), nullable=False, comment="采集协议单ID")
|
||||
todo_status = Column(CHAR(1), nullable=False, default="0", comment="1已办报销 0未办保险")
|
||||
todo_status = Column(CHAR(1), nullable=False, default="0", comment="1已办保险 0未办保险")
|
||||
handle_date = Column(CHAR(8), nullable=True, comment="办理日期")
|
||||
handle_remark = Column(String(512), nullable=True, comment="办理备注")
|
||||
insurance_attachments = Column(String(4000), nullable=True, comment="保险附件逗号分隔")
|
||||
insurance_company_id = Column(String(64), nullable=True, comment="保险公司ID")
|
||||
insurance_company_name = Column(String(200), nullable=True, comment="保险公司名称")
|
||||
insurance_company_name = Column(String(200), nullable=True, comment="保险公司名称(冗余快照)")
|
||||
insurance_type = Column(String(200), nullable=True, comment="保险险种")
|
||||
insurance_policy_no = Column(String(100), nullable=True, comment="保险单号")
|
||||
insurance_effective_date = Column(CHAR(8), nullable=True, comment="保险单生效时间YYYYMMDD")
|
||||
@@ -2448,14 +2448,14 @@ class BizInsuranceCompanyInvoice(Base):
|
||||
|
||||
|
||||
class BizInsuranceProjectPrice(Base):
|
||||
"""保险项目价格 biz_insurance_project_price"""
|
||||
"""保险险种价格 biz_insurance_project_price"""
|
||||
|
||||
__tablename__ = "biz_insurance_project_price"
|
||||
|
||||
id = Column(String(64), primary_key=True, comment="主键ID")
|
||||
insurance_company_id = Column(String(64), nullable=False, comment="保险公司ID")
|
||||
project_name = Column(String(200), nullable=False, comment="项目名称")
|
||||
project_fee = Column(Numeric(18, 2), nullable=True, comment="项目费用(元)")
|
||||
project_name = Column(String(200), nullable=False, comment="险种名称")
|
||||
project_fee = Column(Numeric(18, 2), nullable=True, comment="险种费用(元)")
|
||||
status = Column(CHAR(1), nullable=False, default="1", comment="1正常 0停用")
|
||||
tenant_no = Column(String(64), nullable=False, default="zkxw", comment="租户编号")
|
||||
order_num = Column(Integer, nullable=True, comment="排序号")
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
+2389
-1129
File diff suppressed because it is too large.
Load diff
@@ -1,12 +1,12 @@
|
||||
# Graph Report - app (2026-05-20)
|
||||
|
||||
## Corpus Check
|
||||
- 134 files · ~111,232 words
|
||||
- 135 files · ~112,111 words
|
||||
- Verdict: corpus is large enough that graph structure adds value.
|
||||
|
||||
## Summary
|
||||
- 2296 nodes · 8837 edges · 52 communities detected
|
||||
- Extraction: 42% EXTRACTED · 58% INFERRED · 0% AMBIGUOUS · INFERRED: 5082 edges (avg confidence: 0.63)
|
||||
- 2312 nodes · 8962 edges · 51 communities detected
|
||||
- Extraction: 42% EXTRACTED · 58% INFERRED · 0% AMBIGUOUS · INFERRED: 5177 edges (avg confidence: 0.63)
|
||||
- Token cost: 0 input · 0 output
|
||||
|
||||
## Community Hubs (Navigation)
|
||||
@@ -55,18 +55,17 @@
|
||||
- [[_COMMUNITY_Community 42|Community 42]]
|
||||
- [[_COMMUNITY_Community 43|Community 43]]
|
||||
- [[_COMMUNITY_Community 44|Community 44]]
|
||||
- [[_COMMUNITY_Community 46|Community 46]]
|
||||
- [[_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]]
|
||||
- [[_COMMUNITY_Community 53|Community 53]]
|
||||
- [[_COMMUNITY_Community 54|Community 54]]
|
||||
|
||||
## God Nodes (most connected - your core abstractions)
|
||||
1. `success_response()` - 367 edges
|
||||
2. `error_response()` - 293 edges
|
||||
3. `SysUser` - 202 edges
|
||||
3. `SysUser` - 205 edges
|
||||
4. `BizQcTaskResult` - 193 edges
|
||||
5. `BizQcMaterialUsage` - 190 edges
|
||||
6. `BizMaterialStockLog` - 189 edges
|
||||
@@ -90,249 +89,249 @@
|
||||
## Communities
|
||||
|
||||
### Community 0 - "Community 0"
|
||||
Cohesion: 0.01
|
||||
Nodes (381): AttachmentDownloadUrlBody, DeptCreateBody, DeptUpdateBody, DictDataCreateBody, DictDataUpdateBody, DictTypeCreateBody, DictTypeUpdateBody, ExpressCompanyCreateBody (+373 more)
|
||||
Cohesion: 0.02
|
||||
Nodes (396): attachment_download_url(), create_dept(), create_dict_data(), create_dict_type(), create_express_company(), create_item_unit(), create_menu(), create_post() (+388 more)
|
||||
|
||||
### Community 1 - "Community 1"
|
||||
Cohesion: 0.02
|
||||
Nodes (379): attachment_download_url(), create_dept(), create_dict_data(), create_dict_type(), create_express_company(), create_item_unit(), create_menu(), create_post() (+371 more)
|
||||
Cohesion: 0.01
|
||||
Nodes (358): AttachmentDownloadUrlBody, DeptCreateBody, DeptUpdateBody, DictDataCreateBody, DictDataUpdateBody, DictTypeCreateBody, DictTypeUpdateBody, ExpressCompanyCreateBody (+350 more)
|
||||
|
||||
### Community 2 - "Community 2"
|
||||
Cohesion: 0.05
|
||||
Nodes (260): AuditCreateBody, BatchDetailIdsBody, BatchRefundFinanceSubmitBody, FinanceConfirmBody, FullmoonTodoInsuranceBody, ProtocolCreateBody, ProtocolUpdateBody, 细胞存储 — 采集协议单 / 审核 / 财务确认 / 分期预警 API (+252 more)
|
||||
Nodes (235): InsuranceCompanyCreateBody, InsuranceCompanyInvoiceCreateBody, InsuranceCompanyInvoiceUpdateBody, InsuranceCompanyUpdateBody, InsuranceProjectPriceCreateBody, InsuranceProjectPriceUpdateBody, 保险公司及险种价格管理 API(保险公司 + 开票信息 + 险种价格), AccessLogCreateBody (+227 more)
|
||||
|
||||
### Community 3 - "Community 3"
|
||||
Cohesion: 0.02
|
||||
Nodes (165): generate_uuid(), create_consumable_pack(), get_consumable_pack(), get_pack_detail(), _item_row_to_dict(), list_all_packs(), list_consumable_packs(), pack_code_exists() (+157 more)
|
||||
Nodes (134): get_designer_data(), delete(), get_multi_with_filters(), _access_log_to_dict(), create_access_log(), create_clean_room(), get_access_log(), get_clean_room() (+126 more)
|
||||
|
||||
### Community 4 - "Community 4"
|
||||
Cohesion: 0.03
|
||||
Nodes (107): _persist_protocol_sub_resources(), delete(), get_multi_with_filters(), create_cell_product(), delete_cell_product(), get_cell_product(), list_cell_products(), 细胞产品 CRUD(biz_cell_product) (+99 more)
|
||||
Cohesion: 0.02
|
||||
Nodes (149): generate_uuid(), _code_exists(), create_material(), _dec(), _fmt_dt(), get_material(), list_materials(), options_list() (+141 more)
|
||||
|
||||
### Community 5 - "Community 5"
|
||||
Cohesion: 0.05
|
||||
Nodes (89): _format_attachment_file_size(), get_protocol_nos_used_in_protocols(), urls_to_attachment_list(), complete_production_work_order(), create_production_work_order_from_reception(), _fmt_dt(), _generate_work_order_no(), get_production_work_order() (+81 more)
|
||||
Cohesion: 0.1
|
||||
Nodes (122): CellSampleTypeCreateBody, CellSampleTypeUpdateBody, CollectionRegionCreateBody, CollectionRegionUpdateBody, CustomerCreateBody, CustomerUpdateBody, HospitalCreateBody, HospitalUpdateBody (+114 more)
|
||||
|
||||
### Community 6 - "Community 6"
|
||||
Cohesion: 0.04
|
||||
Nodes (64): _avatar_url_field(), _build_user_info_payload(), get_web_auth_menu_codes(), _jwt_user_payload(), logout(), 公共接口(Web 登录、刷新 Token、登出;用户模型对齐 docs/sql/zkxw.sql 基线), 登出:吊销 Redis 会话(若已配置 REDIS_HOST)。, 获取当前用户菜单权限标识(sys_menu.perms,经角色继承)。 (+56 more)
|
||||
Nodes (96): _format_attachment_file_size(), get_protocol_nos_used_in_protocols(), urls_to_attachment_list(), complete_production_work_order(), create_production_work_order_from_reception(), _fmt_dt(), _generate_work_order_no(), get_production_work_order() (+88 more)
|
||||
|
||||
### Community 7 - "Community 7"
|
||||
Cohesion: 0.07
|
||||
Nodes (66): _parse_datetime_fields(), AuditSubmitBody, batch_delete_research_donations(), BatchDeleteBody, change_donation_status(), convert_from_storage(), convert_to_storage(), ConvertFromStorageBody (+58 more)
|
||||
Cohesion: 0.03
|
||||
Nodes (71): _avatar_url_field(), _build_user_info_payload(), _jwt_user_payload(), logout(), 公共接口(Web 登录、刷新 Token、登出;用户模型对齐 docs/sql/zkxw.sql 基线), 登出:吊销 Redis 会话(若已配置 REDIS_HOST)。, 与 web-admin `userInfo` 字段约定一致。, Web 端登录用 RSA 公钥(PKCS#1 v1.5,与 JSEncrypt 一致) (+63 more)
|
||||
|
||||
### Community 8 - "Community 8"
|
||||
Cohesion: 0.06
|
||||
Nodes (75): _persist_protocol_sub_resources(), _add_months_yyyymmdd(), align_fq_payment_details_payload(), _apply_submit_receipt_finance(), _apply_submit_refund_finance(), attachments_to_urls(), _audit_to_dict(), batch_submit_receipt_finance() (+67 more)
|
||||
|
||||
### Community 9 - "Community 9"
|
||||
Cohesion: 0.05
|
||||
Nodes (26): BusinessException, InvalidStatusTransitionException, log_delivery_operation(), log_operation(), log_order_operation(), log_settlement_operation(), log_user_operation(), OrderLockedException (+18 more)
|
||||
|
||||
### Community 9 - "Community 9"
|
||||
Cohesion: 0.06
|
||||
Nodes (55): get_designer_data(), ProcessDefCreateBody, ProcessDefUpdateBody, PublishVersionBody, 审批意见:前端传 commentText,兼容 comment。, StartInstanceBody, TaskActionBody, list_results_by_task() (+47 more)
|
||||
|
||||
### Community 10 - "Community 10"
|
||||
Cohesion: 0.07
|
||||
Nodes (62): AccessLogCreateBody, AccessLogUpdateBody, CleanRoomCreateBody, CleanRoomUpdateBody, ExhibitionAppointmentCreateBody, ExhibitionAppointmentUpdateBody, 运营支撑 API(洁净室、进出记录、仓储设施、储位、展厅预约), StorageFacilityCreateBody (+54 more)
|
||||
Cohesion: 0.4
|
||||
Nodes (47): ConsumableCreateBody, ConsumablePackCreateBody, ConsumablePackUpdateBody, ConsumableUpdateBody, OutputTypeCreateBody, OutputTypeUpdateBody, PackItemInput, ProcessCategoryCreateBody (+39 more)
|
||||
|
||||
### Community 11 - "Community 11"
|
||||
Cohesion: 0.43
|
||||
Nodes (45): ConsumableCreateBody, ConsumablePackCreateBody, ConsumablePackUpdateBody, ConsumableUpdateBody, OutputTypeCreateBody, OutputTypeUpdateBody, PackItemInput, ProcessCategoryCreateBody (+37 more)
|
||||
Cohesion: 0.14
|
||||
Nodes (34): parse_datetime(), _audit_to_dict(), batch_delete_donations(), change_status(), _collection_to_dict(), _create_collection(), create_donation(), _create_party() (+26 more)
|
||||
|
||||
### Community 12 - "Community 12"
|
||||
Cohesion: 0.08
|
||||
Nodes (35): BaseHTTPMiddleware, parse_admin_request_json(), 运营 Web(/web/admin)JSON 请求体解析。 与 ApiCryptoMiddleware 配合:中间件未改写 body 时,在路由内解密 `, 读取 JSON body;dict 时走 resolve_request_payload(明文 / 密文 / data 包装)。 Returns:, ApiCryptoError, _b64url_decode(), _b64url_encode(), decrypt_json() (+27 more)
|
||||
|
||||
### Community 13 - "Community 13"
|
||||
Cohesion: 0.12
|
||||
Nodes (11): 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, 申请退款 Args: out_trade_no: 商户订单号 total_amount, 小程序调起支付的二次签名参数(与公众号 JSAPI 规则一致), 统一下单 (V2 API) Args: out_trade_no: 商户订单号 tot, 生成签名 V3 (SHA256 with RSA) (+3 more)
|
||||
|
||||
### Community 13 - "Community 13"
|
||||
Cohesion: 0.1
|
||||
Nodes (26): BaseHTTPMiddleware, parse_admin_request_json(), 运营 Web(/web/admin)JSON 请求体解析。 与 ApiCryptoMiddleware 配合:中间件未改写 body 时,在路由内解密 `, 读取 JSON body;dict 时走 resolve_request_payload(明文 / 密文 / data 包装)。 Returns:, ApiCryptoError, _b64url_decode(), _b64url_encode(), decrypt_json() (+18 more)
|
||||
|
||||
### Community 14 - "Community 14"
|
||||
Cohesion: 0.22
|
||||
Nodes (18): _consumable_row_to_dict(), create_process(), _create_sub_consumable(), _create_sub_data_collection(), _create_sub_output(), _create_sub_reagent(), _data_collection_row_to_dict(), get_process() (+10 more)
|
||||
Cohesion: 0.21
|
||||
Nodes (22): _create_insurance_company(), _create_insurance_company_invoice(), _create_insurance_project_price(), delete_insurance_company(), delete_insurance_company_invoice(), delete_insurance_project_price(), _fmt_dt(), _generate_uuid() (+14 more)
|
||||
|
||||
### Community 15 - "Community 15"
|
||||
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 16 - "Community 16"
|
||||
Cohesion: 0.26
|
||||
Nodes (16): InsuranceCompanyCreateBody, InsuranceCompanyInvoiceCreateBody, InsuranceCompanyInvoiceUpdateBody, InsuranceCompanyUpdateBody, InsuranceProjectPriceCreateBody, InsuranceProjectPriceUpdateBody, _list_insurance_companies(), 保险公司管理 API(保险公司 + 开票信息 + 项目价格) (+8 more)
|
||||
Cohesion: 0.22
|
||||
Nodes (18): _consumable_row_to_dict(), create_process(), _create_sub_consumable(), _create_sub_data_collection(), _create_sub_output(), _create_sub_reagent(), _data_collection_row_to_dict(), get_process() (+10 more)
|
||||
|
||||
### Community 17 - "Community 17"
|
||||
Cohesion: 0.19
|
||||
Nodes (12): get_role_data_scope(), get_role_menus(), create_role(), get_role(), get_role_menu_ids(), list_roles(), 角色 CRUD(sys_role / sys_role_menu / sys_role_data_scope_detail), role_name_exists() (+4 more)
|
||||
Cohesion: 0.2
|
||||
Nodes (15): batch_create_slots(), collect_descendant_ids(), create_facility(), create_slot(), get_children(), get_facility(), get_slot(), list_all_facilities() (+7 more)
|
||||
|
||||
### Community 18 - "Community 18"
|
||||
Cohesion: 0.23
|
||||
Nodes (12): create_collection_region(), create_hospital(), get_collection_region(), get_hospital(), _hospital_to_dict(), list_collection_regions(), list_hospitals(), _region_to_dict() (+4 more)
|
||||
|
||||
### Community 19 - "Community 19"
|
||||
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 20 - "Community 20"
|
||||
Cohesion: 0.23
|
||||
Nodes (12): Config, ProductBase, ProductCategoryBase, ProductCategoryCreate, ProductCategoryResponse, ProductCreate, ProductResponse, ProductUnitBase (+4 more)
|
||||
|
||||
### Community 21 - "Community 21"
|
||||
### Community 19 - "Community 19"
|
||||
Cohesion: 0.27
|
||||
Nodes (10): batch_issue_sample_codes(), batch_revoke_sample_codes(), create_sample_code(), get_sample_code(), list_sample_codes(), 样本编码池 CRUD(biz_sample_code), _row_to_dict(), sample_code_exists() (+2 more)
|
||||
|
||||
### Community 22 - "Community 22"
|
||||
Cohesion: 0.26
|
||||
Nodes (10): list_menus(), _build_tree(), _cascade_soft_delete(), create_menu(), get_menu(), list_menus(), list_menus_tree(), _row_to_dict() (+2 more)
|
||||
### Community 20 - "Community 20"
|
||||
Cohesion: 0.27
|
||||
Nodes (10): create_collection_region(), create_hospital(), get_collection_region(), get_hospital(), _hospital_to_dict(), list_hospitals(), soft_delete_collection_region(), soft_delete_hospital() (+2 more)
|
||||
|
||||
### Community 23 - "Community 23"
|
||||
### Community 21 - "Community 21"
|
||||
Cohesion: 0.3
|
||||
Nodes (10): create_consumable_pack(), get_consumable_pack(), get_pack_detail(), _item_row_to_dict(), list_all_packs(), list_consumable_packs(), pack_code_exists(), _row_to_dict() (+2 more)
|
||||
|
||||
### Community 22 - "Community 22"
|
||||
Cohesion: 0.27
|
||||
Nodes (10): batch_issue_protocol_nos(), batch_revoke_protocol_nos(), create_protocol_no(), get_protocol_no(), list_protocol_nos(), protocol_no_exists(), 采集协议号池 CRUD(biz_collection_protocol_no), _row_to_dict() (+2 more)
|
||||
|
||||
### Community 24 - "Community 24"
|
||||
Cohesion: 0.24
|
||||
Nodes (9): dict_data_options(), create_dict_data(), get_dict_data(), list_dict_data(), list_dict_data_options(), 字典数据 CRUD(sys_dict_data), _row_to_dict(), soft_delete_dict_data() (+1 more)
|
||||
|
||||
### Community 25 - "Community 25"
|
||||
### Community 23 - "Community 23"
|
||||
Cohesion: 0.29
|
||||
Nodes (10): list_depts(), _build_tree(), _cascade_soft_delete(), create_dept(), get_dept(), list_depts(), list_depts_tree(), _row_to_dict() (+2 more)
|
||||
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 26 - "Community 26"
|
||||
Cohesion: 0.31
|
||||
Nodes (8): consumable_code_exists(), create_consumable(), get_consumable(), list_consumables(), 耗材 CRUD(biz_consumable), _row_to_dict(), soft_delete_consumable(), update_consumable()
|
||||
|
||||
### Community 27 - "Community 27"
|
||||
### Community 24 - "Community 24"
|
||||
Cohesion: 0.31
|
||||
Nodes (8): create_sop_document(), get_sop_document(), list_sop_documents(), SOP文档 CRUD(biz_sop_document), _row_to_dict(), soft_delete_sop_document(), sop_code_exists(), update_sop_document()
|
||||
|
||||
### Community 28 - "Community 28"
|
||||
### Community 25 - "Community 25"
|
||||
Cohesion: 0.31
|
||||
Nodes (8): create_express_company(), express_code_exists(), get_express_company(), list_express_companies(), 快递公司 CRUD(biz_express_company), _row_to_dict(), soft_delete_express_company(), update_express_company()
|
||||
|
||||
### 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 30 - "Community 30"
|
||||
### Community 26 - "Community 26"
|
||||
Cohesion: 0.31
|
||||
Nodes (8): category_code_exists(), create_process_category(), get_process_category(), list_process_categories(), 工艺工序分类 CRUD(biz_process_category), _row_to_dict(), soft_delete_process_category(), update_process_category()
|
||||
|
||||
### Community 31 - "Community 31"
|
||||
### Community 27 - "Community 27"
|
||||
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 32 - "Community 32"
|
||||
### Community 28 - "Community 28"
|
||||
Cohesion: 0.31
|
||||
Nodes (8): create_customer(), get_customer(), id_card_taken(), list_customers(), 客户 CRUD(biz_customer), _row_to_dict(), soft_delete_customer(), update_customer()
|
||||
|
||||
### Community 33 - "Community 33"
|
||||
### Community 29 - "Community 29"
|
||||
Cohesion: 0.31
|
||||
Nodes (8): 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()
|
||||
|
||||
### Community 34 - "Community 34"
|
||||
### Community 30 - "Community 30"
|
||||
Cohesion: 0.33
|
||||
Nodes (9): _build_tree(), _cascade_soft_delete(), create_dept(), get_dept(), list_depts(), list_depts_tree(), _row_to_dict(), soft_delete_dept() (+1 more)
|
||||
|
||||
### Community 31 - "Community 31"
|
||||
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 35 - "Community 35"
|
||||
### Community 32 - "Community 32"
|
||||
Cohesion: 0.36
|
||||
Nodes (7): create_dict_type(), dict_type_code_exists(), get_dict_type(), list_dict_types(), _row_to_dict(), soft_delete_dict_type(), update_dict_type()
|
||||
|
||||
### Community 36 - "Community 36"
|
||||
### Community 33 - "Community 33"
|
||||
Cohesion: 0.36
|
||||
Nodes (7): create_tenant(), get_tenant(), list_tenants(), _row_to_dict(), soft_delete_tenant(), tenant_no_exists(), update_tenant()
|
||||
|
||||
### Community 37 - "Community 37"
|
||||
Cohesion: 0.36
|
||||
Nodes (7): create_reagent(), get_reagent(), list_reagents(), reagent_code_exists(), _row_to_dict(), soft_delete_reagent(), update_reagent()
|
||||
|
||||
### Community 38 - "Community 38"
|
||||
### Community 34 - "Community 34"
|
||||
Cohesion: 0.39
|
||||
Nodes (8): create_lab_item(), get_lab_item(), item_code_exists(), list_active_lab_items(), list_lab_items(), _row_to_dict(), soft_delete_lab_item(), update_lab_item()
|
||||
|
||||
### Community 39 - "Community 39"
|
||||
### Community 35 - "Community 35"
|
||||
Cohesion: 0.31
|
||||
Nodes (7): create_cell_product(), delete_cell_product(), get_cell_product(), list_cell_products(), 细胞产品 CRUD(biz_cell_product), _row_to_dict(), update_cell_product()
|
||||
|
||||
### Community 36 - "Community 36"
|
||||
Cohesion: 0.36
|
||||
Nodes (7): create_site(), get_site(), list_sites(), _row_to_dict(), site_code_exists(), soft_delete_site(), update_site()
|
||||
|
||||
### Community 40 - "Community 40"
|
||||
### Community 37 - "Community 37"
|
||||
Cohesion: 0.29
|
||||
Nodes (2): BaseModel, SoftDeleteModel
|
||||
|
||||
### Community 41 - "Community 41"
|
||||
### Community 38 - "Community 38"
|
||||
Cohesion: 0.38
|
||||
Nodes (6): derive_legacy_status_from_three(), derive_three_status_from_legacy(), 阶段A兼容:从旧 status 推导三字段。 约束:旧 status 本身混合了支付/配送/订单生命周期,因此只能尽力推断; 若业务侧已有更精确, 阶段A兼容:从三字段反推旧 status(用于旧前端/旧筛选参数兼容)。, ThreeStatus, _to_decimal()
|
||||
|
||||
### Community 42 - "Community 42"
|
||||
### Community 39 - "Community 39"
|
||||
Cohesion: 0.4
|
||||
Nodes (4): list_ethnics_for_select(), list_ethnics(), 民族码表 CRUD(全局 sys_ethnic), _row_to_dict()
|
||||
|
||||
### Community 43 - "Community 43"
|
||||
### Community 40 - "Community 40"
|
||||
Cohesion: 0.5
|
||||
Nodes (3): BaseSettings, Config, Settings
|
||||
|
||||
### Community 44 - "Community 44"
|
||||
### Community 41 - "Community 41"
|
||||
Cohesion: 0.5
|
||||
Nodes (2): _auto_fill_create_dept_id(), ORM before_insert 钩子:当 create_dept_id 为空时,自动从请求上下文填充当前用户部门 ID
|
||||
|
||||
### Community 42 - "Community 42"
|
||||
Cohesion: 0.67
|
||||
Nodes (2): get_menu_list(), 运营端菜单接口(与 web-admin 前端静态路由 sqxp.ts 对齐,供后端菜单模式联调)
|
||||
|
||||
### Community 46 - "Community 46"
|
||||
### Community 43 - "Community 43"
|
||||
Cohesion: 1.0
|
||||
Nodes (1): 请求级别的用户上下文变量 通过 contextvars 在请求处理链路中传递当前用户信息, 供 SQLAlchemy 事件监听器等底层机制使用,避免逐层手动传
|
||||
|
||||
### Community 44 - "Community 44"
|
||||
Cohesion: 1.0
|
||||
Nodes (1): API 路由包(骨架:公共鉴权 + 静态菜单 + 运营端占位)
|
||||
|
||||
### Community 49 - "Community 49"
|
||||
### Community 47 - "Community 47"
|
||||
Cohesion: 1.0
|
||||
Nodes (1): 发送订单状态通知 Args: openid: 用户openid ord
|
||||
|
||||
### Community 50 - "Community 50"
|
||||
### Community 48 - "Community 48"
|
||||
Cohesion: 1.0
|
||||
Nodes (1): 发送支付成功通知 Args: openid: 用户openid ord
|
||||
|
||||
### Community 51 - "Community 51"
|
||||
### Community 49 - "Community 49"
|
||||
Cohesion: 1.0
|
||||
Nodes (1): 发送配送通知 Args: openid: 配送员openid task
|
||||
|
||||
### Community 52 - "Community 52"
|
||||
### Community 50 - "Community 50"
|
||||
Cohesion: 1.0
|
||||
Nodes (1): 发送配送时效预警 Args: openid: 配送员openid ta
|
||||
|
||||
### Community 53 - "Community 53"
|
||||
### Community 51 - "Community 51"
|
||||
Cohesion: 1.0
|
||||
Nodes (1): 发送退款结果通知 Args: openid: 用户openid ord
|
||||
|
||||
### Community 54 - "Community 54"
|
||||
### Community 52 - "Community 52"
|
||||
Cohesion: 1.0
|
||||
Nodes (1): 发送催单通知给配送员 Args: deliver_openid: 配送员openid
|
||||
|
||||
## Knowledge Gaps
|
||||
- **84 isolated node(s):** `刷新会话 TTL(用于 refreshToken 延长会话)`, `写入 refreshToken(用于 one-time 使用/吊销)`, `根据 token 获取当前用户(包含 Redis 会话校验)`, `登录凭据 RSA 解密(与前端 JSEncrypt PKCS#1 v1.5 兼容)。`, `Base64 密文 -> JSON 对象(须含 username、password、ts 毫秒时间戳)。` (+79 more)
|
||||
- **86 isolated node(s):** `刷新会话 TTL(refreshToken 续期;已登录用户每次 API 校验通过后滑动续期)`, `写入 refreshToken(用于 one-time 使用/吊销)`, `根据 token 获取当前用户(包含 Redis 会话校验;会话滑动续期)`, `登录凭据 RSA 解密(与前端 JSEncrypt PKCS#1 v1.5 兼容)。`, `Base64 密文 -> JSON 对象(须含 username、password、ts 毫秒时间戳)。` (+81 more)
|
||||
These have ≤1 connection - possible missing edges or undocumented components.
|
||||
- **Thin community `Community 40`** (8 nodes): `BaseModel`, `.to_dict()`, `get_active()`, `base.py`, `SoftDeleteModel`, `.restore()`, `.soft_delete()`, `__tablename__()`
|
||||
- **Thin community `Community 37`** (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 44`** (3 nodes): `get_menu_list()`, `menu.py`, `运营端菜单接口(与 web-admin 前端静态路由 sqxp.ts 对齐,供后端菜单模式联调)`
|
||||
- **Thin community `Community 41`** (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 46`** (2 nodes): `__init__.py`, `API 路由包(骨架:公共鉴权 + 静态菜单 + 运营端占位)`
|
||||
- **Thin community `Community 42`** (3 nodes): `get_menu_list()`, `menu.py`, `运营端菜单接口(与 web-admin 前端静态路由 sqxp.ts 对齐,供后端菜单模式联调)`
|
||||
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 43`** (2 nodes): `context.py`, `请求级别的用户上下文变量 通过 contextvars 在请求处理链路中传递当前用户信息, 供 SQLAlchemy 事件监听器等底层机制使用,避免逐层手动传`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 50`** (1 nodes): `发送支付成功通知 Args: openid: 用户openid ord`
|
||||
- **Thin community `Community 44`** (2 nodes): `__init__.py`, `API 路由包(骨架:公共鉴权 + 静态菜单 + 运营端占位)`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 51`** (1 nodes): `发送配送通知 Args: openid: 配送员openid task`
|
||||
- **Thin community `Community 47`** (1 nodes): `发送订单状态通知 Args: openid: 用户openid ord`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 52`** (1 nodes): `发送配送时效预警 Args: openid: 配送员openid ta`
|
||||
- **Thin community `Community 48`** (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: openid: 用户openid ord`
|
||||
- **Thin community `Community 49`** (1 nodes): `发送配送通知 Args: openid: 配送员openid task`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 54`** (1 nodes): `发送催单通知给配送员 Args: deliver_openid: 配送员openid`
|
||||
- **Thin community `Community 50`** (1 nodes): `发送配送时效预警 Args: openid: 配送员openid ta`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 51`** (1 nodes): `发送退款结果通知 Args: openid: 用户openid ord`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 52`** (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 `generate_uuid()` connect `Community 3` to `Community 0`, `Community 1`, `Community 2`, `Community 4`, `Community 5`, `Community 6`, `Community 7`, `Community 9`, `Community 10`, `Community 14`, `Community 15`, `Community 17`, `Community 18`, `Community 21`, `Community 22`, `Community 23`, `Community 24`, `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`, `Community 39`?**
|
||||
_High betweenness centrality (0.099) - this node is a cross-community bridge._
|
||||
- **Why does `SysUser` connect `Community 0` to `Community 2`, `Community 5`, `Community 6`, `Community 7`, `Community 9`, `Community 10`, `Community 11`, `Community 16`?**
|
||||
_High betweenness centrality (0.096) - this node is a cross-community bridge._
|
||||
- **Why does `success_response()` connect `Community 1` to `Community 0`, `Community 6`, `Community 7`, `Community 9`, `Community 42`, `Community 44`, `Community 16`, `Community 17`, `Community 22`, `Community 24`, `Community 25`?**
|
||||
_High betweenness centrality (0.089) - this node is a cross-community bridge._
|
||||
- **Why does `generate_uuid()` connect `Community 4` to `Community 0`, `Community 2`, `Community 3`, `Community 5`, `Community 6`, `Community 7`, `Community 8`, `Community 11`, `Community 15`, `Community 16`, `Community 17`, `Community 19`, `Community 20`, `Community 21`, `Community 22`, `Community 23`, `Community 24`, `Community 25`, `Community 26`, `Community 27`, `Community 28`, `Community 29`, `Community 30`, `Community 31`, `Community 32`, `Community 33`, `Community 34`, `Community 35`, `Community 36`?**
|
||||
_High betweenness centrality (0.097) - this node is a cross-community bridge._
|
||||
- **Why does `success_response()` connect `Community 0` to `Community 1`, `Community 3`, `Community 39`, `Community 7`, `Community 42`, `Community 14`?**
|
||||
_High betweenness centrality (0.085) - this node is a cross-community bridge._
|
||||
- **Why does `SysUser` connect `Community 1` to `Community 0`, `Community 2`, `Community 3`, `Community 5`, `Community 6`, `Community 7`, `Community 10`?**
|
||||
_High betweenness centrality (0.080) - this node is a cross-community bridge._
|
||||
- **Are the 366 inferred relationships involving `success_response()` (e.g. with `web_login_rsa_public_key()` and `web_login()`) actually correct?**
|
||||
_`success_response()` has 366 INFERRED edges - model-reasoned connections that need verification._
|
||||
- **Are the 331 inferred relationships involving `str` (e.g. with `extract_login_credentials()` and `._make_request()`) actually correct?**
|
||||
_`str` has 331 INFERRED edges - model-reasoned connections that need verification._
|
||||
- **Are the 292 inferred relationships involving `error_response()` (e.g. with `_json_error_response()` and `web_login()`) actually correct?**
|
||||
_`error_response()` has 292 INFERRED edges - model-reasoned connections that need verification._
|
||||
- **Are the 200 inferred relationships involving `SysUser` (e.g. with `数据权限过滤(V0.3:基于角色 data_scope 的查询级行级过滤) data_scope 值: 1 = 全部数据 2 = 本部门数据 3` and `从 SysUser 读取用户的 dept_id。`) actually correct?**
|
||||
_`SysUser` has 200 INFERRED edges - model-reasoned connections that need verification._
|
||||
- **Are the 203 inferred relationships involving `SysUser` (e.g. with `数据权限过滤(V0.3:基于角色 data_scope 的查询级行级过滤) data_scope 值: 1 = 全部数据 2 = 本部门数据 3` and `从 SysUser 读取用户的 dept_id。`) actually correct?**
|
||||
_`SysUser` has 203 INFERRED edges - model-reasoned connections that need verification._
|
||||
@@ -57,12 +57,12 @@
|
||||
</div>
|
||||
<div id="legend"></div>
|
||||
</div>
|
||||
<div id="stats">2296 nodes · 8837 edges · 59 communities</div>
|
||||
<div id="stats">2312 nodes · 8962 edges · 57 communities</div>
|
||||
</div>
|
||||
<script>
|
||||
const RAW_NODES = [{"id": "init_py", "label": "__init__.py", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "__init__.py", "community": 47, "community_name": "Community 47", "source_file": "__init__.py", "file_type": "code", "degree": 0}, {"id": "main_py", "label": "main.py", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "main.py", "community": 6, "community_name": "Community 6", "source_file": "main.py", "file_type": "code", "degree": 4}, {"id": "app_main_lifespan", "label": "lifespan()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "lifespan()", "community": 6, "community_name": "Community 6", "source_file": "main.py", "file_type": "code", "degree": 4}, {"id": "app_main_mask_secret", "label": "_mask_secret()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "_mask_secret()", "community": 6, "community_name": "Community 6", "source_file": "main.py", "file_type": "code", "degree": 1}, {"id": "app_main_root", "label": "root()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "root()", "community": 6, "community_name": "Community 6", "source_file": "main.py", "file_type": "code", "degree": 1}, {"id": "app_main_health_check", "label": "health_check()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "health_check()", "community": 6, "community_name": "Community 6", "source_file": "main.py", "file_type": "code", "degree": 1}, {"id": "tasks_init_py", "label": "__init__.py", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "__init__.py", "community": 6, "community_name": "Community 6", "source_file": "tasks/__init__.py", "file_type": "code", "degree": 2}, {"id": "tasks_init_init_scheduled_tasks", "label": "init_scheduled_tasks()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "init_scheduled_tasks()", "community": 6, "community_name": "Community 6", "source_file": "tasks/__init__.py", "file_type": "code", "degree": 2}, {"id": "tasks_init_shutdown_scheduler", "label": "shutdown_scheduler()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "shutdown_scheduler()", "community": 6, "community_name": "Community 6", "source_file": "tasks/__init__.py", "file_type": "code", "degree": 2}, {"id": "core_auth_py", "label": "auth.py", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 11.5, "font": {"size": 0, "color": "#ffffff"}, "title": "auth.py", "community": 6, "community_name": "Community 6", "source_file": "core/auth.py", "file_type": "code", "degree": 18}, {"id": "core_auth_redis_session_enabled", "label": "_redis_session_enabled()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "_redis_session_enabled()", "community": 6, "community_name": "Community 6", "source_file": "core/auth.py", "file_type": "code", "degree": 2}, {"id": "core_auth_get_redis_client", "label": "_get_redis_client()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.7, "font": {"size": 0, "color": "#ffffff"}, "title": "_get_redis_client()", "community": 6, "community_name": "Community 6", "source_file": "core/auth.py", "file_type": "code", "degree": 9}, {"id": "core_auth_session_key", "label": "_session_key()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.4, "font": {"size": 0, "color": "#ffffff"}, "title": "_session_key()", "community": 6, "community_name": "Community 6", "source_file": "core/auth.py", "file_type": "code", "degree": 5}, {"id": "core_auth_refresh_key", "label": "_refresh_key()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "boLine 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_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": "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", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_session_key", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_refresh_key", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_store_session", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_revoke_session", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_extend_session", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_is_session_valid", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_store_refresh_token", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_is_refresh_token_valid", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_revoke_refresh_token", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_create_access_token", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_create_refresh_token", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_decode_token", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_get_current_user_by_token", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_get_current_user", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "Line truncated
|
||||
const LEGEND = [{"cid": 0, "color": "#4E79A7", "label": "Community 0", "count": 407}, {"cid": 1, "color": "#F28E2B", "label": "Community 1", "count": 390}, {"cid": 2, "color": "#E15759", "label": "Community 2", "count": 265}, {"cid": 3, "color": "#76B7B2", "label": "Community 3", "count": 180}, {"cid": 4, "color": "#59A14F", "label": "Community 4", "count": 122}, {"cid": 5, "color": "#EDC948", "label": "Community 5", "count": 98}, {"cid": 6, "color": "#B07AA1", "label": "Community 6", "count": 91}, {"cid": 7, "color": "#FF9DA7", "label": "Community 7", "count": 69}, {"cid": 8, "color": "#9C755F", "label": "Community 8", "count": 69}, {"cid": 9, "color": "#BAB0AC", "label": "Community 9", "count": 68}, {"cid": 10, "color": "#4E79A7", "label": "Community 10", "count": 66}, {"cid": 11, "color": "#F28E2B", "label": "Community 11", "count": 49}, {"cid": 12, "color": "#E15759", "label": "Community 12", "count": 42}, {"cid": 13, "color": "#76B7B2", "label": "Community 13", "count": 31}, {"cid": 14, "color": "#59A14F", "label": "Community 14", "count": 20}, {"cid": 15, "color": "#EDC948", "label": "Community 15", "count": 20}, {"cid": 16, "color": "#B07AA1", "label": "Community 16", "count": 17}, {"cid": 17, "color": "#FF9DA7", "label": "Community 17", "count": 15}, {"cid": 18, "color": "#9C755F", "label": "Community 18", "count": 14}, {"cid": 19, "color": "#BAB0AC", "label": "Community 19", "count": 13}, {"cid": 20, "color": "#4E79A7", "label": "Community 20", "count": 13}, {"cid": 21, "color": "#F28E2B", "label": "Community 21", "count": 12}, {"cid": 22, "color": "#E15759", "label": "Community 22", "count": 12}, {"cid": 23, "color": "#76B7B2", "label": "Community 23", "count": 12}, {"cid": 24, "color": "#59A14F", "label": "Community 24", "count": 11}, {"cid": 25, "color": "#EDC948", "label": "Community 25", "count": 11}, {"cid": 26, "color": "#B07AA1", "label": "Community 26", "count": 10}, {"cid": 27, "color": "#FF9DA7", "label": "Community 27", "count": 10}, {"cid": 28, "color": "#9C755F", "label": "Community 28", "count": 10}, {"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": 10}, {"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": 9}, {"cid": 36, "color": "#B07AA1", "label": "Community 36", "count": 9}, {"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": 9}, {"cid": 40, "color": "#4E79A7", "label": "Community 40", "count": 8}, {"cid": 41, "color": "#F28E2B", "label": "Community 41", "count": 7}, {"cid": 42, "color": "#E15759", "label": "Community 42", "count": 6}, {"cid": 43, "color": "#76B7B2", "label": "Community 43", "count": 4}, {"cid": 44, "color": "#59A14F", "label": "Community 44", "count": 3}, {"cid": 45, "color": "#EDC948", "label": "Community 45", "count": 2}, {"cid": 46, "color": "#B07AA1", "label": "Community 46", "count": 2}, {"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": 1}];
|
||||
const RAW_NODES = [{"id": "init_py", "label": "__init__.py", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "__init__.py", "community": 45, "community_name": "Community 45", "source_file": "__init__.py", "file_type": "code", "degree": 0}, {"id": "main_py", "label": "main.py", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "main.py", "community": 7, "community_name": "Community 7", "source_file": "main.py", "file_type": "code", "degree": 4}, {"id": "app_main_lifespan", "label": "lifespan()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "lifespan()", "community": 7, "community_name": "Community 7", "source_file": "main.py", "file_type": "code", "degree": 4}, {"id": "app_main_mask_secret", "label": "_mask_secret()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "_mask_secret()", "community": 7, "community_name": "Community 7", "source_file": "main.py", "file_type": "code", "degree": 1}, {"id": "app_main_root", "label": "root()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "root()", "community": 7, "community_name": "Community 7", "source_file": "main.py", "file_type": "code", "degree": 1}, {"id": "app_main_health_check", "label": "health_check()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "health_check()", "community": 7, "community_name": "Community 7", "source_file": "main.py", "file_type": "code", "degree": 1}, {"id": "tasks_init_py", "label": "__init__.py", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "__init__.py", "community": 7, "community_name": "Community 7", "source_file": "tasks/__init__.py", "file_type": "code", "degree": 2}, {"id": "tasks_init_init_scheduled_tasks", "label": "init_scheduled_tasks()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "init_scheduled_tasks()", "community": 7, "community_name": "Community 7", "source_file": "tasks/__init__.py", "file_type": "code", "degree": 2}, {"id": "tasks_init_shutdown_scheduler", "label": "shutdown_scheduler()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "shutdown_scheduler()", "community": 7, "community_name": "Community 7", "source_file": "tasks/__init__.py", "file_type": "code", "degree": 2}, {"id": "core_auth_py", "label": "auth.py", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 11.5, "font": {"size": 0, "color": "#ffffff"}, "title": "auth.py", "community": 7, "community_name": "Community 7", "source_file": "core/auth.py", "file_type": "code", "degree": 18}, {"id": "core_auth_redis_session_enabled", "label": "_redis_session_enabled()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "_redis_session_enabled()", "community": 7, "community_name": "Community 7", "source_file": "core/auth.py", "file_type": "code", "degree": 2}, {"id": "core_auth_get_redis_client", "label": "_get_redis_client()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.7, "font": {"size": 0, "color": "#ffffff"}, "title": "_get_redis_client()", "community": 7, "community_name": "Community 7", "source_file": "core/auth.py", "file_type": "code", "degree": 9}, {"id": "core_auth_session_key", "label": "_session_key()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.4, "font": {"size": 0, "color": "#ffffff"}, "title": "_session_key()", "community": 7, "community_name": "Community 7", "source_file": "core/auth.py", "file_type": "code", "degree": 5}, {"id": "core_auth_refresh_key", "label": "_refresh_key()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "boLine 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_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": "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", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_session_key", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_refresh_key", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_store_session", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_revoke_session", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_extend_session", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_is_session_valid", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_store_refresh_token", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_is_refresh_token_valid", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_revoke_refresh_token", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_create_access_token", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_create_refresh_token", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_decode_token", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_get_current_user_by_token", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "to": "core_auth_get_current_user", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_py", "Line truncated
|
||||
const LEGEND = [{"cid": 0, "color": "#4E79A7", "label": "Community 0", "count": 410}, {"cid": 1, "color": "#F28E2B", "label": "Community 1", "count": 382}, {"cid": 2, "color": "#E15759", "label": "Community 2", "count": 240}, {"cid": 3, "color": "#76B7B2", "label": "Community 3", "count": 169}, {"cid": 4, "color": "#59A14F", "label": "Community 4", "count": 162}, {"cid": 5, "color": "#EDC948", "label": "Community 5", "count": 124}, {"cid": 6, "color": "#B07AA1", "label": "Community 6", "count": 107}, {"cid": 7, "color": "#FF9DA7", "label": "Community 7", "count": 100}, {"cid": 8, "color": "#9C755F", "label": "Community 8", "count": 77}, {"cid": 9, "color": "#BAB0AC", "label": "Community 9", "count": 69}, {"cid": 10, "color": "#4E79A7", "label": "Community 10", "count": 51}, {"cid": 11, "color": "#F28E2B", "label": "Community 11", "count": 35}, {"cid": 12, "color": "#E15759", "label": "Community 12", "count": 31}, {"cid": 13, "color": "#76B7B2", "label": "Community 13", "count": 31}, {"cid": 14, "color": "#59A14F", "label": "Community 14", "count": 23}, {"cid": 15, "color": "#EDC948", "label": "Community 15", "count": 20}, {"cid": 16, "color": "#B07AA1", "label": "Community 16", "count": 20}, {"cid": 17, "color": "#FF9DA7", "label": "Community 17", "count": 16}, {"cid": 18, "color": "#9C755F", "label": "Community 18", "count": 13}, {"cid": 19, "color": "#BAB0AC", "label": "Community 19", "count": 12}, {"cid": 20, "color": "#4E79A7", "label": "Community 20", "count": 12}, {"cid": 21, "color": "#F28E2B", "label": "Community 21", "count": 12}, {"cid": 22, "color": "#E15759", "label": "Community 22", "count": 12}, {"cid": 23, "color": "#76B7B2", "label": "Community 23", "count": 11}, {"cid": 24, "color": "#59A14F", "label": "Community 24", "count": 10}, {"cid": 25, "color": "#EDC948", "label": "Community 25", "count": 10}, {"cid": 26, "color": "#B07AA1", "label": "Community 26", "count": 10}, {"cid": 27, "color": "#FF9DA7", "label": "Community 27", "count": 10}, {"cid": 28, "color": "#9C755F", "label": "Community 28", "count": 10}, {"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": 9}, {"cid": 33, "color": "#76B7B2", "label": "Community 33", "count": 9}, {"cid": 34, "color": "#59A14F", "label": "Community 34", "count": 9}, {"cid": 35, "color": "#EDC948", "label": "Community 35", "count": 9}, {"cid": 36, "color": "#B07AA1", "label": "Community 36", "count": 9}, {"cid": 37, "color": "#FF9DA7", "label": "Community 37", "count": 8}, {"cid": 38, "color": "#9C755F", "label": "Community 38", "count": 7}, {"cid": 39, "color": "#BAB0AC", "label": "Community 39", "count": 6}, {"cid": 40, "color": "#4E79A7", "label": "Community 40", "count": 4}, {"cid": 41, "color": "#F28E2B", "label": "Community 41", "count": 4}, {"cid": 42, "color": "#E15759", "label": "Community 42", "count": 3}, {"cid": 43, "color": "#76B7B2", "label": "Community 43", "count": 2}, {"cid": 44, "color": "#59A14F", "label": "Community 44", "count": 2}, {"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": 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": 0}, {"cid": 58, "color": "#9C755F", "label": "Community 58", "count": 0}];
|
||||
|
||||
// HTML-escape helper — prevents XSS when injecting graph data into innerHTML
|
||||
function esc(s) {
|
||||
|
||||
+5001
-3357
File diff suppressed because it is too large.
Load diff
@@ -2,18 +2,19 @@
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/__init__.py": 1778578257.989357,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/main.py": 1779230556.547043,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/tasks/__init__.py": 1778579841.437791,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/core/auth.py": 1778580156.4185948,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/core/auth.py": 1779245791.6811426,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/core/api_crypto.py": 1778578258.039314,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/core/login_crypto.py": 1778578258.041774,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/core/config.py": 1778775532.8838744,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/core/wechat_pay.py": 1778578258.0461762,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/core/api_request_log_middleware.py": 1778578258.039998,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/core/database.py": 1778578258.0410967,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/core/database.py": 1779242347.136184,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/core/security.py": 1778578258.044949,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/core/request_payload.py": 1778578258.04292,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/core/__init__.py": 1778578258.028834,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/core/response.py": 1778578258.043157,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/core/menu_guard.py": 1778580098.1876886,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/core/context.py": 1779242263.6923044,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/core/utils.py": 1778578258.045583,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/core/storage.py": 1779159580.3795292,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/core/order_status_compat.py": 1778578258.0426462,
|
||||
@@ -24,7 +25,7 @@
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/core/wechat_message.py": 1778578258.0458734,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/models/material.py": 1779230445.2784467,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/models/qc_param.py": 1779022399.0175831,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py": 1779230561.582661,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/models/models.py": 1779249191.0814734,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/models/__init__.py": 1779206668.0388827,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/models/research_donation.py": 1779177348.5945773,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/models/qc_material.py": 1779229639.8540096,
|
||||
@@ -76,7 +77,7 @@
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/production_task.py": 1779207071.207229,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_third_party_item.py": 1779017663.3365955,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/reagent.py": 1779034352.7174037,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py": 1779228448.342325,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol.py": 1779254051.9869325,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_material_usage.py": 1779229743.717118,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/clean_room.py": 1778775238.2993922,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/__init__.py": 1778605691.3816392,
|
||||
@@ -94,12 +95,12 @@
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/ethnic.py": 1778929287.9790359,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/process_category.py": 1779034397.1296425,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/item_unit.py": 1778775532.8857636,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py": 1779184731.6969383,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_work_order.py": 1779254049.7026045,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/process.py": 1779172963.5319366,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/pilot_service.py": 1779097275.2615435,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/customer.py": 1778733031.447253,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/workflow.py": 1778733044.3626168,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py": 1779207266.1555948,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/sample_reception.py": 1779254072.885309,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/consumable_pack.py": 1779094924.272136,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/qc_material.py": 1779229782.577612,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/crud/collection_protocol_no.py": 1778739676.552736,
|
||||
@@ -115,20 +116,20 @@
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/public.py": 1779009064.3735678,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/material.py": 1779230530.6317234,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/qc.py": 1779229970.7504554,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/collection_protocol.py": 1779228503.4163866,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/collection_protocol.py": 1779247714.4622548,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/basic_info.py": 1779023595.3203893,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/__init__.py": 1779230551.0712175,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/operations.py": 1779013790.741646,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/menu.py": 1779232070.4702563,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/menu.py": 1779242366.289729,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/admin.py": 1779159585.3290305,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/research_donation.py": 1779158141.3931673,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/ethnic.py": 1778929290.0303483,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/pilot_service.py": 1779097246.7527015,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/workflow.py": 1778729745.1120937,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/sample_reception.py": 1779175646.6263578,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/insurance_company.py": 1779228472.3878329,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/insurance_company.py": 1779248617.010136,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/production.py": 1779207670.5439875,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/leave.py": 1778729040.440424,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/leave.py": 1779242371.3065424,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/services/workflow_callback.py": 1778727966.7277644,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/services/workflow_engine.py": 1778634664.6293883,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/services/web_auth_roles.py": 1778775532.8878627,
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
-- 满月待办:todo_status 列注释术语更正(已建库环境执行)
|
||||
-- 说明:仅更新注释,不修改列名与取值(0=未办保险,1=已办保险)。
|
||||
|
||||
ALTER TABLE `biz_protocol_fullmoon_todo`
|
||||
MODIFY COLUMN `todo_status` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '1已办保险 0未办保险';
|
||||
@@ -1,110 +0,0 @@
|
||||
-- =============================================
|
||||
-- 1. 保险公司主表
|
||||
-- =============================================
|
||||
DROP TABLE IF EXISTS `biz_insurance_company`;
|
||||
CREATE TABLE `biz_insurance_company` (
|
||||
`id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID',
|
||||
`company_name` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '保险公司名称',
|
||||
`company_address` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '公司地址',
|
||||
`contact_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '联系人',
|
||||
`contact_phone` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '联系电话',
|
||||
`status` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '1' COMMENT '1正常 0停用',
|
||||
`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 '备注',
|
||||
`create_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_ins_company` (`tenant_no`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='保险公司';
|
||||
|
||||
-- =============================================
|
||||
-- 2. 保险公司开票信息
|
||||
-- =============================================
|
||||
DROP TABLE IF EXISTS `biz_insurance_company_invoice`;
|
||||
CREATE TABLE `biz_insurance_company_invoice` (
|
||||
`id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID',
|
||||
`insurance_company_id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '保险公司ID',
|
||||
`company_name` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '单位名称',
|
||||
`tax_no` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '税号',
|
||||
`company_address` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '单位地址',
|
||||
`company_phone` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '电话',
|
||||
`bank_name` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '开户银行',
|
||||
`bank_account` varchar(64) 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 '备注',
|
||||
`create_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_ins_inv` (`insurance_company_id`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='保险公司开票信息';
|
||||
|
||||
-- =============================================
|
||||
-- 3. 保险项目价格
|
||||
-- =============================================
|
||||
DROP TABLE IF EXISTS `biz_insurance_project_price`;
|
||||
CREATE TABLE `biz_insurance_project_price` (
|
||||
`id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID',
|
||||
`insurance_company_id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '保险公司ID',
|
||||
`project_name` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '项目名称',
|
||||
`project_fee` decimal(18,2) DEFAULT NULL COMMENT '项目费用(元)',
|
||||
`status` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '1' COMMENT '1正常 0停用',
|
||||
`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 '备注',
|
||||
`create_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_ins_proj` (`insurance_company_id`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='保险项目价格';
|
||||
|
||||
-- =============================================
|
||||
-- 4. 满月待办表扩展(新增 8 个保险字段)
|
||||
-- =============================================
|
||||
ALTER TABLE `biz_protocol_fullmoon_todo`
|
||||
ADD COLUMN `insurance_company_id` varchar(64) DEFAULT NULL COMMENT '保险公司ID' AFTER `insurance_attachments`,
|
||||
ADD COLUMN `insurance_company_name` varchar(200) DEFAULT NULL COMMENT '保险公司名称(冗余快照)' AFTER `insurance_company_id`,
|
||||
ADD COLUMN `insurance_type` varchar(200) DEFAULT NULL COMMENT '保险险种' AFTER `insurance_company_name`,
|
||||
ADD COLUMN `insurance_policy_no` varchar(100) DEFAULT NULL COMMENT '保险单号' AFTER `insurance_type`,
|
||||
ADD COLUMN `insurance_effective_date` char(8) DEFAULT NULL COMMENT '保险单生效时间YYYYMMDD' AFTER `insurance_policy_no`,
|
||||
ADD COLUMN `insurance_expiry_date` char(8) DEFAULT NULL COMMENT '保险单失效时间YYYYMMDD' AFTER `insurance_effective_date`,
|
||||
ADD COLUMN `insurance_subscribed` char(1) DEFAULT '0' COMMENT '是否已订购保险(1是 0否)' AFTER `insurance_expiry_date`,
|
||||
ADD COLUMN `insurance_fee` decimal(18,2) DEFAULT NULL COMMENT '保单费用(元)' AFTER `insurance_subscribed`;
|
||||
|
||||
-- =============================================
|
||||
-- 5. 菜单数据初始化
|
||||
-- =============================================
|
||||
-- 父菜单:细胞存储管理 = 50000000000000000000000000000001 (parent_id=2)
|
||||
-- 父菜单:基础信息管理 = 120 (parent_id=2)
|
||||
|
||||
-- 储存证管理:复用已软删除的 ...06 ID(原"分期缴费预警" del_flag=1)
|
||||
UPDATE `sys_menu` SET
|
||||
`menu_name` = '储存证管理',
|
||||
`path` = 'storage-cert',
|
||||
`component` = '/cell-storage/storage-cert/index',
|
||||
`perms` = 'cell-storage:storage-cert:list',
|
||||
`order_num` = 6,
|
||||
`del_flag` = 0,
|
||||
`update_time` = NOW()
|
||||
WHERE `id` = '50000000000000000000000000000006';
|
||||
|
||||
-- 满月待办管理:新插入
|
||||
INSERT INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `menu_type`, `path`, `component`, `perms`, `is_frame`, `visible`, `status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`)
|
||||
VALUES ('50000000000000000000000000000008', '满月待办管理', '50000000000000000000000000000001', 'C', 'fullmoon-todo', '/cell-storage/fullmoon-todo/index', 'cell-storage:fullmoon-todo:list', 1, '1', '1', 'zkxw', 7, NULL, '1', '', NOW(), '1', NOW(), 0);
|
||||
|
||||
-- 保险公司及项目价格:新插入
|
||||
INSERT INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `menu_type`, `path`, `component`, `perms`, `is_frame`, `visible`, `status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`)
|
||||
VALUES ('40000000000000000000000000000007', '保险公司及项目价格', '120', 'C', 'insurance-company', '/basic-info/insurance-company/index', 'basic-info:insurance-company:list', 1, '1', '1', 'zkxw', 6, NULL, '1', '', NOW(), '1', NOW(), 0);
|
||||
@@ -1,281 +0,0 @@
|
||||
-- =============================================
|
||||
-- 保险公司及项目价格 — 演示/初始化数据
|
||||
-- =============================================
|
||||
-- 前置条件:已执行 docs/sql/insurance_and_fullmoon.sql(建表 + 菜单)
|
||||
-- 用法:mysql -u... -p... <dbname> < docs/sql/insurance_company_seed.sql
|
||||
-- 说明:使用固定主键,先删后插,可重复执行;仅写入 tenant_no=zkxw 的演示数据
|
||||
-- =============================================
|
||||
|
||||
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- 固定主键(32 位十六进制,无连字符;变量显式指定与表字段一致的 collation)
|
||||
SET @ins_co_1 = 'A1B2C3D4E5F6478091A2B3C4D5E6F701' COLLATE utf8mb4_unicode_ci;
|
||||
SET @ins_co_2 = 'A1B2C3D4E5F6478091A2B3C4D5E6F702' COLLATE utf8mb4_unicode_ci;
|
||||
SET @ins_co_3 = 'A1B2C3D4E5F6478091A2B3C4D5E6F703' COLLATE utf8mb4_unicode_ci;
|
||||
SET @ins_inv_1 = 'B1B2C3D4E5F6478091A2B3C4D5E6F701' COLLATE utf8mb4_unicode_ci;
|
||||
SET @ins_inv_2 = 'B1B2C3D4E5F6478091A2B3C4D5E6F702' COLLATE utf8mb4_unicode_ci;
|
||||
SET @ins_inv_3 = 'B1B2C3D4E5F6478091A2B3C4D5E6F703' COLLATE utf8mb4_unicode_ci;
|
||||
SET @ins_pr_1 = 'C1B2C3D4E5F6478091A2B3C4D5E6F701' COLLATE utf8mb4_unicode_ci;
|
||||
SET @ins_pr_2 = 'C1B2C3D4E5F6478091A2B3C4D5E6F702' COLLATE utf8mb4_unicode_ci;
|
||||
SET @ins_pr_3 = 'C1B2C3D4E5F6478091A2B3C4D5E6F703' COLLATE utf8mb4_unicode_ci;
|
||||
SET @ins_pr_4 = 'C1B2C3D4E5F6478091A2B3C4D5E6F704' COLLATE utf8mb4_unicode_ci;
|
||||
SET @ins_pr_5 = 'C1B2C3D4E5F6478091A2B3C4D5E6F705' COLLATE utf8mb4_unicode_ci;
|
||||
SET @ins_pr_6 = 'C1B2C3D4E5F6478091A2B3C4D5E6F706' COLLATE utf8mb4_unicode_ci;
|
||||
SET @admin_id = 'd3000000000000000000000000000001' COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- 清理旧种子(子表 → 主表;DELETE 使用字面量避免 IN 与变量 collation 混用)
|
||||
DELETE FROM `biz_insurance_project_price`
|
||||
WHERE `id` IN (
|
||||
'C1B2C3D4E5F6478091A2B3C4D5E6F701',
|
||||
'C1B2C3D4E5F6478091A2B3C4D5E6F702',
|
||||
'C1B2C3D4E5F6478091A2B3C4D5E6F703',
|
||||
'C1B2C3D4E5F6478091A2B3C4D5E6F704',
|
||||
'C1B2C3D4E5F6478091A2B3C4D5E6F705',
|
||||
'C1B2C3D4E5F6478091A2B3C4D5E6F706'
|
||||
);
|
||||
DELETE FROM `biz_insurance_company_invoice`
|
||||
WHERE `id` IN (
|
||||
'B1B2C3D4E5F6478091A2B3C4D5E6F701',
|
||||
'B1B2C3D4E5F6478091A2B3C4D5E6F702',
|
||||
'B1B2C3D4E5F6478091A2B3C4D5E6F703'
|
||||
);
|
||||
DELETE FROM `biz_insurance_company`
|
||||
WHERE `id` IN (
|
||||
'A1B2C3D4E5F6478091A2B3C4D5E6F701',
|
||||
'A1B2C3D4E5F6478091A2B3C4D5E6F702',
|
||||
'A1B2C3D4E5F6478091A2B3C4D5E6F703'
|
||||
);
|
||||
|
||||
-- =============================================
|
||||
-- 1. 保险公司主表
|
||||
-- =============================================
|
||||
INSERT INTO `biz_insurance_company` (
|
||||
`id`, `company_name`, `company_address`, `contact_name`, `contact_phone`,
|
||||
`status`, `tenant_no`, `order_num`, `remark`,
|
||||
`create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`
|
||||
) VALUES
|
||||
(
|
||||
@ins_co_1,
|
||||
'中国人寿保险股份有限公司安徽省分公司',
|
||||
'安徽省合肥市蜀山区长江西路200号国寿大厦',
|
||||
'张经理',
|
||||
'0551-62880001',
|
||||
'1',
|
||||
'zkxw',
|
||||
1,
|
||||
'满月待办默认合作保险公司(演示数据)',
|
||||
@admin_id,
|
||||
'',
|
||||
NOW(),
|
||||
@admin_id,
|
||||
NOW(),
|
||||
0
|
||||
),
|
||||
(
|
||||
@ins_co_2,
|
||||
'中国平安财产保险股份有限公司合肥中心支公司',
|
||||
'安徽省合肥市包河区徽州大道与九华山路交口平安大厦',
|
||||
'李经理',
|
||||
'0551-63660002',
|
||||
'1',
|
||||
'zkxw',
|
||||
2,
|
||||
'演示数据',
|
||||
@admin_id,
|
||||
'',
|
||||
NOW(),
|
||||
@admin_id,
|
||||
NOW(),
|
||||
0
|
||||
),
|
||||
(
|
||||
@ins_co_3,
|
||||
'太平洋人寿保险股份有限公司安徽分公司',
|
||||
'安徽省合肥市庐阳区阜阳北路与北一环交口',
|
||||
'王经理',
|
||||
'0551-65660003',
|
||||
'0',
|
||||
'zkxw',
|
||||
3,
|
||||
'停用状态示例,用于筛选演示',
|
||||
@admin_id,
|
||||
'',
|
||||
NOW(),
|
||||
@admin_id,
|
||||
NOW(),
|
||||
0
|
||||
);
|
||||
|
||||
-- =============================================
|
||||
-- 2. 保险公司开票信息
|
||||
-- =============================================
|
||||
INSERT INTO `biz_insurance_company_invoice` (
|
||||
`id`, `insurance_company_id`, `company_name`, `tax_no`, `company_address`, `company_phone`,
|
||||
`bank_name`, `bank_account`, `tenant_no`, `order_num`, `remark`,
|
||||
`create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`
|
||||
) VALUES
|
||||
(
|
||||
@ins_inv_1,
|
||||
@ins_co_1,
|
||||
'中国人寿保险股份有限公司安徽省分公司',
|
||||
'91340000123456789A',
|
||||
'安徽省合肥市蜀山区长江西路200号',
|
||||
'0551-62880001',
|
||||
'中国工商银行合肥蜀山支行',
|
||||
'6222021234567890123',
|
||||
'zkxw',
|
||||
1,
|
||||
NULL,
|
||||
@admin_id,
|
||||
'',
|
||||
NOW(),
|
||||
@admin_id,
|
||||
NOW(),
|
||||
0
|
||||
),
|
||||
(
|
||||
@ins_inv_2,
|
||||
@ins_co_2,
|
||||
'中国平安财产保险股份有限公司合肥中心支公司',
|
||||
'91340000987654321B',
|
||||
'安徽省合肥市包河区徽州大道平安大厦',
|
||||
'0551-63660002',
|
||||
'招商银行合肥分行',
|
||||
'6225881234567890123',
|
||||
'zkxw',
|
||||
1,
|
||||
NULL,
|
||||
@admin_id,
|
||||
'',
|
||||
NOW(),
|
||||
@admin_id,
|
||||
NOW(),
|
||||
0
|
||||
),
|
||||
(
|
||||
@ins_inv_3,
|
||||
@ins_co_3,
|
||||
'太平洋人寿保险股份有限公司安徽分公司',
|
||||
'91340000555555555C',
|
||||
'安徽省合肥市庐阳区阜阳北路',
|
||||
'0551-65660003',
|
||||
'中国建设银行合肥庐阳支行',
|
||||
'6227001234567890123',
|
||||
'zkxw',
|
||||
1,
|
||||
NULL,
|
||||
@admin_id,
|
||||
'',
|
||||
NOW(),
|
||||
@admin_id,
|
||||
NOW(),
|
||||
0
|
||||
);
|
||||
|
||||
-- =============================================
|
||||
-- 3. 保险项目价格
|
||||
-- =============================================
|
||||
INSERT INTO `biz_insurance_project_price` (
|
||||
`id`, `insurance_company_id`, `project_name`, `project_fee`, `status`,
|
||||
`tenant_no`, `order_num`, `remark`,
|
||||
`create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`
|
||||
) VALUES
|
||||
-- 中国人寿:细胞储存相关险种
|
||||
(
|
||||
@ins_pr_1,
|
||||
@ins_co_1,
|
||||
'新生儿干细胞储存险',
|
||||
1280.00,
|
||||
'1',
|
||||
'zkxw',
|
||||
1,
|
||||
'适用于满月待办订购,含首年保障',
|
||||
@admin_id,
|
||||
'',
|
||||
NOW(),
|
||||
@admin_id,
|
||||
NOW(),
|
||||
0
|
||||
),
|
||||
(
|
||||
@ins_pr_2,
|
||||
@ins_co_1,
|
||||
'脐带血储存综合险',
|
||||
2580.00,
|
||||
'1',
|
||||
'zkxw',
|
||||
2,
|
||||
'脐带血+干细胞联合保障',
|
||||
@admin_id,
|
||||
'',
|
||||
NOW(),
|
||||
@admin_id,
|
||||
NOW(),
|
||||
0
|
||||
),
|
||||
(
|
||||
@ins_pr_3,
|
||||
@ins_co_1,
|
||||
'细胞储存年度续保',
|
||||
680.00,
|
||||
'1',
|
||||
'zkxw',
|
||||
3,
|
||||
'次年续保参考价',
|
||||
@admin_id,
|
||||
'',
|
||||
NOW(),
|
||||
@admin_id,
|
||||
NOW(),
|
||||
0
|
||||
),
|
||||
-- 平安:分级保障计划
|
||||
(
|
||||
@ins_pr_4,
|
||||
@ins_co_2,
|
||||
'新生儿保障计划(基础版)',
|
||||
980.00,
|
||||
'1',
|
||||
'zkxw',
|
||||
1,
|
||||
NULL,
|
||||
@admin_id,
|
||||
'',
|
||||
NOW(),
|
||||
@admin_id,
|
||||
NOW(),
|
||||
0
|
||||
),
|
||||
(
|
||||
@ins_pr_5,
|
||||
@ins_co_2,
|
||||
'新生儿保障计划(尊享版)',
|
||||
1980.00,
|
||||
'1',
|
||||
'zkxw',
|
||||
2,
|
||||
'含住院津贴及意外医疗',
|
||||
@admin_id,
|
||||
'',
|
||||
NOW(),
|
||||
@admin_id,
|
||||
NOW(),
|
||||
0
|
||||
),
|
||||
-- 太平洋(公司已停用,项目仍可作历史参考)
|
||||
(
|
||||
@ins_pr_6,
|
||||
@ins_co_3,
|
||||
'围产期母婴健康险',
|
||||
1580.00,
|
||||
'0',
|
||||
'zkxw',
|
||||
1,
|
||||
'已停用项目示例',
|
||||
@admin_id,
|
||||
'',
|
||||
NOW(),
|
||||
@admin_id,
|
||||
NOW(),
|
||||
0
|
||||
);
|
||||
@@ -0,0 +1,31 @@
|
||||
-- 保险公司及险种价格:术语与注释对齐(已建库环境执行)
|
||||
-- 说明:不修改表名/列名/API 字段(如 company_name、project_name),仅更新菜单名与库表注释。
|
||||
|
||||
-- 1. 系统菜单
|
||||
UPDATE `sys_menu`
|
||||
SET `menu_name` = '保险公司及险种价格',
|
||||
`update_time` = NOW()
|
||||
WHERE `path` = 'insurance-company'
|
||||
AND `del_flag` = 0;
|
||||
|
||||
-- 2. 表注释
|
||||
ALTER TABLE `biz_insurance_company` COMMENT = '保险公司';
|
||||
ALTER TABLE `biz_insurance_company_invoice` COMMENT = '保险公司开票信息';
|
||||
ALTER TABLE `biz_insurance_project_price` COMMENT = '保险险种价格';
|
||||
|
||||
-- 3. 列注释
|
||||
ALTER TABLE `biz_insurance_company`
|
||||
MODIFY COLUMN `company_name` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '保险公司名称',
|
||||
MODIFY COLUMN `company_address` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '公司地址';
|
||||
|
||||
ALTER TABLE `biz_insurance_company_invoice`
|
||||
MODIFY COLUMN `insurance_company_id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '保险公司ID';
|
||||
|
||||
ALTER TABLE `biz_insurance_project_price`
|
||||
MODIFY COLUMN `insurance_company_id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '保险公司ID',
|
||||
MODIFY COLUMN `project_name` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '险种名称',
|
||||
MODIFY COLUMN `project_fee` decimal(18,2) DEFAULT NULL COMMENT '险种费用(元)';
|
||||
|
||||
ALTER TABLE `biz_protocol_fullmoon_todo`
|
||||
MODIFY COLUMN `insurance_company_id` varchar(64) DEFAULT NULL COMMENT '保险公司ID',
|
||||
MODIFY COLUMN `insurance_company_name` varchar(200) DEFAULT NULL COMMENT '保险公司名称(冗余快照)';
|
||||
@@ -1,86 +0,0 @@
|
||||
-- ----------------------------
|
||||
-- 市场物料库 + 物料变动记录
|
||||
-- ----------------------------
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for biz_material
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `biz_material`;
|
||||
CREATE TABLE `biz_material` (
|
||||
`id` varchar(64) NOT NULL COMMENT '主键ID',
|
||||
`material_code` varchar(64) NOT NULL COMMENT '物料编码',
|
||||
`material_name` varchar(200) NOT NULL COMMENT '物料名称',
|
||||
`category` varchar(50) DEFAULT NULL COMMENT '物料分类(字典表 wllb 管理:xccyw - 宣传物料、ccyw - 采集业务物料 等)',
|
||||
`spec_model` varchar(200) DEFAULT NULL COMMENT '规格型号',
|
||||
`unit` varchar(32) DEFAULT NULL COMMENT '单位',
|
||||
`stock_qty` decimal(18,4) NOT NULL DEFAULT 0.0000 COMMENT '当前库存量',
|
||||
`status` char(1) NOT NULL DEFAULT '1' COMMENT '1-启用 0-停用',
|
||||
`image_urls` varchar(2000) DEFAULT NULL COMMENT '物料图片(多个逗号分隔)',
|
||||
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
|
||||
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
|
||||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_mat_tenant_code` (`tenant_no`, `material_code`, `del_flag`),
|
||||
KEY `idx_mat_tenant_status` (`tenant_no`, `status`, `del_flag`),
|
||||
KEY `idx_mat_tenant_category` (`tenant_no`, `category`, `del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='市场物料';
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for biz_material_stock_log
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `biz_material_stock_log`;
|
||||
CREATE TABLE `biz_material_stock_log` (
|
||||
`id` varchar(64) NOT NULL COMMENT '主键ID',
|
||||
`material_id` varchar(64) NOT NULL COMMENT '物料ID',
|
||||
`material_code` varchar(64) DEFAULT NULL COMMENT '物料编码快照',
|
||||
`material_name` varchar(200) DEFAULT NULL COMMENT '物料名称快照',
|
||||
`change_type` varchar(16) NOT NULL COMMENT '变动类型:rk入库 / ck出库',
|
||||
`change_qty` decimal(18,4) NOT NULL COMMENT '变动数量(正数)',
|
||||
`stock_before` decimal(18,4) NOT NULL COMMENT '变动前库存',
|
||||
`stock_after` decimal(18,4) NOT NULL COMMENT '变动后库存',
|
||||
`receiver` varchar(64) DEFAULT NULL COMMENT '领用人(出库时填写)',
|
||||
`purpose` varchar(512) DEFAULT NULL COMMENT '用途/事由',
|
||||
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
|
||||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_msl_material` (`material_id`, `del_flag`),
|
||||
KEY `idx_msl_tenant_time` (`tenant_no`, `change_type`, `create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='市场物料变动记录';
|
||||
|
||||
-- ----------------------------
|
||||
-- 字典类型:物料类别 (wllb)
|
||||
-- ----------------------------
|
||||
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 (REPLACE(UUID(),'-',''), '物料类别', 'wllb', 'zkxw', 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 (REPLACE(UUID(),'-',''), '宣传物料', 'xccyw', 'wllb', 'zkxw', 1, '市场宣传用物料', 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 (REPLACE(UUID(),'-',''), '采集业务物料', 'ccyw', 'wllb', 'zkxw', 2, '采集业务相关物料', NULL, '', NOW(), NULL, NOW(), 0);
|
||||
|
||||
-- ----------------------------
|
||||
-- 菜单数据:在细胞存储管理下添加物料库和物料变动记录菜单
|
||||
-- ----------------------------
|
||||
INSERT INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `menu_type`, `path`, `component`, `perms`, `is_frame`, `visible`, `status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`)
|
||||
VALUES ('50000000000000000000000000000009', '物料库', '50000000000000000000000000000001', 'C', 'material', '/cell-storage/material/index', 'biz:material:list', 1, '1', '1', 'zkxw', 9, NULL, NULL, '', NOW(), NULL, NOW(), 0);
|
||||
|
||||
INSERT INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `menu_type`, `path`, `component`, `perms`, `is_frame`, `visible`, `status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`)
|
||||
VALUES ('50000000000000000000000000000010', '物料变动记录', '50000000000000000000000000000001', 'C', 'material-stock-log', '/cell-storage/material-stock-log/index', 'biz:materialStockLog:list', 1, '1', '1', 'zkxw', 10, NULL, NULL, '', NOW(), NULL, NOW(), 0);
|
||||
@@ -0,0 +1,45 @@
|
||||
-- 市场物料库(biz_material)演示数据:30 条
|
||||
-- 适用页面:web-admin 细胞库 → 物料库(cell-storage/material)
|
||||
-- 租户:zkxw;分类字典 wllb:xccyw=宣传物料,ccyw=采集业务物料
|
||||
-- 执行前请确认当前库无相同 material_code(uk_mat_tenant_code)
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
-- 可选:仅清理本脚本插入的编码(重复执行时先删旧数据)
|
||||
-- DELETE FROM `biz_material` WHERE `tenant_no` = 'zkxw' AND `material_code` LIKE 'MAT-DEMO-%' AND `del_flag` = 0;
|
||||
|
||||
INSERT INTO `biz_material` (
|
||||
`id`, `material_code`, `material_name`, `category`, `spec_model`, `unit`,
|
||||
`stock_qty`, `status`, `image_urls`, `tenant_no`, `order_num`, `remark`,
|
||||
`create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`
|
||||
) VALUES
|
||||
('a1000000000000000000000000000001', 'MAT-DEMO-001', '细胞存储宣传册', 'xccyw', 'A4 对折 157g铜版', '册', 500.0000, '1', NULL, 'zkxw', 1, '市场活动配发', 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000002', 'MAT-DEMO-002', '品牌易拉宝', 'xccyw', '80×200cm 铝合金', '套', 12.0000, '1', NULL, 'zkxw', 2, '展会用', 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000003', 'MAT-DEMO-003', '服务协议宣传单', 'xccyw', 'A5 单页', '张', 2000.0000, '1', NULL, 'zkxw', 3, NULL, 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000004', 'MAT-DEMO-004', '环保手提袋', 'xccyw', '中号 无纺布', '个', 800.0000, '1', NULL, 'zkxw', 4, '客户伴手礼', 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000005', 'MAT-DEMO-005', '企业名片', 'xccyw', '90×54mm 哑膜', '盒', 50.0000, '1', NULL, 'zkxw', 5, '每盒100张', 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000006', 'MAT-DEMO-006', '实验室参观导览图', 'xccyw', 'A3 覆膜', '张', 120.0000, '1', NULL, 'zkxw', 6, NULL, 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000007', 'MAT-DEMO-007', '微信公众号立牌', 'xccyw', '15×10cm 亚克力', '块', 30.0000, '1', NULL, 'zkxw', 7, NULL, 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000008', 'MAT-DEMO-008', '细胞冻存科普海报', 'xccyw', '60×90cm', '张', 45.0000, '1', NULL, 'zkxw', 8, '墙面张贴', 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000009', 'MAT-DEMO-009', '渠道合作折页', 'xccyw', '三折页 A4', '份', 600.0000, '1', NULL, 'zkxw', 9, NULL, 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000010', 'MAT-DEMO-010', '礼品U盘(8G)', 'xccyw', '定制logo', '个', 100.0000, '0', NULL, 'zkxw', 10, '库存停用待换新批次', 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000011', 'MAT-DEMO-011', '脐带血采集管', 'ccyw', 'EDTA-K2 5ml', '支', 1500.0000, '1', NULL, 'zkxw', 11, '常温避光存放', 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000012', 'MAT-DEMO-012', '无菌采样拭子', 'ccyw', '尼龙植绒', '支', 3000.0000, '1', NULL, 'zkxw', 12, NULL, 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000013', 'MAT-DEMO-013', '样本运输冷链箱', 'ccyw', '6L 泡沫+冰排', '个', 25.0000, '1', NULL, 'zkxw', 13, '含温度计卡槽', 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000014', 'MAT-DEMO-014', '生物样本标签', 'ccyw', '50×30mm 耐低温', '卷', 80.0000, '1', NULL, 'zkxw', 14, '每卷500枚', 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000015', 'MAT-DEMO-015', '医用丁腈手套', 'ccyw', 'M码 无粉', '盒', 200.0000, '1', NULL, 'zkxw', 15, '每盒100只', 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000016', 'MAT-DEMO-016', '75%酒精棉片', 'ccyw', '独立包装', '包', 5000.0000, '1', NULL, 'zkxw', 16, NULL, 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000017', 'MAT-DEMO-017', '采血垫', 'ccyw', '一次性吸水', '片', 800.0000, '1', NULL, 'zkxw', 17, NULL, 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000018', 'MAT-DEMO-018', '止血贴', 'ccyw', '圆形22mm', '片', 1200.0000, '1', NULL, 'zkxw', 18, NULL, 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000019', 'MAT-DEMO-019', '样本密封袋', 'ccyw', '15×20cm 自封', '个', 2500.0000, '1', NULL, 'zkxw', 19, '双层', 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000020', 'MAT-DEMO-020', '冰排(400g)', 'ccyw', '蓄冷凝胶', '个', 60.0000, '1', NULL, 'zkxw', 20, '冷冻后使用', 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000021', 'MAT-DEMO-021', '采血管架', 'ccyw', '12孔 塑料', '个', 40.0000, '1', NULL, 'zkxw', 21, NULL, 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000022', 'MAT-DEMO-022', '碘伏消毒液', 'ccyw', '50ml 喷雾', '瓶', 180.0000, '1', NULL, 'zkxw', 22, NULL, 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000023', 'MAT-DEMO-023', '医用胶带', 'ccyw', '1.25cm×5m', '卷', 300.0000, '1', NULL, 'zkxw', 23, NULL, 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000024', 'MAT-DEMO-024', '知情同意书(空白)', 'ccyw', 'A4 双面', '份', 400.0000, '1', NULL, 'zkxw', 24, '现场签署用', 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000025', 'MAT-DEMO-025', '采血针(21G)', 'ccyw', '一次性使用', '支', 2000.0000, '1', NULL, 'zkxw', 25, NULL, 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000026', 'MAT-DEMO-026', '样本交接单', 'ccyw', '三联无碳', '本', 150.0000, '1', NULL, 'zkxw', 26, '每本50份', 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000027', 'MAT-DEMO-027', '紫外线消毒灯管', 'ccyw', 'T8 30W', '支', 8.0000, '1', NULL, 'zkxw', 27, '备件', 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000028', 'MAT-DEMO-028', '医疗废物黄色袋', 'ccyw', '中号 50×60cm', '卷', 35.0000, '1', NULL, 'zkxw', 28, NULL, 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000029', 'MAT-DEMO-029', '台式离心管(15ml)', 'ccyw', '锥底 无菌', '包', 120.0000, '1', NULL, 'zkxw', 29, '每包50支', 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0),
|
||||
('a1000000000000000000000000000030', 'MAT-DEMO-030', '温度记录仪贴纸', 'ccyw', '一次性变色', '张', 500.0000, '0', NULL, 'zkxw', 30, '旧款停用', 'd3000000000000000000000000000001', '', NOW(), 'd3000000000000000000000000000001', NOW(), 0);
|
||||
@@ -1,279 +0,0 @@
|
||||
-- ============================================================
|
||||
-- 入库生产工单 + 生产任务 + 细胞产品库 DDL
|
||||
-- 日期: 2026-05-19
|
||||
-- 说明: 10 张业务表 + 3 个菜单
|
||||
-- ============================================================
|
||||
|
||||
-- -----------------------------------------------------------
|
||||
-- 1. biz_cell_product — 细胞产品库
|
||||
-- -----------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `biz_cell_product` (
|
||||
`id` varchar(64) NOT NULL COMMENT '主键ID',
|
||||
`product_code` varchar(64) NOT NULL COMMENT '产品编码',
|
||||
`product_name` varchar(200) NOT NULL COMMENT '产品名称',
|
||||
`product_type_id` varchar(64) DEFAULT NULL COMMENT '细胞产品类型ID',
|
||||
`spec_id` varchar(64) DEFAULT NULL COMMENT '规格ID',
|
||||
`batch_no` varchar(64) DEFAULT NULL COMMENT '批次号',
|
||||
`storage_slot_id` varchar(64) DEFAULT NULL COMMENT '储物格ID',
|
||||
`product_status` varchar(16) NOT NULL DEFAULT 'zk' COMMENT '状态(zk在库/yc已出库/ysy已使用)',
|
||||
`source_type` varchar(20) DEFAULT 'production' COMMENT '来源类型(production生产/manual手动录入)',
|
||||
`production_task_id` varchar(64) DEFAULT NULL COMMENT '来源生产任务ID',
|
||||
`quantity` decimal(18,4) DEFAULT NULL COMMENT '数量',
|
||||
`unit` varchar(64) DEFAULT NULL COMMENT '单位',
|
||||
`expiry_date` datetime DEFAULT NULL COMMENT '有效期',
|
||||
`product_images` varchar(4000) DEFAULT NULL COMMENT '产品图片URL(逗号分隔)',
|
||||
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
|
||||
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
|
||||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_cp_tenant_status` (`tenant_no`,`product_status`,`del_flag`),
|
||||
KEY `idx_cp_type` (`product_type_id`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='细胞产品库';
|
||||
|
||||
-- -----------------------------------------------------------
|
||||
-- 2. biz_production_work_order — 入库生产工单
|
||||
-- -----------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `biz_production_work_order` (
|
||||
`id` varchar(64) NOT NULL COMMENT '主键ID',
|
||||
`work_order_no` varchar(32) NOT NULL COMMENT '工单号(前缀SC)',
|
||||
`reception_id` varchar(64) NOT NULL COMMENT '样本接收记录ID',
|
||||
`protocol_sample_id` varchar(64) NOT NULL COMMENT '协议样本ID',
|
||||
`collection_protocol_id` varchar(64) NOT NULL COMMENT '协议单ID',
|
||||
`protocol_no` varchar(64) DEFAULT NULL COMMENT '协议号快照',
|
||||
`sample_code` varchar(32) DEFAULT NULL COMMENT '样本编码快照',
|
||||
`reception_source` varchar(20) NOT NULL DEFAULT 'cell_storage' COMMENT '来源(cell_storage/research_donation)',
|
||||
`work_order_status` varchar(16) NOT NULL DEFAULT 'dpz' COMMENT '状态(dpz待配置/ywc已完成)',
|
||||
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
|
||||
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
|
||||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_pwo_reception` (`reception_id`,`del_flag`),
|
||||
KEY `idx_pwo_tenant_status` (`tenant_no`,`work_order_status`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='入库生产工单';
|
||||
|
||||
-- -----------------------------------------------------------
|
||||
-- 3. biz_production_task — 生产任务
|
||||
-- -----------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `biz_production_task` (
|
||||
`id` varchar(64) NOT NULL COMMENT '主键ID',
|
||||
`task_no` varchar(32) NOT NULL COMMENT '任务号(前缀RW)',
|
||||
`work_order_id` varchar(64) NOT NULL COMMENT '所属工单ID',
|
||||
`task_name` varchar(200) DEFAULT NULL COMMENT '任务名称',
|
||||
`description` varchar(500) DEFAULT NULL COMMENT '描述',
|
||||
`route_id` varchar(64) DEFAULT NULL COMMENT '所选工艺路线ID(仅记录来源)',
|
||||
`task_status` varchar(16) NOT NULL DEFAULT 'dpz' COMMENT '状态(dpz待配置/jxz进行中/ywc已完成)',
|
||||
`started_time` datetime DEFAULT NULL COMMENT '开始时间',
|
||||
`completed_time` datetime DEFAULT NULL COMMENT '完成时间',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
|
||||
`attachments` varchar(4000) DEFAULT NULL COMMENT '附件/图片URL(逗号分隔)',
|
||||
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
|
||||
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
|
||||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_pt_wo` (`work_order_id`,`del_flag`),
|
||||
KEY `idx_pt_tenant_status` (`tenant_no`,`task_status`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务';
|
||||
|
||||
-- -----------------------------------------------------------
|
||||
-- 4. biz_production_task_input — 任务输入子表
|
||||
-- -----------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `biz_production_task_input` (
|
||||
`id` varchar(64) NOT NULL COMMENT '主键ID',
|
||||
`task_id` varchar(64) NOT NULL COMMENT '任务ID',
|
||||
`input_type` varchar(20) NOT NULL COMMENT '类型(sample样本/cell_product细胞产品)',
|
||||
`input_id` varchar(64) DEFAULT NULL COMMENT '关联ID(样本ID或细胞产品ID)',
|
||||
`input_code` varchar(64) DEFAULT NULL COMMENT '编码快照',
|
||||
`input_name` varchar(200) DEFAULT NULL COMMENT '名称快照',
|
||||
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
|
||||
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
|
||||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_pti_task` (`task_id`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务输入';
|
||||
|
||||
-- -----------------------------------------------------------
|
||||
-- 5. biz_production_task_step — 任务工艺步骤
|
||||
-- -----------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `biz_production_task_step` (
|
||||
`id` varchar(64) NOT NULL COMMENT '主键ID',
|
||||
`task_id` varchar(64) NOT NULL COMMENT '任务ID',
|
||||
`step_order` int(11) DEFAULT NULL COMMENT '步骤顺序',
|
||||
`process_code` varchar(64) DEFAULT NULL COMMENT '工序代码',
|
||||
`category_id` varchar(64) DEFAULT NULL COMMENT '工序分类ID',
|
||||
`process_name` varchar(100) DEFAULT NULL COMMENT '工序名称',
|
||||
`description` varchar(500) DEFAULT NULL COMMENT '描述',
|
||||
`equipment_name` varchar(200) DEFAULT NULL COMMENT '设备名称',
|
||||
`estimated_duration` varchar(100) DEFAULT NULL COMMENT '预估耗时',
|
||||
`actual_duration` varchar(100) DEFAULT NULL COMMENT '实际耗时',
|
||||
`sop_ids` varchar(1000) DEFAULT NULL COMMENT 'SOP文档ID(逗号分隔)',
|
||||
`step_status` varchar(16) NOT NULL DEFAULT 'dzx' COMMENT '状态(dzx待执行/jxz进行中/ywc已完成)',
|
||||
`started_time` datetime DEFAULT NULL COMMENT '开始时间',
|
||||
`completed_time` datetime DEFAULT NULL COMMENT '完成时间',
|
||||
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
|
||||
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
|
||||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_pts_task` (`task_id`,`del_flag`),
|
||||
KEY `idx_pts_tenant` (`tenant_no`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务工艺步骤';
|
||||
|
||||
-- -----------------------------------------------------------
|
||||
-- 6. biz_production_task_step_reagent — 步骤试剂
|
||||
-- -----------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `biz_production_task_step_reagent` (
|
||||
`id` varchar(64) NOT NULL COMMENT '主键ID',
|
||||
`step_id` varchar(64) NOT NULL COMMENT '步骤ID',
|
||||
`reagent_code` varchar(64) DEFAULT NULL COMMENT '试剂编码',
|
||||
`reagent_name` varchar(100) DEFAULT NULL COMMENT '试剂名称',
|
||||
`spec` varchar(200) DEFAULT NULL COMMENT '规格',
|
||||
`standard_usage` varchar(100) DEFAULT NULL COMMENT '标准用量',
|
||||
`actual_usage` varchar(100) DEFAULT NULL COMMENT '实际用量',
|
||||
`unit` varchar(64) DEFAULT NULL COMMENT '单位',
|
||||
`is_key_material` char(1) DEFAULT '0' COMMENT '是否关键物料(0否 1是)',
|
||||
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
|
||||
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
|
||||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_ptsr_step` (`step_id`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务步骤试剂';
|
||||
|
||||
-- -----------------------------------------------------------
|
||||
-- 7. biz_production_task_step_consumable — 步骤耗材
|
||||
-- -----------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `biz_production_task_step_consumable` (
|
||||
`id` varchar(64) NOT NULL COMMENT '主键ID',
|
||||
`step_id` varchar(64) NOT NULL COMMENT '步骤ID',
|
||||
`consumable_code` varchar(64) DEFAULT NULL COMMENT '耗材编码',
|
||||
`consumable_name` varchar(100) DEFAULT NULL COMMENT '耗材名称',
|
||||
`spec_model` varchar(200) DEFAULT NULL COMMENT '规格型号',
|
||||
`standard_usage` varchar(100) DEFAULT NULL COMMENT '标准用量',
|
||||
`actual_usage` varchar(100) DEFAULT NULL COMMENT '实际用量',
|
||||
`unit` varchar(64) DEFAULT NULL COMMENT '单位',
|
||||
`is_required` char(1) DEFAULT '1' COMMENT '是否必需(1必须 0可选)',
|
||||
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
|
||||
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
|
||||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_ptsc_step` (`step_id`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务步骤耗材';
|
||||
|
||||
-- -----------------------------------------------------------
|
||||
-- 8. biz_production_task_step_output — 步骤产出物
|
||||
-- -----------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `biz_production_task_step_output` (
|
||||
`id` varchar(64) NOT NULL COMMENT '主键ID',
|
||||
`step_id` varchar(64) NOT NULL COMMENT '步骤ID',
|
||||
`output_type_id` varchar(64) DEFAULT NULL COMMENT '产出类型ID',
|
||||
`output_name` varchar(200) DEFAULT NULL COMMENT '产出物名称',
|
||||
`output_barcode` varchar(200) DEFAULT NULL COMMENT '实际条码',
|
||||
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
|
||||
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
|
||||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_ptso_step` (`step_id`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务步骤产出物';
|
||||
|
||||
-- -----------------------------------------------------------
|
||||
-- 9. biz_production_task_step_data_collection — 步骤数据采集
|
||||
-- -----------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `biz_production_task_step_data_collection` (
|
||||
`id` varchar(64) NOT NULL COMMENT '主键ID',
|
||||
`step_id` varchar(64) NOT NULL COMMENT '步骤ID',
|
||||
`collection_name` varchar(100) DEFAULT NULL COMMENT '采集项名称',
|
||||
`unit` varchar(64) DEFAULT NULL COMMENT '单位',
|
||||
`collection_value` varchar(500) DEFAULT NULL COMMENT '填写值',
|
||||
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
|
||||
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
|
||||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_ptsdc_step` (`step_id`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务步骤数据采集';
|
||||
|
||||
-- -----------------------------------------------------------
|
||||
-- 10. biz_production_task_output — 任务输出
|
||||
-- -----------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `biz_production_task_output` (
|
||||
`id` varchar(64) NOT NULL COMMENT '主键ID',
|
||||
`task_id` varchar(64) NOT NULL COMMENT '任务ID',
|
||||
`cell_product_id` varchar(64) DEFAULT NULL COMMENT '关联细胞产品ID',
|
||||
`storage_slot_id` varchar(64) DEFAULT NULL COMMENT '储物格ID',
|
||||
`output_name` varchar(200) DEFAULT NULL COMMENT '产出物名称',
|
||||
`output_barcode` varchar(200) DEFAULT NULL COMMENT '产出物条码',
|
||||
`quantity` decimal(18,4) DEFAULT NULL COMMENT '数量',
|
||||
`unit` varchar(64) DEFAULT NULL COMMENT '单位',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
|
||||
`attachments` varchar(4000) DEFAULT NULL COMMENT '图片URL(逗号分隔)',
|
||||
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
|
||||
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
|
||||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
|
||||
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_pto_task` (`task_id`,`del_flag`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务输出';
|
||||
|
||||
-- -----------------------------------------------------------
|
||||
-- 菜单: 生产管理下新增 3 个二级菜单
|
||||
-- 父菜单ID: 90000000000000000000000000000001 (生产管理)
|
||||
-- -----------------------------------------------------------
|
||||
INSERT INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `menu_type`, `path`, `component`, `perms`, `is_frame`, `visible`, `status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES ('90000000000000000000000000000011', '入库生产工单', '90000000000000000000000000000001', 'C', 'work-order', '/production/production-work-order/index', 'production:work-order:list', 1, '1', '1', 'zkxw', 9, NULL, NULL, '', '2026-05-19 00:00:00', NULL, '2026-05-19 00:00:00', 0);
|
||||
|
||||
INSERT INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `menu_type`, `path`, `component`, `perms`, `is_frame`, `visible`, `status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES ('90000000000000000000000000000012', '生产任务', '90000000000000000000000000000001', 'C', 'task', '/production/production-task/index', 'production:task:list', 1, '1', '1', 'zkxw', 10, NULL, NULL, '', '2026-05-19 00:00:00', NULL, '2026-05-19 00:00:00', 0);
|
||||
|
||||
INSERT INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `menu_type`, `path`, `component`, `perms`, `is_frame`, `visible`, `status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES ('90000000000000000000000000000013', '细胞产品库', '90000000000000000000000000000001', 'C', 'cell-product', '/production/cell-product/index', 'production:cell-product:list', 1, '1', '1', 'zkxw', 11, NULL, NULL, '', '2026-05-19 00:00:00', NULL, '2026-05-19 00:00:00', 0);
|
||||
@@ -61,10 +61,10 @@ CREATE TABLE `biz_qc_material_usage` (
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='质检物料变动记录';
|
||||
|
||||
-- ----------------------------
|
||||
-- 菜单数据
|
||||
-- 菜单数据(已存在则跳过)
|
||||
-- ----------------------------
|
||||
INSERT INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `menu_type`, `path`, `component`, `perms`, `is_frame`, `visible`, `status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`)
|
||||
INSERT IGNORE INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `menu_type`, `path`, `component`, `perms`, `is_frame`, `visible`, `status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`)
|
||||
VALUES ('70000000000000000000000000000009', '质检物料库', '70000000000000000000000000000001', 'C', 'qc-material', '/quality-inspection/qc-material/index', 'biz:qcMaterial:list', 1, '1', '1', 'zkxw', 8, NULL, NULL, '', NOW(), NULL, NOW(), 0);
|
||||
|
||||
INSERT INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `menu_type`, `path`, `component`, `perms`, `is_frame`, `visible`, `status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`)
|
||||
INSERT IGNORE INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `menu_type`, `path`, `component`, `perms`, `is_frame`, `visible`, `status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`)
|
||||
VALUES ('70000000000000000000000000000010', '物料变动记录', '70000000000000000000000000000001', 'C', 'qc-material-usage', '/quality-inspection/qc-material-usage/index', 'biz:qcMaterialUsage:list', 1, '1', '1', 'zkxw', 9, NULL, NULL, '', NOW(), NULL, NOW(), 0);
|
||||
@@ -1,5 +0,0 @@
|
||||
-- 质检任务:检测结论(通过/不通过)
|
||||
ALTER TABLE `biz_qc_task`
|
||||
ADD COLUMN `conclusion` varchar(16) DEFAULT NULL
|
||||
COMMENT '检测结论 tg通过 btg不通过'
|
||||
AFTER `task_status`;
|
||||
@@ -1,11 +0,0 @@
|
||||
-- 质检工单/任务:区分入库质检与出库质检(未来)
|
||||
ALTER TABLE `biz_qc_work_order`
|
||||
ADD COLUMN `qc_biz_type` varchar(20) NOT NULL DEFAULT 'inbound'
|
||||
COMMENT '质检业务类型 inbound入库质检 outbound出库质检'
|
||||
AFTER `reception_source`;
|
||||
|
||||
UPDATE `biz_qc_work_order`
|
||||
SET `qc_biz_type` = 'inbound',
|
||||
`update_time` = NOW()
|
||||
WHERE `del_flag` = 0
|
||||
AND (`qc_biz_type` IS NULL OR `qc_biz_type` = '');
|
||||
@@ -1,6 +0,0 @@
|
||||
-- 质量检测:侧栏菜单「质检工单」更名为「入库质检工单」
|
||||
UPDATE `sys_menu`
|
||||
SET `menu_name` = '入库质检工单',
|
||||
`update_time` = NOW()
|
||||
WHERE `id` = '70000000000000000000000000000007'
|
||||
AND `del_flag` = 0;
|
||||
@@ -1,10 +0,0 @@
|
||||
-- 科研捐赠相关表排序规则与 biz_sample_reception 等表对齐(utf8mb4_unicode_ci)
|
||||
-- 修复样本接收待办查询:Illegal mix of collations (utf8mb4_general_ci) and (utf8mb4_unicode_ci)
|
||||
-- 在已有库执行本脚本一次即可
|
||||
|
||||
ALTER TABLE `biz_research_donation` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `biz_research_donation_audit` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `biz_research_donation_collection` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `biz_research_donation_party` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `biz_research_donation_sample` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `biz_research_donation_sample_transport` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
+818
-162
File diff suppressed because it is too large.
Load diff
@@ -171,7 +171,7 @@ class BizProtocolFullmoonTodo(Base):
|
||||
|
||||
id = Column(String(64), primary_key=True, comment="主键ID")
|
||||
collection_protocol_id = Column(String(64), nullable=False, comment="采集协议单ID")
|
||||
todo_status = Column(CHAR(1), nullable=False, default="0", comment="1已办报销 0未办保险")
|
||||
todo_status = Column(CHAR(1), nullable=False, default="0", comment="1已办保险 0未办保险")
|
||||
handle_date = Column(CHAR(8), nullable=True, comment="办理日期")
|
||||
handle_remark = Column(String(512), nullable=True, comment="办理备注")
|
||||
insurance_attachments = Column(String(4000), nullable=True, comment="保险附件逗号分隔")
|
||||
@@ -914,13 +914,13 @@ git commit -m "feat: add insurance company management page with invoices and pro
|
||||
| 母亲姓名 | motherName | 100 |
|
||||
| 新生儿分娩时间 | newbornDeliveryTime | 140 |
|
||||
| 满月日期 | fullmoonDate | 120 |
|
||||
| 待办状态 | todoStatus(el-tag: 0=warning"未办保险", 1=success"已办报销")| 100 |
|
||||
| 待办状态 | todoStatus(el-tag: 0=warning"未办保险", 1=success"已办保险")| 100 |
|
||||
| 是否已订购保险 | insuranceSubscribed(el-tag: 0=info"否", 1=success"是")| 120 |
|
||||
| 保险公司 | insuranceCompanyName | 140 |
|
||||
| 保险险种 | insuranceType | 120 |
|
||||
| 操作 | fixed="right", width=160 | 160 |
|
||||
|
||||
**筛选栏:** 关键词(协议号/姓名)、待办状态下拉(全部/未办保险/已办报销)
|
||||
**筛选栏:** 关键词(协议号/姓名)、待办状态下拉(全部/未办保险/已办保险)
|
||||
|
||||
**操作按钮:** 「办理保险」→ 弹出编辑弹窗
|
||||
|
||||
@@ -935,7 +935,7 @@ git commit -m "feat: add insurance company management page with invoices and pro
|
||||
- 保险单附件(el-upload,多附件)
|
||||
- 办理日期(el-date-picker)
|
||||
- 办理备注(el-input textarea)
|
||||
- 待办状态(el-radio-group:未办保险/已办报销)
|
||||
- 待办状态(el-radio-group:未办保险/已办保险)
|
||||
|
||||
API 调用:`fetchFullmoonTodoList`(列表)、`fetchUpdateFullmoonTodoInsurance`(保存)
|
||||
|
||||
|
||||
@@ -0,0 +1,278 @@
|
||||
# Web 管理端 Token 自动续期 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:** 在 Access Token 过期时通过 Refresh Token 静默续期并重试请求,避免用户操作中被误踢登录。
|
||||
|
||||
**Architecture:** 新建 `token-refresh.ts` 负责单飞刷新与请求队列;`http/index.ts` 在 401 时先刷新再重试;修复 `fetchRefreshToken` 为 JSON body。首期不做多 Tab 广播与定时主动刷新。
|
||||
|
||||
**Tech Stack:** Vue 3 / Pinia / Axios / FastAPI JWT + Redis 会话
|
||||
|
||||
**Design Doc:** `docs/superpowers/specs/2026-05-20-web-token-auto-refresh-design.md`
|
||||
|
||||
---
|
||||
|
||||
## File Structure Map
|
||||
|
||||
| File | Responsibility |
|
||||
|------|----------------|
|
||||
| `web-admin/src/utils/http/token-refresh.ts` | **新建** — 单飞 refresh、队列、URL 白名单、从 refreshToken 解析 userId |
|
||||
| `web-admin/src/utils/http/index.ts` | **修改** — 401 走刷新队列;重试原请求;刷新失败再 logOut |
|
||||
| `web-admin/src/api/auth.ts` | **修改** — `fetchRefreshToken` body 传参;静默错误提示选项 |
|
||||
| `web-admin/src/store/modules/user.ts` | **复用** — `setToken` / `refreshToken` / `logOut` |
|
||||
| `backend/.env.example` | **可选** — 注释说明 ACCESS_TOKEN 与 refresh 关系 |
|
||||
|
||||
---
|
||||
|
||||
### Task 1: 修复 refresh API 契约
|
||||
|
||||
**Files:**
|
||||
- Modify: `web-admin/src/api/auth.ts`
|
||||
|
||||
- [ ] **Step 1: 修改 `fetchRefreshToken` 使用 JSON body**
|
||||
|
||||
```typescript
|
||||
export function fetchRefreshToken(refreshToken: string) {
|
||||
return request.post<{
|
||||
token: string
|
||||
refreshToken: string
|
||||
expiresIn: number
|
||||
}>({
|
||||
url: '/web/auth/refresh-token',
|
||||
data: { refreshToken },
|
||||
showErrorMessage: false
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 2: 手动验证**
|
||||
|
||||
在浏览器 Network 中触发一次 refresh(可用临时按钮或控制台调用),确认 Request Payload 为 `{"refreshToken":"..."}` 且非 query string。
|
||||
|
||||
---
|
||||
|
||||
### Task 2: 实现 token-refresh 模块
|
||||
|
||||
**Files:**
|
||||
- Create: `web-admin/src/utils/http/token-refresh.ts`
|
||||
|
||||
- [ ] **Step 1: 创建模块骨架**
|
||||
|
||||
```typescript
|
||||
import type { InternalAxiosRequestConfig } from 'axios'
|
||||
import { fetchRefreshToken } from '@/api/auth'
|
||||
import { useUserStore } from '@/store/modules/user'
|
||||
|
||||
const AUTH_SKIP_REFRESH_URLS = [
|
||||
'/web/auth/login',
|
||||
'/web/auth/refresh-token',
|
||||
'/web/auth/logout'
|
||||
]
|
||||
|
||||
let refreshPromise: Promise<void> | null = null
|
||||
|
||||
export function shouldSkipTokenRefresh(url?: string): boolean {
|
||||
if (!url) return false
|
||||
return AUTH_SKIP_REFRESH_URLS.some((p) => url.includes(p))
|
||||
}
|
||||
|
||||
export function parseSubFromJwt(token: string): string {
|
||||
if (!token || token.split('.').length < 2) return ''
|
||||
try {
|
||||
const payload = token.split('.')[1]
|
||||
const b64 = payload.replace(/-/g, '+').replace(/_/g, '/')
|
||||
const pad = '='.repeat((4 - (b64.length % 4)) % 4)
|
||||
const json = atob(b64 + pad)
|
||||
const obj = JSON.parse(json)
|
||||
return String(obj?.sub || '')
|
||||
} catch {
|
||||
return ''
|
||||
}
|
||||
}
|
||||
|
||||
export async function refreshAccessTokenOnce(): Promise<void> {
|
||||
if (refreshPromise) return refreshPromise
|
||||
|
||||
refreshPromise = (async () => {
|
||||
const userStore = useUserStore()
|
||||
const rt = userStore.refreshToken
|
||||
if (!rt) throw new Error('NO_REFRESH_TOKEN')
|
||||
|
||||
const res = await fetchRefreshToken(rt)
|
||||
userStore.setToken(res.token, res.refreshToken)
|
||||
})().finally(() => {
|
||||
refreshPromise = null
|
||||
})
|
||||
|
||||
return refreshPromise
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 2: 添加请求队列类型(供 index.ts 使用)**
|
||||
|
||||
在同一文件导出:
|
||||
|
||||
```typescript
|
||||
type RetryFn = () => Promise<unknown>
|
||||
const pendingRetries: RetryFn[] = []
|
||||
|
||||
export function enqueueAfterRefresh(fn: RetryFn): Promise<unknown> {
|
||||
return new Promise((resolve, reject) => {
|
||||
pendingRetries.push(async () => {
|
||||
try {
|
||||
resolve(await fn())
|
||||
} catch (e) {
|
||||
reject(e)
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
export async function flushPendingRetries(): Promise<void> {
|
||||
const fns = pendingRetries.splice(0, pendingRetries.length)
|
||||
for (const fn of fns) {
|
||||
await fn()
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
(实现时可改为「刷新成功后逐个 resolve 队列」,与 `index.ts` 协调,避免过度设计。)
|
||||
|
||||
---
|
||||
|
||||
### Task 3: 接入 HTTP 拦截器
|
||||
|
||||
**Files:**
|
||||
- Modify: `web-admin/src/utils/http/index.ts`
|
||||
|
||||
- [ ] **Step 1: 扩展 `ExtendedAxiosRequestConfig`**
|
||||
|
||||
```typescript
|
||||
interface ExtendedAxiosRequestConfig extends AxiosRequestConfig {
|
||||
showErrorMessage?: boolean
|
||||
showSuccessMessage?: boolean
|
||||
_skipTokenRefresh?: boolean
|
||||
_retriedAfterRefresh?: boolean
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 2: 抽取 `tryRefreshAndRetry`**
|
||||
|
||||
在 `handleUnauthorizedError` 之前新增:
|
||||
|
||||
```typescript
|
||||
async function tryRefreshAndRetry(
|
||||
config: ExtendedAxiosRequestConfig,
|
||||
message?: string
|
||||
): Promise<AxiosResponse | never> {
|
||||
const userStore = useUserStore()
|
||||
if (config._skipTokenRefresh || shouldSkipTokenRefresh(config.url)) {
|
||||
return handleUnauthorizedError(message)
|
||||
}
|
||||
if (!userStore.refreshToken) {
|
||||
return handleUnauthorizedError(message)
|
||||
}
|
||||
if (config._retriedAfterRefresh) {
|
||||
return handleUnauthorizedError(message)
|
||||
}
|
||||
|
||||
await refreshAccessTokenOnce()
|
||||
config._retriedAfterRefresh = true
|
||||
return axiosInstance.request(config)
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 3: 修改响应成功拦截器**
|
||||
|
||||
当 `code === ApiStatus.unauthorized` 时,若可刷新则 `return tryRefreshAndRetry(response.config, msg)`,否则 `handleUnauthorizedError`。
|
||||
|
||||
注意:`response.config` 需转为 `InternalAxiosRequestConfig` 并保留原 `data`。
|
||||
|
||||
- [ ] **Step 4: 修改响应错误拦截器**
|
||||
|
||||
`error.response?.status === 401` 时同样调用 `tryRefreshAndRetry(error.config, ...)`。
|
||||
|
||||
- [ ] **Step 5: refresh 专用调用**
|
||||
|
||||
`fetchRefreshToken` 内部 request 走同一 axios 时,为 refresh 请求设置 `_skipTokenRefresh: true`(在 auth.ts 的 request 配置传入,需 api 层支持透传;或在 `token-refresh.ts` 用裸 axios 调 `/web/auth/refresh-token` 并手动带加密逻辑)。
|
||||
|
||||
**推荐最小实现:** 在 `getEncryptSkipReason` 或请求 config 上,对 `refresh-token` URL 设置 `_skipTokenRefresh`,且 refresh 失败不进入 `tryRefreshAndRetry`。
|
||||
|
||||
- [ ] **Step 6: 单飞并发验证**
|
||||
|
||||
本地 `ACCESS_TOKEN_EXPIRE_MINUTES=1`,登录后等待过期,快速点击多个菜单,Network 中 `refresh-token` 仅 1 次。
|
||||
|
||||
---
|
||||
|
||||
### Task 4: 加密场景 userId 后备
|
||||
|
||||
**Files:**
|
||||
- Modify: `web-admin/src/utils/http/index.ts` — `resolveUserId`
|
||||
|
||||
- [ ] **Step 1: accessToken 无 sub 时用 refreshToken 解 sub**
|
||||
|
||||
```typescript
|
||||
function resolveUserId(userStore: ReturnType<typeof useUserStore>): string {
|
||||
const info = userStore.info || ({} as any)
|
||||
const fromInfo = String(info.id || info.userId || '')
|
||||
if (fromInfo) return fromInfo
|
||||
const fromAccess = parseUserIdFromToken(userStore.accessToken)
|
||||
if (fromAccess) return fromAccess
|
||||
return parseSubFromJwt(userStore.refreshToken)
|
||||
}
|
||||
```
|
||||
|
||||
(`parseSubFromJwt` 从 `token-refresh.ts` 导入。)
|
||||
|
||||
---
|
||||
|
||||
### Task 5: 文档与配置说明
|
||||
|
||||
**Files:**
|
||||
- Modify: `backend/.env.example`
|
||||
- Modify: `backend/README.md`(可选一句)
|
||||
|
||||
- [ ] **Step 1: 在 `.env.example` JWT 段补充**
|
||||
|
||||
```env
|
||||
# Access Token 有效期(分钟)。过短会导致频繁走 refresh;建议生产 120+。
|
||||
# Refresh Token / Redis 会话均为 7 天,需前端自动 refresh(web-admin 已实现)。
|
||||
# ACCESS_TOKEN_EXPIRE_MINUTES=120
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Task 6: 回归测试清单
|
||||
|
||||
- [ ] 正常登录 → 列表加载
|
||||
- [ ] Access 过期 + Refresh 有效 → 自动续期
|
||||
- [ ] Refresh 无效 → 登出 + 提示
|
||||
- [ ] 登录页 / 登出接口不触发 refresh
|
||||
- [ ] 生产加密开关 ON 时 refresh 成功
|
||||
- [ ] 修复前「操作中突然 token 无效」场景复测
|
||||
|
||||
---
|
||||
|
||||
## Self-Review(计划 vs 设计)
|
||||
|
||||
| 设计要求 | 对应任务 |
|
||||
|----------|----------|
|
||||
| 401 被动刷新 + 单飞 | Task 2, 3 |
|
||||
| 修复 body 传参 | Task 1 |
|
||||
| 防死循环 | Task 3 `_skipTokenRefresh` / `_retriedAfterRefresh` |
|
||||
| 加密 userId | Task 4 |
|
||||
| 多 Tab 首期不处理 | 设计文档已说明,无任务 |
|
||||
| 方案 C 后端滑动会话 | 未纳入本期(可选后续) |
|
||||
|
||||
---
|
||||
|
||||
## Execution Handoff
|
||||
|
||||
Plan complete: `docs/superpowers/plans/2026-05-20-web-token-auto-refresh.md`
|
||||
|
||||
**执行方式:**
|
||||
|
||||
1. **Subagent-Driven** — 每 Task 独立子代理 + 步骤间审查(推荐)
|
||||
2. **Inline Execution** — 本会话按 Task 顺序实现,检查点人工确认
|
||||
|
||||
设计文档:`docs/superpowers/specs/2026-05-20-web-token-auto-refresh-design.md` — 请先审阅设计,再按本计划落地。
|
||||
@@ -121,9 +121,9 @@ ALTER TABLE `biz_protocol_fullmoon_todo`
|
||||
- `biz_protocol_party_customer.newborn_delivery_time + 30天 ≤ 当前日期`(新生儿已满月)
|
||||
|
||||
**字段语义说明**:
|
||||
- `todo_status`:满月待办整体完成状态('0'未办保险 → '1'已办报销),表示整个流程是否结束
|
||||
- `todo_status`:满月待办整体完成状态('0'未办保险 → '1'已办保险),表示整个流程是否结束
|
||||
- `insurance_subscribed`:是否已订购保险('0'否 → '1'是),表示保险购买这一步骤是否完成
|
||||
- 两者关系:`insurance_subscribed='1'` 是 `todo_status='1'` 的前提条件之一,但不是充分条件(可能还需要其他步骤如报销完成)
|
||||
- 两者关系:`insurance_subscribed='1'` 是 `todo_status='1'` 的前提条件之一,但不是充分条件(办结需人工确认待办状态)
|
||||
- 前端更新保险信息时,如果 `insurance_subscribed` 设为 '1',可联动将 `todo_status` 更新为 '1'(用户可覆盖)
|
||||
|
||||
### 2.3 模块 C:储存证管理(复用现有表)
|
||||
|
||||
@@ -0,0 +1,197 @@
|
||||
# Web 管理端 Token 自动续期设计文档
|
||||
|
||||
## 背景
|
||||
|
||||
用户在使用 `web-admin` 时,即使持续操作界面,仍可能突然收到「Token无效或已过期」并被踢回登录页。
|
||||
|
||||
### 现状(代码事实)
|
||||
|
||||
| 层级 | 行为 |
|
||||
|------|------|
|
||||
| **Access Token** | JWT,`exp` 由 `ACCESS_TOKEN_EXPIRE_MINUTES` 控制。`config.py` 默认 **30×24 分钟(30 天)**;`backend/README` / `.env.example` 推荐 **30 分钟**。 |
|
||||
| **Refresh Token** | JWT,**7 天**;Redis 存 `auth:refresh:{jti}`,**一次性**:刷新成功后旧 `jti` 吊销。 |
|
||||
| **Redis 会话** | 配置 `REDIS_HOST` 后启用;`auth:sessions:{sid}` TTL **7 天**;仅在调用 `refresh-token` 时 `extend_session`,**普通 API 请求不续期**。 |
|
||||
| **前端** | 登录保存 `accessToken` + `refreshToken`(Pinia + localStorage);`fetchRefreshToken` 已定义但 **全项目未调用**;`utils/http/index.ts` 遇 **401 直接 `logOut()`**,无静默刷新。 |
|
||||
| **已知缺陷** | `fetchRefreshToken` 使用 `params: { refreshToken }`,而后端 `refresh_token(body: dict)` 读取 **`body.refreshToken`**,当前实现可能刷新失败。 |
|
||||
|
||||
后端错误文案:`Token无效或已过期`(`app/core/auth.py` → `is_session_valid` 失败或 JWT 无效)。
|
||||
|
||||
### 目标
|
||||
|
||||
- 用户在 **Access Token 过期但 Refresh Token 仍有效** 时,业务请求应 **自动续期并重试**,无感知或仅极短延迟。
|
||||
- Refresh Token 也失效时,再提示并跳转登录(保留现有 401 防抖)。
|
||||
- **不扩大范围**:首期仅 `web-admin`;小程序端无同类封装,不在本期。
|
||||
|
||||
### 非目标
|
||||
|
||||
- 改造 OAuth2 标准全家桶、单点登录、多设备互踢策略产品化。
|
||||
- 修改 API 加密算法或全局中间件行为(除 refresh 请求路径约定外)。
|
||||
|
||||
---
|
||||
|
||||
## 方案对比(2~3 种)
|
||||
|
||||
### 方案 A:401 被动刷新 + 请求队列(推荐,首期)
|
||||
|
||||
**流程:**
|
||||
|
||||
1. 业务请求返回 `code === 401` 或 HTTP 401(且非 refresh/login 接口)。
|
||||
2. 若本地有 `refreshToken`,进入 **单飞(single-flight)** 刷新:仅一次 `POST /web/auth/refresh-token`。
|
||||
3. 刷新成功:更新 store 中 `accessToken` / `refreshToken`,**重放** 失败请求队列。
|
||||
4. 刷新失败或无 refreshToken:走现有 `handleUnauthorizedError` → 登出。
|
||||
|
||||
**优点:** 改动集中在 `web-admin/src/utils/http/`;与现有后端 rotate refresh 模型一致;YAGNI。
|
||||
**缺点:** 仅在「第一次 401 之后」才续期;若 Access 仅 30 分钟,第 30 分钟后第一个请求会多一次 RTT。
|
||||
**适用:** 当前仓库已具备 refresh API,缺口在前端。
|
||||
|
||||
### 方案 B:主动定时刷新 + 401 兜底
|
||||
|
||||
在方案 A 基础上,解析 Access JWT 的 `exp`,在到期前 **5 分钟**(可配置)主动调用 refresh。
|
||||
|
||||
**优点:** 减少用户感知到的首包 401;长时间表单填写更稳。
|
||||
**缺点:** 多标签页需 `storage` 事件或 `BroadcastChannel` 同步 token,否则一 tab 刷新后另一 tab 仍用旧 refresh 导致吊销冲突;实现复杂度明显上升。
|
||||
**建议:** 作为 **二期**,在 A 稳定后再加。
|
||||
|
||||
### 方案 C:后端「滑动会话」——每次请求延长 Redis TTL
|
||||
|
||||
在 `get_current_user_by_token` 成功校验后调用 `extend_session(session_id)`。
|
||||
|
||||
**优点:** 7 天内「有操作就不掉会话」;减轻「JWT 仍有效但 Redis 会话已过期」问题。
|
||||
**缺点:** **不解决 Access JWT `exp` 到期**(若配置 30 分钟仍会 401);Redis 写放大;与「仅 refresh 续会话」的现有语义不一致。
|
||||
**建议:** 可选 **后端小改**,与方案 A **组合**使用,不作为唯一手段。
|
||||
|
||||
---
|
||||
|
||||
## 推荐组合
|
||||
|
||||
**首期:方案 A(必须) + 修复 `fetchRefreshToken` 传参(必须) + 配置对齐说明(文档)**
|
||||
**可选同期:方案 C(若产品要求「7 天内有操作永不过期」)**
|
||||
**二期:方案 B(多 Tab / 长表单场景)**
|
||||
|
||||
---
|
||||
|
||||
## 详细设计(方案 A)
|
||||
|
||||
### 1. 模块划分
|
||||
|
||||
| 单元 | 职责 |
|
||||
|------|------|
|
||||
| `web-admin/src/utils/http/token-refresh.ts`(新建) | 单飞刷新、`refreshAccessToken()`、判断是否跳过刷新的 URL |
|
||||
| `web-admin/src/utils/http/index.ts`(修改) | 响应拦截器接入刷新队列;刷新专用请求不走业务重试 |
|
||||
| `web-admin/src/api/auth.ts`(修改) | `fetchRefreshToken` 改为 **JSON body** `{ refreshToken }`;可选 `showErrorMessage: false` |
|
||||
| `web-admin/src/store/modules/user.ts` | 已有 `setToken`,复用即可 |
|
||||
|
||||
### 2. 刷新请求约定
|
||||
|
||||
```http
|
||||
POST /api/web/auth/refresh-token
|
||||
Content-Type: application/json
|
||||
|
||||
{ "refreshToken": "<当前 refreshToken>" }
|
||||
```
|
||||
|
||||
- 使用 **独立 axios 实例** 或带 `_skipTokenRefresh: true` 标记,避免 refresh 失败再次触发刷新死循环。
|
||||
- refresh 接口 **不携带** 已过期的 accessToken 亦可(后端只读 body);为与加密中间件一致,仍建议带当前 accessToken(若解密需要 userId)。
|
||||
- 路径加入「跳过自动刷新」白名单:`/web/auth/refresh-token`、`/web/auth/login`、`/web/auth/logout`。
|
||||
|
||||
### 3. 响应拦截逻辑(伪代码)
|
||||
|
||||
```
|
||||
onResponseError(error):
|
||||
if not isUnauthorized(error): reject
|
||||
if config._skipTokenRefresh or isAuthExcludedUrl(url): handleUnauthorizedError(); return
|
||||
if !refreshToken: handleUnauthorizedError(); return
|
||||
|
||||
return enqueueRequest(() => singleFlightRefresh().then(() => retry(originalConfig)))
|
||||
```
|
||||
|
||||
**单飞:** 模块级 `refreshPromise: Promise<void> | null`;并发 401 共用一个 refresh。
|
||||
|
||||
**业务 `code === 401`:** 与 HTTP 401 同样处理(当前拦截器已对 `resData.code === unauthorized` 调 `handleUnauthorizedError`,需改为先尝试刷新)。
|
||||
|
||||
### 4. 与 API 加密的交互
|
||||
|
||||
生产环境 `VITE_API_ENCRYPT_ENABLED=true` 时,refresh 仍走 `/web/` 加密规则:
|
||||
|
||||
- refresh 请求体小,可继续走现有 request 拦截器加密。
|
||||
- 刷新专用调用须 **避免** 进入「刷新失败 → 再刷新」循环(`_skipTokenRefresh`)。
|
||||
|
||||
若 refresh 时 access 已过期导致加密 `userId` 解析失败,需约定:
|
||||
|
||||
- 从 **refreshToken JWT** 解析 `sub` 作为 `userId` 参与 `deriveKey`(与 `parseUserIdFromToken` 扩展一致),或
|
||||
- 将 `/web/auth/refresh-token` 加入 `VITE_API_ENCRYPT_EXCLUDE_PATHS`(需安全评审)。
|
||||
|
||||
**推荐:** 刷新请求从 refreshToken 解 `sub` 作为 userId 后备,与登录后逻辑一致。
|
||||
|
||||
### 5. 多标签页(首期策略)
|
||||
|
||||
后端 refresh 为 **rotate**:旧 refresh 一次性失效。
|
||||
|
||||
首期策略(简单、可文档说明):
|
||||
|
||||
- 仅 **当前标签** 在 401 时刷新;其他标签仍持旧 refresh,下一次 401 会失败并登出,用户重新登录即可。
|
||||
- 不在首期实现 `BroadcastChannel` 广播新 token(留给方案 B)。
|
||||
|
||||
### 6. 配置与运维建议(文档化,非必须改代码)
|
||||
|
||||
| 配置项 | 建议 |
|
||||
|--------|------|
|
||||
| `ACCESS_TOKEN_EXPIRE_MINUTES` | 生产建议 **120~480**(2~8 小时),与「工作日操作」匹配;开发可 30 分钟便于测刷新。 |
|
||||
| `REDIS_HOST` | 启用会话校验时,明确 **7 天无 refresh 会掉线**;与 Access 过期独立。 |
|
||||
| 登录返回 `expiresIn` | 当前写死 `7200`,与 JWT 不一致;可选后续改为真实秒数(非本期必须)。 |
|
||||
|
||||
### 7. 错误处理
|
||||
|
||||
| 场景 | 行为 |
|
||||
|------|------|
|
||||
| refresh 200,新 token | 更新 store,重试原请求,用户无感 |
|
||||
| refresh 401 / 网络失败 | `logOut()` + 提示后端 `msg` 或默认「请重新登录」 |
|
||||
| 重试仍 401 | 不再二次刷新,直接登出(防死循环) |
|
||||
| 用户主动登出 | 不调 refresh |
|
||||
|
||||
### 8. 测试要点
|
||||
|
||||
1. 将 `ACCESS_TOKEN_EXPIRE_MINUTES=1`,登录后等待 2 分钟,点击列表 → 应自动刷新并成功加载,不跳登录。
|
||||
2. 将 refresh 吊销(登出后再用旧 refresh 调接口)→ 应跳登录。
|
||||
3. 并发 10 个 API 同时 401 → 仅 1 次 refresh 请求(Network 面板验证)。
|
||||
4. 加密开启环境下 refresh 成功。
|
||||
5. 修复后 `fetchRefreshToken` body 与后端契约一致(集成测试或手动 Swagger)。
|
||||
|
||||
---
|
||||
|
||||
## 安全说明
|
||||
|
||||
- Refresh Token 存 localStorage:与现状一致,不新增攻击面。
|
||||
- 单飞刷新避免 refresh 风暴。
|
||||
- Rotate refresh:被盗 refresh 使用后旧 token 失效,符合安全实践。
|
||||
- 不在日志中打印完整 token。
|
||||
|
||||
---
|
||||
|
||||
## 风险与缓解
|
||||
|
||||
| 风险 | 缓解 |
|
||||
|------|------|
|
||||
| 刷新死循环 | `_skipTokenRefresh` + 重试次数上限 1 |
|
||||
| 多 Tab refresh 竞争 | 首期接受;二期 BroadcastChannel |
|
||||
| 加密 userId 缺失 | refreshToken 解 `sub` |
|
||||
| 与现有 401 防抖冲突 | 刷新失败才 `showError` + `logOut`;刷新成功不弹窗 |
|
||||
|
||||
---
|
||||
|
||||
## 验收标准
|
||||
|
||||
1. Access Token 过期、Refresh 有效时,连续操作 **不会** 因单次 401 踢出登录。
|
||||
2. Refresh 过期或会话被吊销时,**一次** 明确提示后进入登录页。
|
||||
3. `fetchRefreshToken` 与后端 body 契约一致,Swagger/前端联调通过。
|
||||
4. 不改变未登录、错误密码等既有登录流程。
|
||||
|
||||
---
|
||||
|
||||
## 参考文件
|
||||
|
||||
- `backend/app/core/auth.py` — token 创建、会话、refresh 校验
|
||||
- `backend/app/api/public.py` — `web_login`、`refresh_token`
|
||||
- `web-admin/src/utils/http/index.ts` — 拦截器与 401 处理
|
||||
- `web-admin/src/api/auth.ts` — `fetchRefreshToken`(待修复)
|
||||
- `web-admin/src/store/modules/user.ts` — `setToken` / `logOut`
|
||||
+1
-1
@@ -232,7 +232,7 @@
|
||||
- 缴费信息子表: (采集协议单中缴费信息子表核心字段:缴费信息主表id、转账方式(wxzz - 微信转账、 zzbzz - 支付宝转账 、 yhkzz - 银行卡转账 、 xj - 现金) 、转账金额、转账时间 、转账附件 、财务确认附件、缴费状态(待缴费、缴费确认中、已缴费、退费确认中、已退费) 分期期数(如果是趸交,这个期数就为空)、分期应缴费时间(YYYYMMDD 缴费方式为分期时候,才有这个值)、备注。 如果为缴费方式为 dj - 趸交, 则只有一条记录。如果为缴费方式 为 fq - 分期,则有分期数一样数目的记录)
|
||||
- 客户信息表: (这里是采集协议单中客户信息表,跟客户信息表 customer 不一样)(客户信息表核心字段:采集协议单id、客户id,母亲姓名、母亲联系电话、母亲身份证号、母亲出生年月(YYYYMM)、母亲民族、母亲家庭住址、父亲姓名、父亲电话、父亲身份证号、新生儿分娩时间、新生儿性别(1 - 男 、0 - 女)、分娩方式(sc - 顺产、 pgc - 剖宫产)、胎次(生育第几胎的意思,生育第一胎就是1 , 生育第二胎就是2,以此类推) 、 新生儿体重(克)、新生儿评分(1分钟)、新生儿评分(5分钟)、采集专员[用户管理,默认当前登录用户的id])
|
||||
- 审核信息表: (采集协议单有一条审核记录表,核心字段: 采集协议单id、审核人、审核备注、审核状态(shtg - 审核通过、 shth - 审核退回))
|
||||
- 新生儿满月待办表: (生效中的采集协议单中已满月的新生儿信息, 这个满月待办表中,核心字段:采集单协议id、满月待办状态(1 - 已办报销 、 0 - 未办保险)、办理日期、办理备注、保险附件)
|
||||
- 新生儿满月待办表: (生效中的采集协议单中已满月的新生儿信息, 这个满月待办表中,核心字段:采集单协议id、满月待办状态(1 - 已办保险 、 0 - 未办保险)、办理日期、办理备注、保险附件)
|
||||
- 储存证表: (生效中的,并且样本已经入库的采集协议单, 储存证表中,核心字段:制作状态(1 - 已制作 , 0 - 未制作) 储存证图片、制作日期,备注)
|
||||
- 操作日志表: (采集协议单操作日志表:记录针对采集协议单的操作日志信息,需要我们针对协议单的所有操作都要有个编码、名称。方便记录操作日志)
|
||||
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"instructions": [
|
||||
"https://gh-proxy.org/https://raw.githubusercontent.com/conventional-commits/conventionalcommits.org/refs/heads/master/content/v1.0.0/index.zh-hans.md",
|
||||
"https://gh-proxy.org/https://raw.githubusercontent.com/vttmlin/opencode-extensions/refs/heads/master/rules/common/sdd-requirement-triage.md",
|
||||
"https://gh-proxy.org/https://raw.githubusercontent.com/vttmlin/opencode-extensions/refs/heads/master/rules/common/interaction-convention.md",
|
||||
".opencode/interaction-convention.md",
|
||||
"https://gh-proxy.org/https://raw.githubusercontent.com/vttmlin/opencode-extensions/refs/heads/master/rules/common/task-execution-strategy.md",
|
||||
"https://gh-proxy.org/https://raw.githubusercontent.com/vttmlin/opencode-extensions/refs/heads/master/rules/common/network-proxy-config.md"
|
||||
],
|
||||
|
||||
@@ -40,3 +40,22 @@
|
||||
|
||||
- **WHEN** 在 `app/api/` 增加新的路由模块
|
||||
- **THEN** 该模块 SHALL 在 `app/api/__init__.py` 与 `app/main.py` 中完成注册,并符合现有认证与租户上下文注入模式
|
||||
|
||||
### Requirement: 细胞存储样本跨表关联键
|
||||
|
||||
细胞存储场景下,将协议样本行(`biz_protocol_sample`)与下游业务(样本接收 `biz_sample_reception`、质检工单 `biz_qc_work_order` 等)进行**业务匹配**时,关联键 SHALL 仅为 `tenant_no` + `sample_code`(租户内样本编码唯一且不变;接收/工单表须持久化 `sample_code` 快照)。**不得**使用 `collection_protocol_id` 或 `protocol_sample_id` 作为查询、列表排除、详情回显的关联依据(协议单可换号/转科研、编辑保存会重建样本行 `id`,但样本编码不变)。
|
||||
|
||||
#### Scenario: 协议单查看弹窗展示样本接收
|
||||
|
||||
- **WHEN** 用户打开采集协议单详情,且租户内某 `sample_code` 已登记接收
|
||||
- **THEN** 详情接口 SHALL 仅按样本编码返回对应 `sampleReception`(及同规则的 `qcInfo`),与当前协议单 ID、样本行 `id` 是否变更无关
|
||||
|
||||
#### Scenario: 待接收列表排除已接收样本
|
||||
|
||||
- **WHEN** 租户内某 `sample_code` 已存在有效接收记录(`del_flag=0`)
|
||||
- **THEN** 该编码的协议样本 SHALL NOT 出现在待接收列表
|
||||
|
||||
#### Scenario: 登记接收防重复
|
||||
|
||||
- **WHEN** 用户对某协议样本提交接收登记
|
||||
- **THEN** 服务端 SHALL 按 `tenant_no` + `sample_code` 校验是否已接收,已存在则拒绝重复登记
|
||||
@@ -263,22 +263,52 @@ Web 管理端弹窗 SHALL 遵循规范:表单 `label-position="top"`;遮罩
|
||||
|
||||
### Requirement: 附件上传卡片化布局
|
||||
|
||||
`web-admin` 中弹窗表单的附件上传区域 SHALL 使用**卡片化布局**:上传触发器与已上传附件在同一行 flex 容器中排列,上传卡片作为第一个元素始终可见。具体规则:
|
||||
`web-admin` 弹窗表单中的附件上传与展示 SHALL 采用**卡片化布局**,实现与交互以 `web-admin/src/views/cell-storage/protocol/ProtocolFormDialog.vue` 中「协议附件」为权威参考;储存证等业务弹窗(如 `web-admin/src/views/cell-storage/storage-cert/index.vue`)SHALL 复用同一套 DOM 结构、类名与样式规则,仅调整 `el-form-item` 的 `label` 与上传 `folder` 等业务参数。
|
||||
|
||||
1. **上传卡片样式**:上传触发器 SHALL 渲染为与附件卡片等尺寸的卡片(宽 120px、高 96px),使用虚线边框(`border: 1px dashed #a7f3d0`)、浅绿背景(`background: #f0fdf4`),居中显示 `Plus` 图标(size 28)与"上传附件"文字(12px `#10b981`)。hover 时边框变实线(`border-color: #10b981`)、背景加深(`background: #ecfdf5`)。
|
||||
2. **同行排列**:上传卡片与已上传附件卡片 SHALL 放在同一个 `display: flex; flex-wrap: wrap; gap: 12px` 容器内,上传卡片为第一个子元素。容器 SHALL 始终可见(不受附件数量影响)。
|
||||
3. **附件卡片样式**:已上传附件卡片 SHALL 为 120px 宽、96px 预览区高度,带实线边框(`border: 1px solid #e2e8f0`)。图片文件显示缩略图(`object-fit: cover`),视频文件显示紫色视频图标,其他文件显示蓝色文档图标。卡片底部显示文件名(11px,最多 2 行省略)与操作按钮(下载、删除,居中排列)。
|
||||
4. **上传中状态**:正在上传的附件卡片 SHALL 设置 `opacity: 0.6` 且 `pointer-events: none`,预览区显示 `Loading` 图标。
|
||||
5. **提示文案**:格式说明文字(如"支持图片、视频、PDF...,单文件不超过 20MB")SHALL 显示在卡片行下方,作为独立的 `11px` 灰色小字(`color: #94a3b8`)。
|
||||
6. **颜色约束**:上传卡片与附件卡片 SHALL 使用 Fresh Mint 色板(`#10b981`、`#a7f3d0`、`#f0fdf4`、`#ecfdf5`),SHALL NOT 使用小程序品牌色 `#0a9f6d`。
|
||||
#### 布局与视觉
|
||||
|
||||
#### 标准写法示例
|
||||
1. **结构**:`el-form-item`(建议 `class="form-col-span-2"` 占满弹窗栅格宽)→ `.attachment-upload` → `.attachment-list`(flex 行)→ 上传卡片 + 若干 `.attachment-item`;`.upload-hint` 在 flex 行**下方**独立一行。
|
||||
2. **上传卡片**:宽 **140px**、高 **96px**;`border: 1px dashed #a7f3d0`;`background: #f0fdf4`;`border-radius: 8px`;居中 `Plus`(size 28,`#10b981`)+ 文案「上传附件」(`.upload-card-text`,12px `#10b981` font-weight 500)。hover:`border-color: #10b981`、`border-style: solid`、`background: #ecfdf5`。
|
||||
3. **附件卡片**:宽 **140px**;预览区高 **96px**;`border: 1px solid #e2e8f0`;`border-radius: 8px`;hover:`border-color: #10b981`、`box-shadow: 0 2px 8px rgba(16, 185, 129, 0.1)`。
|
||||
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」。
|
||||
8. **色板**:SHALL 使用 Fresh Mint(`#10b981`、`#a7f3d0`、`#f0fdf4`、`#ecfdf5`);SHALL NOT 使用小程序主色 `#0a9f6d`。
|
||||
9. **禁止**:SHALL NOT 使用 `el-upload` 的 `list-type="picture-card"`、默认 `file-list` 展示,或单独一行纯文字「选择文件」按钮替代上传卡片。
|
||||
|
||||
```html
|
||||
#### `el-upload` 配置
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|-----|
|
||||
| `:auto-upload` | `false` |
|
||||
| `:show-file-list` | `false` |
|
||||
| `:multiple` | `true` |
|
||||
| `accept` | `image/*,video/*,.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.txt,.zip,.rar` |
|
||||
| `@change` | 选中后立即走上传逻辑(见下) |
|
||||
|
||||
上传卡片 SHALL 作为 `.attachment-list` 的**第一个子元素**,且始终渲染(不因已有附件数量而隐藏)。
|
||||
|
||||
#### 数据模型与上传逻辑
|
||||
|
||||
附件列表 SHALL 为响应式数组,元素至少包含:`id`、`fileName`、`fileUrl`、`fileType`(可选)、`_uploading`(可选布尔)。
|
||||
|
||||
1. **选择文件后**:校验单文件 ≤ **20MB**;超限则 `ElMessage.error` 并 `clearFiles()`。
|
||||
2. **立即上传**:向数组 push 占位项(`_uploading: true`、`fileUrl: ''`);`FormData` 调用 `fetchUploadAttachment`(`@/api/business`),`fd.append('folder', '<业务目录>')`(如 `protocol`、`storage-cert`、`protocol-payment`);成功后回填 `fileUrl` 等字段并 `_uploading: false`;失败则移除该项并提示。
|
||||
3. **收尾**:`nextTick` 后 `uploadRef.clearFiles()`,避免同一文件无法重复选择。
|
||||
4. **删除**:从数组 `splice` 移除,不单独调删除接口(除非产品另有要求)。
|
||||
5. **下载**:使用 `@/utils/download-attachment` 的 `downloadAttachmentFile(file, { fullFileUrl })`;`fullFileUrl` 需拼接 `VITE_MINIO_BASE_URL`(与参考页一致)。
|
||||
6. **预览**:图片/视频已上传项点击预览区,打开独立 `el-dialog`(宽 800px,`destroy-on-close`);图片用 `<img>`,视频用 `<video controls>`。
|
||||
7. **提交**:若存在 `_uploading === true` 的项,SHALL 阻止提交并提示「附件上传中,请稍候」;业务字段若存逗号分隔 URL,提交前 SHALL 从数组中过滤 `fileUrl` 非空且非上传中的项拼接。
|
||||
|
||||
缴费明细等嵌套场景可使用 `.upload-card--sm`(宽 96px、高 76px),其余规则不变。
|
||||
|
||||
#### 标准模板(Vue)
|
||||
|
||||
```vue
|
||||
<el-form-item label="协议附件" class="form-col-span-2">
|
||||
<div class="attachment-upload">
|
||||
<div class="attachment-list">
|
||||
<!-- 上传卡片始终在第一个 -->
|
||||
<el-upload
|
||||
ref="attachmentUploadRef"
|
||||
:auto-upload="false"
|
||||
@@ -292,17 +322,46 @@ Web 管理端弹窗 SHALL 遵循规范:表单 `label-position="top"`;遮罩
|
||||
<span class="upload-card-text">上传附件</span>
|
||||
</div>
|
||||
</el-upload>
|
||||
<!-- 已上传附件卡片 -->
|
||||
<div v-for="(file, index) in formData.attachments" :key="file.id || index"
|
||||
class="attachment-item" :class="{ 'is-uploading': file._uploading }">
|
||||
<div class="attachment-preview">
|
||||
<!-- 图片缩略图 / 视频图标 / 文档图标 -->
|
||||
<div
|
||||
v-for="(file, index) in attachments"
|
||||
:key="file.id || index"
|
||||
class="attachment-item"
|
||||
:class="{ 'is-uploading': file._uploading }"
|
||||
>
|
||||
<div
|
||||
class="attachment-preview"
|
||||
@click="isImageFile(file) && file.fileUrl ? handlePreviewAttachment(file) : undefined"
|
||||
>
|
||||
<template v-if="isImageFile(file) && file.fileUrl">
|
||||
<img :src="fullFileUrl(file.fileUrl)" :alt="file.fileName" />
|
||||
</template>
|
||||
<template v-else-if="isImageFile(file) && !file.fileUrl">
|
||||
<el-icon :size="24" color="#94a3b8"><Loading /></el-icon>
|
||||
</template>
|
||||
<template v-else-if="isVideoFile(file)">
|
||||
<div class="attachment-preview__icon attachment-preview__icon--video">
|
||||
<el-icon :size="28"><VideoPlay /></el-icon>
|
||||
</div>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div class="attachment-preview__icon attachment-preview__icon--doc">
|
||||
<el-icon :size="28"><Document /></el-icon>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
<div class="attachment-footer">
|
||||
<span class="attachment-name">{{ file.fileName }}</span>
|
||||
<span class="attachment-name" :title="file.fileName">{{ file.fileName }}</span>
|
||||
<div class="attachment-actions">
|
||||
<el-icon class="action-btn" title="下载" @click="handleDownload(file)"><Download /></el-icon>
|
||||
<el-icon class="action-btn action-btn--danger" title="删除" @click="removeAttachment(index)"><Delete /></el-icon>
|
||||
<el-icon class="action-btn" title="下载" @click="handleDownloadAttachment(file)">
|
||||
<Download />
|
||||
</el-icon>
|
||||
<el-icon
|
||||
class="action-btn action-btn--danger"
|
||||
title="删除"
|
||||
@click="removeAttachment(index)"
|
||||
>
|
||||
<Delete />
|
||||
</el-icon>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -312,135 +371,86 @@ Web 管理端弹窗 SHALL 遵循规范:表单 `label-position="top"`;遮罩
|
||||
</el-form-item>
|
||||
```
|
||||
|
||||
> 说明:`attachments` 为业务侧附件数组变量名;图标 `Plus`、`Loading`、`VideoPlay`、`Document`、`Download`、`Delete` SHALL 在 `<script setup>` 中从 `@element-plus/icons-vue` 显式 import。
|
||||
|
||||
#### 标准样式(SCSS,弹窗 `scoped` 内)
|
||||
|
||||
完整类名与尺寸 SHALL 与参考页一致,核心片段:
|
||||
|
||||
```scss
|
||||
.attachment-upload { width: 100%; }
|
||||
.attachment-list { display: flex; flex-wrap: wrap; gap: 12px; }
|
||||
.upload-card {
|
||||
width: 120px;
|
||||
height: 96px;
|
||||
border: 1px dashed #a7f3d0;
|
||||
border-radius: 8px;
|
||||
background: #f0fdf4;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 6px;
|
||||
cursor: pointer;
|
||||
transition: border-color 0.15s, background 0.15s;
|
||||
|
||||
&:hover {
|
||||
border-color: #10b981;
|
||||
border-style: solid;
|
||||
background: #ecfdf5;
|
||||
}
|
||||
width: 140px; height: 96px;
|
||||
border: 1px dashed #a7f3d0; border-radius: 8px; background: #f0fdf4;
|
||||
display: flex; flex-direction: column; align-items: center; justify-content: center;
|
||||
gap: 6px; cursor: pointer;
|
||||
&:hover { border-color: #10b981; border-style: solid; background: #ecfdf5; }
|
||||
}
|
||||
|
||||
.upload-card-text {
|
||||
font-size: 12px;
|
||||
color: #10b981;
|
||||
font-weight: 500;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.upload-hint {
|
||||
display: block;
|
||||
font-size: 11px;
|
||||
color: #94a3b8;
|
||||
line-height: 1;
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.attachment-list {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.upload-card-text { font-size: 12px; color: #10b981; font-weight: 500; line-height: 1; }
|
||||
.upload-hint { display: block; font-size: 11px; color: #94a3b8; margin-top: 8px; line-height: 1; }
|
||||
.attachment-item {
|
||||
width: 120px;
|
||||
border: 1px solid #e2e8f0;
|
||||
border-radius: 8px;
|
||||
background: #fff;
|
||||
overflow: hidden;
|
||||
transition: border-color 0.15s, box-shadow 0.15s;
|
||||
|
||||
&:hover {
|
||||
border-color: #10b981;
|
||||
box-shadow: 0 2px 8px rgba(16, 185, 129, 0.1);
|
||||
}
|
||||
|
||||
&.is-uploading {
|
||||
opacity: 0.6;
|
||||
pointer-events: none;
|
||||
}
|
||||
width: 140px; border: 1px solid #e2e8f0; border-radius: 8px; background: #fff; overflow: hidden;
|
||||
&.is-uploading { opacity: 0.6; pointer-events: none; }
|
||||
&:hover { border-color: #10b981; box-shadow: 0 2px 8px rgba(16, 185, 129, 0.1); }
|
||||
}
|
||||
|
||||
.attachment-preview {
|
||||
width: 120px;
|
||||
height: 96px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background: #f8fafc;
|
||||
overflow: hidden;
|
||||
|
||||
img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
display: block;
|
||||
}
|
||||
width: 100%; height: 96px; display: flex; align-items: center; justify-content: center;
|
||||
background: #f8fafc; overflow: hidden; cursor: pointer;
|
||||
img { width: 100%; height: 100%; object-fit: cover; display: block; }
|
||||
}
|
||||
|
||||
.attachment-footer {
|
||||
padding: 6px 8px;
|
||||
position: relative;
|
||||
.attachment-preview__icon {
|
||||
width: 48px; height: 48px; border-radius: 10px;
|
||||
display: flex; align-items: center; justify-content: center;
|
||||
&--video { background: #ede9fe; color: #7c3aed; }
|
||||
&--doc { background: #e0f2fe; color: #0284c7; }
|
||||
}
|
||||
|
||||
.attachment-footer { display: flex; flex-direction: column; padding: 6px 8px; }
|
||||
.attachment-name {
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 2;
|
||||
-webkit-box-orient: vertical;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
font-size: 11px;
|
||||
color: #334155;
|
||||
line-height: 1.4;
|
||||
word-break: break-all;
|
||||
display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
|
||||
overflow: hidden; font-size: 11px; color: #334155; line-height: 1.4; word-break: break-all;
|
||||
}
|
||||
|
||||
.attachment-actions {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 8px;
|
||||
margin-top: 4px;
|
||||
display: flex; justify-content: center; gap: 8px; margin-top: 4px;
|
||||
}
|
||||
.action-btn {
|
||||
width: 22px; height: 22px; border-radius: 4px; background: #f1f5f9; color: #64748b;
|
||||
cursor: pointer;
|
||||
&:hover { background: #10b981; color: #fff; }
|
||||
&--danger:hover { background: #ef4444; color: #fff; }
|
||||
}
|
||||
```
|
||||
|
||||
只读查看态 SHALL 使用 `web-admin/src/views/cell-storage/protocol/ProtocolAttachmentReadonly.vue`(无上传卡片、无删除,可保留下载/预览)。
|
||||
|
||||
#### Scenario: 新增弹窗包含附件上传
|
||||
|
||||
- **WHEN** 在弹窗表单中新增附件上传功能
|
||||
- **THEN** 上传触发器 SHALL 渲染为卡片样式(120×96px,虚线边框),与附件卡片在同一 flex 行中排列
|
||||
- **THEN** 容器 SHALL 始终可见(上传卡片始终显示),提示文案在卡片行下方
|
||||
- **WHEN** 在弹窗表单中新增附件上传
|
||||
- **THEN** SHALL 使用上述 DOM 结构、类名与 140×96 卡片尺寸
|
||||
- **THEN** 上传卡片 SHALL 位于 `.attachment-list` 第一项且始终可见
|
||||
- **THEN** `.upload-hint` SHALL 位于卡片行下方
|
||||
|
||||
#### Scenario: 附件卡片预览
|
||||
#### Scenario: 附件卡片预览与操作
|
||||
|
||||
- **WHEN** 用户上传图片文件
|
||||
- **THEN** 附件卡片预览区 SHALL 显示图片缩略图(`object-fit: cover`),点击可预览大图
|
||||
- **WHEN** 用户上传视频文件
|
||||
- **THEN** 预览区 SHALL 显示紫色视频图标(`background: #ede9fe; color: #7c3aed`)
|
||||
- **WHEN** 用户上传其他类型文件
|
||||
- **THEN** 预览区 SHALL 显示蓝色文档图标(`background: #e0f2fe; color: #0284c7`)
|
||||
- **WHEN** 附件为已上传图片
|
||||
- **THEN** 预览区 SHALL 显示缩略图,点击 SHALL 打开预览弹窗
|
||||
- **WHEN** 附件为视频或其他文档
|
||||
- **THEN** 预览区 SHALL 分别显示视频/文档图标(见布局与视觉 §4)
|
||||
- **WHEN** 用户点击下载或删除
|
||||
- **THEN** SHALL 分别调用 `downloadAttachmentFile` 与数组移除逻辑
|
||||
|
||||
#### Scenario: 附件上传中状态
|
||||
|
||||
- **WHEN** 文件正在上传到服务器
|
||||
- **THEN** 对应附件卡片 SHALL 显示为半透明(`opacity: 0.6`)且不可操作(`pointer-events: none`),预览区显示 Loading 图标
|
||||
- **WHEN** 文件正在上传
|
||||
- **THEN** 对应卡片 SHALL 为 `is-uploading`(半透明、不可点),预览区显示 `Loading`
|
||||
- **WHEN** 用户提交表单且仍有 `_uploading` 项
|
||||
- **THEN** SHALL 阻止提交并提示等待上传完成
|
||||
|
||||
#### Scenario: Code review 附件上传组件
|
||||
|
||||
- **WHEN** PR 包含新增或修改的附件上传区域
|
||||
- **THEN** 审查者 SHALL 确认使用卡片化布局(上传卡片 + 附件卡片同行),SHALL NOT 使用独立的上传按钮行或 Element Plus 默认文件列表
|
||||
#### Scenario: Code review 附件上传
|
||||
|
||||
- **WHEN** PR 新增或修改附件上传 UI
|
||||
- **THEN** 审查者 SHALL 对照 `ProtocolFormDialog.vue` 确认卡片化布局与立即上传逻辑
|
||||
- **THEN** SHALL 拒绝 `picture-card`、`show-file-list` 默认列表、与规范不一致的尺寸/色值
|
||||
### Requirement: 按钮须携带图标
|
||||
|
||||
`web-admin` 中所有带文字标签的 `el-button`(或 `ElButton`)SHALL 在文字前方包含 `<el-icon>` 子元素,使用 `@element-plus/icons-vue` 提供的图标组件;SHALL NOT 出现仅有文字而无图标的按钮。图标的引入方式为在文件 `<script setup>` 中显式 `import` 所需图标组件(`@element-plus/icons-vue` 不属于 auto-import 范围)。
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -2798,7 +2798,7 @@
|
||||
"label": "closeWorktab()",
|
||||
"file_type": "code",
|
||||
"source_file": "components/core/layouts/art-work-tab/index.vue",
|
||||
"source_location": "L366"
|
||||
"source_location": "L370"
|
||||
},
|
||||
{
|
||||
"id": "components_core_layouts_art_chat_window_index_vue",
|
||||
@@ -4373,112 +4373,112 @@
|
||||
"label": "fetchCollectionProtocolAuditList()",
|
||||
"file_type": "code",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L40"
|
||||
"source_location": "L41"
|
||||
},
|
||||
{
|
||||
"id": "api_collection_protocol_fetchsubmitprotocolaudit",
|
||||
"label": "fetchSubmitProtocolAudit()",
|
||||
"file_type": "code",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L52"
|
||||
"source_location": "L53"
|
||||
},
|
||||
{
|
||||
"id": "api_collection_protocol_fetchreceiptconfirmlist",
|
||||
"label": "fetchReceiptConfirmList()",
|
||||
"file_type": "code",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L64"
|
||||
"source_location": "L65"
|
||||
},
|
||||
{
|
||||
"id": "api_collection_protocol_fetchreceiptconfirmedlist",
|
||||
"label": "fetchReceiptConfirmedList()",
|
||||
"file_type": "code",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L71"
|
||||
"source_location": "L72"
|
||||
},
|
||||
{
|
||||
"id": "api_collection_protocol_fetchreceiptconfirmsubmit",
|
||||
"label": "fetchReceiptConfirmSubmit()",
|
||||
"file_type": "code",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L78"
|
||||
"source_location": "L79"
|
||||
},
|
||||
{
|
||||
"id": "api_collection_protocol_fetchrefundconfirmlist",
|
||||
"label": "fetchRefundConfirmList()",
|
||||
"file_type": "code",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L89"
|
||||
"source_location": "L90"
|
||||
},
|
||||
{
|
||||
"id": "api_collection_protocol_fetchrefundconfirmedlist",
|
||||
"label": "fetchRefundConfirmedList()",
|
||||
"file_type": "code",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L96"
|
||||
"source_location": "L97"
|
||||
},
|
||||
{
|
||||
"id": "api_collection_protocol_fetchrefundconfirmsubmit",
|
||||
"label": "fetchRefundConfirmSubmit()",
|
||||
"file_type": "code",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L103"
|
||||
"source_location": "L104"
|
||||
},
|
||||
{
|
||||
"id": "api_collection_protocol_fetchsubmitreceiptfinance",
|
||||
"label": "fetchSubmitReceiptFinance()",
|
||||
"file_type": "code",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L114"
|
||||
"source_location": "L115"
|
||||
},
|
||||
{
|
||||
"id": "api_collection_protocol_fetchsubmitreceiptfinancebatch",
|
||||
"label": "fetchSubmitReceiptFinanceBatch()",
|
||||
"file_type": "code",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L121"
|
||||
"source_location": "L122"
|
||||
},
|
||||
{
|
||||
"id": "api_collection_protocol_fetchsubmitrefundfinance",
|
||||
"label": "fetchSubmitRefundFinance()",
|
||||
"file_type": "code",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L129"
|
||||
"source_location": "L130"
|
||||
},
|
||||
{
|
||||
"id": "api_collection_protocol_fetchsubmitrefundfinancebatch",
|
||||
"label": "fetchSubmitRefundFinanceBatch()",
|
||||
"file_type": "code",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L144"
|
||||
"source_location": "L145"
|
||||
},
|
||||
{
|
||||
"id": "api_collection_protocol_fetchpaymentdetaillist",
|
||||
"label": "fetchPaymentDetailList()",
|
||||
"file_type": "code",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L157"
|
||||
"source_location": "L158"
|
||||
},
|
||||
{
|
||||
"id": "api_collection_protocol_fetchcreatecollectionprotocol",
|
||||
"label": "fetchCreateCollectionProtocol()",
|
||||
"file_type": "code",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L170"
|
||||
"source_location": "L171"
|
||||
},
|
||||
{
|
||||
"id": "api_collection_protocol_fetchupdatecollectionprotocol",
|
||||
"label": "fetchUpdateCollectionProtocol()",
|
||||
"file_type": "code",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L178"
|
||||
"source_location": "L179"
|
||||
},
|
||||
{
|
||||
"id": "api_collection_protocol_fetchdeletecollectionprotocol",
|
||||
"label": "fetchDeleteCollectionProtocol()",
|
||||
"file_type": "code",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L189"
|
||||
"source_location": "L190"
|
||||
},
|
||||
{
|
||||
"id": "api_chinaregion_ts",
|
||||
@@ -6816,14 +6816,14 @@
|
||||
"label": "dash()",
|
||||
"file_type": "code",
|
||||
"source_file": "views/cell-storage/protocol/ProtocolViewDialog.vue",
|
||||
"source_location": "L180"
|
||||
"source_location": "L310"
|
||||
},
|
||||
{
|
||||
"id": "protocol_protocolviewdialog_handleclosed",
|
||||
"label": "handleClosed()",
|
||||
"file_type": "code",
|
||||
"source_file": "views/cell-storage/protocol/ProtocolViewDialog.vue",
|
||||
"source_location": "L1344"
|
||||
"source_location": "L1613"
|
||||
},
|
||||
{
|
||||
"id": "views_cell_storage_protocol_protocolattachmentreadonly_vue",
|
||||
@@ -7348,63 +7348,63 @@
|
||||
"label": "dash()",
|
||||
"file_type": "code",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L660"
|
||||
"source_location": "L684"
|
||||
},
|
||||
{
|
||||
"id": "list_donationviewdialog_formatymd",
|
||||
"label": "formatYmd()",
|
||||
"file_type": "code",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L665"
|
||||
"source_location": "L689"
|
||||
},
|
||||
{
|
||||
"id": "list_donationviewdialog_formatym",
|
||||
"label": "formatYm()",
|
||||
"file_type": "code",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L671"
|
||||
"source_location": "L695"
|
||||
},
|
||||
{
|
||||
"id": "list_donationviewdialog_auditordisplay",
|
||||
"label": "auditorDisplay()",
|
||||
"file_type": "code",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L677"
|
||||
"source_location": "L701"
|
||||
},
|
||||
{
|
||||
"id": "list_donationviewdialog_sampletypename",
|
||||
"label": "sampleTypeName()",
|
||||
"file_type": "code",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L683"
|
||||
"source_location": "L707"
|
||||
},
|
||||
{
|
||||
"id": "list_donationviewdialog_unitname",
|
||||
"label": "unitName()",
|
||||
"file_type": "code",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L687"
|
||||
"source_location": "L711"
|
||||
},
|
||||
{
|
||||
"id": "list_donationviewdialog_sitename",
|
||||
"label": "siteName()",
|
||||
"file_type": "code",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L691"
|
||||
"source_location": "L715"
|
||||
},
|
||||
{
|
||||
"id": "list_donationviewdialog_expressname",
|
||||
"label": "expressName()",
|
||||
"file_type": "code",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L695"
|
||||
"source_location": "L719"
|
||||
},
|
||||
{
|
||||
"id": "list_donationviewdialog_if",
|
||||
"label": "if()",
|
||||
"file_type": "code",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L700"
|
||||
"source_location": "L724"
|
||||
},
|
||||
{
|
||||
"id": "views_research_donation_list_donationformdialog_vue",
|
||||
@@ -15635,7 +15635,7 @@
|
||||
"relation": "contains",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "components/core/layouts/art-work-tab/index.vue",
|
||||
"source_location": "L366",
|
||||
"source_location": "L370",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -18254,7 +18254,7 @@
|
||||
"relation": "contains",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L40",
|
||||
"source_location": "L41",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -18263,7 +18263,7 @@
|
||||
"relation": "contains",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L52",
|
||||
"source_location": "L53",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -18272,7 +18272,7 @@
|
||||
"relation": "contains",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L64",
|
||||
"source_location": "L65",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -18281,7 +18281,7 @@
|
||||
"relation": "contains",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L71",
|
||||
"source_location": "L72",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -18290,7 +18290,7 @@
|
||||
"relation": "contains",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L78",
|
||||
"source_location": "L79",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -18299,7 +18299,7 @@
|
||||
"relation": "contains",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L89",
|
||||
"source_location": "L90",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -18308,7 +18308,7 @@
|
||||
"relation": "contains",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L96",
|
||||
"source_location": "L97",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -18317,7 +18317,7 @@
|
||||
"relation": "contains",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L103",
|
||||
"source_location": "L104",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -18326,7 +18326,7 @@
|
||||
"relation": "contains",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L114",
|
||||
"source_location": "L115",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -18335,7 +18335,7 @@
|
||||
"relation": "contains",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L121",
|
||||
"source_location": "L122",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -18344,7 +18344,7 @@
|
||||
"relation": "contains",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L129",
|
||||
"source_location": "L130",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -18353,7 +18353,7 @@
|
||||
"relation": "contains",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L144",
|
||||
"source_location": "L145",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -18362,7 +18362,7 @@
|
||||
"relation": "contains",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L157",
|
||||
"source_location": "L158",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -18371,7 +18371,7 @@
|
||||
"relation": "contains",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L170",
|
||||
"source_location": "L171",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -18380,7 +18380,7 @@
|
||||
"relation": "contains",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L178",
|
||||
"source_location": "L179",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -18389,7 +18389,7 @@
|
||||
"relation": "contains",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L189",
|
||||
"source_location": "L190",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -21431,7 +21431,7 @@
|
||||
"relation": "contains",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "views/cell-storage/protocol/ProtocolViewDialog.vue",
|
||||
"source_location": "L180",
|
||||
"source_location": "L310",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -21440,7 +21440,7 @@
|
||||
"relation": "contains",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "views/cell-storage/protocol/ProtocolViewDialog.vue",
|
||||
"source_location": "L1344",
|
||||
"source_location": "L1613",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -22340,7 +22340,7 @@
|
||||
"relation": "imports_from",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L489",
|
||||
"source_location": "L512",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -22349,7 +22349,7 @@
|
||||
"relation": "imports_from",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L490",
|
||||
"source_location": "L513",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -22358,7 +22358,7 @@
|
||||
"relation": "imports_from",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L491",
|
||||
"source_location": "L514",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -22367,7 +22367,7 @@
|
||||
"relation": "imports_from",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L492",
|
||||
"source_location": "L515",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -22376,7 +22376,7 @@
|
||||
"relation": "imports_from",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L497",
|
||||
"source_location": "L520",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -22385,7 +22385,7 @@
|
||||
"relation": "imports_from",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L506",
|
||||
"source_location": "L529",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -22394,7 +22394,7 @@
|
||||
"relation": "imports_from",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L507",
|
||||
"source_location": "L530",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -22403,7 +22403,7 @@
|
||||
"relation": "contains",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L660",
|
||||
"source_location": "L684",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -22412,7 +22412,7 @@
|
||||
"relation": "contains",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L665",
|
||||
"source_location": "L689",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -22421,7 +22421,7 @@
|
||||
"relation": "contains",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L671",
|
||||
"source_location": "L695",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -22430,7 +22430,7 @@
|
||||
"relation": "contains",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L677",
|
||||
"source_location": "L701",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -22439,7 +22439,7 @@
|
||||
"relation": "contains",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L683",
|
||||
"source_location": "L707",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -22448,7 +22448,7 @@
|
||||
"relation": "contains",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L687",
|
||||
"source_location": "L711",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -22457,7 +22457,7 @@
|
||||
"relation": "contains",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L691",
|
||||
"source_location": "L715",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -22466,7 +22466,7 @@
|
||||
"relation": "contains",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L695",
|
||||
"source_location": "L719",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -22475,7 +22475,7 @@
|
||||
"relation": "contains",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L700",
|
||||
"source_location": "L724",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -22484,7 +22484,7 @@
|
||||
"relation": "calls",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L668",
|
||||
"source_location": "L692",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -22493,7 +22493,7 @@
|
||||
"relation": "calls",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L674",
|
||||
"source_location": "L698",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -22502,7 +22502,7 @@
|
||||
"relation": "calls",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L680",
|
||||
"source_location": "L704",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -22511,7 +22511,7 @@
|
||||
"relation": "calls",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L684",
|
||||
"source_location": "L708",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -22520,7 +22520,7 @@
|
||||
"relation": "calls",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L688",
|
||||
"source_location": "L712",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -22529,7 +22529,7 @@
|
||||
"relation": "calls",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L692",
|
||||
"source_location": "L716",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -22538,7 +22538,7 @@
|
||||
"relation": "calls",
|
||||
"confidence": "EXTRACTED",
|
||||
"source_file": "views/research-donation/list/DonationViewDialog.vue",
|
||||
"source_location": "L696",
|
||||
"source_location": "L720",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -28871,6 +28871,16 @@
|
||||
"source_location": "L25",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
"source": "art_work_tab_index_clicktab",
|
||||
"target": "core_usecommon_usecommon",
|
||||
"relation": "calls",
|
||||
"confidence": "INFERRED",
|
||||
"confidence_score": 0.8,
|
||||
"source_file": "components/core/layouts/art-work-tab/index.vue",
|
||||
"source_location": "L361",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
"source": "art_work_tab_index_clicktab",
|
||||
"target": "storage_facility_index_push",
|
||||
@@ -28878,7 +28888,7 @@
|
||||
"confidence": "INFERRED",
|
||||
"confidence_score": 0.8,
|
||||
"source_file": "components/core/layouts/art-work-tab/index.vue",
|
||||
"source_location": "L360",
|
||||
"source_location": "L364",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -29378,7 +29388,7 @@
|
||||
"confidence": "INFERRED",
|
||||
"confidence_score": 0.8,
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L46",
|
||||
"source_location": "L47",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -29388,7 +29398,7 @@
|
||||
"confidence": "INFERRED",
|
||||
"confidence_score": 0.8,
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L65",
|
||||
"source_location": "L66",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -29398,7 +29408,7 @@
|
||||
"confidence": "INFERRED",
|
||||
"confidence_score": 0.8,
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L72",
|
||||
"source_location": "L73",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -29408,7 +29418,7 @@
|
||||
"confidence": "INFERRED",
|
||||
"confidence_score": 0.8,
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L90",
|
||||
"source_location": "L91",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -29418,7 +29428,7 @@
|
||||
"confidence": "INFERRED",
|
||||
"confidence_score": 0.8,
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L97",
|
||||
"source_location": "L98",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -29428,7 +29438,7 @@
|
||||
"confidence": "INFERRED",
|
||||
"confidence_score": 0.8,
|
||||
"source_file": "api/collection-protocol.ts",
|
||||
"source_location": "L164",
|
||||
"source_location": "L165",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
@@ -30508,7 +30518,7 @@
|
||||
"confidence": "INFERRED",
|
||||
"confidence_score": 0.8,
|
||||
"source_file": "views/cell-storage/protocol/ProtocolViewDialog.vue",
|
||||
"source_location": "L180",
|
||||
"source_location": "L310",
|
||||
"weight": 1.0
|
||||
},
|
||||
{
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
# Graph Report - src (2026-05-20)
|
||||
|
||||
## Corpus Check
|
||||
- Large corpus: 575 files · ~279,487 words. Semantic extraction will be expensive (many Claude tokens). Consider running on a subfolder, or use --no-semantic to run AST-only.
|
||||
- Large corpus: 575 files · ~283,231 words. Semantic extraction will be expensive (many Claude tokens). Consider running on a subfolder, or use --no-semantic to run AST-only.
|
||||
|
||||
## Summary
|
||||
- 1452 nodes · 1865 edges · 35 communities detected
|
||||
- Extraction: 78% EXTRACTED · 22% INFERRED · 0% AMBIGUOUS · INFERRED: 417 edges (avg confidence: 0.8)
|
||||
- 1452 nodes · 1866 edges · 41 communities detected
|
||||
- Extraction: 78% EXTRACTED · 22% INFERRED · 0% AMBIGUOUS · INFERRED: 418 edges (avg confidence: 0.8)
|
||||
- Token cost: 0 input · 0 output
|
||||
|
||||
## Community Hubs (Navigation)
|
||||
@@ -35,15 +35,21 @@
|
||||
- [[_COMMUNITY_Community 23|Community 23]]
|
||||
- [[_COMMUNITY_Community 24|Community 24]]
|
||||
- [[_COMMUNITY_Community 25|Community 25]]
|
||||
- [[_COMMUNITY_Community 26|Community 26]]
|
||||
- [[_COMMUNITY_Community 27|Community 27]]
|
||||
- [[_COMMUNITY_Community 29|Community 29]]
|
||||
- [[_COMMUNITY_Community 28|Community 28]]
|
||||
- [[_COMMUNITY_Community 30|Community 30]]
|
||||
- [[_COMMUNITY_Community 31|Community 31]]
|
||||
- [[_COMMUNITY_Community 32|Community 32]]
|
||||
- [[_COMMUNITY_Community 33|Community 33]]
|
||||
- [[_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 43|Community 43]]
|
||||
|
||||
## God Nodes (most connected - your core abstractions)
|
||||
1. `get()` - 150 edges
|
||||
@@ -73,171 +79,201 @@
|
||||
|
||||
### Community 0 - "Community 0"
|
||||
Cohesion: 0.01
|
||||
Nodes (102): fetchActiveRegions(), fetchCategoryList(), fetchCategoryParameters(), fetchCellProductSpecList(), fetchCellProductTypeList(), fetchChannelAgreementPrices(), fetchChannelAgreements(), fetchChannelInvoices() (+94 more)
|
||||
Nodes (79): fetchActiveRegions(), fetchCategoryList(), fetchCategoryParameters(), fetchCellProductPriceList(), fetchCellProductSpecList(), fetchCellProductTypeList(), fetchChannelAgreementPrices(), fetchChannelAgreements() (+71 more)
|
||||
|
||||
### Community 1 - "Community 1"
|
||||
Cohesion: 0.02
|
||||
Nodes (23): fetchCellProductPriceList(), fetchCreateProjectSystem(), fetchCreateProjectSystemItem(), fetchDeleteProjectSystemItem(), fetchGetRoleList(), fetchNotDeletedRegions(), fetchProjectSystemItems(), fetchProjectSystemList() (+15 more)
|
||||
|
||||
### Community 2 - "Community 2"
|
||||
Cohesion: 0.03
|
||||
Nodes (56): fetchBatchGenerateProtocolNos(), fetchBatchGenerateSampleCodes(), fetchBatchIssueProtocolNos(), fetchBatchIssueSampleCodes(), fetchCollectionProtocolNoList(), fetchCreateCollectionProtocolNo(), fetchCreateSampleCode(), fetchDeleteCollectionProtocolNo() (+48 more)
|
||||
|
||||
### Community 3 - "Community 3"
|
||||
Cohesion: 0.03
|
||||
Nodes (35): fetchGetMenuList(), fetchGetMenuCodes(), fetchGetUserInfo(), fetchLogin(), IframeRouteManager, MenuProcessor, RouteRegistry, useAppMode() (+27 more)
|
||||
|
||||
### Community 4 - "Community 4"
|
||||
### Community 2 - "Community 2"
|
||||
Cohesion: 0.03
|
||||
Nodes (36): fetchAllConsumablePacks(), fetchAllConsumables(), fetchAllOutputTypes(), fetchAllProcessCategories(), fetchAllProcesses(), fetchAllReagents(), fetchAllSopDocuments(), fetchConsumableList() (+28 more)
|
||||
|
||||
### Community 3 - "Community 3"
|
||||
Cohesion: 0.04
|
||||
Nodes (31): fetchGetUserInfo(), clickTab(), handleTouchEnd(), setTransition(), IframeRouteManager, RouteRegistry, useCommon(), setupAfterEachGuard() (+23 more)
|
||||
|
||||
### Community 4 - "Community 4"
|
||||
Cohesion: 0.04
|
||||
Nodes (27): fetchAttachmentDownloadUrl(), fetchOrderAdjusts(), fetchOrderDetail(), fetchOrderItems(), fetchOrderList(), fetchPriceVersionDetail(), fetchSystemConfig(), fetchUploadAttachment() (+19 more)
|
||||
|
||||
### Community 5 - "Community 5"
|
||||
Cohesion: 0.05
|
||||
Nodes (24): FireworkSystem, reload(), clickTab(), handleTouchEnd(), setTransition(), formatUserLabel(), onPersonSelectChange(), formatLeaderUserLabel() (+16 more)
|
||||
Nodes (23): FireworkSystem, reload(), collectIds(), formatUserLabel(), onPersonSelectChange(), RoutePermissionValidator, formatLeaderUserLabel(), handleMenuJump() (+15 more)
|
||||
|
||||
### Community 6 - "Community 6"
|
||||
Cohesion: 0.06
|
||||
Nodes (35): fetchCreateDept(), fetchCreateSite(), fetchDeleteDept(), fetchDeleteSite(), fetchDictDataOptions(), fetchSiteList(), fetchUpdateDept(), fetchUpdateSite() (+27 more)
|
||||
|
||||
### Community 7 - "Community 7"
|
||||
Cohesion: 0.09
|
||||
Nodes (5): handleReset(), handleSearch(), WebSocketClient, TableCache, emit()
|
||||
|
||||
### Community 8 - "Community 8"
|
||||
### Community 7 - "Community 7"
|
||||
Cohesion: 0.06
|
||||
Nodes (26): fetchCreateUser(), fetchDeleteUser(), fetchDeptTree(), fetchPostBoundUserIds(), fetchResetPassword(), fetchRoleOptions(), fetchUpdateUser(), loadDeptData() (+18 more)
|
||||
Nodes (35): fetchCreateDept(), fetchCreateSite(), fetchDeleteDept(), fetchDeleteSite(), fetchDictDataOptions(), fetchSiteList(), fetchUpdateDept(), fetchUpdateSite() (+27 more)
|
||||
|
||||
### Community 9 - "Community 9"
|
||||
Cohesion: 0.07
|
||||
Nodes (17): fetchAttachmentDownloadUrl(), auditorDisplay(), dash(), expressName(), formatYm(), formatYmd(), sampleTypeName(), siteName() (+9 more)
|
||||
|
||||
### Community 10 - "Community 10"
|
||||
### Community 8 - "Community 8"
|
||||
Cohesion: 0.09
|
||||
Nodes (8): getDefaultLanguage(), checkStorageCompatibility(), StorageConfig, getSystemStorage(), getSysVersion(), StorageKeyManager, StorageCompatibilityManager, validateStorageData()
|
||||
|
||||
### Community 11 - "Community 11"
|
||||
### Community 9 - "Community 9"
|
||||
Cohesion: 0.09
|
||||
Nodes (28): toLogin(), base64ToBytes(), bytesToBase64(), decryptJson(), deriveKey(), encryptJson(), fromBase64Url(), hexToBytes() (+20 more)
|
||||
|
||||
### Community 12 - "Community 12"
|
||||
### Community 10 - "Community 10"
|
||||
Cohesion: 0.09
|
||||
Nodes (24): fetchAccessLogList(), fetchCleanRoomList(), fetchCreateAccessLog(), fetchCreateCleanRoom(), fetchDeleteAccessLog(), fetchDeleteCleanRoom(), fetchUpdateAccessLog(), fetchUpdateCleanRoom() (+16 more)
|
||||
|
||||
### Community 11 - "Community 11"
|
||||
Cohesion: 0.09
|
||||
Nodes (21): fetchCreateUser(), fetchDeleteUser(), fetchDeptTree(), fetchPostBoundUserIds(), fetchResetPassword(), fetchUpdateUser(), loadDeptData(), collectAllPostBindDeptIds() (+13 more)
|
||||
|
||||
### Community 12 - "Community 12"
|
||||
Cohesion: 0.1
|
||||
Nodes (13): fetchEthnicList(), addSample(), applyDonationBundleToForm(), confirmBatchTransportApply(), createEmptyTransport(), ensureDonationProtocolNoInOptions(), ensureEthnicOptionInList(), handleOpenForAdd() (+5 more)
|
||||
|
||||
### Community 13 - "Community 13"
|
||||
Cohesion: 0.09
|
||||
Nodes (18): fetchCollectionRegionList(), fetchCreateCollectionRegion(), fetchCreateHospital(), fetchDeleteCollectionRegion(), fetchDeleteHospital(), fetchHospitalList(), fetchUpdateCollectionRegion(), fetchUpdateHospital() (+10 more)
|
||||
|
||||
### Community 14 - "Community 14"
|
||||
Cohesion: 0.1
|
||||
Nodes (13): fetchEthnicList(), addSample(), applyDonationBundleToForm(), confirmBatchTransportApply(), createEmptyTransport(), ensureDonationProtocolNoInOptions(), ensureEthnicOptionInList(), handleOpenForAdd() (+5 more)
|
||||
Nodes (7): fetchGetMenuList(), fetchGetMenuCodes(), fetchLogin(), MenuProcessor, useAppMode(), useAuth(), buildWebEncryptedLoginBody()
|
||||
|
||||
### Community 15 - "Community 15"
|
||||
Cohesion: 0.09
|
||||
Nodes (10): collectIds(), useSettingsHandlers(), useSettingsPanel(), useSettingsState(), RoutePermissionValidator, useCeremony(), useTheme(), themeAnimation() (+2 more)
|
||||
|
||||
### Community 16 - "Community 16"
|
||||
Cohesion: 0.11
|
||||
Nodes (17): fetchCreateMaterial(), fetchDeleteMaterial(), fetchMaterialList(), fetchMaterialOptions(), fetchMaterialStockLogList(), fetchStockInMaterial(), fetchStockOutMaterial(), fetchUpdateMaterial() (+9 more)
|
||||
|
||||
### Community 17 - "Community 17"
|
||||
### Community 16 - "Community 16"
|
||||
Cohesion: 0.12
|
||||
Nodes (15): addCopyButton(), highlightCode(), insertLineNumbers(), isBlockProcessed(), markBlockAsProcessed(), processBlock(), setupHighlightDirective(), setupRippleDirective() (+7 more)
|
||||
|
||||
### Community 17 - "Community 17"
|
||||
Cohesion: 0.13
|
||||
Nodes (17): fetchCreateProjectSystem(), fetchCreateProjectSystemItem(), fetchDeleteProjectSystemItem(), fetchProjectSystemItems(), fetchProjectSystemList(), fetchUpdateProjectSystem(), handleAdd(), handleBatchDelete() (+9 more)
|
||||
|
||||
### Community 18 - "Community 18"
|
||||
Cohesion: 0.19
|
||||
Nodes (3): fetchGetLatestUpgradeLog(), systemUpgrade(), VersionManager
|
||||
|
||||
### Community 19 - "Community 19"
|
||||
Cohesion: 0.12
|
||||
Nodes (12): fetchApproveTask(), fetchBusinessAllTasks(), fetchCompletedTasks(), fetchDesignerData(), fetchInstanceDetail(), fetchMyInstances(), fetchPendingTasks(), fetchProcessDefList() (+4 more)
|
||||
|
||||
### Community 20 - "Community 20"
|
||||
Cohesion: 0.15
|
||||
Nodes (14): fetchCreateMenu(), fetchDeleteMenu(), fetchMenuTree(), fetchUpdateMenu(), applyTreeExpand(), handleAdd(), handleAddChild(), handleDelete() (+6 more)
|
||||
|
||||
### Community 20 - "Community 20"
|
||||
Cohesion: 0.16
|
||||
Nodes (10): useTable(), useTableImpl(), getColumnChecks(), useTableColumns(), createErrorHandler(), createSmartDebounce(), defaultResponseAdapter(), extractPagination() (+2 more)
|
||||
|
||||
### Community 21 - "Community 21"
|
||||
Cohesion: 0.1
|
||||
Nodes (6): fetchQcTaskDetail(), fetchQcTaskList(), fetchQcThirdPartyCompanyList(), fetchQcThirdPartyCompanyOptions(), fetchQcThirdPartyItemList(), fetchQcThirdPartyItemsActive()
|
||||
|
||||
### Community 22 - "Community 22"
|
||||
Cohesion: 0.2
|
||||
Nodes (2): ComponentLoader, RouteTransformer
|
||||
|
||||
### Community 22 - "Community 22"
|
||||
### Community 23 - "Community 23"
|
||||
Cohesion: 0.16
|
||||
Nodes (10): useTable(), useTableImpl(), getColumnChecks(), useTableColumns(), createErrorHandler(), createSmartDebounce(), defaultResponseAdapter(), extractPagination() (+2 more)
|
||||
|
||||
### Community 24 - "Community 24"
|
||||
Cohesion: 0.27
|
||||
Nodes (14): useChart(), useChartComponent(), useChartOps(), colourBlend(), getCssVar(), getDarkColor(), getLightColor(), handleElementThemeColor() (+6 more)
|
||||
|
||||
### Community 23 - "Community 23"
|
||||
### Community 25 - "Community 25"
|
||||
Cohesion: 0.17
|
||||
Nodes (12): fetchCellSampleTypeList(), fetchCreateCellSampleType(), fetchDeleteCellSampleType(), fetchUpdateCellSampleType(), handleAdd(), handleBatchDelete(), handleDelete(), handleReset() (+4 more)
|
||||
|
||||
### Community 24 - "Community 24"
|
||||
### Community 26 - "Community 26"
|
||||
Cohesion: 0.14
|
||||
Nodes (8): useSettingsHandlers(), useSettingsPanel(), useSettingsState(), useCeremony(), useTheme(), themeAnimation(), toggleTheme(), toggleTransition()
|
||||
|
||||
### Community 27 - "Community 27"
|
||||
Cohesion: 0.18
|
||||
Nodes (11): fetchCreateCustomer(), fetchCustomerList(), fetchDeleteCustomer(), fetchUpdateCustomer(), handleAdd(), handleDelete(), handleReset(), handleSearch() (+3 more)
|
||||
|
||||
### Community 25 - "Community 25"
|
||||
### Community 28 - "Community 28"
|
||||
Cohesion: 0.14
|
||||
Nodes (2): fetchProductionTaskDetail(), fetchProductionTaskList()
|
||||
|
||||
### Community 27 - "Community 27"
|
||||
### Community 30 - "Community 30"
|
||||
Cohesion: 0.17
|
||||
Nodes (3): fetchResearchDonationAuditList(), fetchResearchDonationDetail(), fetchResearchDonationList()
|
||||
|
||||
### Community 29 - "Community 29"
|
||||
### Community 32 - "Community 32"
|
||||
Cohesion: 0.39
|
||||
Nodes (6): isIgnorableScriptError(), normalizeErrorMessage(), registerPromiseErrorHandler(), registerResourceErrorHandler(), scriptErrorHandler(), setupErrorHandle()
|
||||
|
||||
### Community 30 - "Community 30"
|
||||
### Community 33 - "Community 33"
|
||||
Cohesion: 0.36
|
||||
Nodes (1): TableHeightCalculator
|
||||
|
||||
### Community 31 - "Community 31"
|
||||
### Community 34 - "Community 34"
|
||||
Cohesion: 0.33
|
||||
Nodes (2): logApiCryptoBootInfo(), maskSecret()
|
||||
|
||||
### Community 32 - "Community 32"
|
||||
### Community 35 - "Community 35"
|
||||
Cohesion: 0.29
|
||||
Nodes (2): fetchLeaveDetail(), fetchLeaveList()
|
||||
|
||||
### Community 36 - "Community 36"
|
||||
Cohesion: 0.29
|
||||
Nodes (2): fetchQcMaterialList(), fetchQcMaterialOptions()
|
||||
|
||||
### Community 37 - "Community 37"
|
||||
Cohesion: 0.47
|
||||
Nodes (3): isPaymentDueWithinWarnWindow(), parsePaymentDueYmd(), startOfLocalDay()
|
||||
|
||||
### Community 33 - "Community 33"
|
||||
### Community 38 - "Community 38"
|
||||
Cohesion: 0.33
|
||||
Nodes (2): fetchQcLabTestItemList(), fetchQcLabTestItemsActive()
|
||||
|
||||
### Community 39 - "Community 39"
|
||||
Cohesion: 0.5
|
||||
Nodes (2): focusInput(), handleKeydown()
|
||||
|
||||
### Community 34 - "Community 34"
|
||||
### Community 40 - "Community 40"
|
||||
Cohesion: 0.67
|
||||
Nodes (2): if(), logSidebarMenu()
|
||||
|
||||
### Community 35 - "Community 35"
|
||||
### Community 41 - "Community 41"
|
||||
Cohesion: 1.0
|
||||
Nodes (2): getSettingDefaults(), resetToDefaults()
|
||||
|
||||
### Community 37 - "Community 37"
|
||||
### Community 43 - "Community 43"
|
||||
Cohesion: 1.0
|
||||
Nodes (2): defaultAvatarPathByRole(), resolveUserAvatarUrl()
|
||||
|
||||
## Knowledge Gaps
|
||||
- **Thin community `Community 21`** (17 nodes): `ComponentLoader`, `.constructor()`, `.createEmptyComponent()`, `.createErrorComponent()`, `.load()`, `.loadIframe()`, `.loadLayout()`, `.load()`, `RouteTransformer`, `.extractFirstSegment()`, `.handleFirstLevelRoute()`, `.handleIframeRoute()`, `.handleNormalRoute()`, `.isFirstLevelRoute()`, `.transform()`, `ComponentLoader.ts`, `RouteTransformer.ts`
|
||||
- **Thin community `Community 22`** (17 nodes): `ComponentLoader`, `.constructor()`, `.createEmptyComponent()`, `.createErrorComponent()`, `.load()`, `.loadIframe()`, `.loadLayout()`, `.load()`, `RouteTransformer`, `.extractFirstSegment()`, `.handleFirstLevelRoute()`, `.handleIframeRoute()`, `.handleNormalRoute()`, `.isFirstLevelRoute()`, `.transform()`, `ComponentLoader.ts`, `RouteTransformer.ts`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 25`** (14 nodes): `fetchAddTaskStep()`, `fetchCreateProductionTask()`, `fetchDeleteTaskStep()`, `fetchProductionTaskDetail()`, `fetchProductionTaskList()`, `fetchReplaceStepConsumables()`, `fetchReplaceStepDataCollection()`, `fetchReplaceStepReagents()`, `fetchSetTaskInputs()`, `fetchSetTaskOutputs()`, `fetchUpdateProductionTask()`, `fetchUpdateProductionTaskStatus()`, `fetchUpdateTaskStep()`, `production-task.ts`
|
||||
- **Thin community `Community 28`** (14 nodes): `fetchAddTaskStep()`, `fetchCreateProductionTask()`, `fetchDeleteTaskStep()`, `fetchProductionTaskDetail()`, `fetchProductionTaskList()`, `fetchReplaceStepConsumables()`, `fetchReplaceStepDataCollection()`, `fetchReplaceStepReagents()`, `fetchSetTaskInputs()`, `fetchSetTaskOutputs()`, `fetchUpdateProductionTask()`, `fetchUpdateProductionTaskStatus()`, `fetchUpdateTaskStep()`, `production-task.ts`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 30`** (8 nodes): `TableHeightCalculator`, `.calculate()`, `.calculateOffset()`, `.calculatePaginationOffset()`, `.constructor()`, `.getHeaderHeight()`, `useTableHeight()`, `useTableHeight.ts`
|
||||
- **Thin community `Community 33`** (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 31`** (7 nodes): `App.vue`, `main.ts`, `refreshButtonAutoIcons()`, `refreshPanelTitleIcons()`, `logApiCryptoBootInfo()`, `maskSecret()`, `console.ts`
|
||||
- **Thin community `Community 34`** (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 33`** (5 nodes): `focusInput()`, `handleKeydown()`, `if()`, `search()`, `index.vue`
|
||||
- **Thin community `Community 35`** (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 34`** (4 nodes): `if()`, `logSidebarMenu()`, `index.vue`, `SidebarSubmenu.vue`
|
||||
- **Thin community `Community 36`** (7 nodes): `fetchCreateQcMaterial()`, `fetchDeleteQcMaterial()`, `fetchQcMaterialList()`, `fetchQcMaterialOptions()`, `fetchStockInQcMaterial()`, `fetchUpdateQcMaterial()`, `qc-material.ts`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 35`** (3 nodes): `getSettingDefaults()`, `resetToDefaults()`, `setting.ts`
|
||||
- **Thin community `Community 38`** (6 nodes): `fetchCreateQcLabTestItem()`, `fetchDeleteQcLabTestItem()`, `fetchQcLabTestItemList()`, `fetchQcLabTestItemsActive()`, `fetchUpdateQcLabTestItem()`, `qc-lab-test-item.ts`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 37`** (3 nodes): `defaultAvatarPathByRole()`, `resolveUserAvatarUrl()`, `user-avatar.ts`
|
||||
- **Thin community `Community 39`** (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 40`** (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 41`** (3 nodes): `getSettingDefaults()`, `resetToDefaults()`, `setting.ts`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 43`** (3 nodes): `defaultAvatarPathByRole()`, `resolveUserAvatarUrl()`, `user-avatar.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 3`, `Community 4`, `Community 5`, `Community 6`, `Community 8`, `Community 12`, `Community 13`, `Community 14`, `Community 16`, `Community 18`, `Community 19`, `Community 23`, `Community 24`, `Community 25`, `Community 27`?**
|
||||
_High betweenness centrality (0.235) - this node is a cross-community bridge._
|
||||
- **Why does `push()` connect `Community 5` to `Community 1`, `Community 4`, `Community 7`, `Community 8`, `Community 14`, `Community 15`, `Community 18`?**
|
||||
_High betweenness centrality (0.081) - this node is a cross-community bridge._
|
||||
- **Why does `handleDynamicRoutes()` connect `Community 3` to `Community 15`?**
|
||||
_High betweenness centrality (0.058) - this node is a cross-community bridge._
|
||||
- **Why does `get()` connect `Community 0` to `Community 1`, `Community 2`, `Community 3`, `Community 4`, `Community 5`, `Community 7`, `Community 10`, `Community 11`, `Community 12`, `Community 13`, `Community 14`, `Community 15`, `Community 17`, `Community 18`, `Community 19`, `Community 20`, `Community 21`, `Community 25`, `Community 27`, `Community 28`, `Community 30`, `Community 35`, `Community 36`, `Community 38`?**
|
||||
_High betweenness centrality (0.233) - this node is a cross-community bridge._
|
||||
- **Why does `push()` connect `Community 5` to `Community 0`, `Community 2`, `Community 3`, `Community 4`, `Community 6`, `Community 11`, `Community 12`, `Community 17`, `Community 18`?**
|
||||
_High betweenness centrality (0.091) - this node is a cross-community bridge._
|
||||
- **Why does `handleDynamicRoutes()` connect `Community 3` to `Community 5`, `Community 14`?**
|
||||
_High betweenness centrality (0.052) - this node is a cross-community bridge._
|
||||
- **Are the 149 inferred relationships involving `get()` (e.g. with `buildTreePathLabelFromFlat()` and `alignFqPaymentDetailsForDisplay()`) actually correct?**
|
||||
_`get()` has 149 INFERRED edges - model-reasoned connections that need verification._
|
||||
- **Are the 20 inferred relationships involving `withFullscreenLoading()` (e.g. with `.close()` and `handleSubmit()`) actually correct?**
|
||||
|
||||
@@ -57,12 +57,12 @@
|
||||
</div>
|
||||
<div id="legend"></div>
|
||||
</div>
|
||||
<div id="stats">1452 nodes · 1865 edges · 231 communities</div>
|
||||
<div id="stats">1452 nodes · 1866 edges · 237 communities</div>
|
||||
</div>
|
||||
<script>
|
||||
const RAW_NODES = [{"id": "app_vue", "label": "App.vue", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.4, "font": {"size": 0, "color": "#ffffff"}, "title": "App.vue", "community": 31, "community_name": "Community 31", "source_file": "App.vue", "file_type": "code", "degree": 3}, {"id": "src_app_refreshbuttonautoicons", "label": "refreshButtonAutoIcons()", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "refreshButtonAutoIcons()", "community": 31, "community_name": "Community 31", "source_file": "App.vue", "file_type": "code", "degree": 1}, {"id": "src_app_refreshpaneltitleicons", "label": "refreshPanelTitleIcons()", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "refreshPanelTitleIcons()", "community": 31, "community_name": "Community 31", "source_file": "App.vue", "file_type": "code", "degree": 1}, {"id": "main_ts", "label": "main.ts", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "main.ts", "community": 31, "community_name": "Community 31", "source_file": "main.ts", "file_type": "code", "degree": 4}, {"id": "src_main_masksecret", "label": "maskSecret()", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "maskSecret()", "community": 31, "community_name": "Community 31", "source_file": "main.ts", "file_type": "code", "degree": 2}, {"id": "src_main_logapicryptobootinfo", "label": "logApiCryptoBootInfo()", "color": {"background": "#F28E2B", "border": "#F28E2B", "highlight": {"background": "#ffffff", "border": "#F28E2B"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "logApiCryptoBootInfo()", "community": 31, "community_name": "Community 31", "source_file": "main.ts", "file_type": "code", "degree": 2}, {"id": "env_d_ts", "label": "env.d.ts", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "env.d.ts", "community": 68, "community_name": "Community 68", "source_file": "env.d.ts", "file_type": "code", "degree": 0}, {"id": "shims_loose_d_ts", "label": "shims-loose.d.ts", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "shims-loose.d.ts", "community": 69, "community_name": "Community 69", "source_file": "shims-loose.d.ts", "file_type": "code", "degree": 0}, {"id": "directives_index_ts", "label": "index.ts", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "index.ts", "community": 17, "community_name": "Community 17", "source_file": "directives/index.ts", "file_type": "code", "degree": 1}, {"id": "directives_index_setupglobdirectives", "label": "setupGlobDirectives()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.7, "font": {"size": 0, "color": "#ffffff"}, "title": "setupGlobDirectives()", "community": 17, "community_name": "Community 17", "source_file": "directives/index.ts", "file_type": "code", "degree": 5}, {"id": "directives_core_roles_ts", "label": "roles.ts", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.4, "font": {"size": 0, "color": "#ffffff"}, "title": "roles.ts", "community": 17, "community_name": "Community 17", "source_file": "directives/core/roles.ts", "file_type": "code", "degree": 3}, {"id": "core_roles_checkrolepermission", "label": "checkRolePermission()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "checkRolePermission()", "community": 17, "community_name": "Community 17", "source_file": "directives/core/roles.ts", "file_type": "code", "degree": 2}, {"id": "core_roles_removeelement", "label": "removeElement()", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "removeElement()", "community": 17, "community_name": "Community 17", "source_file": "directives/core/roles.ts", "file_type": "code", "degree": 2}, {"id": "core_roles_setuprolesdirective", "laLine 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": 178}, {"cid": 1, "color": "#F28E2B", "label": "Community 1", "count": 134}, {"cid": 2, "color": "#E15759", "label": "Community 2", "count": 86}, {"cid": 3, "color": "#76B7B2", "label": "Community 3", "count": 86}, {"cid": 4, "color": "#59A14F", "label": "Community 4", "count": 74}, {"cid": 5, "color": "#EDC948", "label": "Community 5", "count": 49}, {"cid": 6, "color": "#B07AA1", "label": "Community 6", "count": 48}, {"cid": 7, "color": "#FF9DA7", "label": "Community 7", "count": 48}, {"cid": 8, "color": "#9C755F", "label": "Community 8", "count": 39}, {"cid": 9, "color": "#BAB0AC", "label": "Community 9", "count": 37}, {"cid": 10, "color": "#4E79A7", "label": "Community 10", "count": 36}, {"cid": 11, "color": "#F28E2B", "label": "Community 11", "count": 36}, {"cid": 12, "color": "#E15759", "label": "Community 12", "count": 29}, {"cid": 13, "color": "#76B7B2", "label": "Community 13", "count": 27}, {"cid": 14, "color": "#59A14F", "label": "Community 14", "count": 27}, {"cid": 15, "color": "#EDC948", "label": "Community 15", "count": 26}, {"cid": 16, "color": "#B07AA1", "label": "Community 16", "count": 26}, {"cid": 17, "color": "#FF9DA7", "label": "Community 17", "count": 22}, {"cid": 18, "color": "#9C755F", "label": "Community 18", "count": 19}, {"cid": 19, "color": "#BAB0AC", "label": "Community 19", "count": 19}, {"cid": 20, "color": "#4E79A7", "label": "Community 20", "count": 17}, {"cid": 21, "color": "#F28E2B", "label": "Community 21", "count": 17}, {"cid": 22, "color": "#E15759", "label": "Community 22", "count": 16}, {"cid": 23, "color": "#76B7B2", "label": "Community 23", "count": 16}, {"cid": 24, "color": "#59A14F", "label": "Community 24", "count": 15}, {"cid": 25, "color": "#EDC948", "label": "Community 25", "count": 14}, {"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": 9}, {"cid": 29, "color": "#BAB0AC", "label": "Community 29", "count": 8}, {"cid": 30, "color": "#4E79A7", "label": "Community 30", "count": 8}, {"cid": 31, "color": "#F28E2B", "label": "Community 31", "count": 7}, {"cid": 32, "color": "#E15759", "label": "Community 32", "count": 6}, {"cid": 33, "color": "#76B7B2", "label": "Community 33", "count": 5}, {"cid": 34, "color": "#59A14F", "label": "Community 34", "count": 4}, {"cid": 35, "color": "#EDC948", "label": "Community 35", "count": 3}, {"cid": 36, "color": "#B07AA1", "label": "Community 36", "count": 3}, {"cid": 37, "color": "#FF9DA7", "label": "Community 37", "count": 3}, {"cid": 38, "color": "#9C755F", "label": "Community 38", "count": 3}, {"cid": 39, "color": "#BAB0AC", "label": "Community 39", "count": 3}, {"cid": 40, "color": "#4E79A7", "label": "Community 40", "count": 3}, {"cid": 41, "color": "#F28E2B", "label": "Community 41", "count": 3}, {"cid": 42, "color": "#E15759", "label": "Community 42", "count": 3}, {"cid": 43, "color": "#76B7B2", "label": "Community 43", "count": 3}, {"cid": 44, "color": "#59A14F", "label": "Community 44", "count": 3}, {"cid": 45, "color": "#EDC948", "label": "Community 45", "count": 2}, {"cid": 46, "color": "#B07AA1", "label": "Community 46", "count": 2}, {"cid": 47, "color": "#FF9DA7", "label": "Community 47", "count": 2}, {"cid": 48, "color": "#9C755F", "label": "Community 48", "count": 2}, {"cid": 49, "color": "#BAB0AC", "label": "Community 49", "count": 2}, {"cid": 50, "color": "#4E79A7", "label": "Community 50", "count": 2}, {"cid": 51, "color": "#F28E2B", "label": "Community 51", "count": 2}, {"cid": 52, "color": "#E15759", "label": "Community 52", "count": 2}, {"cid": 53, "color": "#76B7B2", "label": "Community 53", "count": 2}, {"cid": 54, "color": "#59A14F", "label": "Community 54", "count": 2}, {"cid": 55, "color": "#EDC948", "label": "Community 55", "count": 2}, {"cid": 56, "color": "#B07AA1", "label": "Community 56", "count": 2}, {"cid": 57, "color": "#FF9DA7", "label": "Community 57", "count": 2}, {"cid": 58, "color": "#9C755F", "label": "Community 58", "count": 2}, {"cid": 59, "color": "#BAB0AC", "label": "Community 59", "count": 2}, {"cid": 60, "color": "#4E79A7", "label": "Community 60", "count": 2}, {"cid": 61, "color": "#F28E2B", "label": "Community 61", "count": 2}, {"cid": 62, "color": "#E15759", "label": "Community 62", "count": 2}, {"cid": 63, "color": "#76B7B2", "label": "Community 63", "count": 2}, {"cid": 64, "color": "#59A14F", "label": "Community 64", "count": 2}, {"cid": 65, "color": "#EDC948", "label": "Community 65", "count": 2}, {"cid": 66, "color": "#B07AA1", "label": "Community 66", "count": 2}, {"cid": 67, "color": "#FF9DA7", "label": "Community 67", "count": 2}, {"cid": 68, "color": "#9C755F", "label": "Community 68", "count": 1}, {"cid": 69, "color": "#BAB0AC", "label": "Community 69", "count": 1}, {"cid": 70, "color": "#4E79A7", "label": "Community 70", "count": 1}, {"cLine truncated
|
||||
const RAW_NODES = [{"id": "app_vue", "label": "App.vue", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.4, "font": {"size": 0, "color": "#ffffff"}, "title": "App.vue", "community": 34, "community_name": "Community 34", "source_file": "App.vue", "file_type": "code", "degree": 3}, {"id": "src_app_refreshbuttonautoicons", "label": "refreshButtonAutoIcons()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "refreshButtonAutoIcons()", "community": 34, "community_name": "Community 34", "source_file": "App.vue", "file_type": "code", "degree": 1}, {"id": "src_app_refreshpaneltitleicons", "label": "refreshPanelTitleIcons()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "refreshPanelTitleIcons()", "community": 34, "community_name": "Community 34", "source_file": "App.vue", "file_type": "code", "degree": 1}, {"id": "main_ts", "label": "main.ts", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.6, "font": {"size": 0, "color": "#ffffff"}, "title": "main.ts", "community": 34, "community_name": "Community 34", "source_file": "main.ts", "file_type": "code", "degree": 4}, {"id": "src_main_masksecret", "label": "maskSecret()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "maskSecret()", "community": 34, "community_name": "Community 34", "source_file": "main.ts", "file_type": "code", "degree": 2}, {"id": "src_main_logapicryptobootinfo", "label": "logApiCryptoBootInfo()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "logApiCryptoBootInfo()", "community": 34, "community_name": "Community 34", "source_file": "main.ts", "file_type": "code", "degree": 2}, {"id": "env_d_ts", "label": "env.d.ts", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "env.d.ts", "community": 74, "community_name": "Community 74", "source_file": "env.d.ts", "file_type": "code", "degree": 0}, {"id": "shims_loose_d_ts", "label": "shims-loose.d.ts", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "shims-loose.d.ts", "community": 75, "community_name": "Community 75", "source_file": "shims-loose.d.ts", "file_type": "code", "degree": 0}, {"id": "directives_index_ts", "label": "index.ts", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "index.ts", "community": 16, "community_name": "Community 16", "source_file": "directives/index.ts", "file_type": "code", "degree": 1}, {"id": "directives_index_setupglobdirectives", "label": "setupGlobDirectives()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.7, "font": {"size": 0, "color": "#ffffff"}, "title": "setupGlobDirectives()", "community": 16, "community_name": "Community 16", "source_file": "directives/index.ts", "file_type": "code", "degree": 5}, {"id": "directives_core_roles_ts", "label": "roles.ts", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.4, "font": {"size": 0, "color": "#ffffff"}, "title": "roles.ts", "community": 16, "community_name": "Community 16", "source_file": "directives/core/roles.ts", "file_type": "code", "degree": 3}, {"id": "core_roles_checkrolepermission", "label": "checkRolePermission()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "checkRolePermission()", "community": 16, "community_name": "Community 16", "source_file": "directives/core/roles.ts", "file_type": "code", "degree": 2}, {"id": "core_roles_removeelement", "label": "removeElement()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "removeElement()", "community": 16, "community_name": "Community 16", "source_file": "directives/core/roles.ts", "file_type": "code", "degree": 2}, {"id": "core_roles_setuprolesdirective", "laLine 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": 224}, {"cid": 1, "color": "#F28E2B", "label": "Community 1", "count": 86}, {"cid": 2, "color": "#E15759", "label": "Community 2", "count": 74}, {"cid": 3, "color": "#76B7B2", "label": "Community 3", "count": 69}, {"cid": 4, "color": "#59A14F", "label": "Community 4", "count": 60}, {"cid": 5, "color": "#EDC948", "label": "Community 5", "count": 50}, {"cid": 6, "color": "#B07AA1", "label": "Community 6", "count": 48}, {"cid": 7, "color": "#FF9DA7", "label": "Community 7", "count": 48}, {"cid": 8, "color": "#9C755F", "label": "Community 8", "count": 36}, {"cid": 9, "color": "#BAB0AC", "label": "Community 9", "count": 36}, {"cid": 10, "color": "#4E79A7", "label": "Community 10", "count": 29}, {"cid": 11, "color": "#F28E2B", "label": "Community 11", "count": 27}, {"cid": 12, "color": "#E15759", "label": "Community 12", "count": 27}, {"cid": 13, "color": "#76B7B2", "label": "Community 13", "count": 27}, {"cid": 14, "color": "#59A14F", "label": "Community 14", "count": 27}, {"cid": 15, "color": "#EDC948", "label": "Community 15", "count": 26}, {"cid": 16, "color": "#B07AA1", "label": "Community 16", "count": 22}, {"cid": 17, "color": "#FF9DA7", "label": "Community 17", "count": 20}, {"cid": 18, "color": "#9C755F", "label": "Community 18", "count": 19}, {"cid": 19, "color": "#BAB0AC", "label": "Community 19", "count": 19}, {"cid": 20, "color": "#4E79A7", "label": "Community 20", "count": 19}, {"cid": 21, "color": "#F28E2B", "label": "Community 21", "count": 18}, {"cid": 22, "color": "#E15759", "label": "Community 22", "count": 17}, {"cid": 23, "color": "#76B7B2", "label": "Community 23", "count": 17}, {"cid": 24, "color": "#59A14F", "label": "Community 24", "count": 16}, {"cid": 25, "color": "#EDC948", "label": "Community 25", "count": 16}, {"cid": 26, "color": "#B07AA1", "label": "Community 26", "count": 15}, {"cid": 27, "color": "#FF9DA7", "label": "Community 27", "count": 15}, {"cid": 28, "color": "#9C755F", "label": "Community 28", "count": 14}, {"cid": 29, "color": "#BAB0AC", "label": "Community 29", "count": 13}, {"cid": 30, "color": "#4E79A7", "label": "Community 30", "count": 12}, {"cid": 31, "color": "#F28E2B", "label": "Community 31", "count": 9}, {"cid": 32, "color": "#E15759", "label": "Community 32", "count": 8}, {"cid": 33, "color": "#76B7B2", "label": "Community 33", "count": 8}, {"cid": 34, "color": "#59A14F", "label": "Community 34", "count": 7}, {"cid": 35, "color": "#EDC948", "label": "Community 35", "count": 7}, {"cid": 36, "color": "#B07AA1", "label": "Community 36", "count": 7}, {"cid": 37, "color": "#FF9DA7", "label": "Community 37", "count": 6}, {"cid": 38, "color": "#9C755F", "label": "Community 38", "count": 6}, {"cid": 39, "color": "#BAB0AC", "label": "Community 39", "count": 5}, {"cid": 40, "color": "#4E79A7", "label": "Community 40", "count": 4}, {"cid": 41, "color": "#F28E2B", "label": "Community 41", "count": 3}, {"cid": 42, "color": "#E15759", "label": "Community 42", "count": 3}, {"cid": 43, "color": "#76B7B2", "label": "Community 43", "count": 3}, {"cid": 44, "color": "#59A14F", "label": "Community 44", "count": 3}, {"cid": 45, "color": "#EDC948", "label": "Community 45", "count": 3}, {"cid": 46, "color": "#B07AA1", "label": "Community 46", "count": 3}, {"cid": 47, "color": "#FF9DA7", "label": "Community 47", "count": 3}, {"cid": 48, "color": "#9C755F", "label": "Community 48", "count": 3}, {"cid": 49, "color": "#BAB0AC", "label": "Community 49", "count": 3}, {"cid": 50, "color": "#4E79A7", "label": "Community 50", "count": 3}, {"cid": 51, "color": "#F28E2B", "label": "Community 51", "count": 2}, {"cid": 52, "color": "#E15759", "label": "Community 52", "count": 2}, {"cid": 53, "color": "#76B7B2", "label": "Community 53", "count": 2}, {"cid": 54, "color": "#59A14F", "label": "Community 54", "count": 2}, {"cid": 55, "color": "#EDC948", "label": "Community 55", "count": 2}, {"cid": 56, "color": "#B07AA1", "label": "Community 56", "count": 2}, {"cid": 57, "color": "#FF9DA7", "label": "Community 57", "count": 2}, {"cid": 58, "color": "#9C755F", "label": "Community 58", "count": 2}, {"cid": 59, "color": "#BAB0AC", "label": "Community 59", "count": 2}, {"cid": 60, "color": "#4E79A7", "label": "Community 60", "count": 2}, {"cid": 61, "color": "#F28E2B", "label": "Community 61", "count": 2}, {"cid": 62, "color": "#E15759", "label": "Community 62", "count": 2}, {"cid": 63, "color": "#76B7B2", "label": "Community 63", "count": 2}, {"cid": 64, "color": "#59A14F", "label": "Community 64", "count": 2}, {"cid": 65, "color": "#EDC948", "label": "Community 65", "count": 2}, {"cid": 66, "color": "#B07AA1", "label": "Community 66", "count": 2}, {"cid": 67, "color": "#FF9DA7", "label": "Community 67", "count": 2}, {"cid": 68, "color": "#9C755F", "label": "Community 68", "count": 2}, {"cid": 69, "color": "#BAB0AC", "label": "Community 69", "count": 2}, {"cid": 70, "color": "#4E79A7", "label": "Community 70", "count": 2}, {Line truncated
|
||||
|
||||
// HTML-escape helper — prevents XSS when injecting graph data into innerHTML
|
||||
function esc(s) {
|
||||
|
||||
+1285
-1273
File diff suppressed because it is too large.
Load diff
@@ -17,8 +17,8 @@
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/common/index.ts": 1778582068.0254738,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/directive/directive.d.ts": 1778582068.026978,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/api/api.d.ts": 1778582068.0246184,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts": 1779235146.4088914,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/auto-imports.d.ts": 1779235068.1909745,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts": 1779252747.4872186,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/auto-imports.d.ts": 1779247808.9064798,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/store/index.ts": 1778582068.0293276,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/router/index.ts": 1778775532.895603,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/locales/index.ts": 1778582068.004279,
|
||||
@@ -138,7 +138,7 @@
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/SectionTitle.vue": 1778582067.979562,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/BoxStyleSettings.vue": 1778582067.9784102,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-settings-panel/widget/ContainerSettings.vue": 1778582067.9787772,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-work-tab/index.vue": 1779240493.9838557,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-work-tab/index.vue": 1779249882.5565445,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-chat-window/index.vue": 1778600486.966086,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-page-content/index.vue": 1778582067.9749346,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-menus/art-horizontal-menu/index.vue": 1778582067.9713962,
|
||||
@@ -170,7 +170,7 @@
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/protocol-finance-confirm-fields/index.vue": 1779184108.8553443,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/protocol-finance-confirm-fields/finance-attachments.ts": 1778987672.644368,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/qc-task-view-dialog/index.vue": 1779203366.0093758,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-qc-info-cards/index.vue": 1779203475.3439531,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-qc-info-cards/index.vue": 1779254253.4663467,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/order-operate-local-dialog/index.vue": 1778582866.2188683,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/product-view-dialog/index.vue": 1778582067.9494708,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/protocol-payment-detail-readonly/index.vue": 1779006281.4220655,
|
||||
@@ -197,10 +197,10 @@
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-work-order.ts": 1779207884.934813,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-task-result.ts": 1779184105.1763976,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-third-party-company.ts": 1779021425.3773527,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/collection-protocol.ts": 1778991519.4731612,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/collection-protocol.ts": 1779244706.1724706,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/chinaRegion.ts": 1778582067.8620915,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/business.ts": 1779159587.6033742,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts": 1779228244.7717397,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts": 1779248607.786668,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/ethnic.ts": 1778929297.3919344,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-lab-test-item.ts": 1779017838.8231559,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/cell-product.ts": 1779207897.9650705,
|
||||
@@ -217,19 +217,19 @@
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-work-order.ts": 1779180968.908451,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/auth/login/index.vue": 1778910234.3222458,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/refund-confirm/index.vue": 1779227503.9687061,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/index.vue": 1779227503.972119,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/index.vue": 1779253420.0480523,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolStatusChangeDialog.vue": 1779161483.857836,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue": 1779200340.7250473,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue": 1779253423.3756242,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolAttachmentReadonly.vue": 1778938314.528914,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolFormDialog.vue": 1779200506.6351457,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolAuditDialog.vue": 1778978838.5026703,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/payment-info/index.vue": 1779227503.9885736,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/storage-cert/index.vue": 1779228624.5618558,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/index.vue": 1779227503.9925246,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/index.vue": 1779230577.6220012,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/fullmoon-todo/index.vue": 1779228480.6875157,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/payment-info/index.vue": 1779247774.782579,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/storage-cert/index.vue": 1779249930.6539404,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/index.vue": 1779245911.567694,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/index.vue": 1779247424.450886,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/fullmoon-todo/index.vue": 1779252157.9700227,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/payment-confirm/index.vue": 1779227503.9974115,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material-stock-log/index.vue": 1779230607.8396237,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material-stock-log/index.vue": 1779247462.6808264,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/outside/Iframe.vue": 1778582068.071536,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/operations/demo/index.vue": 1779227504.0518396,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/operations/clean-room/index.vue": 1779227504.1094522,
|
||||
@@ -238,7 +238,7 @@
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/audit/index.vue": 1779227504.1761265,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/index.vue": 1779227504.1804457,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationAuditDialog.vue": 1779112125.8042517,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue": 1779199471.5459495,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue": 1779254486.7302408,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationFormDialog.vue": 1779199512.4395914,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationStatusChangeDialog.vue": 1779161484.445245,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/dashboard/console/index.vue": 1779227504.1947322,
|
||||
@@ -281,10 +281,10 @@
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-work-order/index.vue": 1779227504.4966545,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/sample-reception-check-item/index.vue": 1779227504.506105,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/lab-test-item/index.vue": 1779227504.5119748,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/index.vue": 1779229904.2733207,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/index.vue": 1779247473.0542848,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/sample-reception/index.vue": 1779227504.5202835,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-task/index.vue": 1779230107.5226734,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material-usage/index.vue": 1779229886.5988166,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material-usage/index.vue": 1779247570.0360196,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/third-party-company/index.vue": 1779227504.5332224,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/exception/500/index.vue": 1778582068.0705533,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/exception/403/index.vue": 1778582068.0697916,
|
||||
@@ -299,7 +299,7 @@
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/pilot-service/cell-product-spec/index.vue": 1779227504.5794835,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/sample-code/index.vue": 1779235428.819512,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/cell-sample-type/index.vue": 1779235427.422648,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/insurance-company/index.vue": 1779228501.280217,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/insurance-company/index.vue": 1779248595.3531237,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/collection-protocol-no/index.vue": 1779235425.8449798,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/customer/index.vue": 1779235305.2294273,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/collection-region/index.vue": 1779235424.7565684,
|
||||
@@ -320,7 +320,7 @@
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/router/core/RoutePermissionValidator.ts": 1778582068.0127926,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/router/core/index.ts": 1778582068.0138035,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/router/core/IframeRouteManager.ts": 1778582068.0121944,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/router/modules/sqxp.ts": 1779232049.852708,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/router/modules/sqxp.ts": 1779248563.5954363,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/router/modules/index.ts": 1778598510.6043763,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/router/modules/exception.ts": 1778600310.4085584,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/router/routes/staticRoutes.ts": 1778582786.832072,
|
||||
|
||||
@@ -1728,7 +1728,7 @@ export function fetchDeleteCheckupInstitutionPackage(packageId: string) {
|
||||
return request.del({ url: `/web/admin/checkup-institution-packages/${packageId}` })
|
||||
}
|
||||
|
||||
// ============ 保险公司管理 ============
|
||||
// ============ 保险公司及险种价格管理 ============
|
||||
|
||||
export function fetchInsuranceCompanyList(params?: {
|
||||
page?: number
|
||||
@@ -1767,7 +1767,7 @@ export function fetchDeleteInsuranceCompanyInvoice(id: string) {
|
||||
return request.del({ url: `/web/admin/insurance-company-invoices/${id}` })
|
||||
}
|
||||
|
||||
// 保险项目价格
|
||||
// 保险险种价格
|
||||
export function fetchInsuranceProjectPrices(companyId: string) {
|
||||
return request.get({ url: `/web/admin/insurance-companies/${companyId}/project-prices` })
|
||||
}
|
||||
|
||||
@@ -32,6 +32,7 @@ export function fetchCollectionProtocolDetail(id: string) {
|
||||
payment: Record<string, unknown> | null
|
||||
paymentDetails: Array<Record<string, unknown>> | null
|
||||
attachments?: Array<Record<string, unknown>>
|
||||
storageCert?: Record<string, unknown> | null
|
||||
}>({
|
||||
url: `/web/admin/collection-protocols/${id}`
|
||||
})
|
||||
|
||||
@@ -47,6 +47,27 @@ export type SampleReceptionCheckResult = {
|
||||
orderNum?: number
|
||||
}
|
||||
|
||||
export function fetchSampleReceptionUpdate(
|
||||
receptionId: string,
|
||||
data: {
|
||||
receptionTime: string
|
||||
handlerUserId?: string
|
||||
handlerName?: string
|
||||
receiveTemperature?: string
|
||||
volumeMl?: number
|
||||
netWeightG?: number
|
||||
checks: Array<{ checkItemId: string; checked: boolean }>
|
||||
acceptConclusion: 'js' | 'bj'
|
||||
receiveAttachments?: string
|
||||
remark?: string
|
||||
}
|
||||
) {
|
||||
return request.put({
|
||||
url: `/web/admin/sample-receptions/${receptionId}`,
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export function fetchSampleReceptionSubmit(data: {
|
||||
protocolSampleId?: string
|
||||
sourceType?: 'cell_storage' | 'research_donation'
|
||||
|
||||
@@ -678,6 +678,49 @@ body .el-table thead {
|
||||
}
|
||||
// -------------------------------- el-table 全局样式 end --------------------------------
|
||||
|
||||
// border 模式:仅保留表头列之间的分割线以支持拖拽调整列宽
|
||||
// 覆盖 Element Plus el-table--border 的所有默认边框
|
||||
.page-container .el-table--border,
|
||||
.console-container .el-table--border,
|
||||
.el-dialog .el-table--border {
|
||||
// 数据行:移除纵向边框
|
||||
td.el-table__cell {
|
||||
border-right: none !important;
|
||||
}
|
||||
|
||||
// 表头:仅列之间保留淡色分割线,去掉底部边框
|
||||
th.el-table__cell {
|
||||
border-right: 1px solid var(--mint-border) !important;
|
||||
border-top: none !important;
|
||||
}
|
||||
|
||||
th.el-table__cell:first-child {
|
||||
border-left: none !important;
|
||||
}
|
||||
|
||||
th.el-table__cell:last-child {
|
||||
border-right: none !important;
|
||||
}
|
||||
|
||||
// 移除表格外边框(左 ::before、右 ::after)
|
||||
&::after,
|
||||
&::before {
|
||||
content: none !important;
|
||||
}
|
||||
|
||||
// 移除表格顶部边框
|
||||
.el-table__inner-wrapper::after {
|
||||
content: none !important;
|
||||
}
|
||||
|
||||
// 移除边框补丁元素
|
||||
.el-table__border-left-patch,
|
||||
.el-table__border-bottom-patch,
|
||||
.el-table__border-right-patch {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
.page-container .el-table,
|
||||
.console-container .el-table {
|
||||
--el-table-header-bg-color: var(--mint-table-head);
|
||||
|
||||
@@ -180,6 +180,14 @@
|
||||
border-top: 1px dashed #e2e8f0;
|
||||
}
|
||||
|
||||
.sample-card__section-label {
|
||||
font-size: 11px;
|
||||
font-weight: 600;
|
||||
color: #94a3b8;
|
||||
margin-bottom: 10px;
|
||||
letter-spacing: 0.3px;
|
||||
}
|
||||
|
||||
.sample-qc-empty,
|
||||
.sample-qc-hint {
|
||||
font-size: 13px;
|
||||
@@ -216,10 +224,6 @@
|
||||
border-radius: 8px;
|
||||
background: #fff;
|
||||
overflow: hidden;
|
||||
|
||||
&--task {
|
||||
border-left: 3px solid #0ea5e9;
|
||||
}
|
||||
}
|
||||
|
||||
.qc-detail-card__header {
|
||||
|
||||
@@ -357,6 +357,10 @@
|
||||
// 标签页操作逻辑
|
||||
const useTabOperations = (adjustPositionAfterClose: () => void) => {
|
||||
const clickTab = (item: WorkTab) => {
|
||||
if (item.path === activeTab.value) {
|
||||
useCommon().refresh()
|
||||
return
|
||||
}
|
||||
router.push({
|
||||
path: item.path,
|
||||
query: item.query as LocationQueryRaw
|
||||
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_components_business_sample_qc_info_cards_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-qc-info-cards/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_payment_info_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/payment-info/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_material_stock_log_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material-stock-log/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_material_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/index.vue", "source_location": "L1"}, {"id": "material_index_getcategorylabel", "label": "getCategoryLabel()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/index.vue", "source_location": "L432"}, {"id": "material_index_getcategorytagtype", "label": "getCategoryTagType()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/index.vue", "source_location": "L438"}, {"id": "material_index_handleselectionchange", "label": "handleSelectionChange()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/index.vue", "source_location": "L444"}, {"id": "material_index_loaddictoptions", "label": "loadDictOptions()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/index.vue", "source_location": "L483"}, {"id": "material_index_loaddata", "label": "loadData()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/index.vue", "source_location": "L492"}, {"id": "material_index_handlesearch", "label": "handleSearch()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/index.vue", "source_location": "L509"}, {"id": "material_index_handlereset", "label": "handleReset()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/index.vue", "source_location": "L514"}, {"id": "material_index_resetform", "label": "resetForm()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/index.vue", "source_location": "L522"}, {"id": "material_index_handleadd", "label": "handleAdd()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/index.vue", "source_location": "L533"}, {"id": "material_index_handleedit", "label": "handleEdit()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/index.vue", "source_location": "L541"}, {"id": "material_index_handlesubmit", "label": "handleSubmit()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/index.vue", "source_location": "L556"}, {"id": "material_index_handleview", "label": "handleView()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/index.vue", "source_location": "L584"}, {"id": "material_index_handledelete", "label": "handleDelete()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/index.vue", "source_location": "L589"}, {"id": "material_index_handlestockin", "label": "handleStockIn()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/index.vue", "source_location": "L596"}, {"id": "material_index_handlestockinsubmit", "label": "handleStockInSubmit()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/index.vue", "source_location": "L604"}, {"id": "material_index_handlestockout", "label": "handleStockOut()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/index.vue", "source_location": "L622"}, {"id": "material_index_handlestockoutsubmit", "label": "handleStockOutSubmit()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/index.vue", "source_location": "L633"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_material_index_vue", "target": "element_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/index.vue", "source_location": "L356", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_material_index_vue", "target": "icons_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/material/index.vue", "source_location": "L357", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_material_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_components_business_system_view_dialog_index_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/vLine truncated
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_research_donation_list_donationviewdialog_vue", "label": "DonationViewDialog.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L1"}, {"id": "list_donationviewdialog_dash", "label": "dash()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L684"}, {"id": "list_donationviewdialog_formatymd", "label": "formatYmd()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L689"}, {"id": "list_donationviewdialog_formatym", "label": "formatYm()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L695"}, {"id": "list_donationviewdialog_auditordisplay", "label": "auditorDisplay()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L701"}, {"id": "list_donationviewdialog_sampletypename", "label": "sampleTypeName()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L707"}, {"id": "list_donationviewdialog_unitname", "label": "unitName()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L711"}, {"id": "list_donationviewdialog_sitename", "label": "siteName()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L715"}, {"id": "list_donationviewdialog_expressname", "label": "expressName()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L719"}, {"id": "list_donationviewdialog_if", "label": "if()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L724"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_research_donation_list_donationviewdialog_vue", "target": "icons_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L512", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_research_donation_list_donationviewdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_protocol_protocolattachmentreadonly_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L513", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_research_donation_list_donationviewdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_components_business_sample_qc_info_cards_index_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L514", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_research_donation_list_donationviewdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_research_donation", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L515", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_research_donation_list_donationviewdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_admin", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L520", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_research_donation_list_donationviewdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_download_attachment", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L529", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_research_donation_list_donationviewdialog_vue", "target": Line truncated
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_basic_info_insurance_company_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/basic-info/insurance-company/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_protocol_protocolviewdialog_vue", "label": "ProtocolViewDialog.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L1"}, {"id": "protocol_protocolviewdialog_dash", "label": "dash()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L284"}, {"id": "protocol_protocolviewdialog_handleclosed", "label": "handleClosed()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L1583"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_protocol_protocolviewdialog_vue", "target": "protocol_protocolviewdialog_dash", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L284", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_protocol_protocolviewdialog_vue", "target": "protocol_protocolviewdialog_handleclosed", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L1583", "weight": 1.0}], "raw_calls": [{"caller_nid": "protocol_protocolviewdialog_dash", "callee": "unitName", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L284"}]}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_types_import_components_d_ts", "label": "components.d.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts", "source_location": "L1"}], "edges": [], "raw_calls": []}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_api_collection_protocol_ts", "label": "collection-protocol.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/collection-protocol.ts", "source_location": "L1"}, {"id": "api_collection_protocol_fetchcollectionprotocollist", "label": "fetchCollectionProtocolList()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/collection-protocol.ts", "source_location": "L14"}, {"id": "api_collection_protocol_fetchcollectionprotocoldetail", "label": "fetchCollectionProtocolDetail()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/collection-protocol.ts", "source_location": "L26"}, {"id": "api_collection_protocol_fetchcollectionprotocolauditlist", "label": "fetchCollectionProtocolAuditList()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/collection-protocol.ts", "source_location": "L41"}, {"id": "api_collection_protocol_fetchsubmitprotocolaudit", "label": "fetchSubmitProtocolAudit()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/collection-protocol.ts", "source_location": "L53"}, {"id": "api_collection_protocol_fetchreceiptconfirmlist", "label": "fetchReceiptConfirmList()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/collection-protocol.ts", "source_location": "L65"}, {"id": "api_collection_protocol_fetchreceiptconfirmedlist", "label": "fetchReceiptConfirmedList()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/collection-protocol.ts", "source_location": "L72"}, {"id": "api_collection_protocol_fetchreceiptconfirmsubmit", "label": "fetchReceiptConfirmSubmit()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/collection-protocol.ts", "source_location": "L79"}, {"id": "api_collection_protocol_fetchrefundconfirmlist", "label": "fetchRefundConfirmList()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/collection-protocol.ts", "source_location": "L90"}, {"id": "api_collection_protocol_fetchrefundconfirmedlist", "label": "fetchRefundConfirmedList()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/collection-protocol.ts", "source_location": "L97"}, {"id": "api_collection_protocol_fetchrefundconfirmsubmit", "label": "fetchRefundConfirmSubmit()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/collection-protocol.ts", "source_location": "L104"}, {"id": "api_collection_protocol_fetchsubmitreceiptfinance", "label": "fetchSubmitReceiptFinance()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/collection-protocol.ts", "source_location": "L115"}, {"id": "api_collection_protocol_fetchsubmitreceiptfinancebatch", "label": "fetchSubmitReceiptFinanceBatch()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/collection-protocol.ts", "source_location": "L122"}, {"id": "api_collection_protocol_fetchsubmitrefundfinance", "label": "fetchSubmitRefundFinance()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/collection-protocol.ts", "source_location": "L130"}, {"id": "api_collection_protocol_fetchsubmitrefundfinancebatch", "label": "fetchSubmitRefundFinanceBatch()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/collection-protocol.ts", "source_location": "L145"}, {"id": "api_collection_protocol_fetchpaymentdetaillist", "label": "fetchPaymentDetailList()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/collection-protocol.ts", "source_location": "L158"}, {"id": "api_collection_protocol_fetchcreatecollectionprotocol", "label": "fetchCreateCollectionProtocol()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/collection-protocol.ts", "source_location": "L171"}, {"id": "api_collection_protocol_fetchupdatecollectionprotocol", "label": "fetchUpdateCollectionProtocol()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/collection-protocol.ts", "source_location": "L179"}, {"id": "api_collection_protocol_fetchdeletecollectionprotocol", "label": "fetchDeleteCollectionProtocol()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/collection-protocol.ts", "source_location": "L190"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_collection_protocol_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_http", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/collection-protocol.ts", "source_location": "L1", "weight": 1.0}, {"Line truncated
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_qc_material_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_protocol_protocolviewdialog_vue", "label": "ProtocolViewDialog.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L1"}, {"id": "protocol_protocolviewdialog_dash", "label": "dash()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L310"}, {"id": "protocol_protocolviewdialog_handleclosed", "label": "handleClosed()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L1613"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_protocol_protocolviewdialog_vue", "target": "protocol_protocolviewdialog_dash", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L310", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_protocol_protocolviewdialog_vue", "target": "protocol_protocolviewdialog_handleclosed", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L1613", "weight": 1.0}], "raw_calls": [{"caller_nid": "protocol_protocolviewdialog_dash", "callee": "unitName", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/ProtocolViewDialog.vue", "source_location": "L310"}]}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_fullmoon_todo_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/fullmoon-todo/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_types_import_components_d_ts", "label": "components.d.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts", "source_location": "L1"}], "edges": [], "raw_calls": []}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_api_admin_ts", "label": "admin.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts", "source_location": "L1"}, {"id": "api_admin_fetchgetmenulist", "label": "fetchGetMenuList()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts", "source_location": "L10"}, {"id": "api_admin_fetchgetrolelist", "label": "fetchGetRoleList()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts", "source_location": "L19"}, {"id": "api_admin_fetchuseroptions", "label": "fetchUserOptions()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts", "source_location": "L26"}, {"id": "api_admin_fetchroleoptions", "label": "fetchRoleOptions()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts", "source_location": "L33"}, {"id": "api_admin_fetchtenantlist", "label": "fetchTenantList()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts", "source_location": "L43"}, {"id": "api_admin_fetchcreatetenant", "label": "fetchCreateTenant()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts", "source_location": "L56"}, {"id": "api_admin_fetchupdatetenant", "label": "fetchUpdateTenant()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts", "source_location": "L71"}, {"id": "api_admin_fetchdeletetenant", "label": "fetchDeleteTenant()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts", "source_location": "L89"}, {"id": "api_admin_fetchuserlist", "label": "fetchUserList()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts", "source_location": "L100"}, {"id": "api_admin_fetchuserdetail", "label": "fetchUserDetail()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts", "source_location": "L119"}, {"id": "api_admin_fetchcreateuser", "label": "fetchCreateUser()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts", "source_location": "L125"}, {"id": "api_admin_fetchupdateuser", "label": "fetchUpdateUser()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts", "source_location": "L147"}, {"id": "api_admin_fetchdeleteuser", "label": "fetchDeleteUser()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts", "source_location": "L170"}, {"id": "api_admin_fetchresetpassword", "label": "fetchResetPassword()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts", "source_location": "L177"}, {"id": "api_admin_fetchuploaduseravatar", "label": "fetchUploadUserAvatar()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts", "source_location": "L185"}, {"id": "api_admin_fetchregionlist", "label": "fetchRegionList()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts", "source_location": "L196"}, {"id": "api_admin_fetchactiveregions", "label": "fetchActiveRegions()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts", "source_location": "L214"}, {"id": "api_admin_fetchnotdeletedregions", "label": "fetchNotDeletedRegions()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts", "source_location": "L231"}, {"id": "api_admin_fetchcategorylist", "label": "fetchCategoryList()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts", "source_location": "L259"}, {"id": "api_admin_fetchcreatecategory", "label": "fetchCreateCategory()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts", "source_location": "L277"}, {"id": "api_admin_fetchupdatecategory", "label": "fetchUpdateCategory()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts", "source_location": "L290"}, {"id": "api_admin_fetchdeletecategory", "label": "fetchDeleteCategory()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts", "source_location": "L307"}, {"id": "api_admin_fetchuploadcategoryimage", "label": "fetchUploadCategoryImage()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts", "source_location": "L313"}, {"id": "api_admin_fetchunitlist", "label": "fetchUnitList()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/admin.ts", "source_location": "L324"}, {"id": "api_admin_fetchcreateunit", "label": "fetchCrLine truncated
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_router_modules_sqxp_ts", "label": "sqxp.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/router/modules/sqxp.ts", "source_location": "L1"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_router_modules_sqxp_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_types_router", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/router/modules/sqxp.ts", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_qc_material_usage_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material-usage/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_storage_cert_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/storage-cert/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_protocol_audit_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol-audit/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_fullmoon_todo_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/fullmoon-todo/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_research_donation_list_donationviewdialog_vue", "label": "DonationViewDialog.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L1"}, {"id": "list_donationviewdialog_dash", "label": "dash()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L663"}, {"id": "list_donationviewdialog_formatymd", "label": "formatYmd()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L668"}, {"id": "list_donationviewdialog_formatym", "label": "formatYm()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L674"}, {"id": "list_donationviewdialog_auditordisplay", "label": "auditorDisplay()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L680"}, {"id": "list_donationviewdialog_sampletypename", "label": "sampleTypeName()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L686"}, {"id": "list_donationviewdialog_unitname", "label": "unitName()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L690"}, {"id": "list_donationviewdialog_sitename", "label": "siteName()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L694"}, {"id": "list_donationviewdialog_expressname", "label": "expressName()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L698"}, {"id": "list_donationviewdialog_if", "label": "if()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L703"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_research_donation_list_donationviewdialog_vue", "target": "icons_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L491", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_research_donation_list_donationviewdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_protocol_protocolattachmentreadonly_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L492", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_research_donation_list_donationviewdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_components_business_sample_qc_info_cards_index_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L493", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_research_donation_list_donationviewdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_research_donation", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L494", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_research_donation_list_donationviewdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_admin", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L499", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_research_donation_list_donationviewdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_download_attachment", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/research-donation/list/DonationViewDialog.vue", "source_location": "L508", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_research_donation_list_donationviewdialog_vue", "target": Line truncated
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_components_core_layouts_art_work_tab_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-work-tab/index.vue", "source_location": "L1"}, {"id": "art_work_tab_index_settransition", "label": "setTransition()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-work-tab/index.vue", "source_location": "L204"}, {"id": "art_work_tab_index_handlewheelscroll", "label": "handleWheelScroll()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-work-tab/index.vue", "source_location": "L283"}, {"id": "art_work_tab_index_handletouchstart", "label": "handleTouchStart()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-work-tab/index.vue", "source_location": "L300"}, {"id": "art_work_tab_index_handletouchmove", "label": "handleTouchMove()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-work-tab/index.vue", "source_location": "L304"}, {"id": "art_work_tab_index_handletouchend", "label": "handleTouchEnd()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-work-tab/index.vue", "source_location": "L318"}, {"id": "art_work_tab_index_setupeventlisteners", "label": "setupEventListeners()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-work-tab/index.vue", "source_location": "L322"}, {"id": "art_work_tab_index_cleanupeventlisteners", "label": "cleanupEventListeners()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-work-tab/index.vue", "source_location": "L331"}, {"id": "art_work_tab_index_clicktab", "label": "clickTab()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-work-tab/index.vue", "source_location": "L359"}, {"id": "art_work_tab_index_closeworktab", "label": "closeWorktab()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-work-tab/index.vue", "source_location": "L370"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_core_layouts_art_work_tab_index_vue", "target": "art_work_tab_index_settransition", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-work-tab/index.vue", "source_location": "L204", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_core_layouts_art_work_tab_index_vue", "target": "art_work_tab_index_handlewheelscroll", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-work-tab/index.vue", "source_location": "L283", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_core_layouts_art_work_tab_index_vue", "target": "art_work_tab_index_handletouchstart", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-work-tab/index.vue", "source_location": "L300", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_core_layouts_art_work_tab_index_vue", "target": "art_work_tab_index_handletouchmove", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-work-tab/index.vue", "source_location": "L304", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_core_layouts_art_work_tab_index_vue", "target": "art_work_tab_index_handletouchend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-work-tab/index.vue", "source_location": "L318", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_core_layouts_art_work_tab_index_vue", "target": "art_work_tab_index_setupeventlisteners", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-work-tab/index.vue", "source_location": "L322", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_core_layouts_art_work_tab_index_vue", "target": "art_work_tab_index_cleanupeventlisteners", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/layouts/art-work-tab/index.vue", "source_location": "L331", "weight": 1.0}, {"source": "users_wuzilong_work_Line truncated
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_cell_storage_protocol_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/cell-storage/protocol/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
|
||||
@@ -1,6 +1,10 @@
|
||||
import './utils/patch-el-select-filterable'
|
||||
import App from './App.vue'
|
||||
import { createApp } from 'vue'
|
||||
import { ElTable } from 'element-plus'
|
||||
|
||||
ElTable.props.border = { type: Boolean, default: true }
|
||||
|
||||
import { initStore } from './store' // Store
|
||||
import { initRouter } from './router' // Router
|
||||
import language from './locales' // 国际化
|
||||
|
||||
@@ -85,7 +85,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
|
||||
name: 'Unit',
|
||||
path: 'unit',
|
||||
component: '/system/unit/index',
|
||||
meta: { title: '物品单位', keepAlive: true, menuCode: 'system:unit:list' }
|
||||
meta: { title: '物品单位管理', keepAlive: true, menuCode: 'system:unit:list' }
|
||||
},
|
||||
{
|
||||
id: '110',
|
||||
@@ -183,7 +183,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
|
||||
name: 'BasicInfoInsuranceCompany',
|
||||
path: 'insurance-company',
|
||||
component: '/basic-info/insurance-company/index',
|
||||
meta: { title: '保险公司及项目价格', keepAlive: true }
|
||||
meta: { title: '保险公司及险种价格', keepAlive: true }
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
@@ -22,8 +22,8 @@
|
||||
<div class="filter-actions-row">
|
||||
<span class="filter-hint">按编码、名称模糊查询。</span>
|
||||
<div class="filter-actions-end">
|
||||
<el-button class="btn-ghost" @click="handleReset">重置</el-button>
|
||||
<el-button class="btn-main" type="primary" @click="handleSearch">搜索</el-button>
|
||||
<el-button class="btn-ghost" @click="handleReset"><el-icon><RefreshLeft /></el-icon>重置</el-button>
|
||||
<el-button class="btn-main" type="primary" @click="handleSearch"><el-icon><Search /></el-icon>搜索</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</el-form>
|
||||
@@ -209,7 +209,7 @@
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, computed, onMounted } from 'vue'
|
||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||
import { Plus, Close, Check, View, Collection } from '@element-plus/icons-vue'
|
||||
import { Plus, Close, Check, View, Collection, RefreshLeft, Search } from '@element-plus/icons-vue'
|
||||
import { withFullscreenLoading, fullscreenLoadingText } from '@/utils/fullscreen-loading'
|
||||
import {
|
||||
fetchCellSampleTypeList,
|
||||
|
||||
@@ -22,8 +22,8 @@
|
||||
<div class="filter-actions-row">
|
||||
<span class="filter-hint">模糊查询。</span>
|
||||
<div class="filter-actions-end">
|
||||
<el-button class="btn-ghost" @click="handleReset">重置</el-button>
|
||||
<el-button class="btn-main" type="primary" @click="handleSearch">搜索</el-button>
|
||||
<el-button class="btn-ghost" @click="handleReset"><el-icon><RefreshLeft /></el-icon>重置</el-button>
|
||||
<el-button class="btn-main" type="primary" @click="handleSearch"><el-icon><Search /></el-icon>搜索</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</el-form>
|
||||
@@ -363,7 +363,7 @@
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, computed, onMounted } from 'vue'
|
||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||
import { Plus, Close, Check, View, Tickets } from '@element-plus/icons-vue'
|
||||
import { Plus, Close, Check, View, Tickets, RefreshLeft, Search } from '@element-plus/icons-vue'
|
||||
import SystemViewDialog from '@/components/business/system-view-dialog/index.vue'
|
||||
import { withFullscreenLoading, fullscreenLoadingText } from '@/utils/fullscreen-loading'
|
||||
import {
|
||||
|
||||
Loaded 100 of 143 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user