提交
This commit is contained in:
1 parent
3d98104455
commit
0d52442902
76 files changed
+21994
-12642
No files matched your search
@@ -903,6 +903,19 @@ STATIC_MENU_TREE = [
|
||||
"component": "/oa-approval/start/index",
|
||||
"meta": {"title": "发起审批", "keepAlive": True, "menuCode": "oa:start"},
|
||||
},
|
||||
{
|
||||
"id": "OA000000000000000000000000000203",
|
||||
"name": "OaApprovalHistory",
|
||||
"path": "history/:appId",
|
||||
"component": "/oa-approval/history/index",
|
||||
"meta": {
|
||||
"title": "历史记录",
|
||||
"keepAlive": True,
|
||||
"isHide": True,
|
||||
"worktabMulti": True,
|
||||
"menuCode": "oa:start",
|
||||
},
|
||||
},
|
||||
{
|
||||
"id": "OA000000000000000000000000000104",
|
||||
"name": "OaApprovalPending",
|
||||
|
||||
@@ -937,6 +937,47 @@ async def list_oa_instance_history(
|
||||
return error_response(400, str(e))
|
||||
|
||||
|
||||
@router.get("/instances/history/export")
|
||||
async def export_oa_instance_history(
|
||||
appId: str = Query(..., description="流程应用 ID"),
|
||||
instanceId: str = Query(""),
|
||||
instanceIds: str = Query("", description="逗号分隔的实例 ID,用于导出勾选"),
|
||||
instanceStatus: str = Query(""),
|
||||
initiatorName: str = Query(""),
|
||||
applyTimeFrom: str = Query(""),
|
||||
applyTimeTo: str = Query(""),
|
||||
finishTimeFrom: str = Query(""),
|
||||
finishTimeTo: str = Query(""),
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
from app.core.menu_guard import user_has_menu_perm
|
||||
from app.services.oa_engine import OaEngineError, export_instance_history
|
||||
|
||||
try:
|
||||
tenant_no = _get_tenant_no(db, user)
|
||||
can_view_all = user_has_menu_perm(db, user, OA_START_HISTORY_ALL_PERM)
|
||||
id_list = [x.strip() for x in (instanceIds or "").split(",") if x.strip()]
|
||||
data = export_instance_history(
|
||||
db,
|
||||
tenant_no=tenant_no,
|
||||
user_id=user.get("user_id") or "",
|
||||
can_view_all=can_view_all,
|
||||
app_id=appId,
|
||||
instance_id=instanceId or None,
|
||||
instance_ids=id_list or None,
|
||||
initiator_name=initiatorName or None,
|
||||
apply_time_from=applyTimeFrom or None,
|
||||
apply_time_to=applyTimeTo or None,
|
||||
finish_time_from=finishTimeFrom or None,
|
||||
finish_time_to=finishTimeTo or None,
|
||||
instance_status=instanceStatus or None,
|
||||
)
|
||||
return success_response(data)
|
||||
except OaEngineError as e:
|
||||
return error_response(400, str(e))
|
||||
|
||||
|
||||
@router.get("/instances/{instance_id}")
|
||||
async def get_oa_instance(
|
||||
instance_id: str,
|
||||
|
||||
@@ -62,6 +62,7 @@ class ProductionTaskStatusUpdate(BaseModel):
|
||||
|
||||
|
||||
class TaskStepAdd(BaseModel):
|
||||
model_config = ConfigDict(populate_by_name=True)
|
||||
process_id: Optional[str] = None
|
||||
process_code: Optional[str] = None
|
||||
category_id: Optional[str] = None
|
||||
@@ -74,6 +75,7 @@ class TaskStepAdd(BaseModel):
|
||||
|
||||
|
||||
class TaskStepUpdate(BaseModel):
|
||||
model_config = ConfigDict(populate_by_name=True)
|
||||
process_name: Optional[str] = None
|
||||
description: Optional[str] = None
|
||||
equipment_ids: Optional[List[str]] = Field(None, alias="equipmentIds")
|
||||
|
||||
@@ -1004,10 +1004,12 @@ def _enrich_list_rows(
|
||||
ver = ver_by_id.get(inst.app_version_id or "")
|
||||
schema = _loads(getattr(ver, "form_schema_json", None), {}) if ver else {}
|
||||
form_data = _loads(inst.form_data_json, {}) or {}
|
||||
preview = [
|
||||
{"label": f.get("label") or "", "value": f.get("value") or ""}
|
||||
for f in flatten_form_fields_for_summary(schema, form_data)[:limit]
|
||||
]
|
||||
preview = []
|
||||
for f in flatten_form_fields_for_summary(schema, form_data)[:limit]:
|
||||
item = dict(f)
|
||||
item["label"] = item.get("label") or ""
|
||||
item["value"] = item.get("value") or ""
|
||||
preview.append(item)
|
||||
merged = dict(row)
|
||||
merged.update(summary)
|
||||
merged["previewFields"] = preview
|
||||
@@ -2317,6 +2319,494 @@ def list_instance_history(
|
||||
}
|
||||
|
||||
|
||||
_HISTORY_EXPORT_MAX_ROWS = 5000
|
||||
|
||||
_EXPORT_RESULT_TEXT = {
|
||||
"completed": "审批通过",
|
||||
"approved": "审批通过",
|
||||
"rejected": "审批拒绝",
|
||||
"returned": "已打回",
|
||||
"cancelled": "已撤销",
|
||||
"running": "",
|
||||
"pending": "",
|
||||
}
|
||||
|
||||
_EXPORT_STATUS_TEXT = {
|
||||
"completed": "已结束",
|
||||
"approved": "已结束",
|
||||
"rejected": "已结束",
|
||||
"cancelled": "已结束",
|
||||
"returned": "已打回",
|
||||
"running": "进行中",
|
||||
"pending": "待处理",
|
||||
}
|
||||
|
||||
_EXPORT_ACTION_TEXT = {
|
||||
"submitted": "提交申请",
|
||||
"approved": "同意",
|
||||
"rejected": "拒绝",
|
||||
"returned": "打回",
|
||||
"completed": "同意",
|
||||
"pending": "待处理",
|
||||
"cancelled": "取消",
|
||||
"transferred": "转交",
|
||||
"done": "抄送",
|
||||
}
|
||||
|
||||
_FIXED_HISTORY_EXPORT_COLUMNS: List[Tuple[str, str]] = [
|
||||
("instanceNo", "审批编号"),
|
||||
("createTime", "创建时间"),
|
||||
("initiatorName", "创建人"),
|
||||
("currentAssignee", "当前负责人"),
|
||||
("approvalResult", "审批结果"),
|
||||
("approvalStatus", "审批状态"),
|
||||
("updateTime", "更新时间"),
|
||||
("finishTime", "完成时间"),
|
||||
("initiatorDept", "创建人部门"),
|
||||
("title", "审批单标题"),
|
||||
("historyApprovers", "历史审批人"),
|
||||
("duration", "耗时(时:分:秒)"),
|
||||
("approvalRecord", "审批记录"),
|
||||
]
|
||||
|
||||
|
||||
def _format_export_duration(start: Optional[datetime], end: Optional[datetime]) -> str:
|
||||
if not start or not end:
|
||||
return ""
|
||||
delta = end - start
|
||||
if delta.total_seconds() < 0:
|
||||
return ""
|
||||
total = int(delta.total_seconds())
|
||||
h, rem = divmod(total, 3600)
|
||||
m, s = divmod(rem, 60)
|
||||
return f"{h}:{m}:{s}"
|
||||
|
||||
|
||||
def _export_upload_cell_value(field: Dict[str, Any]) -> str:
|
||||
files = field.get("files") or []
|
||||
if not isinstance(files, list):
|
||||
return str(field.get("value") or "")
|
||||
urls: List[str] = []
|
||||
for f in files:
|
||||
if not isinstance(f, dict):
|
||||
continue
|
||||
u = str(f.get("url") or "").strip()
|
||||
if u:
|
||||
urls.append(u)
|
||||
if urls:
|
||||
return ",".join(urls)
|
||||
return str(field.get("value") or "")
|
||||
|
||||
|
||||
def _export_progress_action(status: str, *, task_type: str = "") -> str:
|
||||
st = (status or "").strip()
|
||||
if (task_type or "").strip() == "cc" or st == "done":
|
||||
return "抄送"
|
||||
return _EXPORT_ACTION_TEXT.get(st, st or "")
|
||||
|
||||
|
||||
def _format_export_progress_record(progress: List[Dict[str, Any]]) -> str:
|
||||
lines: List[str] = []
|
||||
for item in progress or []:
|
||||
kind = (item.get("kind") or "").strip()
|
||||
title = (item.get("title") or "").strip()
|
||||
ts = (item.get("timestamp") or "").strip()
|
||||
task_type = (item.get("taskType") or "").strip()
|
||||
if kind == "submit":
|
||||
name = (item.get("assigneeUserName") or "").strip()
|
||||
if not name:
|
||||
continue
|
||||
lines.append(f"{name}|提交申请|{ts}|提交申请")
|
||||
continue
|
||||
people = item.get("people") or []
|
||||
if isinstance(people, list) and people:
|
||||
for p in people:
|
||||
if not isinstance(p, dict):
|
||||
continue
|
||||
name = (p.get("nickName") or p.get("assigneeUserName") or "").strip()
|
||||
if not name:
|
||||
continue
|
||||
pst = (p.get("status") or "").strip()
|
||||
if pst in ("pending", "running", "cancelled") and task_type != "cc":
|
||||
continue
|
||||
node = title or (item.get("nodeKey") or "").strip() or "-"
|
||||
pts = (p.get("timestamp") or ts or "").strip()
|
||||
action = _export_progress_action(pst, task_type=task_type)
|
||||
comment = (p.get("commentText") or "").strip()
|
||||
seg = f"{name}|{node}|{pts}|{action}"
|
||||
if comment:
|
||||
seg += f"|{comment}"
|
||||
lines.append(seg)
|
||||
continue
|
||||
name = (item.get("assigneeUserName") or "").strip()
|
||||
if not name:
|
||||
continue
|
||||
st = (item.get("status") or "").strip()
|
||||
if st in ("pending", "running", "cancelled") and task_type != "cc":
|
||||
continue
|
||||
node = title or (item.get("nodeKey") or "").strip() or "-"
|
||||
action = _export_progress_action(st, task_type=task_type)
|
||||
comment = (item.get("commentText") or "").strip()
|
||||
seg = f"{name}|{node}|{ts}|{action}"
|
||||
if comment:
|
||||
seg += f"|{comment}"
|
||||
lines.append(seg)
|
||||
return ";\r\n".join(lines)
|
||||
|
||||
|
||||
def _collect_history_approver_names(progress: List[Dict[str, Any]]) -> str:
|
||||
names: List[str] = []
|
||||
seen = set()
|
||||
for item in progress or []:
|
||||
if (item.get("kind") or "").strip() == "submit":
|
||||
continue
|
||||
people = item.get("people") or []
|
||||
if isinstance(people, list) and people:
|
||||
for p in people:
|
||||
if not isinstance(p, dict):
|
||||
continue
|
||||
st = (p.get("status") or "").strip()
|
||||
if st not in ("approved", "completed", "rejected", "returned", "transferred"):
|
||||
continue
|
||||
name = (p.get("nickName") or p.get("assigneeUserName") or "").strip()
|
||||
if name and name not in seen:
|
||||
seen.add(name)
|
||||
names.append(name)
|
||||
continue
|
||||
st = (item.get("status") or "").strip()
|
||||
if st not in ("approved", "completed", "rejected", "returned", "transferred"):
|
||||
continue
|
||||
name = (item.get("assigneeUserName") or "").strip()
|
||||
if name and name not in seen:
|
||||
seen.add(name)
|
||||
names.append(name)
|
||||
return ",".join(names)
|
||||
|
||||
|
||||
def _build_history_export_business_columns(schema: Any) -> List[Dict[str, Any]]:
|
||||
from app.services.oa_related_approval import LAYOUT_SKIP, _schema_rules
|
||||
|
||||
cols: List[Dict[str, Any]] = []
|
||||
for rule in _schema_rules(schema):
|
||||
typ = str(rule.get("type") or "")
|
||||
if not typ or typ in LAYOUT_SKIP:
|
||||
continue
|
||||
field = str(rule.get("field") or "").strip()
|
||||
if not field:
|
||||
continue
|
||||
label = str(rule.get("title") or rule.get("label") or field)
|
||||
if typ == "relatedApproval":
|
||||
cols.append(
|
||||
{
|
||||
"key": field,
|
||||
"label": label,
|
||||
"kind": "related",
|
||||
"subLabel": "关联标题",
|
||||
}
|
||||
)
|
||||
else:
|
||||
cols.append({"key": field, "label": label, "kind": "business"})
|
||||
return cols
|
||||
|
||||
|
||||
def _merge_history_export_business_columns(col_lists: List[List[Dict[str, Any]]]) -> List[Dict[str, Any]]:
|
||||
merged: List[Dict[str, Any]] = []
|
||||
seen = set()
|
||||
for cols in col_lists:
|
||||
for c in cols:
|
||||
key = str(c.get("key") or "")
|
||||
if not key or key in seen:
|
||||
continue
|
||||
seen.add(key)
|
||||
merged.append(dict(c))
|
||||
return merged
|
||||
|
||||
|
||||
def _history_export_query(
|
||||
db: Session,
|
||||
*,
|
||||
tenant_no: str,
|
||||
user_id: str,
|
||||
can_view_all: bool,
|
||||
app_id: str,
|
||||
instance_id: Optional[str] = None,
|
||||
instance_ids: Optional[List[str]] = None,
|
||||
initiator_name: Optional[str] = None,
|
||||
apply_time_from: Optional[str] = None,
|
||||
apply_time_to: Optional[str] = None,
|
||||
finish_time_from: Optional[str] = None,
|
||||
finish_time_to: Optional[str] = None,
|
||||
instance_status: Optional[str] = None,
|
||||
):
|
||||
q = db.query(OaInstance).filter(
|
||||
OaInstance.tenant_no == tenant_no,
|
||||
OaInstance.del_flag == 0,
|
||||
OaInstance.app_id == app_id,
|
||||
)
|
||||
if not can_view_all:
|
||||
q = q.filter(OaInstance.initiator_user_id == user_id)
|
||||
initiator_name = None
|
||||
|
||||
clean_ids = [str(x).strip() for x in (instance_ids or []) if str(x).strip()]
|
||||
if clean_ids:
|
||||
q = q.filter(OaInstance.id.in_(clean_ids))
|
||||
else:
|
||||
iid = (instance_id or "").strip()
|
||||
if iid:
|
||||
q = q.filter(OaInstance.id.like(f"%{iid}%"))
|
||||
|
||||
q, _, _ = _apply_instance_list_filters(
|
||||
q,
|
||||
initiator_name=initiator_name,
|
||||
apply_time_from=apply_time_from,
|
||||
apply_time_to=apply_time_to,
|
||||
instance_status=instance_status,
|
||||
)
|
||||
|
||||
ft0 = _parse_day_start(finish_time_from)
|
||||
ft1 = _parse_day_end(finish_time_to)
|
||||
if ft0 is not None or ft1 is not None:
|
||||
q = q.filter(OaInstance.status.in_(tuple(_FINISH_STATUSES)))
|
||||
if ft0 is not None:
|
||||
q = q.filter(OaInstance.update_time >= ft0)
|
||||
if ft1 is not None:
|
||||
q = q.filter(OaInstance.update_time <= ft1)
|
||||
return q
|
||||
|
||||
|
||||
def export_instance_history(
|
||||
db: Session,
|
||||
*,
|
||||
tenant_no: str,
|
||||
user_id: str,
|
||||
can_view_all: bool,
|
||||
app_id: str,
|
||||
instance_id: Optional[str] = None,
|
||||
instance_ids: Optional[List[str]] = None,
|
||||
initiator_name: Optional[str] = None,
|
||||
apply_time_from: Optional[str] = None,
|
||||
apply_time_to: Optional[str] = None,
|
||||
finish_time_from: Optional[str] = None,
|
||||
finish_time_to: Optional[str] = None,
|
||||
instance_status: Optional[str] = None,
|
||||
) -> Dict[str, Any]:
|
||||
from app.services.oa_related_approval import flatten_form_fields_for_summary
|
||||
|
||||
app_id = (app_id or "").strip()
|
||||
if not app_id:
|
||||
raise OaEngineError("appId 不能为空")
|
||||
|
||||
app = oa_crud.get_app(db, app_id, tenant_no)
|
||||
app_name = (app.app_name or "") if app else ""
|
||||
|
||||
q = _history_export_query(
|
||||
db,
|
||||
tenant_no=tenant_no,
|
||||
user_id=user_id,
|
||||
can_view_all=can_view_all,
|
||||
app_id=app_id,
|
||||
instance_id=instance_id,
|
||||
instance_ids=instance_ids,
|
||||
initiator_name=initiator_name,
|
||||
apply_time_from=apply_time_from,
|
||||
apply_time_to=apply_time_to,
|
||||
finish_time_from=finish_time_from,
|
||||
finish_time_to=finish_time_to,
|
||||
instance_status=instance_status,
|
||||
)
|
||||
total = q.count()
|
||||
if total > _HISTORY_EXPORT_MAX_ROWS:
|
||||
raise OaEngineError(f"导出条数超过上限 {_HISTORY_EXPORT_MAX_ROWS},请缩小筛选范围")
|
||||
insts = q.order_by(OaInstance.create_time.desc()).limit(_HISTORY_EXPORT_MAX_ROWS).all()
|
||||
if not insts:
|
||||
pub = oa_crud._find_latest_published(db, app_id, tenant_no)
|
||||
schema = _loads(getattr(pub, "form_schema_json", None), {}) if pub else {}
|
||||
business_columns = _build_history_export_business_columns(schema)
|
||||
return {
|
||||
"appName": app_name,
|
||||
"businessColumns": business_columns,
|
||||
"fixedColumns": [{"key": k, "label": lb} for k, lb in _FIXED_HISTORY_EXPORT_COLUMNS],
|
||||
"rows": [],
|
||||
"total": 0,
|
||||
}
|
||||
|
||||
ver_by_id: Dict[str, OaAppVersion] = {}
|
||||
ver_ids = list({i.app_version_id for i in insts if i.app_version_id})
|
||||
if ver_ids:
|
||||
for v in (
|
||||
db.query(OaAppVersion)
|
||||
.filter(OaAppVersion.id.in_(ver_ids), OaAppVersion.del_flag == 0)
|
||||
.all()
|
||||
):
|
||||
ver_by_id[v.id] = v
|
||||
|
||||
pub = oa_crud._find_latest_published(db, app_id, tenant_no)
|
||||
pub_schema = _loads(getattr(pub, "form_schema_json", None), {}) if pub else {}
|
||||
col_lists = [_build_history_export_business_columns(pub_schema)]
|
||||
for inst in insts:
|
||||
ver = ver_by_id.get(inst.app_version_id or "")
|
||||
schema = _loads(getattr(ver, "form_schema_json", None), {}) if ver else {}
|
||||
col_lists.append(_build_history_export_business_columns(schema))
|
||||
business_columns = _merge_history_export_business_columns(col_lists)
|
||||
|
||||
inst_ids = [i.id for i in insts]
|
||||
all_tasks = (
|
||||
db.query(OaTask)
|
||||
.filter(OaTask.instance_id.in_(inst_ids), OaTask.del_flag == 0)
|
||||
.all()
|
||||
)
|
||||
tasks_by_inst: Dict[str, List[OaTask]] = {}
|
||||
user_ids: List[str] = []
|
||||
for t in all_tasks:
|
||||
tasks_by_inst.setdefault(t.instance_id, []).append(t)
|
||||
if t.assignee_user_id:
|
||||
user_ids.append(t.assignee_user_id)
|
||||
|
||||
all_events = (
|
||||
db.query(OaInstanceEvent)
|
||||
.filter(OaInstanceEvent.instance_id.in_(inst_ids), OaInstanceEvent.del_flag == 0)
|
||||
.order_by(OaInstanceEvent.create_time.asc())
|
||||
.all()
|
||||
)
|
||||
events_by_inst: Dict[str, List[OaInstanceEvent]] = {}
|
||||
for e in all_events:
|
||||
events_by_inst.setdefault(e.instance_id, []).append(e)
|
||||
if e.actor_user_id:
|
||||
user_ids.append(e.actor_user_id)
|
||||
|
||||
for inst in insts:
|
||||
if inst.initiator_user_id:
|
||||
user_ids.append(inst.initiator_user_id)
|
||||
|
||||
name_map = _user_name_map(db, user_ids)
|
||||
|
||||
related_ids: List[str] = []
|
||||
flat_by_inst: Dict[str, List[Dict[str, Any]]] = {}
|
||||
for inst in insts:
|
||||
ver = ver_by_id.get(inst.app_version_id or "")
|
||||
schema = _loads(getattr(ver, "form_schema_json", None), {}) if ver else {}
|
||||
form_data = _loads(inst.form_data_json, {}) or {}
|
||||
flat = flatten_form_fields_for_summary(schema, form_data)
|
||||
flat_by_inst[inst.id] = flat
|
||||
for f in flat:
|
||||
for rid in f.get("relatedIds") or []:
|
||||
rid_s = str(rid or "").strip()
|
||||
if rid_s:
|
||||
related_ids.append(rid_s)
|
||||
|
||||
related_title_map: Dict[str, str] = {}
|
||||
if related_ids:
|
||||
rel_insts = (
|
||||
db.query(OaInstance)
|
||||
.filter(
|
||||
OaInstance.tenant_no == tenant_no,
|
||||
OaInstance.del_flag == 0,
|
||||
OaInstance.id.in_(list(set(related_ids))),
|
||||
)
|
||||
.all()
|
||||
)
|
||||
rel_app_ids = list({r.app_id for r in rel_insts if r.app_id})
|
||||
rel_app_map = {}
|
||||
if rel_app_ids:
|
||||
for a in db.query(OaApp).filter(OaApp.id.in_(rel_app_ids)).all():
|
||||
rel_app_map[a.id] = a.app_name or ""
|
||||
for r in rel_insts:
|
||||
initiator = name_map.get(r.initiator_user_id or "", "")
|
||||
related_title_map[r.id] = (
|
||||
f"{initiator}提交的{rel_app_map.get(r.app_id, '')}" if initiator else (r.title or r.id)
|
||||
)
|
||||
|
||||
pending_by_inst: Dict[str, List[OaTask]] = {}
|
||||
for t in all_tasks:
|
||||
if (t.task_type or "") == "approval" and (t.status or "") == "pending":
|
||||
pending_by_inst.setdefault(t.instance_id, []).append(t)
|
||||
|
||||
rows_out: List[Dict[str, Any]] = []
|
||||
for idx, inst in enumerate(insts, start=1):
|
||||
ver = ver_by_id.get(inst.app_version_id or "")
|
||||
flow_root = None
|
||||
if ver:
|
||||
try:
|
||||
flow_root = _flow_root(_loads(ver.flow_tree_json, {}))
|
||||
except OaEngineError:
|
||||
flow_root = None
|
||||
tasks = _sort_tasks_for_detail(tasks_by_inst.get(inst.id, []), flow_root=flow_root)
|
||||
events = events_by_inst.get(inst.id, [])
|
||||
adv = _advanced(ver) if ver else dict(oa_crud.DEFAULT_ADVANCED_SETTINGS)
|
||||
progress = build_progress_items(
|
||||
inst=inst,
|
||||
flow_root=flow_root,
|
||||
tasks=tasks,
|
||||
name_map=name_map,
|
||||
events=events,
|
||||
db=db,
|
||||
advanced=adv,
|
||||
)
|
||||
summary = _instance_progress_summary(
|
||||
inst,
|
||||
app_name=app_name,
|
||||
initiator_user_name=name_map.get(inst.initiator_user_id or "", ""),
|
||||
pending_approval_tasks=pending_by_inst.get(inst.id, []),
|
||||
name_map=name_map,
|
||||
)
|
||||
st = (inst.status or "").strip()
|
||||
finish_time = (
|
||||
inst.update_time.strftime("%Y-%m-%d %H:%M:%S")
|
||||
if st in _FINISH_STATUSES and inst.update_time
|
||||
else ""
|
||||
)
|
||||
duration_end = inst.update_time if st in _FINISH_STATUSES else None
|
||||
business: Dict[str, Any] = {}
|
||||
flat_map = {str(f.get("fieldKey") or ""): f for f in flat_by_inst.get(inst.id, [])}
|
||||
for col in business_columns:
|
||||
key = str(col.get("key") or "")
|
||||
field = flat_map.get(key) or {}
|
||||
if col.get("kind") == "related":
|
||||
ids = field.get("relatedIds") or []
|
||||
business[key] = f"已关联 {len(ids)} 条" if ids else ""
|
||||
titles = [related_title_map.get(str(i), str(i)) for i in ids]
|
||||
business[f"{key}__titles"] = "、".join(t for t in titles if t)
|
||||
elif field.get("fieldType") in ("upload", "fcUpload", "image", "oaAttachment"):
|
||||
business[key] = _export_upload_cell_value(field)
|
||||
else:
|
||||
business[key] = str(field.get("value") or "")
|
||||
|
||||
rows_out.append(
|
||||
{
|
||||
"index": idx,
|
||||
"id": inst.id,
|
||||
"business": business,
|
||||
"fixed": {
|
||||
"instanceNo": inst.id,
|
||||
"createTime": summary.get("applyTime") or "",
|
||||
"initiatorName": summary.get("initiatorUserName") or "",
|
||||
"currentAssignee": summary.get("currentApproverNames") or "-",
|
||||
"approvalResult": _EXPORT_RESULT_TEXT.get(st, st),
|
||||
"approvalStatus": _EXPORT_STATUS_TEXT.get(st, st),
|
||||
"updateTime": inst.update_time.strftime("%Y-%m-%d %H:%M:%S")
|
||||
if inst.update_time
|
||||
else "",
|
||||
"finishTime": finish_time,
|
||||
"initiatorDept": _dept_name(
|
||||
db, inst.initiator_dept_id, tenant_no=tenant_no
|
||||
),
|
||||
"title": inst.title or "",
|
||||
"historyApprovers": _collect_history_approver_names(progress),
|
||||
"duration": _format_export_duration(inst.create_time, duration_end),
|
||||
"approvalRecord": _format_export_progress_record(progress),
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
return {
|
||||
"appName": app_name,
|
||||
"businessColumns": business_columns,
|
||||
"fixedColumns": [{"key": k, "label": lb} for k, lb in _FIXED_HISTORY_EXPORT_COLUMNS],
|
||||
"rows": rows_out,
|
||||
"total": len(rows_out),
|
||||
}
|
||||
|
||||
|
||||
def list_tasks(
|
||||
db: Session,
|
||||
*,
|
||||
|
||||
@@ -144,6 +144,36 @@ def _format_upload_display(raw: Any) -> str:
|
||||
return "、".join(names) if names else "0 个"
|
||||
|
||||
|
||||
def _upload_files_meta(raw: Any) -> List[Dict[str, str]]:
|
||||
"""摘要/列表用:上传字段规范化为 {url, name} 列表,供前端缩略图展示。"""
|
||||
if raw is None or raw == "" or raw == []:
|
||||
return []
|
||||
if isinstance(raw, list):
|
||||
items: List[Any] = raw
|
||||
elif isinstance(raw, str):
|
||||
items = [x.strip() for x in raw.split(",") if x.strip()]
|
||||
elif isinstance(raw, dict):
|
||||
items = [raw]
|
||||
else:
|
||||
items = [raw]
|
||||
files: List[Dict[str, str]] = []
|
||||
for it in items:
|
||||
if it is None or it == "":
|
||||
continue
|
||||
if isinstance(it, dict):
|
||||
urls = _extract_upload_urls(it)
|
||||
if not urls:
|
||||
continue
|
||||
for u in urls:
|
||||
files.append({"url": u, "name": _upload_display_name(it, u)})
|
||||
continue
|
||||
s = str(it).strip()
|
||||
if not s:
|
||||
continue
|
||||
files.append({"url": s, "name": _upload_display_name(s, s)})
|
||||
return files
|
||||
|
||||
|
||||
def _normalize_related_ids(raw: Any) -> List[str]:
|
||||
"""Order-preserving dedupe of related approval instance ids."""
|
||||
if isinstance(raw, list):
|
||||
@@ -408,14 +438,28 @@ def flatten_form_fields_for_summary(schema: Any, form_data: Optional[Dict[str, A
|
||||
if typ == "relatedApproval":
|
||||
ids = _normalize_related_ids(raw)
|
||||
item: Dict[str, Any] = {
|
||||
"fieldKey": field,
|
||||
"label": label,
|
||||
"value": f"已关联 {len(ids)} 条",
|
||||
"relatedIds": ids,
|
||||
}
|
||||
out.append(item)
|
||||
continue
|
||||
if typ in UPLOAD_TYPES:
|
||||
text, full = _format_value(typ, raw)
|
||||
item = {
|
||||
"fieldKey": field,
|
||||
"label": label,
|
||||
"value": text,
|
||||
"fieldType": typ,
|
||||
"files": _upload_files_meta(raw),
|
||||
}
|
||||
if full:
|
||||
item["fullWidth"] = True
|
||||
out.append(item)
|
||||
continue
|
||||
text, full = _format_value(typ, raw)
|
||||
item = {"label": label, "value": text}
|
||||
item = {"fieldKey": field, "label": label, "value": text}
|
||||
if full:
|
||||
item["fullWidth"] = True
|
||||
out.append(item)
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
+2030
-1148
File diff suppressed because it is too large.
Load diff
@@ -1,11 +1,11 @@
|
||||
# Graph Report - app (2026-08-28)
|
||||
|
||||
## Corpus Check
|
||||
- Large corpus: 262 files · ~314,011 words. Semantic extraction will be expensive (many Claude tokens). Consider running on a subfolder, or use --no-semantic to run AST-only.
|
||||
- Large corpus: 262 files · ~315,778 words. Semantic extraction will be expensive (many Claude tokens). Consider running on a subfolder, or use --no-semantic to run AST-only.
|
||||
|
||||
## Summary
|
||||
- 5427 nodes · 29881 edges · 42 communities detected
|
||||
- Extraction: 31% EXTRACTED · 69% INFERRED · 0% AMBIGUOUS · INFERRED: 20501 edges (avg confidence: 0.6)
|
||||
- 5439 nodes · 29946 edges · 42 communities detected
|
||||
- Extraction: 31% EXTRACTED · 69% INFERRED · 0% AMBIGUOUS · INFERRED: 20530 edges (avg confidence: 0.6)
|
||||
- Token cost: 0 input · 0 output
|
||||
|
||||
## Community Hubs (Navigation)
|
||||
@@ -53,8 +53,8 @@
|
||||
- [[_COMMUNITY_Community 43|Community 43]]
|
||||
|
||||
## God Nodes (most connected - your core abstractions)
|
||||
1. `success_response()` - 760 edges
|
||||
2. `error_response()` - 630 edges
|
||||
1. `success_response()` - 761 edges
|
||||
2. `error_response()` - 631 edges
|
||||
3. `SysUser` - 605 edges
|
||||
4. `BizQcTaskResult` - 352 edges
|
||||
5. `BizProductionMaterial` - 335 edges
|
||||
@@ -67,8 +67,8 @@
|
||||
## Surprising Connections (you probably didn't know these)
|
||||
- `统一记录 API 请求/响应出入参的中间件` --uses--> `SysApiRequestLog` [INFERRED]
|
||||
core/api_request_log_middleware.py → models/models.py
|
||||
- `get_menu_list()` --calls--> `success_response()` [INFERRED]
|
||||
api/menu.py → core/response.py
|
||||
- `历史库存变动(biz_material_stock_log,只读)。` --uses--> `SysUser` [INFERRED]
|
||||
api/material.py → models/models.py
|
||||
- `微信小程序登录业务:openid + 手机号一致性校验。` --uses--> `SysUser` [INFERRED]
|
||||
services/wechat_login_service.py → models/models.py
|
||||
- `已绑定 openid 时静默换票(无需手机号授权)。` --uses--> `SysUser` [INFERRED]
|
||||
@@ -80,132 +80,132 @@
|
||||
|
||||
### Community 0 - "Community 0"
|
||||
Cohesion: 0.01
|
||||
Nodes (1053): attachment_download_url(), create_dept(), create_dict_data(), create_dict_type(), create_express_company(), create_item_unit(), create_menu(), create_post() (+1045 more)
|
||||
Nodes (1026): attachment_download_url(), create_dept(), create_dict_data(), create_dict_type(), create_express_company(), create_item_unit(), create_menu(), create_post() (+1018 more)
|
||||
|
||||
### Community 1 - "Community 1"
|
||||
Cohesion: 0.01
|
||||
Nodes (720): generate_uuid(), allocate_next_biz_no(), _format_biz_no(), _prefix_for(), 业务协议号自动生成:XBCC / JZCC + YYYYMMDD + 6 位序号, 原子分配下一个业务协议号。 须在 create 事务内调用;使用 MySQL LAST_INSERT_ID 保证并发安全。, create_cell_sample_type(), get_cell_sample_type() (+712 more)
|
||||
Nodes (763): set_current_process_route(), generate_uuid(), allocate_next_biz_no(), _format_biz_no(), _prefix_for(), 业务协议号自动生成:XBCC / JZCC + YYYYMMDD + 6 位序号, 原子分配下一个业务协议号。 须在 create 事务内调用;使用 MySQL LAST_INSERT_ID 保证并发安全。, create_cell_sample_type() (+755 more)
|
||||
|
||||
### Community 2 - "Community 2"
|
||||
Cohesion: 0.01
|
||||
Nodes (656): AttachmentDownloadUrlBody, DeptCreateBody, DeptUpdateBody, DictDataCreateBody, DictDataUpdateBody, DictTypeCreateBody, DictTypeUpdateBody, ExpressCompanyCreateBody (+648 more)
|
||||
Nodes (598): AttachmentDownloadUrlBody, DeptCreateBody, DeptUpdateBody, DictDataCreateBody, DictDataUpdateBody, DictTypeCreateBody, DictTypeUpdateBody, ExpressCompanyCreateBody (+590 more)
|
||||
|
||||
### Community 3 - "Community 3"
|
||||
Cohesion: 0.09
|
||||
Nodes (370): 保险公司及险种价格管理 API(保险公司 + 开票信息 + 险种价格), 小程序菜单:当前用户在「移动端菜单」树下有权限的入口。, 宫格图标底色/图形色(可按入口自定义,不强制品牌绿)。, 按路由匹配移动端宫格图标(与 mobile-h5 van-icon 字形名对齐)。, ProcessDefCreateBody, ProcessDefUpdateBody, PublishVersionBody, 审批意见:前端传 commentText,兼容 comment。 (+362 more)
|
||||
Cohesion: 0.01
|
||||
Nodes (421): _normalize_date_bound(), _persist_protocol_sub_resources(), list_ethnics_for_select(), batch_create_storage_slots(), create_access_log(), create_storage_slot(), create_uv_disinfect_log(), delete_access_log() (+413 more)
|
||||
|
||||
### Community 4 - "Community 4"
|
||||
Cohesion: 0.06
|
||||
Nodes (314): CellSampleTypeCreateBody, CellSampleTypeUpdateBody, CollectionRegionCreateBody, CollectionRegionUpdateBody, CustomerCreateBody, CustomerUpdateBody, HospitalCreateBody, HospitalUpdateBody (+306 more)
|
||||
Nodes (444): 保险公司及险种价格管理 API(保险公司 + 开票信息 + 险种价格), 小程序菜单:当前用户在「移动端菜单」树下有权限的入口。, 宫格图标底色/图形色(可按入口自定义,不强制品牌绿)。, 按路由匹配移动端宫格图标(与 mobile-h5 van-icon 字形名对齐)。, AccessLogCreateBody, AccessLogUpdateBody, CleanRoomCreateBody, CleanRoomUpdateBody (+436 more)
|
||||
|
||||
### Community 5 - "Community 5"
|
||||
Cohesion: 0.02
|
||||
Nodes (292): _ensure_review_side_write(), eq_unicode(), like_unicode(), MySQL 字符串比较/模糊匹配时统一排序规则,避免 Illegal mix of collations。, 跨表字符串等值比较(JOIN / WHERE)时统一为 utf8mb4_unicode_ci。, 将列显式设为 utf8mb4_unicode_ci。, unicode_ci(), lookup_attachments_by_urls() (+284 more)
|
||||
Cohesion: 0.06
|
||||
Nodes (313): CellSampleTypeCreateBody, CellSampleTypeUpdateBody, CollectionRegionCreateBody, CollectionRegionUpdateBody, CustomerCreateBody, CustomerUpdateBody, HospitalCreateBody, HospitalUpdateBody (+305 more)
|
||||
|
||||
### Community 6 - "Community 6"
|
||||
Cohesion: 0.02
|
||||
Nodes (266): _normalize_date_bound(), _body_to_payload(), _get_current_user_id(), get_production_reception_by_sample_code(), get_production_reception_detail(), _get_tenant_no(), post_production_reception(), put_production_reception() (+258 more)
|
||||
Nodes (257): 截止日期:仅日期时扩到当天 23:59:59。, 发起前预览审批链(条件齐后解析最终路径与审批人)。, 兼容旧 GET:无 formData,含条件分支时多为待确定占位。, _copied_app_name(), copy_app(), create_app(), create_group(), _create_version() (+249 more)
|
||||
|
||||
### Community 7 - "Community 7"
|
||||
Cohesion: 0.03
|
||||
Nodes (248): 截止日期:仅日期时扩到当天 23:59:59。, 发起前预览审批链(条件齐后解析最终路径与审批人)。, 兼容旧 GET:无 formData,含条件分支时多为待确定占位。, _app_to_dict(), _copied_app_name(), copy_app(), create_app(), _create_version() (+240 more)
|
||||
Cohesion: 0.02
|
||||
Nodes (258): eq_unicode(), like_unicode(), MySQL 字符串比较/模糊匹配时统一排序规则,避免 Illegal mix of collations。, 跨表字符串等值比较(JOIN / WHERE)时统一为 utf8mb4_unicode_ci。, 将列显式设为 utf8mb4_unicode_ci。, unicode_ci(), build_void_type_label_map(), format_protocol_status_label() (+250 more)
|
||||
|
||||
### Community 8 - "Community 8"
|
||||
Cohesion: 0.01
|
||||
Nodes (169): 服务号网页授权 code 绑定当前用户(需 Bearer)。, 微信登录:openid 已绑定时可静默换票;否则须授权手机号且与账号 phone_no 一致。, 密码登录后绑定当前微信 openid(需 Bearer)。, wechat_login(), get_designer_data(), _error_json(), lifespan(), 未捕获异常:统一 JSON 500,确保跨域场景下仍有 Access-Control-Allow-Origin (+161 more)
|
||||
Cohesion: 0.02
|
||||
Nodes (136): mp_bind_status(), 小程序鉴权:微信登录 / 绑定 openid。, 当前用户是否已绑定微信服务号 openid。, 服务号网页授权 code 绑定当前用户(需 Bearer)。, 微信登录:openid 已绑定时可静默换票;否则须授权手机号且与账号 phone_no 一致。, 密码登录后绑定当前微信 openid(需 Bearer)。, _resolve_user_id(), wechat_bind() (+128 more)
|
||||
|
||||
### Community 9 - "Community 9"
|
||||
Cohesion: 0.02
|
||||
Nodes (209): list_ethnics_for_select(), apply_data_scope(), _get_child_dept_ids(), get_user_dept_id(), _resolve_user_role_scopes(), delete(), get_multi_with_filters(), count_pending_protocol_invoice_requests() (+201 more)
|
||||
Cohesion: 0.03
|
||||
Nodes (151): get_next_cell_product_code(), _ancestor_link_from_cell_product_input(), _ancestor_sample_chain_link(), _apply_cell_product_status_change(), _build_ancestor_chain(), _build_descendant_chain(), _build_facility_path_label(), build_split_product_codes() (+143 more)
|
||||
|
||||
### Community 10 - "Community 10"
|
||||
Cohesion: 0.03
|
||||
Nodes (151): build_void_type_label_map(), format_protocol_status_label(), resolve_void_type_label(), _ancestor_link_from_cell_product_input(), _ancestor_sample_chain_link(), _apply_cell_product_status_change(), _build_ancestor_chain(), _build_descendant_chain() (+143 more)
|
||||
Nodes (125): 验证密码(哈希非 bcrypt 或损坏时返回 False,避免抛错), verify_password(), get_protocol_nos_used_in_protocols(), _fmt_dt(), get_handover_by_schedule(), get_outbound_handover(), get_outbound_handover_view(), _handover_row_to_dict() (+117 more)
|
||||
|
||||
### Community 11 - "Community 11"
|
||||
Cohesion: 0.03
|
||||
Nodes (110): 验证密码(哈希非 bcrypt 或损坏时返回 False,避免抛错), verify_password(), _fmt_dt(), get_handover_by_schedule(), get_outbound_handover(), get_outbound_handover_view(), _handover_row_to_dict(), _handover_view_dict() (+102 more)
|
||||
Cohesion: 0.05
|
||||
Nodes (85): _body_to_payload(), _get_current_user_id(), get_production_reception_detail(), _get_tenant_no(), post_production_reception(), put_production_reception(), _resolve_reception_id(), _lookup_attachment_by_url() (+77 more)
|
||||
|
||||
### Community 12 - "Community 12"
|
||||
Cohesion: 0.05
|
||||
Nodes (113): AccessLogCreateBody, AccessLogUpdateBody, CleanRoomCreateBody, CleanRoomUpdateBody, ExhibitionAppointmentCreateBody, ExhibitionAppointmentUpdateBody, list_storage_slot_stats(), OccupancyCreateBody (+105 more)
|
||||
Cohesion: 0.44
|
||||
Nodes (75): BatchStockInBody, BatchStockInItem, BatchStockOutBody, BatchStockOutItem, ConsumableCreateBody, ConsumablePackCreateBody, ConsumablePackUpdateBody, ConsumableUpdateBody (+67 more)
|
||||
|
||||
### Community 13 - "Community 13"
|
||||
Cohesion: 0.04
|
||||
Nodes (81): _collect_descendants(), _current_user(), _find_mobile_root(), list_my_mobile_menus(), _mobile_menu_icon(), _mobile_menu_icon_colors(), _user_menu_ids(), _jwt_user_payload() (+73 more)
|
||||
Cohesion: 0.05
|
||||
Nodes (66): _collect_descendants(), _current_user(), _find_mobile_root(), list_my_mobile_menus(), _mobile_menu_icon(), _mobile_menu_icon_colors(), _user_menu_ids(), _jwt_user_payload() (+58 more)
|
||||
|
||||
### Community 14 - "Community 14"
|
||||
Cohesion: 0.06
|
||||
Nodes (62): complete_application(), create_basic_experiment_sale_schedules(), create_infusion_plan(), create_schedule(), _create_schedule_products(), _format_yyyy_mm_dd(), _generate_application_no(), get_application() (+54 more)
|
||||
Cohesion: 0.08
|
||||
Nodes (57): api_save_application(), auto_generate_schedules(), complete_application(), create_application(), create_basic_experiment_sale_schedules(), create_infusion_plan(), create_schedule(), _create_schedule_products() (+49 more)
|
||||
|
||||
### Community 15 - "Community 15"
|
||||
Cohesion: 0.07
|
||||
Nodes (38): get_designer_data(), list_results_by_task(), _list_saved_results_by_task(), list_saved_results_by_task_ids(), _merge_saved_into_template(), _resolve_task_item_ref(), _row_to_dict(), save_results_for_task() (+30 more)
|
||||
|
||||
### Community 16 - "Community 16"
|
||||
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 16 - "Community 16"
|
||||
Cohesion: 0.21
|
||||
Nodes (19): _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() (+11 more)
|
||||
|
||||
### Community 17 - "Community 17"
|
||||
Cohesion: 0.2
|
||||
Nodes (18): _code_exists(), _dec(), _fmt_dt(), get_material(), get_material_entity(), get_my_usages(), _is_enabled_status(), list_materials() (+10 more)
|
||||
Cohesion: 0.19
|
||||
Nodes (27): _amount_for_row(), _batch_map(), deduct_for_task(), _deduct_task_usage_legacy_batch(), _display_remark(), _fmt_date_val(), _linked_qc_task_no_map(), list_linked_task_usages() (+19 more)
|
||||
|
||||
### Community 18 - "Community 18"
|
||||
Cohesion: 0.19
|
||||
Nodes (17): apply_trip_kit_days(), calc_trip_leg_days(), _day_index(), _end_offset(), _extract_rules(), is_half_day_multiple(), _kit_trip_fields(), 出差套件:半日制行程时长(与前端 oa-trip-days.ts 对齐) (+9 more)
|
||||
Cohesion: 0.2
|
||||
Nodes (19): _code_exists(), create_material(), _dec(), _fmt_dt(), get_material(), get_material_entity(), get_my_usages(), _is_enabled_status() (+11 more)
|
||||
|
||||
### Community 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)
|
||||
Cohesion: 0.22
|
||||
Nodes (15): apply_trip_kit_days(), calc_trip_leg_days(), _day_index(), _end_offset(), _extract_rules(), is_half_day_multiple(), 出差套件:半日制行程时长(与前端 oa-trip-days.ts 对齐), 遍历 tripKit:行程未手改则覆盖 duration;出差天数未手改则覆盖为各行程时长之和。 (+7 more)
|
||||
|
||||
### Community 20 - "Community 20"
|
||||
Cohesion: 0.23
|
||||
Nodes (12): Config, ProductBase, ProductCategoryBase, ProductCategoryCreate, ProductCategoryResponse, ProductCreate, ProductResponse, ProductUnitBase (+4 more)
|
||||
Cohesion: 0.27
|
||||
Nodes (12): create_equipment(), _dec(), equipment_code_exists(), equipment_is_referenced(), get_equipment(), list_equipments(), _norm_status(), _parse_date() (+4 more)
|
||||
|
||||
### Community 21 - "Community 21"
|
||||
Cohesion: 0.32
|
||||
Nodes (13): _assert_item_ids_exist(), create_template(), filter_active_ids(), get_template(), join_id_list(), list_active_templates(), list_templates(), parse_id_csv() (+5 more)
|
||||
|
||||
### Community 22 - "Community 22"
|
||||
Cohesion: 0.27
|
||||
Nodes (12): _field_label(), _is_empty(), _is_required(), _parse_money(), OA 表单设计器:金额控件 form_data 校验, 校验 form_data 中金额控件的值格式,返回中文错误列表(空表示通过)。, 解析金额值。成功返回 (number, None);失败返回 (None, error_key)。, _rule_props() (+4 more)
|
||||
|
||||
### Community 22 - "Community 22"
|
||||
### Community 23 - "Community 23"
|
||||
Cohesion: 0.24
|
||||
Nodes (11): deduct_for_step(), _display_remark(), list_stock_logs(), _parse_receiver_purpose_from_remark(), 试剂变动记录 CRUD(biz_reagent_stock_log), 撤销步骤此前 step_save 扣减,便于重新填报。, 扣减试剂库存并生成变动记录。调用方控制事务,本函数不 commit。, _resolve_receiver_purpose() (+3 more)
|
||||
|
||||
### Community 24 - "Community 24"
|
||||
Cohesion: 0.24
|
||||
Nodes (11): deduct_for_step(), _display_remark(), list_stock_logs(), _parse_receiver_purpose_from_remark(), 耗材变动记录 CRUD(biz_consumable_stock_log), 撤销步骤此前 step_save 扣减,便于重新填报。, 扣减耗材库存并生成变动记录。调用方控制事务,本函数不 commit。, _resolve_receiver_purpose() (+3 more)
|
||||
|
||||
### Community 23 - "Community 23"
|
||||
### Community 25 - "Community 25"
|
||||
Cohesion: 0.27
|
||||
Nodes (11): _build_tree(), _cascade_soft_delete(), _collect_with_ancestors(), create_dept(), get_dept(), list_depts(), list_depts_tree(), 保留匹配节点及其全部上级,供关键词检索后仍能正确组树。 (+3 more)
|
||||
|
||||
### Community 26 - "Community 26"
|
||||
Cohesion: 0.31
|
||||
Nodes (10): create_account(), _filtered_query(), get_account(), list_accounts(), list_options(), OA 收款账户 CRUD(oa_receive_account), row_to_dict(), soft_delete_account() (+2 more)
|
||||
|
||||
### Community 24 - "Community 24"
|
||||
Cohesion: 0.31
|
||||
Nodes (10): _build_tree(), _cascade_soft_delete(), _collect_with_ancestors(), get_dept(), list_depts(), list_depts_tree(), 保留匹配节点及其全部上级,供关键词检索后仍能正确组树。, _row_to_dict() (+2 more)
|
||||
|
||||
### Community 25 - "Community 25"
|
||||
Cohesion: 0.33
|
||||
Nodes (8): _build_tree(), _cascade_soft_delete(), get_menu(), list_menus(), list_menus_tree(), _row_to_dict(), soft_delete_menu(), update_menu()
|
||||
|
||||
### Community 26 - "Community 26"
|
||||
### Community 27 - "Community 27"
|
||||
Cohesion: 0.29
|
||||
Nodes (2): BaseModel, SoftDeleteModel
|
||||
|
||||
### Community 27 - "Community 27"
|
||||
### Community 28 - "Community 28"
|
||||
Cohesion: 0.38
|
||||
Nodes (6): derive_legacy_status_from_three(), derive_three_status_from_legacy(), 阶段A兼容:从旧 status 推导三字段。 约束:旧 status 本身混合了支付/配送/订单生命周期,因此只能尽力推断; 若业务侧已有更精确, 阶段A兼容:从三字段反推旧 status(用于旧前端/旧筛选参数兼容)。, ThreeStatus, _to_decimal()
|
||||
|
||||
### Community 28 - "Community 28"
|
||||
### Community 29 - "Community 29"
|
||||
Cohesion: 0.4
|
||||
Nodes (5): batch_matches_stock_status(), normalize_batch_stock_status(), 质检物料入库批次:按剩余数量过滤的语义辅助。, 纯函数判定(供单测);list_batches 用 SQL 等价条件。, 返回 'available' | 'exhausted';全部 / 空 / 非法 → None(不加剩余数量条件)。
|
||||
|
||||
### Community 29 - "Community 29"
|
||||
### Community 30 - "Community 30"
|
||||
Cohesion: 0.5
|
||||
Nodes (3): BaseSettings, Config, Settings
|
||||
|
||||
### Community 30 - "Community 30"
|
||||
### Community 31 - "Community 31"
|
||||
Cohesion: 0.5
|
||||
Nodes (2): _auto_fill_create_dept_id(), ORM before_insert 钩子:当 create_dept_id 为空时,自动从请求上下文填充当前用户部门 ID
|
||||
|
||||
### Community 31 - "Community 31"
|
||||
Cohesion: 0.67
|
||||
Nodes (2): get_menu_list(), 运营端菜单接口(与 web-admin 前端静态路由 sqxp.ts 对齐,5 个一级菜单分组)
|
||||
|
||||
### Community 32 - "Community 32"
|
||||
Cohesion: 0.67
|
||||
Nodes (1): 转正套件:入职日 + 试用期月数 → 建议转正日(YYYY-MM-DD)。
|
||||
@@ -249,11 +249,9 @@ Nodes (1): 发送催单通知给配送员 Args: del
|
||||
## Knowledge Gaps
|
||||
- **178 isolated node(s):** `刷新会话 TTL(refreshToken 续期;已登录用户每次 API 校验通过后滑动续期)`, `写入 refreshToken(用于 one-time 使用/吊销)`, `根据 token 获取当前用户(包含 Redis 会话校验;会话滑动续期)`, `登录凭据 RSA 解密(与前端 JSEncrypt PKCS#1 v1.5 兼容)。`, `加载 RSA 密钥对:优先环境变量,否则使用内置固定默认密钥。` (+173 more)
|
||||
These have ≤1 connection - possible missing edges or undocumented components.
|
||||
- **Thin community `Community 26`** (8 nodes): `BaseModel`, `.to_dict()`, `get_active()`, `base.py`, `SoftDeleteModel`, `.restore()`, `.soft_delete()`, `__tablename__()`
|
||||
- **Thin community `Community 27`** (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 30`** (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 31`** (3 nodes): `get_menu_list()`, `menu.py`, `运营端菜单接口(与 web-admin 前端静态路由 sqxp.ts 对齐,5 个一级菜单分组)`
|
||||
- **Thin community `Community 31`** (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 32`** (3 nodes): `add_months_ymd()`, `oa_confirmation_date.py`, `转正套件:入职日 + 试用期月数 → 建议转正日(YYYY-MM-DD)。`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
@@ -279,17 +277,17 @@ Nodes (1): 发送催单通知给配送员 Args: del
|
||||
## Suggested Questions
|
||||
_Questions this graph is uniquely positioned to answer:_
|
||||
|
||||
- **Why does `SysUser` connect `Community 2` to `Community 0`, `Community 1`, `Community 3`, `Community 4`, `Community 5`, `Community 7`, `Community 8`, `Community 9`, `Community 11`, `Community 12`, `Community 13`, `Community 22`?**
|
||||
_High betweenness centrality (0.121) - this node is a cross-community bridge._
|
||||
- **Why does `success_response()` connect `Community 0` to `Community 2`, `Community 6`, `Community 8`, `Community 9`, `Community 12`, `Community 13`, `Community 31`?**
|
||||
_High betweenness centrality (0.046) - this node is a cross-community bridge._
|
||||
- **Why does `OaEngineError` connect `Community 7` to `Community 1`, `Community 2`?**
|
||||
_High betweenness centrality (0.039) - this node is a cross-community bridge._
|
||||
- **Are the 915 inferred relationships involving `str` (e.g. with `unhandled_exception_handler()` and `get_current_user_by_token()`) actually correct?**
|
||||
_`str` has 915 INFERRED edges - model-reasoned connections that need verification._
|
||||
- **Are the 759 inferred relationships involving `success_response()` (e.g. with `list_storage_release_reviews()` and `get_storage_release_review_detail()`) actually correct?**
|
||||
_`success_response()` has 759 INFERRED edges - model-reasoned connections that need verification._
|
||||
- **Are the 629 inferred relationships involving `error_response()` (e.g. with `_json_error_response()` and `list_storage_release_reviews()`) actually correct?**
|
||||
_`error_response()` has 629 INFERRED edges - model-reasoned connections that need verification._
|
||||
- **Why does `SysUser` connect `Community 2` to `Community 0`, `Community 1`, `Community 3`, `Community 4`, `Community 5`, `Community 6`, `Community 8`, `Community 10`, `Community 12`, `Community 13`, `Community 15`, `Community 23`, `Community 24`?**
|
||||
_High betweenness centrality (0.105) - this node is a cross-community bridge._
|
||||
- **Why does `success_response()` connect `Community 0` to `Community 1`, `Community 2`, `Community 3`, `Community 8`, `Community 9`, `Community 11`, `Community 13`, `Community 14`, `Community 15`?**
|
||||
_High betweenness centrality (0.045) - this node is a cross-community bridge._
|
||||
- **Why does `OaEngineError` connect `Community 6` to `Community 1`, `Community 2`?**
|
||||
_High betweenness centrality (0.036) - this node is a cross-community bridge._
|
||||
- **Are the 922 inferred relationships involving `str` (e.g. with `unhandled_exception_handler()` and `get_current_user_by_token()`) actually correct?**
|
||||
_`str` has 922 INFERRED edges - model-reasoned connections that need verification._
|
||||
- **Are the 760 inferred relationships involving `success_response()` (e.g. with `list_storage_release_reviews()` and `get_storage_release_review_detail()`) actually correct?**
|
||||
_`success_response()` has 760 INFERRED edges - model-reasoned connections that need verification._
|
||||
- **Are the 630 inferred relationships involving `error_response()` (e.g. with `_json_error_response()` and `list_storage_release_reviews()`) actually correct?**
|
||||
_`error_response()` has 630 INFERRED edges - model-reasoned connections that need verification._
|
||||
- **Are the 603 inferred relationships involving `SysUser` (e.g. with `数据权限过滤(V0.3:基于角色 data_scope 的查询级行级过滤) data_scope 值: 1 = 全部数据 2 = 本部门数据 3` and `从 SysUser 读取用户的 dept_id。`) actually correct?**
|
||||
_`SysUser` has 603 INFERRED edges - model-reasoned connections that need verification._
|
||||
+4562
-3674
File diff suppressed because it is too large.
Load diff
@@ -208,9 +208,9 @@
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/pre_transit_sample.py": 1786938943.6929982,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/qc_sms_notification.py": 1780326875.7886882,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/research_donation_sample_collection.py": 1780457788.2998126,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/oa_approval.py": 1787885396.9678786,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/oa_approval.py": 1787892843.1222966,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/operations.py": 1785213144.2881503,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/menu.py": 1787112431.3662364,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/menu.py": 1787887339.1254666,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/pilot_delivery.py": 1779655584.820777,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/admin.py": 1786010386.7044516,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/env_detect.py": 1786945487.513935,
|
||||
@@ -227,7 +227,7 @@
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/protocol_sample_collection.py": 1780457788.2093296,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/leave.py": 1779266168.8693042,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/api/clinical_payment.py": 1781750841.074568,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/services/oa_engine.py": 1787885250.853435,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/services/oa_engine.py": 1787892839.3046124,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/services/oa_overtime_hours.py": 1786373766.5113294,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/services/workflow_callback.py": 1778727966.7277644,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/services/qc_work_order_fee_summary.py": 1783329884.6125586,
|
||||
@@ -245,7 +245,7 @@
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/services/oa_trip_days.py": 1785407394.0606225,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/services/protocol_payment_installment.py": 1781432208.0765035,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/services/protocol_sample_list_summary.py": 1785207474.9871266,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/services/oa_related_approval.py": 1786413868.1112978,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/services/oa_related_approval.py": 1787892816.3154016,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/services/wechat_mp_message.py": 1786689383.1677845,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/services/oa_leave_hours.py": 1785397787.0493405,
|
||||
"/Users/wuzilong/work/00code/zkxw/backend/app/services/oa_resignation_kit_sync.py": 1785405020.285242,
|
||||
|
||||
@@ -0,0 +1,235 @@
|
||||
#!/usr/bin/env python3
|
||||
"""为 SOP 模板正文表非主操作区行添加 sop-row-hidden,并重新生成 seed SQL。"""
|
||||
from __future__ import annotations
|
||||
|
||||
import re
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[2]
|
||||
TEMPLATES_DIR = ROOT / "docs" / "sop-templates"
|
||||
SQL_DIR = ROOT / "docs" / "sql"
|
||||
|
||||
SOP_CODES = [
|
||||
"SOP-CC-001-E01-01",
|
||||
"SOP-CC-002-E01-01",
|
||||
"SOP-CC-003-E01-01",
|
||||
"SOP-CC-006-E01-01",
|
||||
"SOP-SC-003-E01-01",
|
||||
"SOP-SC-004-E01-01",
|
||||
"SOP-SC-005-E01-01",
|
||||
"SOP-SC-006-E01-01",
|
||||
"SOP-SC-007-E01-01",
|
||||
"SOP-SC-008-E01-01",
|
||||
"SOP-SC-009-E01-01",
|
||||
"SOP-SC-010-E01-01",
|
||||
"SOP-SC-011-E01-01",
|
||||
"SOP-SC-012-E01-01",
|
||||
"SOP-SC-013-E01-01",
|
||||
"SOP-SC-014-E01-01",
|
||||
]
|
||||
|
||||
SC014_NK_ROW_OLD = (
|
||||
'<tr>\n'
|
||||
' <td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">'
|
||||
"NK细胞<br />培养</td>\n"
|
||||
' <td colspan="11" style="border:1px solid #334155; padding:10px; vertical-align:top; word-wrap:break-word; overflow-wrap:break-word;">'
|
||||
)
|
||||
SC014_NK_ROW_NEW = (
|
||||
'<tr class="sop-fill-row">\n'
|
||||
' <td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">'
|
||||
"NK细胞<br />培养</td>\n"
|
||||
' <td class="sop-fill-cell" colspan="11" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%; word-wrap:break-word; overflow-wrap:break-word;">'
|
||||
)
|
||||
|
||||
|
||||
def _is_tr_open(html: str, pos: int) -> bool:
|
||||
if not html.startswith("<tr", pos):
|
||||
return False
|
||||
nxt = html[pos + 3 : pos + 4]
|
||||
return nxt in ("", " ", ">", "/", "\n", "\t", "\r")
|
||||
|
||||
|
||||
def _split_top_level_trs(html: str) -> list[str]:
|
||||
rows: list[str] = []
|
||||
i = 0
|
||||
n = len(html)
|
||||
while i < n:
|
||||
start = html.find("<tr", i)
|
||||
if start < 0 or not _is_tr_open(html, start):
|
||||
break
|
||||
depth = 0
|
||||
pos = start
|
||||
while pos < n:
|
||||
if _is_tr_open(html, pos):
|
||||
depth += 1
|
||||
pos += 3
|
||||
continue
|
||||
if html.startswith("</tr>", pos):
|
||||
depth -= 1
|
||||
pos += 5
|
||||
if depth == 0:
|
||||
rows.append(html[start:pos])
|
||||
i = pos
|
||||
break
|
||||
continue
|
||||
pos += 1
|
||||
else:
|
||||
raise ValueError("unclosed <tr> in sop-body-table tbody")
|
||||
return rows
|
||||
|
||||
|
||||
def _add_hidden_class(tr_html: str) -> str:
|
||||
open_tag = tr_html.split(">", 1)[0] + ">"
|
||||
if "sop-fill-row" in open_tag:
|
||||
return tr_html
|
||||
|
||||
def _patch_tr_tag(match: re.Match[str]) -> str:
|
||||
tag = match.group(0)
|
||||
if 'class="' in tag:
|
||||
return re.sub(
|
||||
r'class="([^"]*)"',
|
||||
lambda m: f'class="{m.group(1)} sop-row-hidden"',
|
||||
tag,
|
||||
count=1,
|
||||
)
|
||||
return tag.replace("<tr", '<tr class="sop-row-hidden"', 1)
|
||||
|
||||
return re.sub(r"<tr[^>]*>", _patch_tr_tag, tr_html, count=1)
|
||||
|
||||
|
||||
def _find_body_tbody_span(html: str) -> tuple[int, int] | None:
|
||||
body_start = html.find('<table class="sop-body-table"')
|
||||
if body_start < 0:
|
||||
return None
|
||||
tbody_open = html.find("<tbody>", body_start)
|
||||
if tbody_open < 0:
|
||||
return None
|
||||
inner_start = tbody_open + len("<tbody>")
|
||||
table_depth = 1
|
||||
tbody_depth = 1
|
||||
pos = inner_start
|
||||
n = len(html)
|
||||
while pos < n:
|
||||
if html.startswith("<table", pos):
|
||||
table_depth += 1
|
||||
pos += 6
|
||||
continue
|
||||
if html.startswith("</table>", pos):
|
||||
table_depth -= 1
|
||||
pos += 8
|
||||
continue
|
||||
if html.startswith("<tbody>", pos):
|
||||
tbody_depth += 1
|
||||
pos += 7
|
||||
continue
|
||||
if html.startswith("</tbody>", pos):
|
||||
tbody_depth -= 1
|
||||
pos += 8
|
||||
if tbody_depth == 0:
|
||||
return inner_start, pos - 8
|
||||
continue
|
||||
pos += 1
|
||||
raise ValueError("无法定位 sop-body-table 的 tbody 结束位置")
|
||||
|
||||
|
||||
def process_body_table(html: str) -> str:
|
||||
span = _find_body_tbody_span(html)
|
||||
if span is None:
|
||||
return html
|
||||
inner_start, inner_end = span
|
||||
tbody_inner = html[inner_start:inner_end]
|
||||
rows = _split_top_level_trs(tbody_inner)
|
||||
processed = [_add_hidden_class(row) for row in rows]
|
||||
return html[:inner_start] + "".join(processed) + html[inner_end:]
|
||||
|
||||
|
||||
def process_template(html: str, code: str) -> str:
|
||||
html = html.replace(
|
||||
'<table class="sop-header-table"',
|
||||
'<table class="sop-header-table sop-row-hidden"',
|
||||
1,
|
||||
)
|
||||
if code == "SOP-SC-014-E01-01":
|
||||
html = html.replace(SC014_NK_ROW_OLD, SC014_NK_ROW_NEW)
|
||||
html = html.replace("sop-a4-pages-2", "sop-a4-pages-1")
|
||||
html = re.sub(
|
||||
r"min-height:\s*594mm;\s*height:\s*auto;",
|
||||
"height: 297mm; min-height: 297mm;",
|
||||
html,
|
||||
)
|
||||
return process_body_table(html)
|
||||
|
||||
|
||||
def sql_escape(html: str) -> str:
|
||||
return html.replace("\\", "\\\\").replace("'", "''")
|
||||
|
||||
|
||||
def write_seed_sql(code: str, html: str) -> None:
|
||||
short = code.replace("SOP-", "").replace("-E01-01", "").lower()
|
||||
sql_path = SQL_DIR / f"2026-08-25-seed-sop-{short}-content.sql"
|
||||
comment = html.split("\n", 1)[0].strip().removeprefix("<!-- ").removesuffix(" -->")
|
||||
escaped = sql_escape(html)
|
||||
sql_path.write_text(
|
||||
"\n".join(
|
||||
[
|
||||
f"-- 种子数据: {code} {comment.split('(')[0].strip()}",
|
||||
f"-- 源文件: docs/sop-templates/{code}.html",
|
||||
"",
|
||||
"UPDATE `biz_process`",
|
||||
"SET `sop_content` = '"
|
||||
f"{escaped}"
|
||||
"',",
|
||||
" `update_time` = NOW()",
|
||||
f"WHERE `process_code` = '{code}'",
|
||||
" AND `del_flag` = 0;",
|
||||
"",
|
||||
]
|
||||
),
|
||||
encoding="utf-8",
|
||||
)
|
||||
|
||||
|
||||
def write_deploy_bundle() -> Path:
|
||||
"""合并 seed + sync SQL,供测试/生产一次性执行。"""
|
||||
deploy_path = SQL_DIR / "2026-08-28-sop-visible-section-only-deploy.sql"
|
||||
parts = [
|
||||
"-- =============================================================================",
|
||||
"-- SOP 精简展示:仅保留主操作记录区(页眉与其余正文行均已隐藏)",
|
||||
"-- 生成时间: 由 backend/scripts/apply_sop_row_hidden.py 自动生成",
|
||||
"-- 执行顺序: 先 seed 工艺库 → 再 sync 路线/任务步骤",
|
||||
"--",
|
||||
"-- 【生产环境】推荐方式(二选一):",
|
||||
"-- A) mysql -h <host> -u <user> -p <dbname> < docs/sql/2026-08-28-sop-visible-section-only-deploy.sql",
|
||||
"-- B) ENV_FILE=.env.production python3 backend/scripts/run_sop_visible_deploy.py",
|
||||
"-- =============================================================================",
|
||||
"",
|
||||
]
|
||||
for code in SOP_CODES:
|
||||
short = code.replace("SOP-", "").replace("-E01-01", "").lower()
|
||||
seed = SQL_DIR / f"2026-08-25-seed-sop-{short}-content.sql"
|
||||
sync = SQL_DIR / f"2026-08-25-sync-sop-{short}-content-to-routes-tasks.sql"
|
||||
parts.append(f"-- ---------- {code} seed ----------")
|
||||
parts.append(seed.read_text(encoding="utf-8").strip())
|
||||
parts.append("")
|
||||
if sync.exists():
|
||||
parts.append(f"-- ---------- {code} sync ----------")
|
||||
parts.append(sync.read_text(encoding="utf-8").strip())
|
||||
parts.append("")
|
||||
deploy_path.write_text("\n".join(parts) + "\n", encoding="utf-8")
|
||||
return deploy_path
|
||||
|
||||
|
||||
def main() -> None:
|
||||
for code in SOP_CODES:
|
||||
path = TEMPLATES_DIR / f"{code}.html"
|
||||
html = path.read_text(encoding="utf-8")
|
||||
updated = process_template(html, code)
|
||||
path.write_text(updated, encoding="utf-8")
|
||||
write_seed_sql(code, updated)
|
||||
print(f"{code}: done")
|
||||
deploy = write_deploy_bundle()
|
||||
print(f"deploy bundle: {deploy}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,85 @@
|
||||
#!/usr/bin/env python3
|
||||
"""在测试/本地库执行 SOP 精简展示部署 SQL。"""
|
||||
from __future__ import annotations
|
||||
|
||||
import re
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[2]
|
||||
sys.path.insert(0, str(ROOT / "backend"))
|
||||
|
||||
from sqlalchemy import create_engine, text # noqa: E402
|
||||
|
||||
try:
|
||||
from app.core.config import settings # noqa: E402
|
||||
except Exception as exc: # pragma: no cover
|
||||
raise SystemExit(f"无法加载 backend 配置: {exc}") from exc
|
||||
|
||||
SQL_DIR = ROOT / "docs" / "sql"
|
||||
|
||||
SOP_CODES = [
|
||||
"SOP-CC-001-E01-01",
|
||||
"SOP-CC-002-E01-01",
|
||||
"SOP-CC-003-E01-01",
|
||||
"SOP-CC-006-E01-01",
|
||||
"SOP-SC-003-E01-01",
|
||||
"SOP-SC-004-E01-01",
|
||||
"SOP-SC-005-E01-01",
|
||||
"SOP-SC-006-E01-01",
|
||||
"SOP-SC-007-E01-01",
|
||||
"SOP-SC-008-E01-01",
|
||||
"SOP-SC-009-E01-01",
|
||||
"SOP-SC-010-E01-01",
|
||||
"SOP-SC-011-E01-01",
|
||||
"SOP-SC-012-E01-01",
|
||||
"SOP-SC-013-E01-01",
|
||||
"SOP-SC-014-E01-01",
|
||||
]
|
||||
|
||||
UPDATE_STMT_RE = re.compile(r"\bUPDATE\b.+?;", re.IGNORECASE | re.DOTALL)
|
||||
|
||||
|
||||
def _strip_sql_comments(sql: str) -> str:
|
||||
lines = []
|
||||
for line in sql.splitlines():
|
||||
if line.strip().startswith("--"):
|
||||
continue
|
||||
lines.append(line)
|
||||
return "\n".join(lines)
|
||||
|
||||
|
||||
def _run_seed_file(conn, path: Path) -> int:
|
||||
sql = path.read_text(encoding="utf-8").strip()
|
||||
if not sql:
|
||||
return 0
|
||||
result = conn.execute(text(sql))
|
||||
return result.rowcount or 0
|
||||
|
||||
|
||||
def _run_sync_file(conn, path: Path) -> int:
|
||||
raw = _strip_sql_comments(path.read_text(encoding="utf-8"))
|
||||
total = 0
|
||||
for stmt in UPDATE_STMT_RE.findall(raw):
|
||||
result = conn.execute(text(stmt.strip()))
|
||||
total += result.rowcount or 0
|
||||
return total
|
||||
|
||||
|
||||
def main() -> None:
|
||||
engine = create_engine(settings.DATABASE_URL)
|
||||
total = 0
|
||||
with engine.begin() as conn:
|
||||
for code in SOP_CODES:
|
||||
short = code.replace("SOP-", "").replace("-E01-01", "").lower()
|
||||
seed = SQL_DIR / f"2026-08-25-seed-sop-{short}-content.sql"
|
||||
sync = SQL_DIR / f"2026-08-25-sync-sop-{short}-content-to-routes-tasks.sql"
|
||||
n1 = _run_seed_file(conn, seed)
|
||||
n2 = _run_sync_file(conn, sync) if sync.exists() else 0
|
||||
total += n1 + n2
|
||||
print(f"{code}: process={n1}, sync={n2}")
|
||||
print(f"done, affected rows (approx): {total}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -8,7 +8,7 @@ from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
|
||||
from app.models.base import Base
|
||||
from app.models.models import OaApp, OaAppVersion, OaInstance, OaTask, SysUser
|
||||
from app.models.models import OaApp, OaAppVersion, OaInstance, OaInstanceEvent, OaTask, SysUser
|
||||
from app.services import oa_engine
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@ class TestOaInstanceHistory(unittest.TestCase):
|
||||
SysUser.__table__,
|
||||
OaInstance.__table__,
|
||||
OaTask.__table__,
|
||||
OaInstanceEvent.__table__,
|
||||
],
|
||||
)
|
||||
Session = sessionmaker(bind=self.engine, autoflush=False, autocommit=False)
|
||||
@@ -50,7 +51,7 @@ class TestOaInstanceHistory(unittest.TestCase):
|
||||
version_no=1,
|
||||
status="published",
|
||||
is_latest_published="1",
|
||||
form_schema_json='{"rule":[{"type":"input","field":"leaveType","title":"请假类型"},{"type":"input","field":"days","title":"天数"}]}',
|
||||
form_schema_json='{"rule":[{"type":"input","field":"leaveType","title":"请假类型"},{"type":"input","field":"days","title":"天数"},{"type":"upload","field":"voucher","title":"付款凭证"}]}',
|
||||
flow_tree_json="{}",
|
||||
advanced_settings_json="{}",
|
||||
tenant_no="zkxw",
|
||||
@@ -87,7 +88,7 @@ class TestOaInstanceHistory(unittest.TestCase):
|
||||
app_version_id="v-leave",
|
||||
title="请假-张三",
|
||||
initiator_user_id="u-a",
|
||||
form_data_json='{"leaveType":"年假","days":"2"}',
|
||||
form_data_json='{"leaveType":"年假","days":"2","voucher":"f33a569a9dd64f2c853899498cd47498.png"}',
|
||||
status="completed",
|
||||
tenant_no="zkxw",
|
||||
create_dept_id="",
|
||||
@@ -203,6 +204,57 @@ class TestOaInstanceHistory(unittest.TestCase):
|
||||
if pf:
|
||||
self.assertGreaterEqual(len(pf), 1)
|
||||
|
||||
def test_preview_fields_keep_upload_files(self):
|
||||
data = oa_engine.list_instance_history(
|
||||
self.db,
|
||||
tenant_no="zkxw",
|
||||
user_id="u-a",
|
||||
can_view_all=False,
|
||||
app_id="app-leave",
|
||||
)
|
||||
pf = data["list"][0].get("previewFields") or []
|
||||
voucher = next((f for f in pf if f.get("label") == "付款凭证"), None)
|
||||
self.assertIsNotNone(voucher)
|
||||
self.assertEqual(voucher.get("fieldType"), "upload")
|
||||
self.assertEqual(
|
||||
voucher.get("files"),
|
||||
[
|
||||
{
|
||||
"url": "f33a569a9dd64f2c853899498cd47498.png",
|
||||
"name": "f33a569a9dd64f2c853899498cd47498.png",
|
||||
}
|
||||
],
|
||||
)
|
||||
|
||||
def test_export_history_rows(self):
|
||||
data = oa_engine.export_instance_history(
|
||||
self.db,
|
||||
tenant_no="zkxw",
|
||||
user_id="u-a",
|
||||
can_view_all=False,
|
||||
app_id="app-leave",
|
||||
)
|
||||
self.assertEqual(data["total"], 1)
|
||||
self.assertGreaterEqual(len(data["businessColumns"]), 1)
|
||||
self.assertEqual(len(data["fixedColumns"]), 13)
|
||||
row = data["rows"][0]
|
||||
self.assertEqual(row["id"], "inst-alice-done")
|
||||
self.assertEqual(row["business"].get("leaveType"), "年假")
|
||||
self.assertEqual(row["fixed"].get("initiatorName"), "张三")
|
||||
self.assertIn("approvalRecord", row["fixed"])
|
||||
|
||||
def test_export_selected_ids_only(self):
|
||||
data = oa_engine.export_instance_history(
|
||||
self.db,
|
||||
tenant_no="zkxw",
|
||||
user_id="u-a",
|
||||
can_view_all=True,
|
||||
app_id="app-leave",
|
||||
instance_ids=["inst-bob-run"],
|
||||
)
|
||||
self.assertEqual(data["total"], 1)
|
||||
self.assertEqual(data["rows"][0]["id"], "inst-bob-run")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
@@ -27,11 +27,19 @@ class TestFlatten(unittest.TestCase):
|
||||
fields = flatten_form_fields_for_summary(schema, data)
|
||||
labels = [f["label"] for f in fields]
|
||||
self.assertNotIn("说明", labels)
|
||||
self.assertEqual(fields[0], {"label": "事由", "value": "出差"})
|
||||
self.assertEqual(fields[0], {"fieldKey": "reason", "label": "事由", "value": "出差"})
|
||||
self.assertEqual(
|
||||
fields[1]["value"],
|
||||
"a.png、b.png",
|
||||
)
|
||||
self.assertEqual(fields[1].get("fieldType"), "upload")
|
||||
self.assertEqual(
|
||||
fields[1].get("files"),
|
||||
[
|
||||
{"url": "https://cdn.example.com/a.png", "name": "a.png"},
|
||||
{"url": "https://cdn.example.com/b.png", "name": "b.png"},
|
||||
],
|
||||
)
|
||||
self.assertTrue(fields[1].get("fullWidth"))
|
||||
self.assertEqual(fields[2]["value"], "已关联 2 条")
|
||||
self.assertEqual(fields[2].get("relatedIds"), ["id1", "id2"])
|
||||
@@ -117,6 +125,13 @@ class TestFlatten(unittest.TestCase):
|
||||
fields[0]["value"],
|
||||
"a.pdf、b.pdf",
|
||||
)
|
||||
self.assertEqual(
|
||||
fields[0].get("files"),
|
||||
[
|
||||
{"url": "https://cdn.example.com/a.pdf", "name": "a.pdf"},
|
||||
{"url": "/mini/b.pdf", "name": "b.pdf"},
|
||||
],
|
||||
)
|
||||
|
||||
def test_extract_links_with_field_key_and_dedupe(self):
|
||||
schema = {
|
||||
@@ -207,7 +222,7 @@ class TestFlatten(unittest.TestCase):
|
||||
fields = flatten_form_fields_for_summary(schema, {"kit1": {"x": 1}, "reason": "学习"})
|
||||
labels = [f["label"] for f in fields]
|
||||
self.assertNotIn("出差套件", labels)
|
||||
self.assertEqual(fields[0], {"label": "出差事由", "value": "学习"})
|
||||
self.assertEqual(fields[0], {"fieldKey": "reason", "label": "出差事由", "value": "学习"})
|
||||
|
||||
|
||||
class TestValidateLinkable(unittest.TestCase):
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<!-- SOP-CC-001-E01-01 存储样本接收操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-cc-001" style="font-family: 'PingFang SC','Microsoft YaHei',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:43%" />
|
||||
@@ -39,19 +39,16 @@
|
||||
<col style="width:20.5%" />
|
||||
<col style="width:16.8%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="5" style="border:1px solid #334155; padding:8px;">工序: 样本接收</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="9" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -75,8 +72,7 @@
|
||||
<span class="sop-underline" style="text-align:left; min-width:96px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">样本接收<br />操作记录</td>
|
||||
<td class="sop-fill-cell" colspan="9" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 8px;">
|
||||
@@ -96,31 +92,26 @@
|
||||
<span class="sop-underline" style="text-align:left; min-width:220px;"> </span>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">细胞后续操作</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">后续操作记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="5" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="2" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -131,16 +122,13 @@
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="9" style="border:1px solid #334155; padding:8px; min-height:56px; height:56px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:10px;">主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -1,6 +1,6 @@
|
||||
<!-- SOP-CC-002-E01-01 造血干细胞制备标准操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-cc-002" style="font-family: 'PingFang SC','Microsoft YaHei',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:43%" />
|
||||
@@ -39,19 +39,16 @@
|
||||
<col style="width:22.2%" />
|
||||
<col style="width:14.0%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="5" style="border:1px solid #334155; padding:8px;">工序: 造血干细胞制备标准操作记录</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="9" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -72,8 +69,7 @@
|
||||
<span class="sop-underline" style="text-align:left; min-width:96px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">造血干细胞<br />富集标准<br />操作记录</td>
|
||||
<td class="sop-fill-cell" colspan="9" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 6px;">
|
||||
@@ -99,35 +95,29 @@
|
||||
<p style="margin:0 0 6px;">10. 离心结束后分浆夹在转移袋白细胞层上1cm处夹紧, 进行分浆. 在血浆全部流至导管后关闭血袋导管上的夹子.</p>
|
||||
<p style="margin:0;">11. 热合仪热合导管, 分开采血袋与转移袋.</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">采血袋后续操作</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">转移袋后续操作</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">后续操作记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="5" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="2" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -138,16 +128,13 @@
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="9" style="border:1px solid #334155; padding:8px; min-height:56px; height:56px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:10px;">主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -1,6 +1,6 @@
|
||||
<!-- SOP-CC-003-E01-01 造血干细胞冻存操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-cc-003" style="font-family: 'PingFang SC','Microsoft YaHei',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:43%" />
|
||||
@@ -45,38 +45,32 @@
|
||||
<col style="width:9.875%" />
|
||||
<col style="width:9.875%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="5" style="border:1px solid #334155; padding:8px;">工序: 造血干细胞冻存</td>
|
||||
<td colspan="1" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="1" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">试剂</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:8px; text-align:center;">名称</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; text-align:center;">生产厂家</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; text-align:center;">批号</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; text-align:center;">使用数量</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="3" style="border:1px solid #334155; padding:8px;">处理后血样</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; text-align:center;">/</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; text-align:center;">/</td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="3" style="border:1px solid #334155; padding:8px;">DMSO-DEX40冻存液</td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="9" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -111,8 +105,7 @@
|
||||
<span class="sop-underline" style="text-align:left; min-width:80px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">脐血干细胞<br />冻存操作<br />记录</td>
|
||||
<td class="sop-fill-cell" colspan="9" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 6px;">1. 混匀含白细胞的转移袋, 用注射器转移至冰冻袋内, 留样约1.5 ml于两个编码EP管中, 分别为约0.5 ml和约1 ml;</p>
|
||||
@@ -133,30 +126,26 @@
|
||||
7. 对应复苏操作记录编号: <span class="sop-underline" style="text-align:left; min-width:140px;"> </span>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">每个冻存袋上皆清楚标示细胞批号</td>
|
||||
<td colspan="4" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="4" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="5" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="4" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:0; vertical-align:middle;">
|
||||
<table class="sop-nested-table" border="1" style="width:100%; border-collapse:collapse; table-layout:fixed; border:none; margin:0;">
|
||||
<colgroup>
|
||||
@@ -179,12 +168,10 @@
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="9" style="border:1px solid #334155; padding:8px; min-height:48px; height:48px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="10" style="border:1px solid #334155; padding:0; vertical-align:middle;">
|
||||
<table class="sop-nested-table" border="1" style="width:100%; border-collapse:collapse; table-layout:fixed; border:none; margin:0;">
|
||||
<colgroup>
|
||||
@@ -201,7 +188,6 @@
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -1,6 +1,6 @@
|
||||
<!-- SOP-CC-006-E01-01 集落培养操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-cc-006" style="font-family: 'PingFang SC','Microsoft YaHei',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:43%" />
|
||||
@@ -41,44 +41,37 @@
|
||||
<col style="width:5.2%" />
|
||||
<col style="width:13.9%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">工序: 集落培养操作记录</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="4" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">试剂</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; text-align:center;">名称</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:8px; text-align:center;">生产厂家</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; text-align:center;">批号</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; text-align:center;">使用数量</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px;">CFU-GM试剂</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px;">HES试剂</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px;">低糖DMEM培养基</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -95,8 +88,7 @@
|
||||
<span class="sop-underline" style="text-align:left; min-width:80px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">造血干细胞<br />集落培养<br />操作记录</td>
|
||||
<td class="sop-fill-cell" colspan="11" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 6px;">
|
||||
@@ -112,31 +104,26 @@
|
||||
</p>
|
||||
<p style="margin:0;">6. 3号EP管混匀后吸取20μL加入48孔板.</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">48孔板后续操作</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">结果信息</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="1" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -147,16 +134,13 @@
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; min-height:48px; height:48px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -1,6 +1,6 @@
|
||||
<!-- SOP-SC-003-E01-01 人脐带间充质干细胞原代培养操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-sc-003" style="font-family: 'PingFang SC','Microsoft YaHei',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:43%" />
|
||||
@@ -41,50 +41,42 @@
|
||||
<col style="width:5.1%" />
|
||||
<col style="width:14.0%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">工序: 脐带MSC原代细胞培养</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="5" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">试剂</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; text-align:center;">名称</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:8px; text-align:center;">生产厂家</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; text-align:center;">批号</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; text-align:center;">使用数量</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px;">磷酸盐缓冲液(PBS)</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px;">MSC培养基</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px;">青/链霉素(双抗)</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px;">75%酒精</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -102,8 +94,7 @@
|
||||
<span class="sop-underline" style="text-align:left; min-width:80px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">脐带组织处理<br />及干细胞<br />原代培养</td>
|
||||
<td class="sop-fill-cell" colspan="11" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 6px;">
|
||||
@@ -138,30 +129,26 @@
|
||||
</p>
|
||||
<p style="margin:0;">11. 培养瓶上标记相关信息, 包括细胞来源、操作项目、操作时间、操作人等. 小心将培养瓶放入37℃, 5%CO<sub>2</sub>的培养箱中培养.</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">每个培养瓶上皆清楚标示细胞批号</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="1" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -172,16 +159,13 @@
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; min-height:48px; height:48px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -1,6 +1,6 @@
|
||||
<!-- SOP-SC-004-E01-01 人脐带间充质干细胞原代培养半换液操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-sc-004" style="font-family: 'PingFang SC','Microsoft YaHei',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:50%" />
|
||||
@@ -41,32 +41,27 @@
|
||||
<col style="width:5.2%" />
|
||||
<col style="width:13.6%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">工序: 脐带MSC原代细胞培养半换液</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="2" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">试剂</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; text-align:center;">名称</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:8px; text-align:center;">生产厂家</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; text-align:center;">批号</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; text-align:center;">使用数量</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px;">干细胞培养基</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -84,8 +79,7 @@
|
||||
<span class="sop-underline" style="text-align:left; min-width:80px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">干细胞原代<br />培养半换液</td>
|
||||
<td class="sop-fill-cell" colspan="11" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 6px;">
|
||||
@@ -153,8 +147,7 @@
|
||||
14. Day<span class="sop-underline" style="text-align:left; min-width:40px;"> </span>观察到爬出的细胞局部融合度达到80%-90%, 准备进行重铺.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">小结</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
细胞于Day <span class="sop-underline" style="text-align:left; min-width:40px;"> </span>开始观察到爬出; Day<span class="sop-underline" style="text-align:left; min-width:40px;"> </span>进行重铺,
|
||||
@@ -162,30 +155,26 @@
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
进行二次贴壁.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">每个培养瓶上是否皆清楚标示细胞批号</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="1" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -196,16 +185,13 @@
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; min-height:48px; height:48px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">生产主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -1,6 +1,6 @@
|
||||
<!-- SOP-SC-005-E01-01 人脐带间充质干细胞原代重铺操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-sc-005" style="font-family: 'PingFang SC','Microsoft YaHei',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:48%" />
|
||||
@@ -42,56 +42,47 @@
|
||||
<col style="width:5.1%" />
|
||||
<col style="width:13.7%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">工序: 脐带MSC原代重铺操作</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="6" style="border:1px solid #334155; padding:3px 6px; text-align:center; vertical-align:middle; line-height:1.25;">试剂</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">名称</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">生产厂家</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">批号</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">使用数量</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">磷酸盐缓冲液(PBS)</td>
|
||||
<td colspan="6" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">MSC完全培养基</td>
|
||||
<td colspan="6" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">胰酶</td>
|
||||
<td colspan="6" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">生理盐水</td>
|
||||
<td colspan="6" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">消化液</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">------</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">制定配制记录</td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="12" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -109,8 +100,7 @@
|
||||
<span class="sop-underline" style="text-align:left; min-width:80px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">干细胞原代<br />培养(重铺)</td>
|
||||
<td class="sop-fill-cell" colspan="12" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 6px;">
|
||||
@@ -137,30 +127,26 @@
|
||||
</p>
|
||||
<p style="margin:0;">8. 充分晃匀后做好重铺P1标记, 放入CO<sub>2</sub>培养箱进行继续培养.</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">每个培养瓶上皆清楚标示细胞批号</td>
|
||||
<td colspan="6" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="6" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="6" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="1" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -171,16 +157,13 @@
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="12" style="border:1px solid #334155; padding:8px; min-height:48px; height:48px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">生产主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -1,6 +1,6 @@
|
||||
<!-- SOP-SC-006-E01-01 人脐带间充质干细胞原代二次贴壁操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-sc-006" style="font-family: 'PingFang SC','Microsoft YaHei',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:50%" />
|
||||
@@ -41,50 +41,42 @@
|
||||
<col style="width:5.1%" />
|
||||
<col style="width:13.7%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">工序: 脐带MSC原代二次贴壁</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; vertical-align:middle; line-height:1.25;">试剂</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">名称</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">生产厂家</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">批号</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">使用数量</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">磷酸盐缓冲液(PBS)</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">MSC完全培养基</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">重组胰酶</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">消化液</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">-----</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">制定配制记录</td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -102,8 +94,7 @@
|
||||
<span class="sop-underline" style="text-align:left; min-width:80px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">干细胞原代<br />培养<br />(二次贴壁)</td>
|
||||
<td class="sop-fill-cell" colspan="11" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 6px;">
|
||||
@@ -145,30 +136,26 @@
|
||||
12. Day<span class="sop-underline" style="text-align:left; min-width:40px;"> </span>观察到细胞局部融合度大于90%, 执行SOP-SC-005-E01-01重铺, 并做好重铺标记.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">每个培养瓶上皆清楚标示细胞批号</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="1" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -179,16 +166,13 @@
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; min-height:48px; height:48px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">生产主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -1,6 +1,6 @@
|
||||
<!-- SOP-SC-007-E01-01 人脐带间充质干细胞传代培养操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-sc-007" style="font-family: 'PingFang SC','Microsoft YaHei',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:50%" />
|
||||
@@ -41,56 +41,47 @@
|
||||
<col style="width:5.2%" />
|
||||
<col style="width:13.7%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">工序: 脐带MSC传代操作</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="6" style="border:1px solid #334155; padding:3px 6px; text-align:center; vertical-align:middle; line-height:1.25;">试剂</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">名称</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">生产厂家</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">批号</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">使用数量</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">磷酸盐缓冲液(PBS)</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">MSC完全培养基</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">生理盐水</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">胰酶</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">消化液</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">------</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">制定配制记录</td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -108,8 +99,7 @@
|
||||
<span class="sop-underline" style="text-align:left; min-width:80px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">人脐带间充质<br />干细胞<br />传代操作</td>
|
||||
<td class="sop-fill-cell" colspan="11" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 6px;">
|
||||
@@ -150,30 +140,26 @@
|
||||
<span class="sop-underline" style="text-align:left; min-width:56px;"> </span>mL.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">每个培养瓶上皆清楚标示细胞批号</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="1" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -184,16 +170,13 @@
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; min-height:48px; height:48px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">生产主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -1,6 +1,6 @@
|
||||
<!-- SOP-SC-008-E01-01 人脐带间充质干细胞冻存操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-sc-008" style="font-family: 'PingFang SC','Microsoft YaHei',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:48%" />
|
||||
@@ -42,50 +42,42 @@
|
||||
<col style="width:5.1%" />
|
||||
<col style="width:13.7%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">工序: 干细胞冻存</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; vertical-align:middle; line-height:1.25;">试剂</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">名称</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">生产厂家</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">批号</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">使用数量</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">无蛋白细胞保存液</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">沙保罗</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">血平皿</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">细胞悬液</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">------</td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">------</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="12" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -103,8 +95,7 @@
|
||||
<span class="sop-underline" style="text-align:left; min-width:80px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">人脐带间充质<br />干细胞<br />操作记录</td>
|
||||
<td class="sop-fill-cell" colspan="12" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 6px;">
|
||||
@@ -126,30 +117,26 @@
|
||||
4. 对应复苏操作记录编号: <span class="sop-underline" style="text-align:left; min-width:160px;"> </span>.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">每个冻存管上皆清楚标示细胞批号</td>
|
||||
<td colspan="6" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="6" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="6" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="1" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -160,16 +147,13 @@
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="12" style="border:1px solid #334155; padding:8px; min-height:48px; height:48px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">生产主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -1,6 +1,6 @@
|
||||
<!-- SOP-SC-009-E01-01 人脐带间充质干细胞复苏操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-sc-009" style="font-family: 'PingFang SC','Microsoft YaHei',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:48%" />
|
||||
@@ -42,38 +42,32 @@
|
||||
<col style="width:5.1%" />
|
||||
<col style="width:13.7%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">工序: 脐带MSC复苏</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:3px 6px; text-align:center; vertical-align:middle; line-height:1.25;">试剂</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">名称</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">生产厂家</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">批号</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">使用数量</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">生理盐水</td>
|
||||
<td colspan="6" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">MSC完全培养基</td>
|
||||
<td colspan="6" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="12" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -91,8 +85,7 @@
|
||||
<span class="sop-underline" style="text-align:left; min-width:80px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">人脐带间充质<br />干细胞复苏<br />操作记录</td>
|
||||
<td class="sop-fill-cell" colspan="12" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 6px;">
|
||||
@@ -113,30 +106,26 @@
|
||||
<span class="sop-underline" style="text-align:left; min-width:40px;"> </span>个T175培养瓶, 标记好信息后转移至CO<sub>2</sub>培养箱中培养.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="8" style="border:1px solid #334155; padding:8px;">每个培养瓶上皆清楚标示细胞批号</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="2" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -147,16 +136,13 @@
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="12" style="border:1px solid #334155; padding:8px; min-height:48px; height:48px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -1,6 +1,6 @@
|
||||
<!-- SOP-SC-010-E01-01 脐血UBMC分离操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-sc-010" style="font-family: 'PingFang SC','Microsoft YaHei',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:48%" />
|
||||
@@ -41,50 +41,42 @@
|
||||
<col style="width:5.1%" />
|
||||
<col style="width:14.0%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">工序: 脐血UBMC分离</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; vertical-align:middle; line-height:1.25;">试剂</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">名称</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">生产厂家</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">批号</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">使用数量</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">人脐带血</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">/</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">/</td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">生理盐水</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">淋巴细胞分离液</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">红细胞沉降液</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -102,8 +94,7 @@
|
||||
<span class="sop-underline" style="text-align:left; min-width:80px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">脐血UBMC<br />分离</td>
|
||||
<td class="sop-fill-cell" colspan="11" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 6px;">
|
||||
@@ -159,31 +150,26 @@
|
||||
</p>
|
||||
<p style="margin:0;">11. 离心结束后消毒离心管, 放入生物安全柜中, 根据需求进行冻存或细胞培养.</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">细胞后续培养用途</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">后续培养记录编号</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="1" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -194,16 +180,13 @@
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; min-height:48px; height:48px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -1,6 +1,6 @@
|
||||
<!-- SOP-SC-011-E01-01 外周血PBMC分离操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-sc-011" style="font-family: 'PingFang SC','Microsoft YaHei',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:48%" />
|
||||
@@ -41,44 +41,37 @@
|
||||
<col style="width:5.1%" />
|
||||
<col style="width:13.9%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">工序: 外周血PBMC分离</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="4" style="border:1px solid #334155; padding:3px 6px; text-align:center; vertical-align:middle; line-height:1.25;">试剂</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">名称</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">生产厂家</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">批号</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">使用数量</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">外周血</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">/</td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">生理盐水</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">淋巴细胞分离液</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -96,8 +89,7 @@
|
||||
<span class="sop-underline" style="text-align:left; min-width:80px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">外周血<br />PBMC分离</td>
|
||||
<td class="sop-fill-cell" colspan="11" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 6px;">
|
||||
@@ -157,31 +149,26 @@
|
||||
对应细胞冻存编号为: <span class="sop-underline" style="text-align:left; min-width:160px;"> </span>.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">细胞后续培养用途</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">后续培养编号</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="1" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -192,16 +179,13 @@
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; min-height:48px; height:48px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -1,6 +1,6 @@
|
||||
<!-- SOP-SC-012-E01-01 免疫细胞冻存操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-sc-012" style="font-family: 'PingFang SC','Microsoft YaHei',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:48%" />
|
||||
@@ -42,50 +42,42 @@
|
||||
<col style="width:5.1%" />
|
||||
<col style="width:13.7%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">工序: 免疫细胞冻存</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; vertical-align:middle; line-height:1.25;">试剂</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">名称</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">生产厂家</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">批号</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">使用数量</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">无蛋白细胞保存液</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">沙保罗</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">血平皿</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">细胞悬液</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">------</td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">------</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="12" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -103,8 +95,7 @@
|
||||
<span class="sop-underline" style="text-align:left; min-width:80px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">免疫细胞<br />冻存操作<br />记录</td>
|
||||
<td class="sop-fill-cell" colspan="12" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 6px;">
|
||||
@@ -126,30 +117,26 @@
|
||||
4. 对应复苏操作记录编号: <span class="sop-underline" style="text-align:left; min-width:160px;"> </span>.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">每个冻存管上皆清楚标示细胞批号</td>
|
||||
<td colspan="6" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="6" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="6" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="1" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -160,16 +147,13 @@
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="12" style="border:1px solid #334155; padding:8px; min-height:48px; height:48px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">生产主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -1,6 +1,6 @@
|
||||
<!-- SOP-SC-013-E01-01 免疫细胞复苏操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-sc-013" style="font-family: 'PingFang SC','Microsoft YaHei',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:48%" />
|
||||
@@ -41,32 +41,27 @@
|
||||
<col style="width:5.1%" />
|
||||
<col style="width:13.7%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">工序: 免疫细胞复苏</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; vertical-align:middle; line-height:1.25;">试剂</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">名称</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">生产厂家</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">批号</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">使用数量</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">培养基</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -84,8 +79,7 @@
|
||||
<span class="sop-underline" style="text-align:left; min-width:80px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">免疫细胞<br />复苏操作<br />记录</td>
|
||||
<td class="sop-fill-cell" colspan="11" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 6px;">
|
||||
@@ -106,30 +100,26 @@
|
||||
<span class="sop-underline" style="text-align:left; min-width:160px;"> </span>.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">每个培养瓶上皆清楚标示细胞批号</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="1" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -140,16 +130,13 @@
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; min-height:48px; height:48px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -1,6 +1,6 @@
|
||||
<!-- SOP-SC-014-E01-01 NK细胞培养操作记录(约2页 A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-a4-pages-2 sop-sc-014" style="font-family: 'PingFang SC','Microsoft YaHei',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; min-height: 594mm; height: auto; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<div class="sop-record sop-a4 sop-a4-pages-1 sop-sc-014" style="font-family: 'PingFang SC','Microsoft YaHei',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:48%" />
|
||||
@@ -41,68 +41,57 @@
|
||||
<col style="width:5.1%" />
|
||||
<col style="width:13.9%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">工序: NK细胞培养</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="8" style="border:1px solid #334155; padding:3px 6px; text-align:center; vertical-align:middle; line-height:1.25;">试剂</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">名称</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">生产厂家</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">批号</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">使用数量</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">UBMC/PBMC</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">/</td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">血替/血浆</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">/</td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">NK培养基1</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">/</td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">NK培养基2</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">/</td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">PBS</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">NK营养剂</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">/</td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">NK包被剂</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">/</td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:3px 6px; text-align:center; vertical-align:middle; line-height:1.25;">仪器<br />设备</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:3px 6px; vertical-align:middle; line-height:1.25;">
|
||||
<p style="margin:0;">
|
||||
@@ -120,10 +109,9 @@
|
||||
<span class="sop-underline" style="text-align:left; min-width:80px;"> </span>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">NK细胞<br />培养</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:10px; vertical-align:top; word-wrap:break-word; overflow-wrap:break-word;">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">NK细胞<br />培养</td>
|
||||
<td class="sop-fill-cell" colspan="11" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%; word-wrap:break-word; overflow-wrap:break-word;">
|
||||
<p style="margin:0 0 6px;">
|
||||
1. 分离操作记录编号<span class="sop-underline" style="text-align:left; min-width:140px;"> </span>;
|
||||
冻存及复苏操作记录编号<span class="sop-underline" style="text-align:left; min-width:160px;"> </span>;
|
||||
@@ -303,23 +291,20 @@
|
||||
</p>
|
||||
<p style="margin:0; line-height:1.55;"> </p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="1" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -330,16 +315,13 @@
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; min-height:48px; height:48px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -59,6 +59,7 @@ Logo:`src="/sop-templates/{资源名}"`(站点根路径,勿用相对路径
|
||||
| `sop-header-table` | 页眉表 |
|
||||
| `sop-body-table` | 正文表 |
|
||||
| `sop-fill-row` / `sop-fill-label` / `sop-fill-cell` | 可撑高填写区;左侧标题上下居中 |
|
||||
| `sop-row-hidden` | 页眉表或非主操作区行(工序/试剂/仪器设备/清场/签名等);编辑与打印均不展示,HTML 仍保留便于后续恢复 |
|
||||
| `sop-option` | 选项整组(勾选框 + 文案),可点击 |
|
||||
| `sop-check` | 勾选框本体 |
|
||||
| `sop-check--checked` | 已勾选(编辑态视觉) |
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
-- 种子数据: SOP-CC-001-E01-01 存储样本接收操作记录
|
||||
-- 种子数据: SOP-CC-001-E01-01 SOP-CC-001-E01-01 存储样本接收操作记录
|
||||
-- 源文件: docs/sop-templates/SOP-CC-001-E01-01.html
|
||||
|
||||
UPDATE `biz_process`
|
||||
SET `sop_content` = '<!-- SOP-CC-001-E01-01 存储样本接收操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-cc-001" style="font-family: ''PingFang SC'',''Microsoft YaHei'',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:43%" />
|
||||
@@ -43,19 +43,16 @@ SET `sop_content` = '<!-- SOP-CC-001-E01-01 存储样本接收操作记录(A4
|
||||
<col style="width:20.5%" />
|
||||
<col style="width:16.8%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="5" style="border:1px solid #334155; padding:8px;">工序: 样本接收</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="9" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -79,8 +76,7 @@ SET `sop_content` = '<!-- SOP-CC-001-E01-01 存储样本接收操作记录(A4
|
||||
<span class="sop-underline" style="text-align:left; min-width:96px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">样本接收<br />操作记录</td>
|
||||
<td class="sop-fill-cell" colspan="9" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 8px;">
|
||||
@@ -100,31 +96,26 @@ SET `sop_content` = '<!-- SOP-CC-001-E01-01 存储样本接收操作记录(A4
|
||||
<span class="sop-underline" style="text-align:left; min-width:220px;"> </span>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">细胞后续操作</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">后续操作记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="5" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="2" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -135,17 +126,14 @@ SET `sop_content` = '<!-- SOP-CC-001-E01-01 存储样本接收操作记录(A4
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="9" style="border:1px solid #334155; padding:8px; min-height:56px; height:56px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:10px;">主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
',
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
-- 种子数据: SOP-CC-002-E01-01 造血干细胞制备标准操作记录
|
||||
-- 种子数据: SOP-CC-002-E01-01 SOP-CC-002-E01-01 造血干细胞制备标准操作记录
|
||||
-- 源文件: docs/sop-templates/SOP-CC-002-E01-01.html
|
||||
|
||||
UPDATE `biz_process`
|
||||
SET `sop_content` = '<!-- SOP-CC-002-E01-01 造血干细胞制备标准操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-cc-002" style="font-family: ''PingFang SC'',''Microsoft YaHei'',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:43%" />
|
||||
@@ -43,19 +43,16 @@ SET `sop_content` = '<!-- SOP-CC-002-E01-01 造血干细胞制备标准操作记
|
||||
<col style="width:22.2%" />
|
||||
<col style="width:14.0%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="5" style="border:1px solid #334155; padding:8px;">工序: 造血干细胞制备标准操作记录</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="9" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -76,8 +73,7 @@ SET `sop_content` = '<!-- SOP-CC-002-E01-01 造血干细胞制备标准操作记
|
||||
<span class="sop-underline" style="text-align:left; min-width:96px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">造血干细胞<br />富集标准<br />操作记录</td>
|
||||
<td class="sop-fill-cell" colspan="9" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 6px;">
|
||||
@@ -103,35 +99,29 @@ SET `sop_content` = '<!-- SOP-CC-002-E01-01 造血干细胞制备标准操作记
|
||||
<p style="margin:0 0 6px;">10. 离心结束后分浆夹在转移袋白细胞层上1cm处夹紧, 进行分浆. 在血浆全部流至导管后关闭血袋导管上的夹子.</p>
|
||||
<p style="margin:0;">11. 热合仪热合导管, 分开采血袋与转移袋.</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">采血袋后续操作</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">转移袋后续操作</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">后续操作记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="5" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="2" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -142,17 +132,14 @@ SET `sop_content` = '<!-- SOP-CC-002-E01-01 造血干细胞制备标准操作记
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="9" style="border:1px solid #334155; padding:8px; min-height:56px; height:56px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:10px;">主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
',
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
-- 种子数据: SOP-CC-003-E01-01 造血干细胞冻存操作记录
|
||||
-- 种子数据: SOP-CC-003-E01-01 SOP-CC-003-E01-01 造血干细胞冻存操作记录
|
||||
-- 源文件: docs/sop-templates/SOP-CC-003-E01-01.html
|
||||
|
||||
UPDATE `biz_process`
|
||||
SET `sop_content` = '<!-- SOP-CC-003-E01-01 造血干细胞冻存操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-cc-003" style="font-family: ''PingFang SC'',''Microsoft YaHei'',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:43%" />
|
||||
@@ -49,38 +49,32 @@ SET `sop_content` = '<!-- SOP-CC-003-E01-01 造血干细胞冻存操作记录(A4
|
||||
<col style="width:9.875%" />
|
||||
<col style="width:9.875%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="5" style="border:1px solid #334155; padding:8px;">工序: 造血干细胞冻存</td>
|
||||
<td colspan="1" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="1" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">试剂</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:8px; text-align:center;">名称</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; text-align:center;">生产厂家</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; text-align:center;">批号</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; text-align:center;">使用数量</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="3" style="border:1px solid #334155; padding:8px;">处理后血样</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; text-align:center;">/</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; text-align:center;">/</td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="3" style="border:1px solid #334155; padding:8px;">DMSO-DEX40冻存液</td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="9" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -115,8 +109,7 @@ SET `sop_content` = '<!-- SOP-CC-003-E01-01 造血干细胞冻存操作记录(A4
|
||||
<span class="sop-underline" style="text-align:left; min-width:80px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">脐血干细胞<br />冻存操作<br />记录</td>
|
||||
<td class="sop-fill-cell" colspan="9" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 6px;">1. 混匀含白细胞的转移袋, 用注射器转移至冰冻袋内, 留样约1.5 ml于两个编码EP管中, 分别为约0.5 ml和约1 ml;</p>
|
||||
@@ -137,30 +130,26 @@ SET `sop_content` = '<!-- SOP-CC-003-E01-01 造血干细胞冻存操作记录(A4
|
||||
7. 对应复苏操作记录编号: <span class="sop-underline" style="text-align:left; min-width:140px;"> </span>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">每个冻存袋上皆清楚标示细胞批号</td>
|
||||
<td colspan="4" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="4" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="5" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="4" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:0; vertical-align:middle;">
|
||||
<table class="sop-nested-table" border="1" style="width:100%; border-collapse:collapse; table-layout:fixed; border:none; margin:0;">
|
||||
<colgroup>
|
||||
@@ -183,12 +172,10 @@ SET `sop_content` = '<!-- SOP-CC-003-E01-01 造血干细胞冻存操作记录(A4
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="9" style="border:1px solid #334155; padding:8px; min-height:48px; height:48px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="10" style="border:1px solid #334155; padding:0; vertical-align:middle;">
|
||||
<table class="sop-nested-table" border="1" style="width:100%; border-collapse:collapse; table-layout:fixed; border:none; margin:0;">
|
||||
<colgroup>
|
||||
@@ -205,8 +192,7 @@ SET `sop_content` = '<!-- SOP-CC-003-E01-01 造血干细胞冻存操作记录(A4
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
',
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
-- 种子数据: SOP-CC-006-E01-01 集落培养操作记录
|
||||
-- 种子数据: SOP-CC-006-E01-01 SOP-CC-006-E01-01 集落培养操作记录
|
||||
-- 源文件: docs/sop-templates/SOP-CC-006-E01-01.html
|
||||
|
||||
UPDATE `biz_process`
|
||||
SET `sop_content` = '<!-- SOP-CC-006-E01-01 集落培养操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-cc-006" style="font-family: ''PingFang SC'',''Microsoft YaHei'',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:43%" />
|
||||
@@ -45,44 +45,37 @@ SET `sop_content` = '<!-- SOP-CC-006-E01-01 集落培养操作记录(A4 竖版)
|
||||
<col style="width:5.2%" />
|
||||
<col style="width:13.9%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">工序: 集落培养操作记录</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="4" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">试剂</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; text-align:center;">名称</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:8px; text-align:center;">生产厂家</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; text-align:center;">批号</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; text-align:center;">使用数量</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px;">CFU-GM试剂</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px;">HES试剂</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px;">低糖DMEM培养基</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -99,8 +92,7 @@ SET `sop_content` = '<!-- SOP-CC-006-E01-01 集落培养操作记录(A4 竖版)
|
||||
<span class="sop-underline" style="text-align:left; min-width:80px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">造血干细胞<br />集落培养<br />操作记录</td>
|
||||
<td class="sop-fill-cell" colspan="11" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 6px;">
|
||||
@@ -116,31 +108,26 @@ SET `sop_content` = '<!-- SOP-CC-006-E01-01 集落培养操作记录(A4 竖版)
|
||||
</p>
|
||||
<p style="margin:0;">6. 3号EP管混匀后吸取20μL加入48孔板.</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">48孔板后续操作</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">结果信息</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="1" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -151,17 +138,14 @@ SET `sop_content` = '<!-- SOP-CC-006-E01-01 集落培养操作记录(A4 竖版)
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; min-height:48px; height:48px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
',
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
-- 种子数据: SOP-SC-003-E01-01 人脐带间充质干细胞原代培养记录
|
||||
-- 种子数据: SOP-SC-003-E01-01 SOP-SC-003-E01-01 人脐带间充质干细胞原代培养操作记录
|
||||
-- 源文件: docs/sop-templates/SOP-SC-003-E01-01.html
|
||||
|
||||
UPDATE `biz_process`
|
||||
SET `sop_content` = '<!-- SOP-SC-003-E01-01 人脐带间充质干细胞原代培养操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-sc-003" style="font-family: ''PingFang SC'',''Microsoft YaHei'',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:43%" />
|
||||
@@ -45,50 +45,42 @@ SET `sop_content` = '<!-- SOP-SC-003-E01-01 人脐带间充质干细胞原代培
|
||||
<col style="width:5.1%" />
|
||||
<col style="width:14.0%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">工序: 脐带MSC原代细胞培养</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="5" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">试剂</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; text-align:center;">名称</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:8px; text-align:center;">生产厂家</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; text-align:center;">批号</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; text-align:center;">使用数量</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px;">磷酸盐缓冲液(PBS)</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px;">MSC培养基</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px;">青/链霉素(双抗)</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px;">75%酒精</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -106,8 +98,7 @@ SET `sop_content` = '<!-- SOP-SC-003-E01-01 人脐带间充质干细胞原代培
|
||||
<span class="sop-underline" style="text-align:left; min-width:80px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">脐带组织处理<br />及干细胞<br />原代培养</td>
|
||||
<td class="sop-fill-cell" colspan="11" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 6px;">
|
||||
@@ -142,30 +133,26 @@ SET `sop_content` = '<!-- SOP-SC-003-E01-01 人脐带间充质干细胞原代培
|
||||
</p>
|
||||
<p style="margin:0;">11. 培养瓶上标记相关信息, 包括细胞来源、操作项目、操作时间、操作人等. 小心将培养瓶放入37℃, 5%CO<sub>2</sub>的培养箱中培养.</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">每个培养瓶上皆清楚标示细胞批号</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="1" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -176,17 +163,14 @@ SET `sop_content` = '<!-- SOP-SC-003-E01-01 人脐带间充质干细胞原代培
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; min-height:48px; height:48px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
',
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
-- 种子数据: SOP-SC-004-E01-01 人脐带间充质干细胞原代培养半换液操作记录
|
||||
-- 种子数据: SOP-SC-004-E01-01 SOP-SC-004-E01-01 人脐带间充质干细胞原代培养半换液操作记录
|
||||
-- 源文件: docs/sop-templates/SOP-SC-004-E01-01.html
|
||||
|
||||
UPDATE `biz_process`
|
||||
SET `sop_content` = '<!-- SOP-SC-004-E01-01 人脐带间充质干细胞原代培养半换液操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-sc-004" style="font-family: ''PingFang SC'',''Microsoft YaHei'',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:50%" />
|
||||
@@ -45,32 +45,27 @@ SET `sop_content` = '<!-- SOP-SC-004-E01-01 人脐带间充质干细胞原代培
|
||||
<col style="width:5.2%" />
|
||||
<col style="width:13.6%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">工序: 脐带MSC原代细胞培养半换液</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="2" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">试剂</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; text-align:center;">名称</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:8px; text-align:center;">生产厂家</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; text-align:center;">批号</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; text-align:center;">使用数量</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px;">干细胞培养基</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -88,8 +83,7 @@ SET `sop_content` = '<!-- SOP-SC-004-E01-01 人脐带间充质干细胞原代培
|
||||
<span class="sop-underline" style="text-align:left; min-width:80px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">干细胞原代<br />培养半换液</td>
|
||||
<td class="sop-fill-cell" colspan="11" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 6px;">
|
||||
@@ -157,8 +151,7 @@ SET `sop_content` = '<!-- SOP-SC-004-E01-01 人脐带间充质干细胞原代培
|
||||
14. Day<span class="sop-underline" style="text-align:left; min-width:40px;"> </span>观察到爬出的细胞局部融合度达到80%-90%, 准备进行重铺.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">小结</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
细胞于Day <span class="sop-underline" style="text-align:left; min-width:40px;"> </span>开始观察到爬出; Day<span class="sop-underline" style="text-align:left; min-width:40px;"> </span>进行重铺,
|
||||
@@ -166,30 +159,26 @@ SET `sop_content` = '<!-- SOP-SC-004-E01-01 人脐带间充质干细胞原代培
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
进行二次贴壁.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">每个培养瓶上是否皆清楚标示细胞批号</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="1" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -200,17 +189,14 @@ SET `sop_content` = '<!-- SOP-SC-004-E01-01 人脐带间充质干细胞原代培
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; min-height:48px; height:48px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">生产主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
',
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
-- 种子数据: SOP-SC-005-E01-01 人脐带间充质干细胞原代重铺操作记录
|
||||
-- 种子数据: SOP-SC-005-E01-01 SOP-SC-005-E01-01 人脐带间充质干细胞原代重铺操作记录
|
||||
-- 源文件: docs/sop-templates/SOP-SC-005-E01-01.html
|
||||
|
||||
UPDATE `biz_process`
|
||||
SET `sop_content` = '<!-- SOP-SC-005-E01-01 人脐带间充质干细胞原代重铺操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-sc-005" style="font-family: ''PingFang SC'',''Microsoft YaHei'',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:48%" />
|
||||
@@ -46,56 +46,47 @@ SET `sop_content` = '<!-- SOP-SC-005-E01-01 人脐带间充质干细胞原代重
|
||||
<col style="width:5.1%" />
|
||||
<col style="width:13.7%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">工序: 脐带MSC原代重铺操作</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="6" style="border:1px solid #334155; padding:3px 6px; text-align:center; vertical-align:middle; line-height:1.25;">试剂</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">名称</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">生产厂家</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">批号</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">使用数量</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">磷酸盐缓冲液(PBS)</td>
|
||||
<td colspan="6" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">MSC完全培养基</td>
|
||||
<td colspan="6" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">胰酶</td>
|
||||
<td colspan="6" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">生理盐水</td>
|
||||
<td colspan="6" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">消化液</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">------</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">制定配制记录</td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="12" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -113,8 +104,7 @@ SET `sop_content` = '<!-- SOP-SC-005-E01-01 人脐带间充质干细胞原代重
|
||||
<span class="sop-underline" style="text-align:left; min-width:80px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">干细胞原代<br />培养(重铺)</td>
|
||||
<td class="sop-fill-cell" colspan="12" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 6px;">
|
||||
@@ -141,30 +131,26 @@ SET `sop_content` = '<!-- SOP-SC-005-E01-01 人脐带间充质干细胞原代重
|
||||
</p>
|
||||
<p style="margin:0;">8. 充分晃匀后做好重铺P1标记, 放入CO<sub>2</sub>培养箱进行继续培养.</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">每个培养瓶上皆清楚标示细胞批号</td>
|
||||
<td colspan="6" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="6" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="6" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="1" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -175,17 +161,14 @@ SET `sop_content` = '<!-- SOP-SC-005-E01-01 人脐带间充质干细胞原代重
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="12" style="border:1px solid #334155; padding:8px; min-height:48px; height:48px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">生产主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
',
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
-- 种子数据: SOP-SC-006-E01-01 人脐带间充质干细胞原代二次贴壁操作记录
|
||||
-- 种子数据: SOP-SC-006-E01-01 SOP-SC-006-E01-01 人脐带间充质干细胞原代二次贴壁操作记录
|
||||
-- 源文件: docs/sop-templates/SOP-SC-006-E01-01.html
|
||||
|
||||
UPDATE `biz_process`
|
||||
SET `sop_content` = '<!-- SOP-SC-006-E01-01 人脐带间充质干细胞原代二次贴壁操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-sc-006" style="font-family: ''PingFang SC'',''Microsoft YaHei'',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:50%" />
|
||||
@@ -45,50 +45,42 @@ SET `sop_content` = '<!-- SOP-SC-006-E01-01 人脐带间充质干细胞原代二
|
||||
<col style="width:5.1%" />
|
||||
<col style="width:13.7%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">工序: 脐带MSC原代二次贴壁</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; vertical-align:middle; line-height:1.25;">试剂</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">名称</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">生产厂家</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">批号</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">使用数量</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">磷酸盐缓冲液(PBS)</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">MSC完全培养基</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">重组胰酶</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">消化液</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">-----</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">制定配制记录</td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -106,8 +98,7 @@ SET `sop_content` = '<!-- SOP-SC-006-E01-01 人脐带间充质干细胞原代二
|
||||
<span class="sop-underline" style="text-align:left; min-width:80px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">干细胞原代<br />培养<br />(二次贴壁)</td>
|
||||
<td class="sop-fill-cell" colspan="11" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 6px;">
|
||||
@@ -149,30 +140,26 @@ SET `sop_content` = '<!-- SOP-SC-006-E01-01 人脐带间充质干细胞原代二
|
||||
12. Day<span class="sop-underline" style="text-align:left; min-width:40px;"> </span>观察到细胞局部融合度大于90%, 执行SOP-SC-005-E01-01重铺, 并做好重铺标记.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">每个培养瓶上皆清楚标示细胞批号</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="1" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -183,17 +170,14 @@ SET `sop_content` = '<!-- SOP-SC-006-E01-01 人脐带间充质干细胞原代二
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; min-height:48px; height:48px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">生产主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
',
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
-- 种子数据: SOP-SC-007-E01-01 人脐带间充质干细胞传代培养操作记录
|
||||
-- 种子数据: SOP-SC-007-E01-01 SOP-SC-007-E01-01 人脐带间充质干细胞传代培养操作记录
|
||||
-- 源文件: docs/sop-templates/SOP-SC-007-E01-01.html
|
||||
|
||||
UPDATE `biz_process`
|
||||
SET `sop_content` = '<!-- SOP-SC-007-E01-01 人脐带间充质干细胞传代培养操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-sc-007" style="font-family: ''PingFang SC'',''Microsoft YaHei'',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:50%" />
|
||||
@@ -45,56 +45,47 @@ SET `sop_content` = '<!-- SOP-SC-007-E01-01 人脐带间充质干细胞传代培
|
||||
<col style="width:5.2%" />
|
||||
<col style="width:13.7%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">工序: 脐带MSC传代操作</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="6" style="border:1px solid #334155; padding:3px 6px; text-align:center; vertical-align:middle; line-height:1.25;">试剂</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">名称</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">生产厂家</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">批号</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">使用数量</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">磷酸盐缓冲液(PBS)</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">MSC完全培养基</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">生理盐水</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">胰酶</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">消化液</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">------</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">制定配制记录</td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -112,8 +103,7 @@ SET `sop_content` = '<!-- SOP-SC-007-E01-01 人脐带间充质干细胞传代培
|
||||
<span class="sop-underline" style="text-align:left; min-width:80px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">人脐带间充质<br />干细胞<br />传代操作</td>
|
||||
<td class="sop-fill-cell" colspan="11" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 6px;">
|
||||
@@ -154,30 +144,26 @@ SET `sop_content` = '<!-- SOP-SC-007-E01-01 人脐带间充质干细胞传代培
|
||||
<span class="sop-underline" style="text-align:left; min-width:56px;"> </span>mL.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">每个培养瓶上皆清楚标示细胞批号</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="1" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -188,17 +174,14 @@ SET `sop_content` = '<!-- SOP-SC-007-E01-01 人脐带间充质干细胞传代培
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; min-height:48px; height:48px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">生产主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
',
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
-- 种子数据: SOP-SC-008-E01-01 人脐带间充质干细胞冻存操作记录
|
||||
-- 种子数据: SOP-SC-008-E01-01 SOP-SC-008-E01-01 人脐带间充质干细胞冻存操作记录
|
||||
-- 源文件: docs/sop-templates/SOP-SC-008-E01-01.html
|
||||
|
||||
UPDATE `biz_process`
|
||||
SET `sop_content` = '<!-- SOP-SC-008-E01-01 人脐带间充质干细胞冻存操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-sc-008" style="font-family: ''PingFang SC'',''Microsoft YaHei'',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:48%" />
|
||||
@@ -46,50 +46,42 @@ SET `sop_content` = '<!-- SOP-SC-008-E01-01 人脐带间充质干细胞冻存操
|
||||
<col style="width:5.1%" />
|
||||
<col style="width:13.7%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">工序: 干细胞冻存</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; vertical-align:middle; line-height:1.25;">试剂</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">名称</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">生产厂家</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">批号</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">使用数量</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">无蛋白细胞保存液</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">沙保罗</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">血平皿</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">细胞悬液</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">------</td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">------</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="12" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -107,8 +99,7 @@ SET `sop_content` = '<!-- SOP-SC-008-E01-01 人脐带间充质干细胞冻存操
|
||||
<span class="sop-underline" style="text-align:left; min-width:80px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">人脐带间充质<br />干细胞<br />操作记录</td>
|
||||
<td class="sop-fill-cell" colspan="12" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 6px;">
|
||||
@@ -130,30 +121,26 @@ SET `sop_content` = '<!-- SOP-SC-008-E01-01 人脐带间充质干细胞冻存操
|
||||
4. 对应复苏操作记录编号: <span class="sop-underline" style="text-align:left; min-width:160px;"> </span>.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">每个冻存管上皆清楚标示细胞批号</td>
|
||||
<td colspan="6" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="6" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="6" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="1" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -164,17 +151,14 @@ SET `sop_content` = '<!-- SOP-SC-008-E01-01 人脐带间充质干细胞冻存操
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="12" style="border:1px solid #334155; padding:8px; min-height:48px; height:48px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">生产主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
',
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
-- 种子数据: SOP-SC-009-E01-01 人脐带干细胞复苏操作记录
|
||||
-- 种子数据: SOP-SC-009-E01-01 SOP-SC-009-E01-01 人脐带间充质干细胞复苏操作记录
|
||||
-- 源文件: docs/sop-templates/SOP-SC-009-E01-01.html
|
||||
|
||||
UPDATE `biz_process`
|
||||
SET `sop_content` = '<!-- SOP-SC-009-E01-01 人脐带间充质干细胞复苏操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-sc-009" style="font-family: ''PingFang SC'',''Microsoft YaHei'',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:48%" />
|
||||
@@ -46,38 +46,32 @@ SET `sop_content` = '<!-- SOP-SC-009-E01-01 人脐带间充质干细胞复苏操
|
||||
<col style="width:5.1%" />
|
||||
<col style="width:13.7%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">工序: 脐带MSC复苏</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:3px 6px; text-align:center; vertical-align:middle; line-height:1.25;">试剂</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">名称</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">生产厂家</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">批号</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">使用数量</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">生理盐水</td>
|
||||
<td colspan="6" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">MSC完全培养基</td>
|
||||
<td colspan="6" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="12" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -95,8 +89,7 @@ SET `sop_content` = '<!-- SOP-SC-009-E01-01 人脐带间充质干细胞复苏操
|
||||
<span class="sop-underline" style="text-align:left; min-width:80px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">人脐带间充质<br />干细胞复苏<br />操作记录</td>
|
||||
<td class="sop-fill-cell" colspan="12" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 6px;">
|
||||
@@ -117,30 +110,26 @@ SET `sop_content` = '<!-- SOP-SC-009-E01-01 人脐带间充质干细胞复苏操
|
||||
<span class="sop-underline" style="text-align:left; min-width:40px;"> </span>个T175培养瓶, 标记好信息后转移至CO<sub>2</sub>培养箱中培养.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="8" style="border:1px solid #334155; padding:8px;">每个培养瓶上皆清楚标示细胞批号</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="2" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -151,17 +140,14 @@ SET `sop_content` = '<!-- SOP-SC-009-E01-01 人脐带间充质干细胞复苏操
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="12" style="border:1px solid #334155; padding:8px; min-height:48px; height:48px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
',
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
-- 种子数据: SOP-SC-010-E01-01 脐血UBMC分离记录
|
||||
-- 种子数据: SOP-SC-010-E01-01 SOP-SC-010-E01-01 脐血UBMC分离操作记录
|
||||
-- 源文件: docs/sop-templates/SOP-SC-010-E01-01.html
|
||||
|
||||
UPDATE `biz_process`
|
||||
SET `sop_content` = '<!-- SOP-SC-010-E01-01 脐血UBMC分离操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-sc-010" style="font-family: ''PingFang SC'',''Microsoft YaHei'',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:48%" />
|
||||
@@ -45,50 +45,42 @@ SET `sop_content` = '<!-- SOP-SC-010-E01-01 脐血UBMC分离操作记录(A4 竖
|
||||
<col style="width:5.1%" />
|
||||
<col style="width:14.0%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">工序: 脐血UBMC分离</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; vertical-align:middle; line-height:1.25;">试剂</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">名称</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">生产厂家</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">批号</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">使用数量</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">人脐带血</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">/</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">/</td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">生理盐水</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">淋巴细胞分离液</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">红细胞沉降液</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -106,8 +98,7 @@ SET `sop_content` = '<!-- SOP-SC-010-E01-01 脐血UBMC分离操作记录(A4 竖
|
||||
<span class="sop-underline" style="text-align:left; min-width:80px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">脐血UBMC<br />分离</td>
|
||||
<td class="sop-fill-cell" colspan="11" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 6px;">
|
||||
@@ -163,31 +154,26 @@ SET `sop_content` = '<!-- SOP-SC-010-E01-01 脐血UBMC分离操作记录(A4 竖
|
||||
</p>
|
||||
<p style="margin:0;">11. 离心结束后消毒离心管, 放入生物安全柜中, 根据需求进行冻存或细胞培养.</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">细胞后续培养用途</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">后续培养记录编号</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="1" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -198,17 +184,14 @@ SET `sop_content` = '<!-- SOP-SC-010-E01-01 脐血UBMC分离操作记录(A4 竖
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; min-height:48px; height:48px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
',
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
-- 种子数据: SOP-SC-011-E01-01 外周血PBMC分离记录
|
||||
-- 种子数据: SOP-SC-011-E01-01 SOP-SC-011-E01-01 外周血PBMC分离操作记录
|
||||
-- 源文件: docs/sop-templates/SOP-SC-011-E01-01.html
|
||||
|
||||
UPDATE `biz_process`
|
||||
SET `sop_content` = '<!-- SOP-SC-011-E01-01 外周血PBMC分离操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-sc-011" style="font-family: ''PingFang SC'',''Microsoft YaHei'',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:48%" />
|
||||
@@ -45,44 +45,37 @@ SET `sop_content` = '<!-- SOP-SC-011-E01-01 外周血PBMC分离操作记录(A4
|
||||
<col style="width:5.1%" />
|
||||
<col style="width:13.9%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">工序: 外周血PBMC分离</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="4" style="border:1px solid #334155; padding:3px 6px; text-align:center; vertical-align:middle; line-height:1.25;">试剂</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">名称</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">生产厂家</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">批号</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">使用数量</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">外周血</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">/</td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">生理盐水</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">淋巴细胞分离液</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -100,8 +93,7 @@ SET `sop_content` = '<!-- SOP-SC-011-E01-01 外周血PBMC分离操作记录(A4
|
||||
<span class="sop-underline" style="text-align:left; min-width:80px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">外周血<br />PBMC分离</td>
|
||||
<td class="sop-fill-cell" colspan="11" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 6px;">
|
||||
@@ -161,31 +153,26 @@ SET `sop_content` = '<!-- SOP-SC-011-E01-01 外周血PBMC分离操作记录(A4
|
||||
对应细胞冻存编号为: <span class="sop-underline" style="text-align:left; min-width:160px;"> </span>.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">细胞后续培养用途</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">后续培养编号</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="1" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -196,17 +183,14 @@ SET `sop_content` = '<!-- SOP-SC-011-E01-01 外周血PBMC分离操作记录(A4
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; min-height:48px; height:48px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
',
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
-- 种子数据: SOP-SC-012-E01-01 免疫细胞冻存操作记录
|
||||
-- 种子数据: SOP-SC-012-E01-01 SOP-SC-012-E01-01 免疫细胞冻存操作记录
|
||||
-- 源文件: docs/sop-templates/SOP-SC-012-E01-01.html
|
||||
|
||||
UPDATE `biz_process`
|
||||
SET `sop_content` = '<!-- SOP-SC-012-E01-01 免疫细胞冻存操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-sc-012" style="font-family: ''PingFang SC'',''Microsoft YaHei'',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:48%" />
|
||||
@@ -46,50 +46,42 @@ SET `sop_content` = '<!-- SOP-SC-012-E01-01 免疫细胞冻存操作记录(A4
|
||||
<col style="width:5.1%" />
|
||||
<col style="width:13.7%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">工序: 免疫细胞冻存</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; vertical-align:middle; line-height:1.25;">试剂</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">名称</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">生产厂家</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">批号</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">使用数量</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">无蛋白细胞保存液</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">沙保罗</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">血平皿</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">细胞悬液</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">------</td>
|
||||
<td colspan="3" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">------</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="12" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -107,8 +99,7 @@ SET `sop_content` = '<!-- SOP-SC-012-E01-01 免疫细胞冻存操作记录(A4
|
||||
<span class="sop-underline" style="text-align:left; min-width:80px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">免疫细胞<br />冻存操作<br />记录</td>
|
||||
<td class="sop-fill-cell" colspan="12" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 6px;">
|
||||
@@ -130,30 +121,26 @@ SET `sop_content` = '<!-- SOP-SC-012-E01-01 免疫细胞冻存操作记录(A4
|
||||
4. 对应复苏操作记录编号: <span class="sop-underline" style="text-align:left; min-width:160px;"> </span>.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">每个冻存管上皆清楚标示细胞批号</td>
|
||||
<td colspan="6" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="6" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="6" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="1" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -164,17 +151,14 @@ SET `sop_content` = '<!-- SOP-SC-012-E01-01 免疫细胞冻存操作记录(A4
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="12" style="border:1px solid #334155; padding:8px; min-height:48px; height:48px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">生产主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
',
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
-- 种子数据: SOP-SC-013-E01-01 免疫细胞复苏操作记录
|
||||
-- 种子数据: SOP-SC-013-E01-01 SOP-SC-013-E01-01 免疫细胞复苏操作记录
|
||||
-- 源文件: docs/sop-templates/SOP-SC-013-E01-01.html
|
||||
|
||||
UPDATE `biz_process`
|
||||
SET `sop_content` = '<!-- SOP-SC-013-E01-01 免疫细胞复苏操作记录(A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-sc-013" style="font-family: ''PingFang SC'',''Microsoft YaHei'',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:48%" />
|
||||
@@ -45,32 +45,27 @@ SET `sop_content` = '<!-- SOP-SC-013-E01-01 免疫细胞复苏操作记录(A4
|
||||
<col style="width:5.1%" />
|
||||
<col style="width:13.7%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">工序: 免疫细胞复苏</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; vertical-align:middle; line-height:1.25;">试剂</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">名称</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">生产厂家</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">批号</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">使用数量</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">培养基</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">仪器<br />设备</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; vertical-align:top;">
|
||||
<div>
|
||||
@@ -88,8 +83,7 @@ SET `sop_content` = '<!-- SOP-SC-013-E01-01 免疫细胞复苏操作记录(A4
|
||||
<span class="sop-underline" style="text-align:left; min-width:80px;"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="sop-fill-row">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">免疫细胞<br />复苏操作<br />记录</td>
|
||||
<td class="sop-fill-cell" colspan="11" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%;">
|
||||
<p style="margin:0 0 6px;">
|
||||
@@ -110,30 +104,26 @@ SET `sop_content` = '<!-- SOP-SC-013-E01-01 免疫细胞复苏操作记录(A4
|
||||
<span class="sop-underline" style="text-align:left; min-width:160px;"> </span>.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="7" style="border:1px solid #334155; padding:8px;">每个培养瓶上皆清楚标示细胞批号</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="1" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -144,17 +134,14 @@ SET `sop_content` = '<!-- SOP-SC-013-E01-01 免疫细胞复苏操作记录(A4
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; min-height:48px; height:48px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
',
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
-- 种子数据: SOP-SC-014-E01-01 NK细胞培养操作记录(约2页A4)
|
||||
-- 种子数据: SOP-SC-014-E01-01 SOP-SC-014-E01-01 NK细胞培养操作记录
|
||||
-- 源文件: docs/sop-templates/SOP-SC-014-E01-01.html
|
||||
|
||||
UPDATE `biz_process`
|
||||
SET `sop_content` = '<!-- SOP-SC-014-E01-01 NK细胞培养操作记录(约2页 A4 竖版) -->
|
||||
<div class="sop-record sop-a4 sop-a4-pages-2 sop-sc-014" style="font-family: ''PingFang SC'',''Microsoft YaHei'',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; min-height: 594mm; height: auto; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<div class="sop-record sop-a4 sop-a4-pages-1 sop-sc-014" style="font-family: ''PingFang SC'',''Microsoft YaHei'',sans-serif; font-size: 10.5pt; color: #1e293b; line-height: 1.55; box-sizing: border-box; display: flex; flex-direction: column; height: 297mm; min-height: 297mm; padding: 16mm 15mm 20mm;">
|
||||
<table class="sop-header-table sop-row-hidden" style="width:100%; border-collapse:collapse; table-layout:fixed; border:1px solid #334155; margin-bottom:8px; flex-shrink:0;">
|
||||
<colgroup>
|
||||
<col style="width:15%" />
|
||||
<col style="width:48%" />
|
||||
@@ -45,68 +45,57 @@ SET `sop_content` = '<!-- SOP-SC-014-E01-01 NK细胞培养操作记录(约2页 A
|
||||
<col style="width:5.1%" />
|
||||
<col style="width:13.9%" />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<tbody><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">工序: NK细胞培养</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">记录编号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px; min-height:28px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">细胞批号</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:8px; white-space:nowrap;">日期</td>
|
||||
<td colspan="4" class="sop-blank-cell" style="border:1px solid #334155; padding:8px;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="8" style="border:1px solid #334155; padding:3px 6px; text-align:center; vertical-align:middle; line-height:1.25;">试剂</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">名称</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">生产厂家</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">批号</td>
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">使用数量</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">UBMC/PBMC</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">/</td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">血替/血浆</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">/</td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">NK培养基1</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">/</td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">NK培养基2</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">/</td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">PBS</td>
|
||||
<td colspan="5" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">NK营养剂</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">/</td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="2" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;">NK包被剂</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:3px 6px; text-align:center; line-height:1.25;">/</td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
<td colspan="2" class="sop-blank-cell" style="border:1px solid #334155; padding:3px 6px; line-height:1.25;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:3px 6px; text-align:center; vertical-align:middle; line-height:1.25;">仪器<br />设备</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:3px 6px; vertical-align:middle; line-height:1.25;">
|
||||
<p style="margin:0;">
|
||||
@@ -124,10 +113,9 @@ SET `sop_content` = '<!-- SOP-SC-014-E01-01 NK细胞培养操作记录(约2页 A
|
||||
<span class="sop-underline" style="text-align:left; min-width:80px;"> </span>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">NK细胞<br />培养</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:10px; vertical-align:top; word-wrap:break-word; overflow-wrap:break-word;">
|
||||
</tr><tr class="sop-fill-row">
|
||||
<td class="sop-fill-label" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle; height:100%;">NK细胞<br />培养</td>
|
||||
<td class="sop-fill-cell" colspan="11" style="border:1px solid #334155; padding:10px; vertical-align:top; height:100%; word-wrap:break-word; overflow-wrap:break-word;">
|
||||
<p style="margin:0 0 6px;">
|
||||
1. 分离操作记录编号<span class="sop-underline" style="text-align:left; min-width:140px;"> </span>;
|
||||
冻存及复苏操作记录编号<span class="sop-underline" style="text-align:left; min-width:160px;"> </span>;
|
||||
@@ -307,23 +295,20 @@ SET `sop_content` = '<!-- SOP-SC-014-E01-01 NK细胞培养操作记录(约2页 A
|
||||
</p>
|
||||
<p style="margin:0; line-height:1.55;"> </p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td rowspan="3" style="border:1px solid #334155; padding:8px; text-align:center; vertical-align:middle;">清场</td>
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">未使用完试剂是否放入指定位置</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="6" style="border:1px solid #334155; padding:8px;">废液是否进行收集处理</td>
|
||||
<td colspan="5" class="sop-option-cell" style="border:1px solid #334155; padding:8px; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:8px; white-space:nowrap;">是否清洁, 消毒操作间</td>
|
||||
<td colspan="1" class="sop-option-cell" style="border:1px solid #334155; padding:8px; white-space:nowrap; text-align:center;">
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
@@ -334,17 +319,14 @@ SET `sop_content` = '<!-- SOP-SC-014-E01-01 NK细胞培养操作记录(约2页 A
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>是</span>
|
||||
<span class="sop-option"><span class="sop-check" contenteditable="false" data-mce-contenteditable="false"> </span>否</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td style="border:1px solid #334155; padding:8px; text-align:center;">备注</td>
|
||||
<td colspan="11" style="border:1px solid #334155; padding:8px; min-height:48px; height:48px; vertical-align:top;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr class="sop-row-hidden sop-row-hidden">
|
||||
<td colspan="4" style="border:1px solid #334155; padding:10px;">操作人/日期:</td>
|
||||
<td colspan="5" style="border:1px solid #334155; padding:10px;">复核人/日期:</td>
|
||||
<td colspan="3" style="border:1px solid #334155; padding:10px;">主管/日期:</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
',
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,121 @@
|
||||
# Mobile OA 发起表单「历史记录」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:** 在小程序 OA 表单填写页「取消」右侧增加「历史记录」,同 webview 内列表(对齐「我发起的」卡片)并可查看详情(无导出/打印;申请人检索仅全员权限时显示)。
|
||||
|
||||
**Architecture:** 改动集中在 `mobile-oa-h5`:底栏按钮 → `/oa-history` 新页调已有 `GET /instances/history` → `/oa-detail?from=history` 隐藏打印。权限由后端 `canViewAll` 驱动。
|
||||
|
||||
**Tech Stack:** Vue 3 + Vue Router + Vant(mobile-oa-h5);复用后端 history API。
|
||||
|
||||
**Spec:** `docs/superpowers/specs/2026-08-28-mobile-oa-start-history-design.md`
|
||||
|
||||
---
|
||||
|
||||
### Task 1: API 封装
|
||||
|
||||
**Files:**
|
||||
- Modify: `mobile-oa-h5/src/api/oa.js`
|
||||
|
||||
- [ ] **Step 1: 增加 `fetchOaInstanceHistory`**
|
||||
|
||||
在 `fetchOaInstanceDetail` 附近增加:
|
||||
|
||||
```js
|
||||
export function fetchOaInstanceHistory(params) {
|
||||
return get('/web/admin/oa-approval/instances/history', params)
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Commit**(可选,可与后续任务合并提交)
|
||||
|
||||
---
|
||||
|
||||
### Task 2: 路由注册
|
||||
|
||||
**Files:**
|
||||
- Modify: `mobile-oa-h5/src/router.js`
|
||||
|
||||
- [ ] **Step 1: 注册 `/oa-history`**
|
||||
|
||||
```js
|
||||
import OaHistory from './views/OaHistory.vue'
|
||||
// routes:
|
||||
{ path: '/oa-history', component: OaHistory },
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Task 3: OaHistory 列表页
|
||||
|
||||
**Files:**
|
||||
- Create: `mobile-oa-h5/src/views/OaHistory.vue`
|
||||
|
||||
- [ ] **Step 1: 实现列表页**
|
||||
|
||||
要求:
|
||||
- Query: `appId`(必填)、`appName`(可选)
|
||||
- `canViewAll` 为 true 时显示申请人 search-box;否则不显示
|
||||
- 卡片结构对齐 mine:`dd-card`(角标、标题、时间、meta 预览、状态)
|
||||
- 分页:滚动触底加载;PAGE_SIZE=10
|
||||
- 点击 → `router.push({ path: '/oa-detail', query: { instanceId, from: 'history', token, returnPath } })`(透传 token/returnPath 若存在)
|
||||
- Token 色:`#0a9f6d` 系,勿用 `#10b981`
|
||||
|
||||
---
|
||||
|
||||
### Task 4: OaStart 底栏按钮
|
||||
|
||||
**Files:**
|
||||
- Modify: `mobile-oa-h5/src/views/OaStart.vue`
|
||||
|
||||
- [ ] **Step 1: 取消右侧增加「历史记录」**
|
||||
|
||||
```html
|
||||
<van-button class="oa-start__btn oa-start__btn--cancel" @click="onCancel">取消</van-button>
|
||||
<van-button class="oa-start__btn oa-start__btn--cancel" @click="onHistory">历史记录</van-button>
|
||||
```
|
||||
|
||||
```js
|
||||
function onHistory() {
|
||||
const appId = String(appMeta.value?.id || '').trim()
|
||||
if (!appId) {
|
||||
showToast('缺少流程信息')
|
||||
return
|
||||
}
|
||||
router.push({
|
||||
path: '/oa-history',
|
||||
query: {
|
||||
appId,
|
||||
appName: appMeta.value.appName || '',
|
||||
token: route.query.token || undefined,
|
||||
returnPath: route.query.returnPath || undefined
|
||||
}
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
样式可复用 `--cancel`;若四钮过挤,历史记录 `padding` 可略紧。
|
||||
|
||||
---
|
||||
|
||||
### Task 5: 详情隐藏打印
|
||||
|
||||
**Files:**
|
||||
- Modify: `mobile-oa-h5/src/views/OaDetail.vue`
|
||||
|
||||
- [ ] **Step 1: `from=history` 时不展示打印按钮**
|
||||
|
||||
```js
|
||||
const hidePrint = computed(() => String(route.query.from || '').trim() === 'history')
|
||||
```
|
||||
|
||||
模板中打印按钮加 `v-if="!hidePrint"`;更多菜单里若有打印项一并隐藏。
|
||||
|
||||
---
|
||||
|
||||
### Task 6: 手工验收
|
||||
|
||||
- [ ] 无全员权限:仅本人;无申请人框
|
||||
- [ ] 有全员权限:申请人检索有效
|
||||
- [ ] 点卡片进详情无打印;返回历史再返回表单可继续填
|
||||
- [ ] 底栏顺序:取消 | 历史记录 | 暂存草稿 | 提交审批
|
||||
@@ -0,0 +1,170 @@
|
||||
# OA 小程序端 · 发起表单「历史记录」设计
|
||||
|
||||
**模块**: OA 审批 · mobile-oa-h5 / mobile-h5
|
||||
**日期**: 2026-08-28
|
||||
**状态**: 已实现(mobile-oa-h5)
|
||||
**关联**: web 端历史记录已落地(WorkTab + `GET /instances/history`)
|
||||
**决策记录**:
|
||||
- 打开方式: **方案 A** — 同 webview 内 H5 路由跳转,返回后继续填表
|
||||
- 权限: 与 web 一致 — `oa:start:history:all` 全员;无权限仅本人
|
||||
- 列表样式: 对齐小程序「我发起的」卡片模式(`mobile-h5/pages/oa/mine/index.vue`)
|
||||
- 不做: 导出、打印、状态/时间等其它筛选;检索暂时仅「申请人」(且仅全员权限时显示)
|
||||
|
||||
---
|
||||
|
||||
## 1. 背景与目标
|
||||
|
||||
web-admin「发起审批」已支持按流程查看历史记录。用户希望在微信小程序工作台(`mobile-h5`)发起流程时,在表单填写页(`mobile-oa-h5` 的 `/oa-start`,经 `pages/oa/start/webview` 加载)底栏「取消」右侧增加「历史记录」,进入该流程的历史列表,并可查看详情。
|
||||
|
||||
**成功标准**:
|
||||
- 表单底栏常显「历史记录」文字按钮(取消右侧)
|
||||
- 点击进入历史列表;卡片样式对齐「我发起的」
|
||||
- 有全员权限可看本租户该流程全部,并显示申请人检索;无权限仅本人、不显示申请人检索
|
||||
- 点击卡片进入只读详情;无打印、无导出
|
||||
- 从历史返回表单页时,可继续填写(同 webview 栈内返回)
|
||||
|
||||
---
|
||||
|
||||
## 2. 范围
|
||||
|
||||
### 2.1 在范围内
|
||||
|
||||
| 项 | 说明 |
|
||||
|----|------|
|
||||
| 入口按钮 | `mobile-oa-h5/src/views/OaStart.vue` 底栏 |
|
||||
| 历史列表页 | 新建 `OaHistory.vue` + 路由 `/oa-history` |
|
||||
| API 封装 | `mobile-oa-h5/src/api/oa.js` 增加 `fetchOaInstanceHistory` |
|
||||
| 详情 | 复用已有 `/oa-detail?instanceId=`(只读) |
|
||||
| 权限 | 后端已有;前端用响应 `canViewAll` 控制申请人检索显隐 |
|
||||
|
||||
### 2.2 非目标
|
||||
|
||||
- 导出 Excel
|
||||
- 打印
|
||||
- 审批状态 / 发起时间 / 完成时间等筛选(后续可加)
|
||||
- 改后端 history API 契约(复用现有即可)
|
||||
- 在「发起审批」流程宫格列表上增加历史入口(本期仅表单页)
|
||||
|
||||
---
|
||||
|
||||
## 3. 交互与信息架构
|
||||
|
||||
```
|
||||
发起审批宫格 → webview 加载 /oa-start?appId=…
|
||||
│
|
||||
├─ 取消 → closeToHost
|
||||
├─ 历史记录 → /oa-history?appId=… (同 H5 路由)
|
||||
│ │
|
||||
│ ├─ 上拉分页 / 申请人检索(可选)
|
||||
│ └─ 点卡片 → /oa-detail?instanceId=…
|
||||
│ └─ 返回 → 历史列表
|
||||
├─ 暂存草稿
|
||||
└─ 提交审批
|
||||
```
|
||||
|
||||
- 历史列表页顶部可展示流程名称(来自模板详情或 query)
|
||||
- 浏览器/小程序 webview 内使用 Vue Router `push` / `back`,**不** `closeToHost` 离开宿主
|
||||
|
||||
---
|
||||
|
||||
## 4. UI 规范
|
||||
|
||||
### 4.1 底栏按钮
|
||||
|
||||
顺序:`取消` | `历史记录` | `暂存草稿` | `提交审批`
|
||||
|
||||
- 「历史记录」为次要文字按钮,视觉权重对齐「取消」(非主色实心)
|
||||
- Token:三墙绿(`#0a9f6d` 系),**禁止** web-admin `#10b981`
|
||||
|
||||
### 4.2 历史列表(对齐「我发起的」)
|
||||
|
||||
参考:`mobile-h5/pages/oa/mine/index.vue` 的 `dd-card` 结构:
|
||||
|
||||
| 区域 | 内容 |
|
||||
|------|------|
|
||||
| 角标 | 序号 |
|
||||
| 标题行 | 审批标题 / 流程名;右侧相对或绝对发起时间 |
|
||||
| 元信息 | 可选:申请人(全员时更有用)、当前节点、业务预览字段 1~2 行 |
|
||||
| 底栏 | 状态文案 + 语义色 Tag(进行中 / 已完成 / 已拒绝等) |
|
||||
|
||||
检索区(仅 `canViewAll`):
|
||||
|
||||
- 单行「申请人」输入 + 确认搜索(样式可对齐 mine 顶栏 search-box,placeholder 改为「搜索申请人」)
|
||||
- 无权限:不渲染检索区
|
||||
|
||||
空态 / 加载 / 加载更多:对齐 mine(VanEmpty 或等价、pulse、已经到底了)
|
||||
|
||||
### 4.3 详情
|
||||
|
||||
- `router.push({ path: '/oa-detail', query: { instanceId } })`
|
||||
- 不暴露打印入口(若详情页已有打印,历史入口进入时可通过 query 如 `from=history` 隐藏;若实现成本高且详情页本无打印,则无需改)
|
||||
|
||||
---
|
||||
|
||||
## 5. API
|
||||
|
||||
复用:
|
||||
|
||||
```
|
||||
GET /web/admin/oa-approval/instances/history
|
||||
appId* | initiatorName? | page | pageSize
|
||||
```
|
||||
|
||||
- 后端已按 JWT + `oa:start:history:all` 收窄范围
|
||||
- 响应含 `list`、`total`、`canViewAll`
|
||||
- 列表项已有:`id`、`appName`、`initiatorUserName`、`applyTime`、`finishTime`、`instanceStatus`、`currentNodeName`、`previewFields` 等
|
||||
|
||||
`mobile-oa-h5/src/api/oa.js` 新增:
|
||||
|
||||
```js
|
||||
export function fetchOaInstanceHistory(params) {
|
||||
return get('/web/admin/oa-approval/instances/history', params)
|
||||
}
|
||||
```
|
||||
|
||||
`mobile-h5` 侧本期可不封装(列表跑在 oa-h5 内)。
|
||||
|
||||
---
|
||||
|
||||
## 6. 路由
|
||||
|
||||
`mobile-oa-h5/src/router.js` 增加:
|
||||
|
||||
```js
|
||||
{ path: '/oa-history', component: OaHistory }
|
||||
```
|
||||
|
||||
Query:`appId`(必填);可选 `appName` 用于标题,避免再请求。
|
||||
|
||||
---
|
||||
|
||||
## 7. 实现要点
|
||||
|
||||
1. **OaStart 底栏**:增加「历史记录」按钮;`onHistory` 取当前 `appId` / 流程名后 `router.push`
|
||||
2. **OaHistory.vue**:首屏拉 history;`canViewAll` 控制检索;分页 `page` 递增;卡片字段映射对齐 mine 的 `cardTitle` / `statusText` / `statusTone`
|
||||
3. **KeepAlive(可选)**:若返回表单丢数据,可为 `/oa-start` 加 keep-alive;优先验证默认行为,按需再加
|
||||
4. **权限文案**:无数据时区分「暂无历史记录」与「未找到相关记录」(有检索词时)
|
||||
|
||||
---
|
||||
|
||||
## 8. 测试要点
|
||||
|
||||
- 无全员权限:仅本人数据;无申请人检索框
|
||||
- 有全员权限:可见他人;申请人检索生效
|
||||
- 从历史进详情再返回,仍在历史列表;再返回表单可继续编辑
|
||||
- 无 appId 时友好提示,不白屏
|
||||
- 视觉:底栏四钮不换行挤压;卡片风格与「我发起的」一致
|
||||
|
||||
---
|
||||
|
||||
## 9. 文件清单(预期)
|
||||
|
||||
| 文件 | 变更 |
|
||||
|------|------|
|
||||
| `mobile-oa-h5/src/views/OaStart.vue` | 底栏按钮 + 跳转 |
|
||||
| `mobile-oa-h5/src/views/OaHistory.vue` | 新建列表页 |
|
||||
| `mobile-oa-h5/src/router.js` | 注册 `/oa-history` |
|
||||
| `mobile-oa-h5/src/api/oa.js` | `fetchOaInstanceHistory` |
|
||||
| (可选)`OaDetail.vue` | 隐藏打印若存在且需按来源隐藏 |
|
||||
|
||||
后端 / 菜单 SQL:**无需**为本期新增。
|
||||
@@ -4,7 +4,7 @@
|
||||
*
|
||||
* 微信公众平台须配置 request / 业务域名:www.chengyantek.cn(HTTPS,安全组放行 443)
|
||||
*/
|
||||
const USE_REMOTE_TEST = true
|
||||
const USE_REMOTE_TEST = false
|
||||
|
||||
/** 本机联调 */
|
||||
const LOCAL_API_BASE_URL = 'http://127.0.0.1:8000/api'
|
||||
|
||||
@@ -101,6 +101,10 @@ export function fetchOaInstanceDetail(id) {
|
||||
return get(`/web/admin/oa-approval/instances/${encodeURIComponent(id)}`)
|
||||
}
|
||||
|
||||
export function fetchOaInstanceHistory(params) {
|
||||
return get('/web/admin/oa-approval/instances/history', params)
|
||||
}
|
||||
|
||||
export function fetchApproveOaTask(taskId, comment) {
|
||||
return post(`/web/admin/oa-approval/tasks/${encodeURIComponent(taskId)}/approve`, {
|
||||
comment
|
||||
|
||||
@@ -2,6 +2,7 @@ import { createRouter, createWebHistory } from 'vue-router'
|
||||
import FormSink from './views/FormSink.vue'
|
||||
import OaStart from './views/OaStart.vue'
|
||||
import OaDetail from './views/OaDetail.vue'
|
||||
import OaHistory from './views/OaHistory.vue'
|
||||
import OaMpBind from './views/OaMpBind.vue'
|
||||
|
||||
export default createRouter({
|
||||
@@ -13,6 +14,7 @@ export default createRouter({
|
||||
},
|
||||
{ path: '/oa-form-sink', component: FormSink },
|
||||
{ path: '/oa-start', component: OaStart },
|
||||
{ path: '/oa-history', component: OaHistory },
|
||||
{ path: '/oa-detail', component: OaDetail },
|
||||
{ path: '/oa-mp-bind', component: OaMpBind }
|
||||
]
|
||||
|
||||
@@ -8,7 +8,8 @@
|
||||
class="oa-detail__body"
|
||||
:class="{
|
||||
'oa-detail__body--approve': canApprove,
|
||||
'oa-detail__body--mine-act': (canWithdraw || canCopyRestart) && !canApprove
|
||||
'oa-detail__body--mine-act':
|
||||
(canWithdraw || canCopyRestart || (!hidePrint && showViewFooter)) && !canApprove
|
||||
}"
|
||||
>
|
||||
<div class="oa-detail__stamp-host">
|
||||
@@ -25,6 +26,7 @@
|
||||
<OaProgressTimeline :items="timelineItems" />
|
||||
</div>
|
||||
<footer
|
||||
v-if="canApprove || showViewFooter"
|
||||
class="oa-detail__ft"
|
||||
:class="{
|
||||
'oa-detail__ft--center': !canApprove && !canWithdraw && !canCopyRestart,
|
||||
@@ -59,8 +61,9 @@
|
||||
<OaBtnLoadingInner :loading="acting">同意</OaBtnLoadingInner>
|
||||
</van-button>
|
||||
</template>
|
||||
<template v-else>
|
||||
<template v-else-if="showViewFooter">
|
||||
<van-button
|
||||
v-if="!hidePrint"
|
||||
class="oa-detail__btn oa-detail__btn--ghost oa-detail__btn--print oa-btn-loading"
|
||||
:class="{ 'is-loading': printing }"
|
||||
:disabled="acting || printing"
|
||||
@@ -238,11 +241,18 @@ const transferComment = ref('')
|
||||
|
||||
const moreVisible = ref(false)
|
||||
|
||||
const moreActions = computed(() => buildMoreActions(detail.value))
|
||||
const hidePrint = computed(() => String(route.query.from || '').trim() === 'history')
|
||||
|
||||
const moreActions = computed(() => {
|
||||
const list = buildMoreActions(detail.value)
|
||||
if (!hidePrint.value) return list
|
||||
return list.filter((a) => a.key !== 'print')
|
||||
})
|
||||
|
||||
const instanceId = computed(() => String(route.query.instanceId || '').trim())
|
||||
const queryTaskId = computed(() => String(route.query.taskId || '').trim())
|
||||
const wantAutoPrint = computed(() => {
|
||||
if (hidePrint.value) return false
|
||||
const v = String(route.query.autoPrint || '').trim()
|
||||
return v === '1' || v === 'true'
|
||||
})
|
||||
@@ -326,6 +336,12 @@ const canCopyRestart = computed(() => {
|
||||
return ['returned', 'cancelled', 'rejected'].includes(String(detail.value.status || ''))
|
||||
})
|
||||
|
||||
/** 只读底栏:历史入口不展示打印;无其它动作时整栏隐藏 */
|
||||
const showViewFooter = computed(() => {
|
||||
if (canWithdraw.value || canCopyRestart.value) return true
|
||||
return !hidePrint.value
|
||||
})
|
||||
|
||||
/** 转交:排除自己 + 本节点已有 pending approval 的办理人 */
|
||||
const transferExcludeIds = computed(() => {
|
||||
const me = currentUserId.value
|
||||
|
||||
@@ -0,0 +1,613 @@
|
||||
<template>
|
||||
<div class="oa-history">
|
||||
<div v-if="canViewAll" class="oa-history__toolbar">
|
||||
<div class="search-box" :class="{ 'is-focus': searchFocused }">
|
||||
<span class="search-ico" aria-hidden="true" />
|
||||
<input
|
||||
v-model="initiatorName"
|
||||
class="search-input"
|
||||
type="search"
|
||||
enterkeyhint="search"
|
||||
placeholder="搜索申请人"
|
||||
@focus="searchFocused = true"
|
||||
@blur="searchFocused = false"
|
||||
@keyup.enter="onSearch"
|
||||
/>
|
||||
<button
|
||||
v-if="initiatorName"
|
||||
type="button"
|
||||
class="search-clear"
|
||||
aria-label="清空"
|
||||
@click="clearSearch"
|
||||
>
|
||||
×
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-if="loading && !list.length" class="state state-loading">
|
||||
<div class="pulse-dots" aria-hidden="true">
|
||||
<span class="pulse-dot" />
|
||||
<span class="pulse-dot" />
|
||||
<span class="pulse-dot" />
|
||||
</div>
|
||||
<p class="state-loading__text">加载历史记录…</p>
|
||||
</div>
|
||||
|
||||
<div v-else-if="!list.length" class="oa-empty-wrap">
|
||||
<van-empty
|
||||
:description="initiatorName ? '未找到相关记录' : '暂无历史记录'"
|
||||
:image-size="80"
|
||||
/>
|
||||
<p class="oa-empty-tip">
|
||||
{{
|
||||
initiatorName
|
||||
? '试试其他申请人,或清空搜索'
|
||||
: '该流程暂无发起记录'
|
||||
}}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div v-else ref="listEl" class="pending-list" @scroll="onScroll">
|
||||
<div
|
||||
v-for="(row, idx) in list"
|
||||
:key="row.id"
|
||||
class="dd-card"
|
||||
@click="openDetail(row)"
|
||||
>
|
||||
<div class="dd-card__corner" aria-hidden="true">
|
||||
<span class="dd-card__corner-num">{{ cornerIndex(idx) }}</span>
|
||||
</div>
|
||||
<div class="dd-card__head">
|
||||
<span class="dd-card__title">{{ cardTitle(row) }}</span>
|
||||
<span class="dd-card__time">{{
|
||||
formatRelativeTime(row.applyTime || row.createTime)
|
||||
}}</span>
|
||||
</div>
|
||||
<div v-if="metaLines(row).length" class="dd-card__meta">
|
||||
<span
|
||||
v-for="(line, i) in metaLines(row)"
|
||||
:key="i"
|
||||
class="dd-card__meta-line"
|
||||
>
|
||||
{{ line }}
|
||||
</span>
|
||||
</div>
|
||||
<div class="dd-card__foot">
|
||||
<span
|
||||
class="dd-card__hint-tag"
|
||||
:class="'is-' + statusToneClass(row)"
|
||||
>
|
||||
{{ hintText(row) }}
|
||||
</span>
|
||||
<span
|
||||
class="dd-card__status"
|
||||
:class="'is-' + statusToneClass(row)"
|
||||
>
|
||||
{{ statusText(row.instanceStatus || row.status) }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="loadingMore" class="oa-task-list__end">加载更多…</div>
|
||||
<div v-else-if="!hasMore" class="oa-task-list__end">已经到底了</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { computed, onMounted, ref } from 'vue'
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
import { showToast } from 'vant'
|
||||
import { fetchOaInstanceHistory } from '../api/oa.js'
|
||||
import { statusText, statusTone } from '../oa/status-label.js'
|
||||
|
||||
const PAGE_SIZE = 10
|
||||
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
|
||||
const appId = computed(() => String(route.query.appId || '').trim())
|
||||
const appName = computed(() => String(route.query.appName || '').trim())
|
||||
const pageTitle = computed(() =>
|
||||
appName.value ? `历史记录 · ${appName.value}` : '历史记录'
|
||||
)
|
||||
|
||||
const list = ref([])
|
||||
const page = ref(1)
|
||||
const total = ref(0)
|
||||
const loading = ref(false)
|
||||
const loadingMore = ref(false)
|
||||
const hasMore = ref(true)
|
||||
const canViewAll = ref(false)
|
||||
const initiatorName = ref('')
|
||||
const searchFocused = ref(false)
|
||||
const listEl = ref(null)
|
||||
|
||||
function formatCornerIndex(n) {
|
||||
const i = Math.floor(Number(n))
|
||||
if (!Number.isFinite(i) || i < 1) return '01'
|
||||
return i < 10 ? `0${i}` : String(i)
|
||||
}
|
||||
|
||||
function cornerIndex(idx) {
|
||||
return formatCornerIndex(Number(idx) + 1)
|
||||
}
|
||||
|
||||
function cardTitle(row) {
|
||||
return (row && (row.title || row.appName || appName.value)) || '-'
|
||||
}
|
||||
|
||||
function statusToneClass(row) {
|
||||
const s = String((row && (row.instanceStatus || row.status)) || '')
|
||||
const tone = statusTone(s)
|
||||
if (tone === 'warn') return 'warn'
|
||||
if (tone === 'ok') return 'success'
|
||||
if (tone === 'danger') return 'danger'
|
||||
return 'info'
|
||||
}
|
||||
|
||||
function hintText(row) {
|
||||
const status = String((row && (row.instanceStatus || row.status)) || '')
|
||||
const names = String((row && row.currentApproverNames) || '').trim()
|
||||
const inProgress = status === 'pending' || status === 'running'
|
||||
if (inProgress && names && names !== '-') {
|
||||
return `待${names}处理`
|
||||
}
|
||||
const node = String((row && row.currentNodeName) || '').trim()
|
||||
if (node && node !== '-') return node
|
||||
const initiator = String((row && row.initiatorUserName) || '').trim()
|
||||
if (initiator) return initiator
|
||||
return '历史记录'
|
||||
}
|
||||
|
||||
function metaLines(row) {
|
||||
const lines = []
|
||||
const initiator = String((row && row.initiatorUserName) || '').trim()
|
||||
if (canViewAll.value && initiator) {
|
||||
lines.push(`申请人:${initiator}`)
|
||||
}
|
||||
const fields = (row && row.previewFields) || []
|
||||
for (let i = 0; i < fields.length && lines.length < 3; i++) {
|
||||
const f = fields[i] || {}
|
||||
const label = String(f.label || '').trim() || '字段'
|
||||
const value =
|
||||
f.value != null && String(f.value).trim() !== '' ? String(f.value) : '-'
|
||||
lines.push(`${label}:${value}`)
|
||||
}
|
||||
return lines
|
||||
}
|
||||
|
||||
function parseDateTime(str) {
|
||||
if (!str) return null
|
||||
const s = String(str).trim().replace(/-/g, '/')
|
||||
const d = new Date(s)
|
||||
return Number.isNaN(d.getTime()) ? null : d
|
||||
}
|
||||
|
||||
function pad2(n) {
|
||||
return n < 10 ? `0${n}` : String(n)
|
||||
}
|
||||
|
||||
function formatRelativeTime(str) {
|
||||
const d = parseDateTime(str)
|
||||
if (!d) return str || '-'
|
||||
const now = new Date()
|
||||
const startToday = new Date(now.getFullYear(), now.getMonth(), now.getDate())
|
||||
const startThat = new Date(d.getFullYear(), d.getMonth(), d.getDate())
|
||||
const diffDay = Math.round((startToday - startThat) / 86400000)
|
||||
const hm = `${pad2(d.getHours())}:${pad2(d.getMinutes())}`
|
||||
if (diffDay === 0) return `今天 ${hm}`
|
||||
if (diffDay === 1) return `昨天 ${hm}`
|
||||
if (d.getFullYear() === now.getFullYear()) {
|
||||
return `${pad2(d.getMonth() + 1)}-${pad2(d.getDate())} ${hm}`
|
||||
}
|
||||
return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`
|
||||
}
|
||||
|
||||
function openDetail(row) {
|
||||
const instanceId = String((row && (row.id || row.instanceId)) || '').trim()
|
||||
if (!instanceId) {
|
||||
showToast('缺少审批 ID')
|
||||
return
|
||||
}
|
||||
const q = { instanceId, from: 'history' }
|
||||
const token = String(route.query.token || '').trim()
|
||||
const returnPath = String(route.query.returnPath || '').trim()
|
||||
if (token) q.token = token
|
||||
if (returnPath) q.returnPath = returnPath
|
||||
router.push({ path: '/oa-detail', query: q })
|
||||
}
|
||||
|
||||
async function loadList(reset) {
|
||||
if (!appId.value) {
|
||||
showToast('缺少流程信息')
|
||||
return
|
||||
}
|
||||
const isReset = !!reset
|
||||
if (isReset) {
|
||||
page.value = 1
|
||||
hasMore.value = true
|
||||
loading.value = true
|
||||
} else {
|
||||
if (!hasMore.value || loadingMore.value || loading.value) return
|
||||
loadingMore.value = true
|
||||
}
|
||||
try {
|
||||
const params = {
|
||||
appId: appId.value,
|
||||
page: page.value,
|
||||
pageSize: PAGE_SIZE
|
||||
}
|
||||
const name = initiatorName.value.trim()
|
||||
if (name) params.initiatorName = name
|
||||
const res = await fetchOaInstanceHistory(params)
|
||||
if (typeof res?.canViewAll === 'boolean') {
|
||||
canViewAll.value = res.canViewAll
|
||||
}
|
||||
const rows = res?.list || []
|
||||
const t = res?.total != null ? Number(res.total) : 0
|
||||
total.value = t
|
||||
if (isReset) list.value = rows
|
||||
else list.value = list.value.concat(rows)
|
||||
const loaded = list.value.length
|
||||
hasMore.value = loaded < t && rows.length > 0
|
||||
if (rows.length > 0) page.value += 1
|
||||
} catch (e) {
|
||||
if (isReset) list.value = []
|
||||
showToast(e?.message || '加载失败')
|
||||
} finally {
|
||||
loading.value = false
|
||||
loadingMore.value = false
|
||||
}
|
||||
}
|
||||
|
||||
function onSearch() {
|
||||
void loadList(true)
|
||||
}
|
||||
|
||||
function clearSearch() {
|
||||
initiatorName.value = ''
|
||||
void loadList(true)
|
||||
}
|
||||
|
||||
function onScroll(e) {
|
||||
const el = e?.target
|
||||
if (!el || !hasMore.value || loading.value || loadingMore.value) return
|
||||
if (el.scrollTop + el.clientHeight >= el.scrollHeight - 48) {
|
||||
void loadList(false)
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
document.title = pageTitle.value
|
||||
void loadList(true)
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.oa-history {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
min-height: 100vh;
|
||||
background: #f5f6f8;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.oa-history__toolbar {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 15;
|
||||
padding: 8px 12px;
|
||||
padding-top: calc(8px + env(safe-area-inset-top));
|
||||
background: #fff;
|
||||
border-bottom: 1px solid #f1f5f9;
|
||||
}
|
||||
|
||||
.search-box {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
align-items: center;
|
||||
height: 36px;
|
||||
padding: 0 12px;
|
||||
background: #fafafa;
|
||||
border: 1px solid #e8eaed;
|
||||
border-radius: 10px;
|
||||
box-sizing: border-box;
|
||||
transition:
|
||||
border-color 0.15s,
|
||||
background 0.15s,
|
||||
box-shadow 0.15s;
|
||||
}
|
||||
|
||||
.search-box.is-focus {
|
||||
background: #fff;
|
||||
border-color: #cbd5e1;
|
||||
box-shadow: 0 0 0 3px rgb(148 163 184 / 18%);
|
||||
}
|
||||
|
||||
.search-ico {
|
||||
position: relative;
|
||||
flex-shrink: 0;
|
||||
width: 13px;
|
||||
height: 13px;
|
||||
border: 1.5px solid #94a3b8;
|
||||
border-radius: 50%;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.search-ico::after {
|
||||
position: absolute;
|
||||
right: -4px;
|
||||
bottom: -3px;
|
||||
width: 6px;
|
||||
height: 1.5px;
|
||||
content: '';
|
||||
background: #94a3b8;
|
||||
border-radius: 2px;
|
||||
transform: rotate(45deg);
|
||||
}
|
||||
|
||||
.search-input {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
height: 36px;
|
||||
padding: 0;
|
||||
font-size: 14px;
|
||||
color: #1f2937;
|
||||
background: transparent;
|
||||
border: none;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.search-clear {
|
||||
display: flex;
|
||||
flex-shrink: 0;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
padding: 0;
|
||||
font-size: 14px;
|
||||
line-height: 1;
|
||||
color: #6b7280;
|
||||
cursor: pointer;
|
||||
background: #e5e7eb;
|
||||
border: none;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
.pending-list {
|
||||
display: flex;
|
||||
flex: 1;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
min-height: 0;
|
||||
padding: 10px 12px 24px;
|
||||
overflow: auto;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.dd-card {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
padding: 14px 14px 12px 42px;
|
||||
background: #fff;
|
||||
border-radius: 10px;
|
||||
box-shadow: 0 2px 10px rgb(15 23 42 / 4%);
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.dd-card:active {
|
||||
opacity: 0.92;
|
||||
}
|
||||
|
||||
.dd-card__corner {
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
left: 10px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
pointer-events: none;
|
||||
background: #0a9f6d;
|
||||
border-radius: 50%;
|
||||
box-shadow: 0 2px 6px rgb(10 159 109 / 28%);
|
||||
}
|
||||
|
||||
.dd-card__corner-num {
|
||||
font-size: 10px;
|
||||
font-weight: 800;
|
||||
line-height: 1;
|
||||
color: #fff;
|
||||
letter-spacing: -0.02em;
|
||||
}
|
||||
|
||||
.dd-card__head {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.dd-card__title {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
font-size: 15px;
|
||||
font-weight: 700;
|
||||
line-height: 1.4;
|
||||
color: #1f2329;
|
||||
}
|
||||
|
||||
.dd-card__time {
|
||||
flex-shrink: 0;
|
||||
padding-top: 2px;
|
||||
font-size: 12px;
|
||||
line-height: 1.4;
|
||||
color: #8f959e;
|
||||
}
|
||||
|
||||
.dd-card__meta {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.dd-card__meta-line {
|
||||
overflow: hidden;
|
||||
font-size: 13px;
|
||||
line-height: 1.45;
|
||||
color: #8f959e;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.dd-card__foot {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
margin-top: 12px;
|
||||
}
|
||||
|
||||
.dd-card__hint-tag {
|
||||
flex: 0 1 auto;
|
||||
max-width: 70%;
|
||||
min-width: 0;
|
||||
padding: 4px 9px;
|
||||
overflow: hidden;
|
||||
font-size: 11px;
|
||||
font-weight: 650;
|
||||
line-height: 1.2;
|
||||
color: #d97706;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
background: rgb(217 119 6 / 12%);
|
||||
border-radius: 999px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.dd-card__hint-tag.is-warn {
|
||||
color: #d97706;
|
||||
background: rgb(217 119 6 / 12%);
|
||||
}
|
||||
|
||||
.dd-card__hint-tag.is-success {
|
||||
color: #0a9f6d;
|
||||
background: rgb(10 159 109 / 12%);
|
||||
}
|
||||
|
||||
.dd-card__hint-tag.is-danger {
|
||||
color: #ef4444;
|
||||
background: rgb(239 68 68 / 12%);
|
||||
}
|
||||
|
||||
.dd-card__hint-tag.is-info {
|
||||
color: #646a73;
|
||||
background: rgb(100 106 115 / 12%);
|
||||
}
|
||||
|
||||
.dd-card__status {
|
||||
flex-shrink: 0;
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
color: #d97706;
|
||||
}
|
||||
|
||||
.dd-card__status.is-warn {
|
||||
color: #d97706;
|
||||
}
|
||||
|
||||
.dd-card__status.is-success {
|
||||
color: #0a9f6d;
|
||||
}
|
||||
|
||||
.dd-card__status.is-danger {
|
||||
color: #ef4444;
|
||||
}
|
||||
|
||||
.dd-card__status.is-info {
|
||||
color: #64748b;
|
||||
}
|
||||
|
||||
.oa-task-list__end {
|
||||
padding: 12px 0 8px;
|
||||
font-size: 12px;
|
||||
color: #94a3b8;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.state {
|
||||
padding: 40px 12px;
|
||||
font-size: 14px;
|
||||
color: #999;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.state-loading {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 14px;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
min-height: 50vh;
|
||||
padding: 48px 16px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.pulse-dots {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.pulse-dot {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
background: #0a9f6d;
|
||||
border-radius: 50%;
|
||||
animation: oa-pulse-bounce 1.2s ease-in-out infinite;
|
||||
}
|
||||
|
||||
.pulse-dot:nth-child(2) {
|
||||
opacity: 0.75;
|
||||
animation-delay: 0.15s;
|
||||
}
|
||||
|
||||
.pulse-dot:nth-child(3) {
|
||||
opacity: 0.55;
|
||||
animation-delay: 0.3s;
|
||||
}
|
||||
|
||||
.state-loading__text {
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
line-height: 1.4;
|
||||
color: #5f7a6d;
|
||||
}
|
||||
|
||||
.oa-empty-wrap {
|
||||
padding: 48px 16px 24px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.oa-empty-tip {
|
||||
margin: 0;
|
||||
font-size: 13px;
|
||||
line-height: 1.4;
|
||||
color: #94a3b8;
|
||||
}
|
||||
|
||||
@keyframes oa-pulse-bounce {
|
||||
0%,
|
||||
80%,
|
||||
100% {
|
||||
transform: translateY(0);
|
||||
}
|
||||
40% {
|
||||
transform: translateY(-6px);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -40,8 +40,8 @@
|
||||
/>
|
||||
</div>
|
||||
<footer class="oa-start__ft">
|
||||
<van-button class="oa-start__btn oa-start__btn--cancel" @click="onCancel">
|
||||
取消
|
||||
<van-button class="oa-start__btn oa-start__btn--history" @click="onHistory">
|
||||
历史记录
|
||||
</van-button>
|
||||
<van-button
|
||||
class="oa-start__btn oa-start__btn--draft oa-btn-loading"
|
||||
@@ -741,8 +741,21 @@ async function bootstrap() {
|
||||
}
|
||||
}
|
||||
|
||||
function onCancel() {
|
||||
closeToMini({ action: 'oa-start-cancel' })
|
||||
function onHistory() {
|
||||
const appId = String(appMeta.value?.id || '').trim()
|
||||
if (!appId) {
|
||||
showToast('缺少流程信息')
|
||||
return
|
||||
}
|
||||
const q = {
|
||||
appId,
|
||||
appName: String(appMeta.value?.appName || '').trim() || undefined
|
||||
}
|
||||
const token = String(route.query.token || '').trim()
|
||||
const returnPath = String(route.query.returnPath || '').trim()
|
||||
if (token) q.token = token
|
||||
if (returnPath) q.returnPath = returnPath
|
||||
router.push({ path: '/oa-history', query: q })
|
||||
}
|
||||
|
||||
async function saveDraft() {
|
||||
@@ -919,10 +932,10 @@ onUnmounted(() => {
|
||||
border-radius: 12px !important;
|
||||
font-size: 15px;
|
||||
}
|
||||
.oa-start__btn--cancel {
|
||||
.oa-start__btn--history {
|
||||
flex: 0 0 auto;
|
||||
height: 44px;
|
||||
padding: 0 10px !important;
|
||||
padding: 0 8px !important;
|
||||
border: none !important;
|
||||
background: transparent !important;
|
||||
color: #94a3b8 !important;
|
||||
@@ -930,7 +943,7 @@ onUnmounted(() => {
|
||||
font-size: 14px;
|
||||
border-radius: 0 !important;
|
||||
}
|
||||
.oa-start__btn--cancel:active {
|
||||
.oa-start__btn--history:active {
|
||||
opacity: 0.7;
|
||||
}
|
||||
.oa-start__btn--draft {
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -1,11 +1,11 @@
|
||||
# Graph Report - src (2026-08-28)
|
||||
|
||||
## Corpus Check
|
||||
- Large corpus: 992 files · ~652,997 words. Semantic extraction will be expensive (many Claude tokens). Consider running on a subfolder, or use --no-semantic to run AST-only.
|
||||
- Large corpus: 993 files · ~655,581 words. Semantic extraction will be expensive (many Claude tokens). Consider running on a subfolder, or use --no-semantic to run AST-only.
|
||||
|
||||
## Summary
|
||||
- 3550 nodes · 5051 edges · 68 communities detected
|
||||
- Extraction: 78% EXTRACTED · 22% INFERRED · 0% AMBIGUOUS · INFERRED: 1109 edges (avg confidence: 0.8)
|
||||
- 3573 nodes · 5087 edges · 72 communities detected
|
||||
- Extraction: 78% EXTRACTED · 22% INFERRED · 0% AMBIGUOUS · INFERRED: 1115 edges (avg confidence: 0.8)
|
||||
- Token cost: 0 input · 0 output
|
||||
|
||||
## Community Hubs (Navigation)
|
||||
@@ -56,31 +56,35 @@
|
||||
- [[_COMMUNITY_Community 45|Community 45]]
|
||||
- [[_COMMUNITY_Community 46|Community 46]]
|
||||
- [[_COMMUNITY_Community 47|Community 47]]
|
||||
- [[_COMMUNITY_Community 49|Community 49]]
|
||||
- [[_COMMUNITY_Community 52|Community 52]]
|
||||
- [[_COMMUNITY_Community 48|Community 48]]
|
||||
- [[_COMMUNITY_Community 50|Community 50]]
|
||||
- [[_COMMUNITY_Community 53|Community 53]]
|
||||
- [[_COMMUNITY_Community 55|Community 55]]
|
||||
- [[_COMMUNITY_Community 54|Community 54]]
|
||||
- [[_COMMUNITY_Community 56|Community 56]]
|
||||
- [[_COMMUNITY_Community 57|Community 57]]
|
||||
- [[_COMMUNITY_Community 58|Community 58]]
|
||||
- [[_COMMUNITY_Community 59|Community 59]]
|
||||
- [[_COMMUNITY_Community 60|Community 60]]
|
||||
- [[_COMMUNITY_Community 61|Community 61]]
|
||||
- [[_COMMUNITY_Community 62|Community 62]]
|
||||
- [[_COMMUNITY_Community 66|Community 66]]
|
||||
- [[_COMMUNITY_Community 72|Community 72]]
|
||||
- [[_COMMUNITY_Community 75|Community 75]]
|
||||
- [[_COMMUNITY_Community 64|Community 64]]
|
||||
- [[_COMMUNITY_Community 65|Community 65]]
|
||||
- [[_COMMUNITY_Community 69|Community 69]]
|
||||
- [[_COMMUNITY_Community 71|Community 71]]
|
||||
- [[_COMMUNITY_Community 76|Community 76]]
|
||||
- [[_COMMUNITY_Community 78|Community 78]]
|
||||
- [[_COMMUNITY_Community 79|Community 79]]
|
||||
- [[_COMMUNITY_Community 80|Community 80]]
|
||||
- [[_COMMUNITY_Community 82|Community 82]]
|
||||
- [[_COMMUNITY_Community 83|Community 83]]
|
||||
- [[_COMMUNITY_Community 95|Community 95]]
|
||||
- [[_COMMUNITY_Community 98|Community 98]]
|
||||
- [[_COMMUNITY_Community 84|Community 84]]
|
||||
- [[_COMMUNITY_Community 88|Community 88]]
|
||||
- [[_COMMUNITY_Community 99|Community 99]]
|
||||
- [[_COMMUNITY_Community 102|Community 102]]
|
||||
- [[_COMMUNITY_Community 103|Community 103]]
|
||||
|
||||
## God Nodes (most connected - your core abstractions)
|
||||
1. `get()` - 315 edges
|
||||
2. `push()` - 123 edges
|
||||
1. `get()` - 316 edges
|
||||
2. `push()` - 125 edges
|
||||
3. `emit()` - 29 edges
|
||||
4. `WebSocketClient` - 26 edges
|
||||
5. `set()` - 21 edges
|
||||
@@ -95,86 +99,86 @@
|
||||
views/quality-inspection/storage-release-review/index.vue → utils/fullscreen-loading.ts
|
||||
- `handleBatchDelete()` --calls--> `withFullscreenLoading()` [INFERRED]
|
||||
views/basic-info/customer/index.vue → utils/fullscreen-loading.ts
|
||||
- `formatDetectMethods()` --calls--> `push()` [INFERRED]
|
||||
utils/qc-work-order-card-meta.ts → views/operations/storage-facility/index.vue
|
||||
- `buildCellStorageGroupContext()` --calls--> `push()` [INFERRED]
|
||||
utils/qc-work-order-card-meta.ts → views/operations/storage-facility/index.vue
|
||||
- `buildDonationGroupContext()` --calls--> `push()` [INFERRED]
|
||||
utils/qc-work-order-card-meta.ts → views/operations/storage-facility/index.vue
|
||||
- `onPick()` --calls--> `ensureOvertimeKitRuleProps()` [INFERRED]
|
||||
components/oa-approval/OaStartFormDialog.vue → utils/oa-overtime-kit-runtime.ts
|
||||
- `formatReceiveAccountLine()` --calls--> `push()` [INFERRED]
|
||||
utils/oa-receive-account-value.ts → views/operations/storage-facility/index.vue
|
||||
- `displayCell()` --calls--> `formatDisplayOrDash()` [INFERRED]
|
||||
views/production/waste-output/index.vue → utils/datetime-display.ts
|
||||
|
||||
## Communities
|
||||
|
||||
### Community 0 - "Community 0"
|
||||
Cohesion: 0.0
|
||||
Nodes (200): fetchAccessLogList(), fetchActiveRegions(), fetchCategoryList(), fetchCategoryParameters(), fetchCellProductPriceList(), fetchCellProductSpecList(), fetchCellProductTypeList(), fetchChannelAccount() (+192 more)
|
||||
Nodes (201): fetchAccessLogList(), fetchActiveRegions(), fetchCategoryList(), fetchCategoryParameters(), fetchCellProductPriceList(), fetchCellProductSpecList(), fetchCellProductTypeList(), fetchChannelAccount() (+193 more)
|
||||
|
||||
### Community 1 - "Community 1"
|
||||
Cohesion: 0.02
|
||||
Nodes (101): fetchUploadAttachment(), fetchMyQcTaskList(), fetchQcTaskDetail(), fetchQcTaskList(), FireworkSystem, handleReportUpload(), handleReportUpload(), walk() (+93 more)
|
||||
Cohesion: 0.03
|
||||
Nodes (87): batchSavePilotCheckup(), deletePilotCheckupActualItem(), fetchCheckupInstitutionList(), fetchCheckupInstitutionPackageDetail(), fetchCheckupInstitutionPackages(), fetchPilotCheckupDetail(), fetchPilotCheckupList(), markPilotCheckupChecked() (+79 more)
|
||||
|
||||
### Community 2 - "Community 2"
|
||||
Cohesion: 0.03
|
||||
Nodes (88): batchSavePilotCheckup(), deletePilotCheckupActualItem(), fetchCheckupInstitutionList(), fetchCheckupInstitutionPackageDetail(), fetchCheckupInstitutionPackages(), fetchPilotCheckupDetail(), fetchPilotCheckupList(), fetchUpdatePostBoundRoles() (+80 more)
|
||||
Nodes (84): fetchUploadAttachment(), handleReportUpload(), handleReportUpload(), walk(), if(), async(), addDispatchItem(), createDispatchItem() (+76 more)
|
||||
|
||||
### Community 3 - "Community 3"
|
||||
Cohesion: 0.03
|
||||
Nodes (79): fetchEthnicList(), formatNowDatetime(), applyDonationBundleToForm(), createEmptyTransport(), ensureEthnicOptionInList(), handleOpenForAdd(), if(), loadEthnicOptions() (+71 more)
|
||||
Cohesion: 0.02
|
||||
Nodes (65): fetchBatchDeleteOaReceiveAccounts(), fetchBatchMarkOaCcTasksRead(), fetchCreateOaReceiveAccount(), fetchDeleteOaReceiveAccount(), fetchMarkOaCcTaskRead(), fetchOaAppDraft(), fetchOaCcUnreadCount(), fetchOaInstanceDetail() (+57 more)
|
||||
|
||||
### Community 4 - "Community 4"
|
||||
Cohesion: 0.03
|
||||
Nodes (60): fetchBatchDeleteOaReceiveAccounts(), fetchBatchMarkOaCcTasksRead(), fetchCreateOaReceiveAccount(), fetchDeleteOaReceiveAccount(), fetchMarkOaCcTaskRead(), fetchOaAppDraft(), fetchOaCcUnreadCount(), fetchOaInstanceDetail() (+52 more)
|
||||
Nodes (79): fetchEthnicList(), formatNowDatetime(), applyDonationBundleToForm(), createEmptyTransport(), ensureEthnicOptionInList(), handleOpenForAdd(), if(), loadEthnicOptions() (+71 more)
|
||||
|
||||
### Community 5 - "Community 5"
|
||||
Cohesion: 0.03
|
||||
Nodes (34): fetchGetMenuList(), ComponentLoader, IframeRouteManager, MenuProcessor, RoutePermissionValidator, RouteRegistry, RouteTransformer, useAppMode() (+26 more)
|
||||
Nodes (66): fetchFullmoonTodoList(), fetchUpdateFullmoonTodoInsurance(), fetchCollectionProtocolAuditList(), fetchCollectionProtocolDetail(), fetchCollectionProtocolList(), fetchCreateProtocolInvoiceRequest(), fetchInvoiceEligiblePayments(), fetchPaymentDetailList() (+58 more)
|
||||
|
||||
### Community 6 - "Community 6"
|
||||
Cohesion: 0.03
|
||||
Nodes (48): handleBlur(), handleFocus(), handleInput(), fetchClinicalPaymentDetail(), fetchClinicalPayments(), fetchClinicalReceiptConfirmed(), fetchClinicalReceiptPending(), fetchClinicalRefundConfirmed() (+40 more)
|
||||
Nodes (47): handleBlur(), handleFocus(), handleInput(), fetchClinicalPaymentDetail(), fetchClinicalPayments(), fetchClinicalReceiptConfirmed(), fetchClinicalReceiptPending(), fetchClinicalRefundConfirmed() (+39 more)
|
||||
|
||||
### Community 7 - "Community 7"
|
||||
Cohesion: 0.04
|
||||
Nodes (76): fetchDeptTree(), fetchOaFlowPreview(), fetchOaTemplateDetail(), branchConditionLines(), collectConditionReferencedFields(), collectFormConditionReferencedFields(), flattenFormRules(), formatConditionPreview() (+68 more)
|
||||
Cohesion: 0.03
|
||||
Nodes (59): buildInboundBasicSection(), buildInboundCellStorageViewSections(), buildInboundResearchDonationViewSections(), buildReceptionSection(), buildTemporaryViewSections(), buildTransportSection(), resolveInboundProtocolStatus(), buildInsertedSiblingCard() (+51 more)
|
||||
|
||||
### Community 8 - "Community 8"
|
||||
Cohesion: 0.03
|
||||
Nodes (59): fetchCheckupInstitutionInvoices(), fetchCheckupInstitutionProjects(), fetchCreateCheckupInstitution(), fetchCreateCheckupInstitutionInvoice(), fetchCreateCheckupInstitutionProject(), fetchUpdateCheckupInstitution(), fetchUpdateCheckupInstitutionInvoice(), fetchUpdateCheckupInstitutionProject() (+51 more)
|
||||
Nodes (54): useSettingsHandlers(), useSettingsPanel(), useSettingsState(), useCeremony(), useTheme(), if(), nodeSummary(), createDefaultFlow() (+46 more)
|
||||
|
||||
### Community 9 - "Community 9"
|
||||
Cohesion: 0.03
|
||||
Nodes (50): fetchProductionWorkOrderQcInfo(), dash(), fmtMoney(), attachmentFullUrl(), dash(), handleAttachmentDownload(), handleAttachmentPreview(), auditorDisplay() (+42 more)
|
||||
Nodes (59): fetchCheckupInstitutionInvoices(), fetchCheckupInstitutionProjects(), fetchCreateCheckupInstitution(), fetchCreateCheckupInstitutionInvoice(), fetchCreateCheckupInstitutionProject(), fetchUpdateCheckupInstitution(), fetchUpdateCheckupInstitutionInvoice(), fetchUpdateCheckupInstitutionProject() (+51 more)
|
||||
|
||||
### Community 10 - "Community 10"
|
||||
Cohesion: 0.03
|
||||
Nodes (59): fetchMyProductionTasks(), useInboundSiblingNavigation(), shouldApplyTriggerSourceFilter(), useQcWorkOrderTabPage(), buildMineTableRows(), buildPresetTasksMap(), buildWorkOrderFromTasks(), fetchAllMineProductionTasks() (+51 more)
|
||||
Nodes (42): fetchGetMenuList(), fetchGetMenuCodes(), fetchGetUserInfo(), fetchLogin(), fetchUpdateProfile(), fetchUploadProfileAvatar(), MenuProcessor, RoutePermissionValidator (+34 more)
|
||||
|
||||
### Community 11 - "Community 11"
|
||||
Cohesion: 0.03
|
||||
Nodes (58): fetchFullmoonTodoList(), fetchUpdateFullmoonTodoInsurance(), fetchCollectionProtocolAuditList(), fetchCollectionProtocolDetail(), fetchCollectionProtocolList(), fetchCreateProtocolInvoiceRequest(), fetchInvoiceEligiblePayments(), fetchPaymentDetailList() (+50 more)
|
||||
Cohesion: 0.04
|
||||
Nodes (45): buildBaseFields(), buildFeeSection(), buildInboundBasicSection(), buildInboundCellStorageProductionViewSections(), buildInboundResearchDonationProductionViewSections(), buildOutboundBasicExperimentProductionViewSections(), buildOutboundClinicalProductionViewSections(), buildOutboundDetail() (+37 more)
|
||||
|
||||
### Community 12 - "Community 12"
|
||||
Cohesion: 0.04
|
||||
Nodes (44): buildBaseFields(), buildInboundBasicSection(), buildInboundCellStorageProductionViewSections(), buildInboundResearchDonationProductionViewSections(), buildOutboundBasicExperimentProductionViewSections(), buildOutboundClinicalProductionViewSections(), buildOutboundDetail(), buildOutboundPilotProductionViewSections() (+36 more)
|
||||
Nodes (53): fetchMyProductionTasks(), fetchMyQcTaskList(), fetchQcTaskDetail(), fetchQcTaskList(), fetchMineTasksForWorkOrders(), useInboundSiblingNavigation(), shouldApplyTriggerSourceFilter(), useQcWorkOrderTabPage() (+45 more)
|
||||
|
||||
### Community 13 - "Community 13"
|
||||
Cohesion: 0.03
|
||||
Nodes (49): useSettingsHandlers(), useSettingsPanel(), useSettingsState(), useCeremony(), useTheme(), if(), nodeSummary(), createDefaultFlow() (+41 more)
|
||||
Cohesion: 0.04
|
||||
Nodes (65): fetchDeptTree(), fetchOaFlowPreview(), fetchOaTemplateDetail(), branchConditionLines(), collectConditionReferencedFields(), collectFormConditionReferencedFields(), flattenFormRules(), formatConditionPreview() (+57 more)
|
||||
|
||||
### Community 14 - "Community 14"
|
||||
Cohesion: 0.04
|
||||
Nodes (45): fetchUserList(), fetchAddTaskStep(), fetchCopyTaskStep(), fetchDeleteTaskStep(), fetchDispatchProductionTaskSteps(), fetchForwardProductionTask(), fetchProductionTaskDetail(), fetchProductionTaskEditorInit() (+37 more)
|
||||
Nodes (52): fetchCreateCustomer(), fetchCustomerList(), fetchDeleteCustomer(), fetchUpdateCustomer(), updateInfusionScheduleStatus(), handleDialogClose(), handleAdd(), handleBatchDelete() (+44 more)
|
||||
|
||||
### Community 15 - "Community 15"
|
||||
Cohesion: 0.04
|
||||
Nodes (49): fetchCreateCustomer(), fetchCustomerList(), fetchDeleteCustomer(), fetchUpdateCustomer(), updateInfusionScheduleStatus(), handleDialogClose(), handleAdd(), handleBatchDelete() (+41 more)
|
||||
Nodes (35): dash(), fmtMoney(), attachmentFullUrl(), dash(), handleAttachmentDownload(), handleAttachmentPreview(), auditorDisplay(), dash() (+27 more)
|
||||
|
||||
### Community 16 - "Community 16"
|
||||
Cohesion: 0.05
|
||||
Nodes (53): fetchGetMenuCodes(), fetchGetUserInfo(), fetchLogin(), fetchRefreshToken(), fetchUpdateProfile(), fetchUploadProfileAvatar(), toLogin(), fetchUserInfo() (+45 more)
|
||||
Cohesion: 0.04
|
||||
Nodes (43): fetchCellSampleTypeList(), fetchCreateCellSampleType(), fetchCreateMenu(), fetchDeleteCellSampleType(), fetchDeleteMenu(), fetchMenuTree(), fetchUpdateCellSampleType(), fetchUpdateMenu() (+35 more)
|
||||
|
||||
### Community 17 - "Community 17"
|
||||
Cohesion: 0.04
|
||||
Nodes (38): fetchCellSampleTypeList(), fetchCreateCellSampleType(), fetchCreateMenu(), fetchDeleteCellSampleType(), fetchDeleteMenu(), fetchMenuTree(), fetchUpdateCellSampleType(), fetchUpdateMenu() (+30 more)
|
||||
Nodes (45): fetchUserList(), fetchAddTaskStep(), fetchCopyTaskStep(), fetchDeleteTaskStep(), fetchDispatchProductionTaskSteps(), fetchForwardProductionTask(), fetchProductionTaskDetail(), fetchProductionTaskEditorInit() (+37 more)
|
||||
|
||||
### Community 18 - "Community 18"
|
||||
Cohesion: 0.06
|
||||
@@ -185,52 +189,52 @@ Cohesion: 0.05
|
||||
Nodes (39): fetchCreateQcInspectionItemTemplate(), fetchDeleteQcInspectionItemTemplate(), fetchQcInspectionItemTemplateDetail(), fetchQcInspectionItemTemplateList(), fetchQcInspectionItemTemplatesActive(), fetchUpdateQcInspectionItemTemplate(), fetchQcLabTestItemList(), fetchQcLabTestItemsActive() (+31 more)
|
||||
|
||||
### Community 20 - "Community 20"
|
||||
Cohesion: 0.05
|
||||
Nodes (23): fetchQcMaterialBatchDetail(), fetchQcMaterialBatchList(), fetchQcMaterialBatchOptions(), fetchQcMaterialList(), fetchQcMaterialOptions(), fetchUpdateQcMaterialBatch(), fetchMarkQcMaterialUsageFullyUsed(), financeAttachmentsToUrlString() (+15 more)
|
||||
|
||||
### Community 21 - "Community 21"
|
||||
Cohesion: 0.08
|
||||
Nodes (37): formatDatetimeToMinute(), handleChineseDatetimePaste(), parseChineseDatetimeText(), parseBirthOrder(), parseChineseNumeral(), addSampleHint(), earliestCollectTime(), isMaternalBloodEmpty() (+29 more)
|
||||
|
||||
### Community 21 - "Community 21"
|
||||
Cohesion: 0.06
|
||||
Nodes (22): fetchQcMaterialBatchDetail(), fetchQcMaterialBatchList(), fetchQcMaterialBatchOptions(), fetchQcMaterialList(), fetchQcMaterialOptions(), fetchUpdateQcMaterialBatch(), fetchMarkQcMaterialUsageFullyUsed(), financeAttachmentsToUrlString() (+14 more)
|
||||
|
||||
### Community 22 - "Community 22"
|
||||
Cohesion: 0.1
|
||||
Nodes (2): WebSocketClient, TableCache
|
||||
|
||||
### Community 23 - "Community 23"
|
||||
Cohesion: 0.08
|
||||
Nodes (33): fetchRefreshToken(), toLogin(), base64ToBytes(), bytesToBase64(), decryptJson(), deriveKey(), encryptJson(), fromBase64Url() (+25 more)
|
||||
|
||||
### Community 24 - "Community 24"
|
||||
Cohesion: 0.07
|
||||
Nodes (24): fetchMineProductionWorkOrderTabStepCounts(), fetchMineProductionWorkOrderTabStepCountsDeduped(), fetchProductionWorkOrderCellProductOptions(), fetchProductionWorkOrderDetail(), fetchProductionWorkOrderList(), fetchProductionWorkOrderQcDispatchOptions(), fetchProductionWorkOrderQcInfo(), fetchProductionWorkOrderTabStepCounts() (+16 more)
|
||||
|
||||
### Community 25 - "Community 25"
|
||||
Cohesion: 0.09
|
||||
Nodes (8): getDefaultLanguage(), checkStorageCompatibility(), StorageConfig, getSystemStorage(), getSysVersion(), StorageKeyManager, StorageCompatibilityManager, validateStorageData()
|
||||
|
||||
### Community 24 - "Community 24"
|
||||
### Community 26 - "Community 26"
|
||||
Cohesion: 0.08
|
||||
Nodes (12): ComponentLoader, IframeRouteManager, RouteTransformer, getFirstMenuPath(), getFirstSecondLevelMenuPath(), isIframe(), isNavigableMenuItem(), isWorkbenchMenuItem() (+4 more)
|
||||
|
||||
### Community 27 - "Community 27"
|
||||
Cohesion: 0.08
|
||||
Nodes (20): createEmptySnapshots(), normalizeConfiguredReagents(), normalizeConsumables(), normalizeDataCollections(), normalizeReagents(), normalizeStepOutputs(), serializeAttachments(), serializeEquipmentIds() (+12 more)
|
||||
|
||||
### Community 25 - "Community 25"
|
||||
### Community 28 - "Community 28"
|
||||
Cohesion: 0.07
|
||||
Nodes (19): fetchDeleteMaterialBatch(), fetchMaterialBatchList(), fetchMaterialBatchOptions(), fetchMaterialList(), fetchMaterialOptions(), fetchUpdateMaterialBatch(), fetchMaterialUsageList(), fetchMyMaterialUsageList() (+11 more)
|
||||
|
||||
### Community 26 - "Community 26"
|
||||
Cohesion: 0.09
|
||||
Nodes (28): completePilotApplication(), deletePilotApplication(), fetchPilotApplicationList(), startPilotApplication(), voidPilotApplication(), clearTableSelection(), handleBatchComplete(), handleBatchStart() (+20 more)
|
||||
|
||||
### Community 27 - "Community 27"
|
||||
Cohesion: 0.09
|
||||
Nodes (18): fetchProductionReceptionBySampleCode(), fetchProductionReceptionSubmit(), fetchProductionReceptionUpdate(), onUserSelectVisible(), remoteSearchUsers(), buildPayload(), ensureDefaultHandler(), initDialog() (+10 more)
|
||||
|
||||
### Community 28 - "Community 28"
|
||||
Cohesion: 0.09
|
||||
Nodes (22): fetchMineProductionWorkOrderTabStepCounts(), fetchMineProductionWorkOrderTabStepCountsDeduped(), fetchProductionWorkOrderCellProductOptions(), fetchProductionWorkOrderDetail(), fetchProductionWorkOrderList(), fetchProductionWorkOrderQcDispatchOptions(), fetchProductionWorkOrderTabStepCounts(), fetchProductionWorkOrderTabStepCountsDeduped() (+14 more)
|
||||
|
||||
### Community 29 - "Community 29"
|
||||
Cohesion: 0.1
|
||||
Nodes (20): buildInboundBasicSection(), buildInboundCellStorageViewSections(), buildInboundResearchDonationViewSections(), buildReceptionSection(), buildTransportSection(), resolveInboundProtocolStatus(), appendTaskResultSections(), batchTasksForPanelSlot() (+12 more)
|
||||
Cohesion: 0.08
|
||||
Nodes (19): fetchProductionReceptionBySampleCode(), fetchProductionReceptionSubmit(), fetchProductionReceptionUpdate(), onUserSelectVisible(), remoteSearchUsers(), buildPayload(), ensureDefaultHandler(), initDialog() (+11 more)
|
||||
|
||||
### Community 30 - "Community 30"
|
||||
Cohesion: 0.09
|
||||
Nodes (22): fetchOaAppList(), fetchOaGroupList(), fetchPublishOaApp(), loadData(), loadGroups(), resetForm(), onSuccess(), goBack() (+14 more)
|
||||
Nodes (28): completePilotApplication(), deletePilotApplication(), fetchPilotApplicationList(), startPilotApplication(), voidPilotApplication(), clearTableSelection(), handleBatchComplete(), handleBatchStart() (+20 more)
|
||||
|
||||
### Community 31 - "Community 31"
|
||||
Cohesion: 0.05
|
||||
Nodes (8): fetchQcMaterialAmountAuthUsers(), fetchQcMonthTemplateList(), fetchNextDonationSampleCode(), fetchResearchDonationAuditList(), fetchResearchDonationDetail(), fetchResearchDonationList(), fetchSampleSmsNotificationList(), fetchStorageEntrySmsList()
|
||||
Cohesion: 0.09
|
||||
Nodes (22): fetchOaAppList(), fetchOaGroupList(), fetchPublishOaApp(), loadData(), loadGroups(), resetForm(), onSuccess(), goBack() (+14 more)
|
||||
|
||||
### Community 32 - "Community 32"
|
||||
Cohesion: 0.1
|
||||
@@ -253,25 +257,25 @@ Cohesion: 0.19
|
||||
Nodes (15): fetchAttachmentDownloadUrl(), attachmentFullUrl(), ensureUniqueZipEntryName(), fetchAttachmentBlob(), getAttachmentExtension(), resolveAttachmentFileName(), sanitizeZipPathSegment(), applyInboundLabStorageCodePrefix() (+7 more)
|
||||
|
||||
### Community 37 - "Community 37"
|
||||
Cohesion: 0.13
|
||||
Nodes (8): chipTitle(), confirmPicker(), memberOptionLabel(), removeUser(), resolveUser(), signBadge(), signBadgeText(), updateSelect()
|
||||
|
||||
### Community 38 - "Community 38"
|
||||
Cohesion: 0.2
|
||||
Nodes (14): applyFlagToRule(), applySchema(), countRules(), getActiveRule(), getDesigner(), getSetupState(), onMessage(), readFlag() (+6 more)
|
||||
|
||||
### Community 39 - "Community 39"
|
||||
### Community 38 - "Community 38"
|
||||
Cohesion: 0.12
|
||||
Nodes (6): setupOaConfirmationKit(), ensureOaKitMenu(), setupOaLeaveKit(), setupOaOvertimeKit(), setupOaResignationKit(), setupOaTripKit()
|
||||
|
||||
### Community 40 - "Community 40"
|
||||
### Community 39 - "Community 39"
|
||||
Cohesion: 0.16
|
||||
Nodes (10): useTable(), useTableImpl(), getColumnChecks(), useTableColumns(), createErrorHandler(), createSmartDebounce(), defaultResponseAdapter(), extractPagination() (+2 more)
|
||||
|
||||
### Community 41 - "Community 41"
|
||||
### Community 40 - "Community 40"
|
||||
Cohesion: 0.27
|
||||
Nodes (14): useChart(), useChartComponent(), useChartOps(), colourBlend(), getCssVar(), getDarkColor(), getLightColor(), handleElementThemeColor() (+6 more)
|
||||
|
||||
### Community 41 - "Community 41"
|
||||
Cohesion: 0.33
|
||||
Nodes (13): buildProtocolPaymentFlowSteps(), dash(), financeReceiptTime(), formatAmount(), hasFinanceReceipt(), hasFinanceRefund(), hasReceiptSubmit(), hasRefundSubmit() (+5 more)
|
||||
|
||||
### Community 42 - "Community 42"
|
||||
Cohesion: 0.19
|
||||
Nodes (6): fetchServiceOrderTxnList(), handleReset(), handleSearch(), handleTabChange(), loadData(), switchTab()
|
||||
@@ -281,154 +285,178 @@ Cohesion: 0.24
|
||||
Nodes (10): buildPrintDocumentHtml(), cleanupPrintIframe(), embedSopImagesAsDataUrls(), getSopA4ContentHeightPx(), getSopA4EditorHeightPx(), normalizeSopCheckboxes(), prepareSopHtmlForPrint(), printSopHtml() (+2 more)
|
||||
|
||||
### Community 45 - "Community 45"
|
||||
Cohesion: 0.24
|
||||
Nodes (8): fullFileUrl(), handlePreviewAttachment(), isVideoFile(), normalizeDisplayValue(), resolveReviewCellType(), resolveReviewQuantity(), resolveReviewSpecText(), uniqueJoined()
|
||||
Cohesion: 0.15
|
||||
Nodes (4): fetchNextDonationSampleCode(), fetchResearchDonationAuditList(), fetchResearchDonationDetail(), fetchResearchDonationList()
|
||||
|
||||
### Community 46 - "Community 46"
|
||||
Cohesion: 0.31
|
||||
Nodes (4): isSlotAvailable(), resolveStorageSlotRangeFill(), slotFacilityNodeId(), sortBoxSlots()
|
||||
|
||||
### Community 47 - "Community 47"
|
||||
Cohesion: 0.28
|
||||
Nodes (1): FireworkSystem
|
||||
|
||||
### Community 48 - "Community 48"
|
||||
Cohesion: 0.25
|
||||
Nodes (2): handleTouchEnd(), setTransition()
|
||||
|
||||
### Community 49 - "Community 49"
|
||||
### Community 50 - "Community 50"
|
||||
Cohesion: 0.28
|
||||
Nodes (4): fetchMyProductionMaterialConsumptions(), handleReset(), handleSearch(), loadData()
|
||||
Nodes (4): isActiveHistoryInstance(), isUploadPreviewLabel(), previewColumnMinWidth(), syncWorktabTitle()
|
||||
|
||||
### Community 52 - "Community 52"
|
||||
### Community 53 - "Community 53"
|
||||
Cohesion: 0.39
|
||||
Nodes (6): isIgnorableScriptError(), normalizeErrorMessage(), registerPromiseErrorHandler(), registerResourceErrorHandler(), scriptErrorHandler(), setupErrorHandle()
|
||||
|
||||
### Community 53 - "Community 53"
|
||||
### Community 54 - "Community 54"
|
||||
Cohesion: 0.36
|
||||
Nodes (1): TableHeightCalculator
|
||||
|
||||
### Community 55 - "Community 55"
|
||||
### Community 56 - "Community 56"
|
||||
Cohesion: 0.33
|
||||
Nodes (2): logApiCryptoBootInfo(), maskSecret()
|
||||
|
||||
### Community 56 - "Community 56"
|
||||
### Community 57 - "Community 57"
|
||||
Cohesion: 0.38
|
||||
Nodes (4): handleFocus(), handleInput(), parseDecimalToNumber(), sanitizeDecimalInput()
|
||||
|
||||
### Community 57 - "Community 57"
|
||||
### Community 58 - "Community 58"
|
||||
Cohesion: 0.29
|
||||
Nodes (1): fetchQcMonthTemplateList()
|
||||
|
||||
### Community 59 - "Community 59"
|
||||
Cohesion: 0.4
|
||||
Nodes (2): isUnfinishedQcWorkOrder(), resolveQcWorkOrderUnfinishedBadgeCount()
|
||||
|
||||
### Community 58 - "Community 58"
|
||||
### Community 60 - "Community 60"
|
||||
Cohesion: 0.47
|
||||
Nodes (3): isPaymentDueWithinWarnWindow(), parsePaymentDueYmd(), startOfLocalDay()
|
||||
|
||||
### Community 59 - "Community 59"
|
||||
### Community 61 - "Community 61"
|
||||
Cohesion: 0.5
|
||||
Nodes (2): formatProtocolDocDeleteConfirm(), formatProtocolDocSubject()
|
||||
|
||||
### Community 60 - "Community 60"
|
||||
### Community 62 - "Community 62"
|
||||
Cohesion: 0.5
|
||||
Nodes (2): parseEquipmentIds(), syncEquipmentNamesFromOptions()
|
||||
|
||||
### Community 62 - "Community 62"
|
||||
### Community 64 - "Community 64"
|
||||
Cohesion: 0.5
|
||||
Nodes (2): focusInput(), handleKeydown()
|
||||
|
||||
### Community 66 - "Community 66"
|
||||
### Community 65 - "Community 65"
|
||||
Cohesion: 0.4
|
||||
Nodes (1): fetchQcMaterialAmountAuthUsers()
|
||||
|
||||
### Community 69 - "Community 69"
|
||||
Cohesion: 0.67
|
||||
Nodes (2): if(), logSidebarMenu()
|
||||
|
||||
### Community 72 - "Community 72"
|
||||
Cohesion: 1.0
|
||||
Nodes (2): getSettingDefaults(), resetToDefaults()
|
||||
|
||||
### Community 75 - "Community 75"
|
||||
Cohesion: 1.0
|
||||
Nodes (2): buildOvertimeKitChildren(), uniqueId()
|
||||
### Community 71 - "Community 71"
|
||||
Cohesion: 0.5
|
||||
Nodes (1): fetchSampleSmsNotificationList()
|
||||
|
||||
### Community 76 - "Community 76"
|
||||
Cohesion: 1.0
|
||||
Nodes (2): buildLeaveKitChildren(), uniqueId()
|
||||
|
||||
### Community 78 - "Community 78"
|
||||
Cohesion: 1.0
|
||||
Nodes (2): buildConfirmationKitChildren(), uniqueId()
|
||||
Nodes (2): getSettingDefaults(), resetToDefaults()
|
||||
|
||||
### Community 79 - "Community 79"
|
||||
Cohesion: 1.0
|
||||
Nodes (2): buildResignationKitChildren(), uniqueId()
|
||||
Nodes (2): buildOvertimeKitChildren(), uniqueId()
|
||||
|
||||
### Community 80 - "Community 80"
|
||||
Cohesion: 1.0
|
||||
Nodes (2): copyTextToClipboard(), copyTextWithFallback()
|
||||
Nodes (2): buildLeaveKitChildren(), uniqueId()
|
||||
|
||||
### Community 82 - "Community 82"
|
||||
Cohesion: 1.0
|
||||
Nodes (2): buildConfirmationKitChildren(), uniqueId()
|
||||
|
||||
### Community 83 - "Community 83"
|
||||
Cohesion: 1.0
|
||||
Nodes (2): buildResignationKitChildren(), uniqueId()
|
||||
|
||||
### Community 84 - "Community 84"
|
||||
Cohesion: 1.0
|
||||
Nodes (2): copyTextToClipboard(), copyTextWithFallback()
|
||||
|
||||
### Community 88 - "Community 88"
|
||||
Cohesion: 1.0
|
||||
Nodes (2): getSourceProtocolAttachment(), normalizeAttachmentFiles()
|
||||
|
||||
### Community 95 - "Community 95"
|
||||
### Community 99 - "Community 99"
|
||||
Cohesion: 1.0
|
||||
Nodes (2): emptyTabCounts(), useProductionWorkOrderTabStepCounts()
|
||||
|
||||
### Community 98 - "Community 98"
|
||||
### Community 102 - "Community 102"
|
||||
Cohesion: 1.0
|
||||
Nodes (2): initialProgress(), useQcWorkOrderAttachmentExport()
|
||||
|
||||
### Community 99 - "Community 99"
|
||||
### Community 103 - "Community 103"
|
||||
Cohesion: 1.0
|
||||
Nodes (2): emptyTabCounts(), useQcWorkOrderTabUnfinishedCounts()
|
||||
|
||||
## Knowledge Gaps
|
||||
- **Thin community `Community 22`** (42 nodes): `WebSocketClient`, `.calculateReconnectDelay()`, `.clearAllTimers()`, `.clearConnectionTimers()`, `.clearTimer()`, `.close()`, `.closeCurrentSocketForReconnect()`, `.connect()`, `.connectionStatusText()`, `.constructor()`, `.destroyInstance()`, `.flushMessageQueue()`, `.getInstance()`, `.getReadyStateText()`, `.handleClose()`, `.handleConnectionTimeout()`, `.handleError()`, `.handleMessage()`, `.handleOpen()`, `.init()`, `.isWebSocketConnected()`, `.reconnect()`, `.resetHeartbeat()`, `.send()`, `.startHeartbeat()`, `.startPing()`, `TableCache`, `.cleanupExpired()`, `.clear()`, `.clearByTags()`, `.clearCurrentSearch()`, `.clearPagination()`, `.constructor()`, `.evictLRU()`, `.generateKey()`, `.generateTags()`, `.get()`, `.getStats()`, `.log()`, `.set()`, `index.ts`, `tableCache.ts`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 47`** (9 nodes): `cleanupEventListeners()`, `handleTouchEnd()`, `handleTouchMove()`, `handleTouchStart()`, `handleWheelScroll()`, `if()`, `setTransition()`, `setupEventListeners()`, `index.vue`
|
||||
- **Thin community `Community 47`** (9 nodes): `FireworkSystem`, `.constructor()`, `.createFirework()`, `.createParticle()`, `.getAvailableParticle()`, `.initializePool()`, `.preloadAllImages()`, `.preloadImage()`, `index.vue`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 53`** (8 nodes): `TableHeightCalculator`, `.calculate()`, `.calculateOffset()`, `.calculatePaginationOffset()`, `.constructor()`, `.getHeaderHeight()`, `useTableHeight()`, `useTableHeight.ts`
|
||||
- **Thin community `Community 48`** (9 nodes): `cleanupEventListeners()`, `handleTouchEnd()`, `handleTouchMove()`, `handleTouchStart()`, `handleWheelScroll()`, `if()`, `setTransition()`, `setupEventListeners()`, `index.vue`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 55`** (7 nodes): `App.vue`, `main.ts`, `refreshButtonAutoIcons()`, `refreshPanelTitleIcons()`, `logApiCryptoBootInfo()`, `maskSecret()`, `console.ts`
|
||||
- **Thin community `Community 54`** (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 57`** (6 nodes): `formatQcWorkOrderUnfinishedBadgeCount()`, `isUnfinishedQcWorkOrder()`, `qcWorkOrderUnfinishedBadgeTitle()`, `resolveQcWorkOrderUnfinishedBadgeCount()`, `sumQcWorkOrderGroupUnfinishedBadgeCount()`, `qc-work-order-unfinished-badge.ts`
|
||||
- **Thin community `Community 56`** (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 59`** (5 nodes): `formatProtocolDocBatchDeleteConfirm()`, `formatProtocolDocDeleteConfirm()`, `formatProtocolDocSubject()`, `getProtocolDocTypeLabel()`, `protocol-doc-label.ts`
|
||||
- **Thin community `Community 58`** (7 nodes): `fetchConfirmQcMonthImport()`, `fetchCreateQcMonthTemplate()`, `fetchDeleteQcMonthTemplate()`, `fetchPreviewQcMonthImport()`, `fetchQcMonthTemplateList()`, `fetchUpdateQcMonthTemplate()`, `qc-material-month-template.ts`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 60`** (5 nodes): `equipmentOptionLabel()`, `joinEquipmentIds()`, `parseEquipmentIds()`, `syncEquipmentNamesFromOptions()`, `equipment-select.ts`
|
||||
- **Thin community `Community 59`** (6 nodes): `formatQcWorkOrderUnfinishedBadgeCount()`, `isUnfinishedQcWorkOrder()`, `qcWorkOrderUnfinishedBadgeTitle()`, `resolveQcWorkOrderUnfinishedBadgeCount()`, `sumQcWorkOrderGroupUnfinishedBadgeCount()`, `qc-work-order-unfinished-badge.ts`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 62`** (5 nodes): `focusInput()`, `handleKeydown()`, `if()`, `search()`, `index.vue`
|
||||
- **Thin community `Community 61`** (5 nodes): `formatProtocolDocBatchDeleteConfirm()`, `formatProtocolDocDeleteConfirm()`, `formatProtocolDocSubject()`, `getProtocolDocTypeLabel()`, `protocol-doc-label.ts`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 66`** (4 nodes): `if()`, `logSidebarMenu()`, `index.vue`, `SidebarSubmenu.vue`
|
||||
- **Thin community `Community 62`** (5 nodes): `equipmentOptionLabel()`, `joinEquipmentIds()`, `parseEquipmentIds()`, `syncEquipmentNamesFromOptions()`, `equipment-select.ts`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 72`** (3 nodes): `getSettingDefaults()`, `resetToDefaults()`, `setting.ts`
|
||||
- **Thin community `Community 64`** (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 75`** (3 nodes): `buildOvertimeKitChildren()`, `oa-overtime-kit-rule.ts`, `uniqueId()`
|
||||
- **Thin community `Community 65`** (5 nodes): `fetchBatchRevokeQcMaterialAmountAuth()`, `fetchGrantQcMaterialAmountAuth()`, `fetchQcMaterialAmountAuthUsers()`, `fetchRevokeQcMaterialAmountAuth()`, `qc-material-amount-auth.ts`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 76`** (3 nodes): `buildLeaveKitChildren()`, `oa-leave-kit-rule.ts`, `uniqueId()`
|
||||
- **Thin community `Community 69`** (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 78`** (3 nodes): `buildConfirmationKitChildren()`, `oa-confirmation-kit-rule.ts`, `uniqueId()`
|
||||
- **Thin community `Community 71`** (4 nodes): `fetchGenerateSms()`, `fetchSampleSmsNotificationList()`, `fetchToggleSmsNotified()`, `sample-sms-notification.ts`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 79`** (3 nodes): `buildResignationKitChildren()`, `oa-resignation-kit-rule.ts`, `uniqueId()`
|
||||
- **Thin community `Community 76`** (3 nodes): `getSettingDefaults()`, `resetToDefaults()`, `setting.ts`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 80`** (3 nodes): `copyTextToClipboard()`, `copyTextWithFallback()`, `copy-text.ts`
|
||||
- **Thin community `Community 79`** (3 nodes): `buildOvertimeKitChildren()`, `oa-overtime-kit-rule.ts`, `uniqueId()`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 83`** (3 nodes): `getSourceProtocolAttachment()`, `normalizeAttachmentFiles()`, `protocol-source-attachment.ts`
|
||||
- **Thin community `Community 80`** (3 nodes): `buildLeaveKitChildren()`, `oa-leave-kit-rule.ts`, `uniqueId()`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 95`** (3 nodes): `emptyTabCounts()`, `useProductionWorkOrderTabStepCounts()`, `useProductionWorkOrderTabStepCounts.ts`
|
||||
- **Thin community `Community 82`** (3 nodes): `buildConfirmationKitChildren()`, `oa-confirmation-kit-rule.ts`, `uniqueId()`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 98`** (3 nodes): `initialProgress()`, `useQcWorkOrderAttachmentExport()`, `useQcWorkOrderAttachmentExport.ts`
|
||||
- **Thin community `Community 83`** (3 nodes): `buildResignationKitChildren()`, `oa-resignation-kit-rule.ts`, `uniqueId()`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 99`** (3 nodes): `emptyTabCounts()`, `useQcWorkOrderTabUnfinishedCounts()`, `useQcWorkOrderTabUnfinishedCounts.ts`
|
||||
- **Thin community `Community 84`** (3 nodes): `copyTextToClipboard()`, `copyTextWithFallback()`, `copy-text.ts`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 88`** (3 nodes): `getSourceProtocolAttachment()`, `normalizeAttachmentFiles()`, `protocol-source-attachment.ts`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 99`** (3 nodes): `emptyTabCounts()`, `useProductionWorkOrderTabStepCounts()`, `useProductionWorkOrderTabStepCounts.ts`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 102`** (3 nodes): `initialProgress()`, `useQcWorkOrderAttachmentExport()`, `useQcWorkOrderAttachmentExport.ts`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
- **Thin community `Community 103`** (3 nodes): `emptyTabCounts()`, `useQcWorkOrderTabUnfinishedCounts()`, `useQcWorkOrderTabUnfinishedCounts.ts`
|
||||
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
|
||||
|
||||
## Suggested Questions
|
||||
_Questions this graph is uniquely positioned to answer:_
|
||||
|
||||
- **Why does `push()` connect `Community 1` to `Community 0`, `Community 2`, `Community 3`, `Community 4`, `Community 7`, `Community 8`, `Community 9`, `Community 10`, `Community 11`, `Community 12`, `Community 13`, `Community 14`, `Community 16`, `Community 18`, `Community 19`, `Community 21`, `Community 22`, `Community 24`, `Community 26`, `Community 28`, `Community 29`, `Community 30`, `Community 32`, `Community 33`, `Community 36`, `Community 37`?**
|
||||
_High betweenness centrality (0.281) - this node is a cross-community bridge._
|
||||
- **Why does `get()` connect `Community 0` to `Community 1`, `Community 2`, `Community 3`, `Community 4`, `Community 6`, `Community 7`, `Community 8`, `Community 9`, `Community 10`, `Community 11`, `Community 13`, `Community 14`, `Community 15`, `Community 16`, `Community 17`, `Community 18`, `Community 19`, `Community 20`, `Community 25`, `Community 26`, `Community 27`, `Community 28`, `Community 29`, `Community 30`, `Community 31`, `Community 33`, `Community 34`, `Community 42`, `Community 46`, `Community 49`?**
|
||||
_High betweenness centrality (0.243) - this node is a cross-community bridge._
|
||||
- **Why does `handleDynamicRoutes()` connect `Community 5` to `Community 33`, `Community 4`, `Community 16`, `Community 18`, `Community 28`?**
|
||||
_High betweenness centrality (0.032) - this node is a cross-community bridge._
|
||||
- **Are the 314 inferred relationships involving `get()` (e.g. with `resolveStorageSlotRangeFill()` and `buildNodeCodePathFromFlat()`) actually correct?**
|
||||
_`get()` has 314 INFERRED edges - model-reasoned connections that need verification._
|
||||
- **Are the 122 inferred relationships involving `push()` (e.g. with `refreshQcMenuBadges()` and `collectLeafFacilityNodesInTreeOrder()`) actually correct?**
|
||||
_`push()` has 122 INFERRED edges - model-reasoned connections that need verification._
|
||||
- **Why does `push()` connect `Community 2` to `Community 0`, `Community 1`, `Community 3`, `Community 4`, `Community 5`, `Community 7`, `Community 8`, `Community 9`, `Community 11`, `Community 12`, `Community 13`, `Community 15`, `Community 16`, `Community 17`, `Community 18`, `Community 19`, `Community 20`, `Community 22`, `Community 23`, `Community 24`, `Community 27`, `Community 30`, `Community 31`, `Community 32`, `Community 33`, `Community 36`, `Community 47`?**
|
||||
_High betweenness centrality (0.306) - this node is a cross-community bridge._
|
||||
- **Why does `get()` connect `Community 0` to `Community 1`, `Community 3`, `Community 4`, `Community 5`, `Community 6`, `Community 7`, `Community 8`, `Community 9`, `Community 10`, `Community 12`, `Community 13`, `Community 14`, `Community 16`, `Community 17`, `Community 18`, `Community 19`, `Community 21`, `Community 24`, `Community 28`, `Community 29`, `Community 30`, `Community 31`, `Community 33`, `Community 34`, `Community 42`, `Community 45`, `Community 46`, `Community 58`, `Community 65`, `Community 71`?**
|
||||
_High betweenness centrality (0.232) - this node is a cross-community bridge._
|
||||
- **Why does `handleDynamicRoutes()` connect `Community 10` to `Community 33`, `Community 3`, `Community 18`, `Community 24`, `Community 26`?**
|
||||
_High betweenness centrality (0.030) - this node is a cross-community bridge._
|
||||
- **Are the 315 inferred relationships involving `get()` (e.g. with `resolveStorageSlotRangeFill()` and `buildNodeCodePathFromFlat()`) actually correct?**
|
||||
_`get()` has 315 INFERRED edges - model-reasoned connections that need verification._
|
||||
- **Are the 124 inferred relationships involving `push()` (e.g. with `refreshQcMenuBadges()` and `collectLeafFacilityNodesInTreeOrder()`) actually correct?**
|
||||
_`push()` has 124 INFERRED edges - model-reasoned connections that need verification._
|
||||
- **Are the 28 inferred relationships involving `emit()` (e.g. with `handleSubmit()` and `handleDialogClose()`) actually correct?**
|
||||
_`emit()` has 28 INFERRED edges - model-reasoned connections that need verification._
|
||||
- **Are the 20 inferred relationships involving `set()` (e.g. with `buildNodeCodePathFromFlat()` and `collectLeafFacilityNodesInTreeOrder()`) actually correct?**
|
||||
|
||||
@@ -57,12 +57,12 @@
|
||||
</div>
|
||||
<div id="legend"></div>
|
||||
</div>
|
||||
<div id="stats">3550 nodes · 5051 edges · 393 communities</div>
|
||||
<div id="stats">3573 nodes · 5087 edges · 396 communities</div>
|
||||
</div>
|
||||
<script>
|
||||
const RAW_NODES = [{"id": "app_vue", "label": "App.vue", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "App.vue", "community": 55, "community_name": "Community 55", "source_file": "App.vue", "file_type": "code", "degree": 3}, {"id": "src_app_refreshbuttonautoicons", "label": "refreshButtonAutoIcons()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "refreshButtonAutoIcons()", "community": 55, "community_name": "Community 55", "source_file": "App.vue", "file_type": "code", "degree": 1}, {"id": "src_app_refreshpaneltitleicons", "label": "refreshPanelTitleIcons()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "refreshPanelTitleIcons()", "community": 55, "community_name": "Community 55", "source_file": "App.vue", "file_type": "code", "degree": 1}, {"id": "main_ts", "label": "main.ts", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.4, "font": {"size": 0, "color": "#ffffff"}, "title": "main.ts", "community": 55, "community_name": "Community 55", "source_file": "main.ts", "file_type": "code", "degree": 4}, {"id": "src_main_masksecret", "label": "maskSecret()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "maskSecret()", "community": 55, "community_name": "Community 55", "source_file": "main.ts", "file_type": "code", "degree": 2}, {"id": "src_main_logapicryptobootinfo", "label": "logApiCryptoBootInfo()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "logApiCryptoBootInfo()", "community": 55, "community_name": "Community 55", "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": 148, "community_name": "Community 148", "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": 149, "community_name": "Community 149", "source_file": "shims-loose.d.ts", "file_type": "code", "degree": 0}, {"id": "directives_index_ts", "label": "index.ts", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "index.ts", "community": 35, "community_name": "Community 35", "source_file": "directives/index.ts", "file_type": "code", "degree": 1}, {"id": "directives_index_setupglobdirectives", "label": "setupGlobDirectives()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.5, "font": {"size": 0, "color": "#ffffff"}, "title": "setupGlobDirectives()", "community": 35, "community_name": "Community 35", "source_file": "directives/index.ts", "file_type": "code", "degree": 5}, {"id": "directives_core_roles_ts", "label": "roles.ts", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "roles.ts", "community": 35, "community_name": "Community 35", "source_file": "directives/core/roles.ts", "file_type": "code", "degree": 3}, {"id": "core_roles_checkrolepermission", "label": "checkRolePermission()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "checkRolePermission()", "community": 35, "community_name": "Community 35", "source_file": "directives/core/roles.ts", "file_type": "code", "degree": 2}, {"id": "core_roles_removeelement", "label": "removeElement()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "removeElement()", "community": 35, "community_name": "Community 35", "source_file": "directives/core/roles.ts", "file_type": "code", "degree": 2}, {"id": "core_roles_setuprolesdirective",Line truncated
|
||||
const RAW_EDGES = [{"from": "app_vue", "to": "src_app_refreshbuttonautoicons", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_vue", "to": "src_app_refreshpaneltitleicons", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_vue", "to": "main_ts", "label": "imports_from", "title": "imports_from [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_ts", "to": "utils_sys_console_ts", "label": "imports_from", "title": "imports_from [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_ts", "to": "src_main_masksecret", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_ts", "to": "src_main_logapicryptobootinfo", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "src_main_masksecret", "to": "src_main_logapicryptobootinfo", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_index_ts", "to": "directives_index_setupglobdirectives", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_index_setupglobdirectives", "to": "core_auth_setupauthdirective", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "directives_index_setupglobdirectives", "to": "core_roles_setuprolesdirective", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "directives_index_setupglobdirectives", "to": "business_highlight_setuphighlightdirective", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "directives_index_setupglobdirectives", "to": "business_ripple_setuprippledirective", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "directives_core_roles_ts", "to": "core_roles_checkrolepermission", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_roles_ts", "to": "core_roles_removeelement", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_roles_ts", "to": "core_roles_setuprolesdirective", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_roles_checkrolepermission", "to": "core_roles_removeelement", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_auth_ts", "to": "core_auth_checkauthpermission", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_auth_ts", "to": "core_auth_removeelement", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_auth_ts", "to": "core_auth_setupauthdirective", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_checkauthpermission", "to": "core_auth_removeelement", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_business_ripple_ts", "to": "business_ripple_setuprippledirective", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_business_highlight_ts", "to": "business_highlight_highlightcode", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_business_highlight_ts", "to": "business_highlight_insertlinenumbers", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_business_highlight_ts", "to": "business_highlight_addcopybutton", "label": "contains", "title": "contains [EXTRACTED]", "dLine truncated
|
||||
const LEGEND = [{"cid": 0, "color": "#4E79A7", "label": "Community 0", "count": 545}, {"cid": 1, "color": "#F28E2B", "label": "Community 1", "count": 161}, {"cid": 2, "color": "#E15759", "label": "Community 2", "count": 121}, {"cid": 3, "color": "#76B7B2", "label": "Community 3", "count": 110}, {"cid": 4, "color": "#59A14F", "label": "Community 4", "count": 104}, {"cid": 5, "color": "#EDC948", "label": "Community 5", "count": 101}, {"cid": 6, "color": "#B07AA1", "label": "Community 6", "count": 97}, {"cid": 7, "color": "#FF9DA7", "label": "Community 7", "count": 93}, {"cid": 8, "color": "#9C755F", "label": "Community 8", "count": 92}, {"cid": 9, "color": "#BAB0AC", "label": "Community 9", "count": 91}, {"cid": 10, "color": "#4E79A7", "label": "Community 10", "count": 90}, {"cid": 11, "color": "#F28E2B", "label": "Community 11", "count": 89}, {"cid": 12, "color": "#E15759", "label": "Community 12", "count": 83}, {"cid": 13, "color": "#76B7B2", "label": "Community 13", "count": 80}, {"cid": 14, "color": "#59A14F", "label": "Community 14", "count": 72}, {"cid": 15, "color": "#EDC948", "label": "Community 15", "count": 70}, {"cid": 16, "color": "#B07AA1", "label": "Community 16", "count": 69}, {"cid": 17, "color": "#FF9DA7", "label": "Community 17", "count": 67}, {"cid": 18, "color": "#9C755F", "label": "Community 18", "count": 60}, {"cid": 19, "color": "#BAB0AC", "label": "Community 19", "count": 57}, {"cid": 20, "color": "#4E79A7", "label": "Community 20", "count": 49}, {"cid": 21, "color": "#F28E2B", "label": "Community 21", "count": 47}, {"cid": 22, "color": "#E15759", "label": "Community 22", "count": 42}, {"cid": 23, "color": "#76B7B2", "label": "Community 23", "count": 37}, {"cid": 24, "color": "#59A14F", "label": "Community 24", "count": 36}, {"cid": 25, "color": "#EDC948", "label": "Community 25", "count": 35}, {"cid": 26, "color": "#B07AA1", "label": "Community 26", "count": 35}, {"cid": 27, "color": "#FF9DA7", "label": "Community 27", "count": 34}, {"cid": 28, "color": "#9C755F", "label": "Community 28", "count": 34}, {"cid": 29, "color": "#BAB0AC", "label": "Community 29", "count": 33}, {"cid": 30, "color": "#4E79A7", "label": "Community 30", "count": 33}, {"cid": 31, "color": "#F28E2B", "label": "Community 31", "count": 33}, {"cid": 32, "color": "#E15759", "label": "Community 32", "count": 31}, {"cid": 33, "color": "#76B7B2", "label": "Community 33", "count": 25}, {"cid": 34, "color": "#59A14F", "label": "Community 34", "count": 24}, {"cid": 35, "color": "#EDC948", "label": "Community 35", "count": 22}, {"cid": 36, "color": "#B07AA1", "label": "Community 36", "count": 20}, {"cid": 37, "color": "#FF9DA7", "label": "Community 37", "count": 20}, {"cid": 38, "color": "#9C755F", "label": "Community 38", "count": 19}, {"cid": 39, "color": "#BAB0AC", "label": "Community 39", "count": 17}, {"cid": 40, "color": "#4E79A7", "label": "Community 40", "count": 17}, {"cid": 41, "color": "#F28E2B", "label": "Community 41", "count": 16}, {"cid": 42, "color": "#E15759", "label": "Community 42", "count": 14}, {"cid": 43, "color": "#76B7B2", "label": "Community 43", "count": 13}, {"cid": 44, "color": "#59A14F", "label": "Community 44", "count": 13}, {"cid": 45, "color": "#EDC948", "label": "Community 45", "count": 13}, {"cid": 46, "color": "#B07AA1", "label": "Community 46", "count": 9}, {"cid": 47, "color": "#FF9DA7", "label": "Community 47", "count": 9}, {"cid": 48, "color": "#9C755F", "label": "Community 48", "count": 9}, {"cid": 49, "color": "#BAB0AC", "label": "Community 49", "count": 9}, {"cid": 50, "color": "#4E79A7", "label": "Community 50", "count": 9}, {"cid": 51, "color": "#F28E2B", "label": "Community 51", "count": 9}, {"cid": 52, "color": "#E15759", "label": "Community 52", "count": 8}, {"cid": 53, "color": "#76B7B2", "label": "Community 53", "count": 8}, {"cid": 54, "color": "#59A14F", "label": "Community 54", "count": 8}, {"cid": 55, "color": "#EDC948", "label": "Community 55", "count": 7}, {"cid": 56, "color": "#B07AA1", "label": "Community 56", "count": 7}, {"cid": 57, "color": "#FF9DA7", "label": "Community 57", "count": 6}, {"cid": 58, "color": "#9C755F", "label": "Community 58", "count": 6}, {"cid": 59, "color": "#BAB0AC", "label": "Community 59", "count": 5}, {"cid": 60, "color": "#4E79A7", "label": "Community 60", "count": 5}, {"cid": 61, "color": "#F28E2B", "label": "Community 61", "count": 5}, {"cid": 62, "color": "#E15759", "label": "Community 62", "count": 5}, {"cid": 63, "color": "#76B7B2", "label": "Community 63", "count": 5}, {"cid": 64, "color": "#59A14F", "label": "Community 64", "count": 4}, {"cid": 65, "color": "#EDC948", "label": "Community 65", "count": 4}, {"cid": 66, "color": "#B07AA1", "label": "Community 66", "count": 4}, {"cid": 67, "color": "#FF9DA7", "label": "Community 67", "count": 4}, {"cid": 68, "color": "#9C755F", "label": "Community 68", "count": 4}, {"cid": 69, "color": "#BAB0AC", "label": "Community 69", "count": 4}, {"cid": 70, "color": "#4E79A7", "label": "CommunityLine truncated
|
||||
const RAW_NODES = [{"id": "app_vue", "label": "App.vue", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "App.vue", "community": 56, "community_name": "Community 56", "source_file": "App.vue", "file_type": "code", "degree": 3}, {"id": "src_app_refreshbuttonautoicons", "label": "refreshButtonAutoIcons()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "refreshButtonAutoIcons()", "community": 56, "community_name": "Community 56", "source_file": "App.vue", "file_type": "code", "degree": 1}, {"id": "src_app_refreshpaneltitleicons", "label": "refreshPanelTitleIcons()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "refreshPanelTitleIcons()", "community": 56, "community_name": "Community 56", "source_file": "App.vue", "file_type": "code", "degree": 1}, {"id": "main_ts", "label": "main.ts", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.4, "font": {"size": 0, "color": "#ffffff"}, "title": "main.ts", "community": 56, "community_name": "Community 56", "source_file": "main.ts", "file_type": "code", "degree": 4}, {"id": "src_main_masksecret", "label": "maskSecret()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "maskSecret()", "community": 56, "community_name": "Community 56", "source_file": "main.ts", "file_type": "code", "degree": 2}, {"id": "src_main_logapicryptobootinfo", "label": "logApiCryptoBootInfo()", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "logApiCryptoBootInfo()", "community": 56, "community_name": "Community 56", "source_file": "main.ts", "file_type": "code", "degree": 2}, {"id": "env_d_ts", "label": "env.d.ts", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "env.d.ts", "community": 152, "community_name": "Community 152", "source_file": "env.d.ts", "file_type": "code", "degree": 0}, {"id": "shims_loose_d_ts", "label": "shims-loose.d.ts", "color": {"background": "#76B7B2", "border": "#76B7B2", "highlight": {"background": "#ffffff", "border": "#76B7B2"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "shims-loose.d.ts", "community": 153, "community_name": "Community 153", "source_file": "shims-loose.d.ts", "file_type": "code", "degree": 0}, {"id": "directives_index_ts", "label": "index.ts", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "index.ts", "community": 35, "community_name": "Community 35", "source_file": "directives/index.ts", "file_type": "code", "degree": 1}, {"id": "directives_index_setupglobdirectives", "label": "setupGlobDirectives()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.5, "font": {"size": 0, "color": "#ffffff"}, "title": "setupGlobDirectives()", "community": 35, "community_name": "Community 35", "source_file": "directives/index.ts", "file_type": "code", "degree": 5}, {"id": "directives_core_roles_ts", "label": "roles.ts", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "roles.ts", "community": 35, "community_name": "Community 35", "source_file": "directives/core/roles.ts", "file_type": "code", "degree": 3}, {"id": "core_roles_checkrolepermission", "label": "checkRolePermission()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "checkRolePermission()", "community": 35, "community_name": "Community 35", "source_file": "directives/core/roles.ts", "file_type": "code", "degree": 2}, {"id": "core_roles_removeelement", "label": "removeElement()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "removeElement()", "community": 35, "community_name": "Community 35", "source_file": "directives/core/roles.ts", "file_type": "code", "degree": 2}, {"id": "core_roles_setuprolesdirective",Line truncated
|
||||
const RAW_EDGES = [{"from": "app_vue", "to": "src_app_refreshbuttonautoicons", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_vue", "to": "src_app_refreshpaneltitleicons", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_vue", "to": "main_ts", "label": "imports_from", "title": "imports_from [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_ts", "to": "utils_sys_console_ts", "label": "imports_from", "title": "imports_from [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_ts", "to": "src_main_masksecret", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_ts", "to": "src_main_logapicryptobootinfo", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "src_main_masksecret", "to": "src_main_logapicryptobootinfo", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_index_ts", "to": "directives_index_setupglobdirectives", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_index_setupglobdirectives", "to": "core_auth_setupauthdirective", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "directives_index_setupglobdirectives", "to": "core_roles_setuprolesdirective", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "directives_index_setupglobdirectives", "to": "business_highlight_setuphighlightdirective", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "directives_index_setupglobdirectives", "to": "business_ripple_setuprippledirective", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "directives_core_roles_ts", "to": "core_roles_checkrolepermission", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_roles_ts", "to": "core_roles_removeelement", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_roles_ts", "to": "core_roles_setuprolesdirective", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_roles_checkrolepermission", "to": "core_roles_removeelement", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_auth_ts", "to": "core_auth_checkauthpermission", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_auth_ts", "to": "core_auth_removeelement", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_auth_ts", "to": "core_auth_setupauthdirective", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_checkauthpermission", "to": "core_auth_removeelement", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_business_ripple_ts", "to": "business_ripple_setuprippledirective", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_business_highlight_ts", "to": "business_highlight_highlightcode", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_business_highlight_ts", "to": "business_highlight_insertlinenumbers", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_business_highlight_ts", "to": "business_highlight_addcopybutton", "label": "contains", "title": "contains [EXTRACTED]", "dLine truncated
|
||||
const LEGEND = [{"cid": 0, "color": "#4E79A7", "label": "Community 0", "count": 549}, {"cid": 1, "color": "#F28E2B", "label": "Community 1", "count": 123}, {"cid": 2, "color": "#E15759", "label": "Community 2", "count": 120}, {"cid": 3, "color": "#76B7B2", "label": "Community 3", "count": 111}, {"cid": 4, "color": "#59A14F", "label": "Community 4", "count": 110}, {"cid": 5, "color": "#EDC948", "label": "Community 5", "count": 102}, {"cid": 6, "color": "#B07AA1", "label": "Community 6", "count": 96}, {"cid": 7, "color": "#FF9DA7", "label": "Community 7", "count": 94}, {"cid": 8, "color": "#9C755F", "label": "Community 8", "count": 92}, {"cid": 9, "color": "#BAB0AC", "label": "Community 9", "count": 92}, {"cid": 10, "color": "#4E79A7", "label": "Community 10", "count": 92}, {"cid": 11, "color": "#F28E2B", "label": "Community 11", "count": 84}, {"cid": 12, "color": "#E15759", "label": "Community 12", "count": 82}, {"cid": 13, "color": "#76B7B2", "label": "Community 13", "count": 80}, {"cid": 14, "color": "#59A14F", "label": "Community 14", "count": 78}, {"cid": 15, "color": "#EDC948", "label": "Community 15", "count": 75}, {"cid": 16, "color": "#B07AA1", "label": "Community 16", "count": 74}, {"cid": 17, "color": "#FF9DA7", "label": "Community 17", "count": 72}, {"cid": 18, "color": "#9C755F", "label": "Community 18", "count": 60}, {"cid": 19, "color": "#BAB0AC", "label": "Community 19", "count": 57}, {"cid": 20, "color": "#4E79A7", "label": "Community 20", "count": 47}, {"cid": 21, "color": "#F28E2B", "label": "Community 21", "count": 46}, {"cid": 22, "color": "#E15759", "label": "Community 22", "count": 42}, {"cid": 23, "color": "#76B7B2", "label": "Community 23", "count": 41}, {"cid": 24, "color": "#59A14F", "label": "Community 24", "count": 38}, {"cid": 25, "color": "#EDC948", "label": "Community 25", "count": 37}, {"cid": 26, "color": "#B07AA1", "label": "Community 26", "count": 37}, {"cid": 27, "color": "#FF9DA7", "label": "Community 27", "count": 36}, {"cid": 28, "color": "#9C755F", "label": "Community 28", "count": 35}, {"cid": 29, "color": "#BAB0AC", "label": "Community 29", "count": 35}, {"cid": 30, "color": "#4E79A7", "label": "Community 30", "count": 35}, {"cid": 31, "color": "#F28E2B", "label": "Community 31", "count": 33}, {"cid": 32, "color": "#E15759", "label": "Community 32", "count": 31}, {"cid": 33, "color": "#76B7B2", "label": "Community 33", "count": 25}, {"cid": 34, "color": "#59A14F", "label": "Community 34", "count": 24}, {"cid": 35, "color": "#EDC948", "label": "Community 35", "count": 22}, {"cid": 36, "color": "#B07AA1", "label": "Community 36", "count": 20}, {"cid": 37, "color": "#FF9DA7", "label": "Community 37", "count": 19}, {"cid": 38, "color": "#9C755F", "label": "Community 38", "count": 17}, {"cid": 39, "color": "#BAB0AC", "label": "Community 39", "count": 17}, {"cid": 40, "color": "#4E79A7", "label": "Community 40", "count": 16}, {"cid": 41, "color": "#F28E2B", "label": "Community 41", "count": 14}, {"cid": 42, "color": "#E15759", "label": "Community 42", "count": 14}, {"cid": 43, "color": "#76B7B2", "label": "Community 43", "count": 13}, {"cid": 44, "color": "#59A14F", "label": "Community 44", "count": 13}, {"cid": 45, "color": "#EDC948", "label": "Community 45", "count": 13}, {"cid": 46, "color": "#B07AA1", "label": "Community 46", "count": 9}, {"cid": 47, "color": "#FF9DA7", "label": "Community 47", "count": 9}, {"cid": 48, "color": "#9C755F", "label": "Community 48", "count": 9}, {"cid": 49, "color": "#BAB0AC", "label": "Community 49", "count": 9}, {"cid": 50, "color": "#4E79A7", "label": "Community 50", "count": 9}, {"cid": 51, "color": "#F28E2B", "label": "Community 51", "count": 9}, {"cid": 52, "color": "#E15759", "label": "Community 52", "count": 9}, {"cid": 53, "color": "#76B7B2", "label": "Community 53", "count": 8}, {"cid": 54, "color": "#59A14F", "label": "Community 54", "count": 8}, {"cid": 55, "color": "#EDC948", "label": "Community 55", "count": 8}, {"cid": 56, "color": "#B07AA1", "label": "Community 56", "count": 7}, {"cid": 57, "color": "#FF9DA7", "label": "Community 57", "count": 7}, {"cid": 58, "color": "#9C755F", "label": "Community 58", "count": 7}, {"cid": 59, "color": "#BAB0AC", "label": "Community 59", "count": 6}, {"cid": 60, "color": "#4E79A7", "label": "Community 60", "count": 6}, {"cid": 61, "color": "#F28E2B", "label": "Community 61", "count": 5}, {"cid": 62, "color": "#E15759", "label": "Community 62", "count": 5}, {"cid": 63, "color": "#76B7B2", "label": "Community 63", "count": 5}, {"cid": 64, "color": "#59A14F", "label": "Community 64", "count": 5}, {"cid": 65, "color": "#EDC948", "label": "Community 65", "count": 5}, {"cid": 66, "color": "#B07AA1", "label": "Community 66", "count": 5}, {"cid": 67, "color": "#FF9DA7", "label": "Community 67", "count": 4}, {"cid": 68, "color": "#9C755F", "label": "Community 68", "count": 4}, {"cid": 69, "color": "#BAB0AC", "label": "Community 69", "count": 4}, {"cid": 70, "color": "#4E79A7", "label": "CommunityLine truncated
|
||||
|
||||
// HTML-escape helper — prevents XSS when injecting graph data into innerHTML
|
||||
function esc(s) {
|
||||
|
||||
+3693
-2829
File diff suppressed because it is too large.
Load diff
@@ -17,10 +17,10 @@
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/common/index.ts": 1781272556.3597305,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/directive/directive.d.ts": 1781272556.3601494,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/api/api.d.ts": 1781272556.3606477,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts": 1787885606.1539679,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/auto-imports.d.ts": 1787881878.2320535,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/store/index.ts": 1781272556.364766,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/router/index.ts": 1782394569.8806834,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts": 1787900576.2954183,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/auto-imports.d.ts": 1787900560.6600368,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/store/index.ts": 1787887312.735774,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/router/index.ts": 1787887320.8486114,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/composables/useAttachmentActions.ts": 1783921717.4015942,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/composables/useAttachmentDropZone.ts": 1782873161.9839864,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/locales/index.ts": 1781272556.3657222,
|
||||
@@ -62,7 +62,7 @@
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-overtime-kit.ts": 1785488982.6957128,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-approval-print-related.ts": 1785145511.865531,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/qc-material-ui.ts": 1781525352.6976836,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/sop-print.ts": 1787881631.4311998,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/sop-print.ts": 1787899876.3465168,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/qc-work-order-tabs.ts": 1787193681.0370538,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-overtime-kit-rule.ts": 1786374586.9544816,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/rmb-upper.test.ts": 1785380467.5004647,
|
||||
@@ -168,6 +168,7 @@
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-flow-steps.ts": 1782806499.3099828,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-related-approval.ts": 1785145511.866155,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-step-output.test.ts": 1787019495.9619598,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-history-export.ts": 1787892864.869699,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/loginRsa.ts": 1781272556.4129546,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/chinese-datetime-parse.ts": 1782958233.483039,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-task-editor-cache.ts": 1782602746.754815,
|
||||
@@ -195,7 +196,7 @@
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/form/validator.ts": 1781272556.386984,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/constants/links.ts": 1781272556.3907003,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/constants/index.ts": 1781272556.390974,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/navigation/worktab.ts": 1781272556.391687,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/navigation/worktab.ts": 1787887332.2557578,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/navigation/jump.ts": 1781272556.3920226,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/navigation/route.ts": 1781272556.3928444,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/navigation/index.ts": 1781272556.3933916,
|
||||
@@ -336,7 +337,6 @@
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/common/decimal-input/index.vue": 1782893851.5090024,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaPostSelect.vue": 1785394386.0894492,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaFlowPreview.vue": 1785392987.9755206,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaAppHistoryDialog.vue": 1787885605.5324888,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts": 1786002784.7150648,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaPersonSelect.vue": 1785388355.4534001,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaOvertimeKit.vue": 1786374594.648936,
|
||||
@@ -412,7 +412,7 @@
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/cell-product.ts": 1785290097.6330564,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/sample-sms-notification.ts": 1781272556.666838,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-waste-output.ts": 1787023802.604376,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/oaApproval.ts": 1787885508.363352,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/oaApproval.ts": 1787892852.5955176,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/material-stock-check.ts": 1781427280.4992144,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/research-donation.ts": 1782893816.502791,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-task.ts": 1783327864.9737554,
|
||||
@@ -500,9 +500,10 @@
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/leave/index.vue": 1783326448.934463,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/receive-accounts/index.vue": 1785391037.6431305,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/drafts/index.vue": 1785999332.6019115,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/start/index.vue": 1787885694.2328417,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/start/index.vue": 1787887346.920489,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/form-designer-spike/index.vue": 1785145511.870818,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/done/index.vue": 1786416827.7349942,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/history/index.vue": 1787896445.8062387,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/mine/index.vue": 1786416848.7317674,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/designer/index.vue": 1786415778.485927,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/instances/detail.vue": 1785990793.1733682,
|
||||
@@ -577,7 +578,7 @@
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/consumable/index.vue": 1783326448.950747,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/consumable/ConsumablePackTab.vue": 1783326448.951496,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/cleanroom-garment/index.vue": 1783326448.9530618,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-material/index.vue": 1785210206.2032187,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-material/index.vue": 1787901052.2520447,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-material/MaterialConsumptionTab.vue": 1785210280.6240091,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-material/ProductionMaterialConfiguredCatalogDialog.vue": 1785210135.312117,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-material/ProductionMaterialUsageTab.vue": 1785209913.2979107,
|
||||
@@ -639,7 +640,7 @@
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/lab-test-item/index.vue": 1782893853.832618,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/lab-test-item/ThirdPartyCompanyTab.vue": 1783326448.9753742,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/my-qc-material-usage/index.vue": 1782893853.6503608,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/index.vue": 1787115003.8945668,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/index.vue": 1787900942.2708254,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/QcMaterialStockCheckTab.vue": 1783326448.981454,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/QcMaterialUsageTab.vue": 1783429524.2582674,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/QcMaterialMonthImportDialog.vue": 1787118965.9649005,
|
||||
@@ -720,7 +721,7 @@
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/assets/svg/loading.ts": 1781272558.486104,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/store/index.ts": 1781272559.227605,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/qc-menu-badge.ts": 1782394567.2213001,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/worktab.ts": 1781351182.1456184,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/worktab.ts": 1787887329.153417,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/table.ts": 1781272559.2465377,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/oa-menu-badge.ts": 1785990702.1987846,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/store/modules/menu.ts": 1781272559.2476027,
|
||||
@@ -737,7 +738,7 @@
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/router/core/RoutePermissionValidator.ts": 1781272559.4235668,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/router/core/index.ts": 1781272559.424284,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/router/core/IframeRouteManager.ts": 1781272559.425215,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/router/modules/sqxp.ts": 1787112428.2639441,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/router/modules/sqxp.ts": 1787887334.7914455,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/router/modules/index.ts": 1781272559.5419338,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/router/modules/exception.ts": 1781272559.549901,
|
||||
"/Users/wuzilong/work/00code/zkxw/web-admin/src/router/routes/staticRoutes.ts": 1781272559.596198,
|
||||
|
||||
@@ -386,6 +386,39 @@ export function fetchOaInstanceHistory(params: {
|
||||
})
|
||||
}
|
||||
|
||||
export function fetchOaInstanceHistoryExport(params: {
|
||||
appId: string
|
||||
instanceId?: string
|
||||
instanceIds?: string
|
||||
instanceStatus?: string
|
||||
initiatorName?: string
|
||||
applyTimeFrom?: string
|
||||
applyTimeTo?: string
|
||||
finishTimeFrom?: string
|
||||
finishTimeTo?: string
|
||||
}) {
|
||||
return request.get<{
|
||||
appName?: string
|
||||
businessColumns?: Array<{
|
||||
key: string
|
||||
label: string
|
||||
kind?: string
|
||||
subLabel?: string
|
||||
}>
|
||||
fixedColumns?: Array<{ key: string; label: string }>
|
||||
rows?: Array<{
|
||||
index?: number
|
||||
id?: string
|
||||
business?: Record<string, string>
|
||||
fixed?: Record<string, string>
|
||||
}>
|
||||
total?: number
|
||||
}>({
|
||||
url: `${BASE}/instances/history/export`,
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
export function fetchOaPendingTaskCount() {
|
||||
return request.get<{ count: number }>({ url: `${BASE}/tasks/pending/count` })
|
||||
}
|
||||
|
||||
@@ -1,388 +0,0 @@
|
||||
<!-- OA 发起审批 · 单流程历史记录弹窗 -->
|
||||
<template>
|
||||
<el-dialog
|
||||
v-model="visible"
|
||||
class="dialog-form-layout"
|
||||
:title="`历史记录 · ${appName}`"
|
||||
width="1080px"
|
||||
append-to-body
|
||||
destroy-on-close
|
||||
align-center
|
||||
modal-class="protocol-dialog-mask"
|
||||
@closed="onClosed"
|
||||
>
|
||||
<div class="filter-block">
|
||||
<el-form :model="searchForm" class="filter-form" @submit.prevent>
|
||||
<div class="filter-grid">
|
||||
<el-form-item label="流程名称">
|
||||
<el-input :model-value="appName" readonly placeholder="流程名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="审批状态">
|
||||
<el-select v-model="searchForm.instanceStatus" placeholder="全部" clearable>
|
||||
<el-option label="全部" value="" />
|
||||
<el-option label="进行中" value="running" />
|
||||
<el-option label="已完成" value="completed" />
|
||||
<el-option label="已拒绝" value="rejected" />
|
||||
<el-option label="已打回" value="returned" />
|
||||
<el-option label="已撤销" value="cancelled" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="审批 ID">
|
||||
<el-input
|
||||
v-model="searchForm.instanceId"
|
||||
placeholder="请输入审批 ID"
|
||||
clearable
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="发起时间">
|
||||
<el-date-picker
|
||||
v-model="applyTimeRange"
|
||||
type="daterange"
|
||||
range-separator="至"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
value-format="YYYY-MM-DD"
|
||||
style="width: 100%"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="完成时间">
|
||||
<el-date-picker
|
||||
v-model="finishTimeRange"
|
||||
type="daterange"
|
||||
range-separator="至"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
value-format="YYYY-MM-DD"
|
||||
style="width: 100%"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="canViewAll" label="申请人">
|
||||
<el-input
|
||||
v-model="searchForm.initiatorName"
|
||||
placeholder="请输入申请人"
|
||||
clearable
|
||||
/>
|
||||
</el-form-item>
|
||||
</div>
|
||||
<div class="filter-actions-row">
|
||||
<div class="filter-actions-end">
|
||||
<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>
|
||||
</div>
|
||||
|
||||
<div class="list-body list-wrap">
|
||||
<el-table
|
||||
class="list-table"
|
||||
:data="rows"
|
||||
v-loading="loading"
|
||||
stripe
|
||||
empty-text="暂无历史记录"
|
||||
>
|
||||
<el-table-column
|
||||
type="index"
|
||||
label="序号"
|
||||
min-width="68"
|
||||
align="center"
|
||||
header-align="center"
|
||||
:index="indexMethod"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="id"
|
||||
label="审批 ID"
|
||||
min-width="160"
|
||||
align="center"
|
||||
header-align="center"
|
||||
show-overflow-tooltip
|
||||
>
|
||||
<template #default="{ row }">{{ row.id || '-' }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="appName"
|
||||
label="流程名称"
|
||||
min-width="140"
|
||||
align="center"
|
||||
header-align="center"
|
||||
show-overflow-tooltip
|
||||
>
|
||||
<template #default="{ row }">{{ row.appName || appName || '-' }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="initiatorUserName"
|
||||
label="申请人"
|
||||
min-width="100"
|
||||
align="center"
|
||||
header-align="center"
|
||||
>
|
||||
<template #default="{ row }">{{ row.initiatorUserName || '-' }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
v-for="label in previewFieldLabels"
|
||||
:key="label"
|
||||
:label="label"
|
||||
min-width="120"
|
||||
align="center"
|
||||
header-align="center"
|
||||
show-overflow-tooltip
|
||||
>
|
||||
<template #default="{ row }">{{ previewValue(row, label) }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="applyTime"
|
||||
label="发起时间"
|
||||
min-width="170"
|
||||
align="center"
|
||||
header-align="center"
|
||||
>
|
||||
<template #default="{ row }">{{ row.applyTime || '-' }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="finishTime"
|
||||
label="完成时间"
|
||||
min-width="170"
|
||||
align="center"
|
||||
header-align="center"
|
||||
>
|
||||
<template #default="{ row }">{{ row.finishTime || '-' }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="instanceStatus"
|
||||
label="审批状态"
|
||||
min-width="110"
|
||||
align="center"
|
||||
header-align="center"
|
||||
>
|
||||
<template #default="{ row }">
|
||||
<el-tag size="small" :type="statusType(row.instanceStatus || row.status)">
|
||||
{{ statusText(row.instanceStatus || row.status) }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="currentNodeName"
|
||||
label="当前节点"
|
||||
min-width="140"
|
||||
align="center"
|
||||
header-align="center"
|
||||
show-overflow-tooltip
|
||||
>
|
||||
<template #default="{ row }">{{ row.currentNodeName || '-' }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" min-width="260" fixed="right" align="center">
|
||||
<template #default="{ row }">
|
||||
<el-button class="btn-op-item primary" @click="openDetail(row)">
|
||||
<el-icon><View /></el-icon>
|
||||
查看
|
||||
</el-button>
|
||||
<el-button
|
||||
class="btn-op-item"
|
||||
:loading="printingId === row.id"
|
||||
@click="printRow(row)"
|
||||
>
|
||||
<el-icon><Printer /></el-icon>
|
||||
打印
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<div class="pagination list-pager-bar">
|
||||
<el-pagination
|
||||
v-model:current-page="page"
|
||||
v-model:page-size="pageSize"
|
||||
:total="total"
|
||||
:page-sizes="[10, 20, 50]"
|
||||
layout="total, sizes, prev, pager, next"
|
||||
background
|
||||
@size-change="load"
|
||||
@current-change="load"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Printer, RefreshLeft, Search, View } from '@element-plus/icons-vue'
|
||||
import { fetchOaInstanceDetail, fetchOaInstanceHistory } from '@/api/oaApproval'
|
||||
import { useMenuPerm } from '@/hooks/core/useMenuPerm'
|
||||
import { useUserStore } from '@/store/modules/user'
|
||||
import { exportOaApprovalPdf } from '@/utils/oa-approval-print'
|
||||
|
||||
defineOptions({ name: 'OaAppHistoryDialog' })
|
||||
|
||||
const OA_START_HISTORY_ALL = 'oa:start:history:all'
|
||||
const { hasMenuPerm } = useMenuPerm()
|
||||
const canViewAll = computed(() => hasMenuPerm(OA_START_HISTORY_ALL))
|
||||
|
||||
const router = useRouter()
|
||||
const userStore = useUserStore()
|
||||
|
||||
const visible = ref(false)
|
||||
const appId = ref('')
|
||||
const appName = ref('')
|
||||
const loading = ref(false)
|
||||
const printingId = ref('')
|
||||
const rows = ref<any[]>([])
|
||||
const page = ref(1)
|
||||
const pageSize = ref(20)
|
||||
const total = ref(0)
|
||||
const applyTimeRange = ref<string[] | null>(null)
|
||||
const finishTimeRange = ref<string[] | null>(null)
|
||||
const searchForm = reactive({
|
||||
instanceStatus: '',
|
||||
instanceId: '',
|
||||
initiatorName: ''
|
||||
})
|
||||
|
||||
const previewFieldLabels = computed(() => {
|
||||
const labels: string[] = []
|
||||
for (const row of rows.value) {
|
||||
for (const f of row.previewFields || []) {
|
||||
const lb = String(f?.label || '').trim()
|
||||
if (lb && !labels.includes(lb)) labels.push(lb)
|
||||
}
|
||||
}
|
||||
return labels.slice(0, 6)
|
||||
})
|
||||
|
||||
function indexMethod(index: number) {
|
||||
return (page.value - 1) * pageSize.value + index + 1
|
||||
}
|
||||
|
||||
function previewValue(row: any, label: string) {
|
||||
const hit = (row.previewFields || []).find((f: any) => f.label === label)
|
||||
return hit?.value || '-'
|
||||
}
|
||||
|
||||
function currentPrinterName() {
|
||||
const info: any = userStore.info || userStore.getUserInfo || {}
|
||||
return String(
|
||||
info.realName || info.nickName || info.userName || info.username || ''
|
||||
).trim()
|
||||
}
|
||||
|
||||
function statusType(s: string) {
|
||||
if (s === 'pending' || s === 'running') return 'warning'
|
||||
if (s === 'approved' || s === 'completed' || s === 'done') return 'success'
|
||||
if (s === 'rejected' || s === 'cancelled' || s === 'returned') return 'danger'
|
||||
return 'info'
|
||||
}
|
||||
|
||||
function statusText(s: string) {
|
||||
if (!s) return '-'
|
||||
const map: Record<string, string> = {
|
||||
pending: '待处理',
|
||||
running: '进行中',
|
||||
approved: '已同意',
|
||||
rejected: '已拒绝',
|
||||
completed: '已完成',
|
||||
cancelled: '已撤销',
|
||||
done: '已结束',
|
||||
returned: '已打回',
|
||||
transferred: '已转交'
|
||||
}
|
||||
return map[s] || s
|
||||
}
|
||||
|
||||
function resetFilters() {
|
||||
searchForm.instanceStatus = ''
|
||||
searchForm.instanceId = ''
|
||||
searchForm.initiatorName = ''
|
||||
applyTimeRange.value = null
|
||||
finishTimeRange.value = null
|
||||
page.value = 1
|
||||
}
|
||||
|
||||
function open(app: { id: string; appName?: string }) {
|
||||
appId.value = String(app?.id || '').trim()
|
||||
appName.value = String(app?.appName || '').trim()
|
||||
resetFilters()
|
||||
visible.value = true
|
||||
void load()
|
||||
}
|
||||
|
||||
function onClosed() {
|
||||
rows.value = []
|
||||
total.value = 0
|
||||
printingId.value = ''
|
||||
}
|
||||
|
||||
function handleSearch() {
|
||||
page.value = 1
|
||||
void load()
|
||||
}
|
||||
|
||||
function handleReset() {
|
||||
resetFilters()
|
||||
void load()
|
||||
}
|
||||
|
||||
async function load() {
|
||||
if (!appId.value) return
|
||||
loading.value = true
|
||||
try {
|
||||
const params: any = {
|
||||
appId: appId.value,
|
||||
instanceId: searchForm.instanceId || undefined,
|
||||
instanceStatus: searchForm.instanceStatus || undefined,
|
||||
applyTimeFrom: applyTimeRange.value?.[0],
|
||||
applyTimeTo: applyTimeRange.value?.[1],
|
||||
finishTimeFrom: finishTimeRange.value?.[0],
|
||||
finishTimeTo: finishTimeRange.value?.[1],
|
||||
page: page.value,
|
||||
pageSize: pageSize.value
|
||||
}
|
||||
if (canViewAll.value && searchForm.initiatorName) {
|
||||
params.initiatorName = searchForm.initiatorName
|
||||
}
|
||||
const data = await fetchOaInstanceHistory(params)
|
||||
rows.value = data?.list || []
|
||||
total.value = Number(data?.total || 0)
|
||||
} catch {
|
||||
rows.value = []
|
||||
total.value = 0
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
function openDetail(row: any) {
|
||||
const id = row?.id
|
||||
if (!id) return
|
||||
visible.value = false
|
||||
router.push({ path: `/system-manage/oa-approval/instances/${id}` })
|
||||
}
|
||||
|
||||
async function printRow(row: any) {
|
||||
const id = String(row?.id || '').trim()
|
||||
if (!id || printingId.value) return
|
||||
printingId.value = id
|
||||
let detail: any
|
||||
try {
|
||||
detail = await fetchOaInstanceDetail(id)
|
||||
} catch {
|
||||
printingId.value = ''
|
||||
ElMessage.error('加载审批单失败')
|
||||
return
|
||||
}
|
||||
try {
|
||||
await exportOaApprovalPdf(detail, { printerName: currentPrinterName() })
|
||||
ElMessage.success('PDF 已下载')
|
||||
} catch {
|
||||
ElMessage.error('导出 PDF 失败')
|
||||
} finally {
|
||||
printingId.value = ''
|
||||
}
|
||||
}
|
||||
|
||||
defineExpose({ open })
|
||||
</script>
|
||||
@@ -1444,6 +1444,19 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
|
||||
menuCode: 'oa:start'
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 'OA000000000000000000000000000203',
|
||||
name: 'OaApprovalHistory',
|
||||
path: 'history/:appId',
|
||||
component: '/oa-approval/history/index',
|
||||
meta: {
|
||||
title: '历史记录',
|
||||
keepAlive: true,
|
||||
isHide: true,
|
||||
worktabMulti: true,
|
||||
menuCode: 'oa:start'
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 'OA000000000000000000000000000109',
|
||||
name: 'OaApprovalDrafts',
|
||||
|
||||
@@ -206,9 +206,9 @@ export const useWorktabStore = defineStore(
|
||||
removeKeepAliveExclude(tab.name)
|
||||
}
|
||||
|
||||
// 先根据路由名称查找(应对动态路由参数导致的多开问题),找不到再根据路径查找
|
||||
// 默认:先按 name 复用(动态参数同页);worktabMulti 仅按 path 匹配以支持同 name 多开
|
||||
let existingIndex = -1
|
||||
if (tab.name) {
|
||||
if (!tab.worktabMulti && tab.name) {
|
||||
existingIndex = opened.value.findIndex((t) => t.name === tab.name)
|
||||
}
|
||||
if (existingIndex === -1) {
|
||||
@@ -239,6 +239,7 @@ export const useWorktabStore = defineStore(
|
||||
title: tab.title || existingTab.title,
|
||||
fixedTab: tab.fixedTab ?? existingTab.fixedTab,
|
||||
keepAlive: tab.keepAlive ?? existingTab.keepAlive,
|
||||
worktabMulti: tab.worktabMulti ?? existingTab.worktabMulti,
|
||||
name: tab.name || existingTab.name,
|
||||
icon: tab.icon || existingTab.icon
|
||||
}
|
||||
@@ -430,6 +431,8 @@ export const useWorktabStore = defineStore(
|
||||
*/
|
||||
const addKeepAliveExclude = (tab: WorkTab): void => {
|
||||
if (!tab.keepAlive || !tab.name) return
|
||||
// 同 name 多开:仍有其它同名标签时勿排除,否则会清掉其它实例缓存
|
||||
if (opened.value.some((t) => t.name === tab.name)) return
|
||||
|
||||
if (!keepAliveExclude.value.includes(tab.name)) {
|
||||
keepAliveExclude.value.push(tab.name)
|
||||
@@ -449,9 +452,15 @@ export const useWorktabStore = defineStore(
|
||||
* 将传入的一组选项卡的组件名称标记为排除缓存
|
||||
*/
|
||||
const markTabsToRemove = (tabs: WorkTab[]): void => {
|
||||
const removePaths = new Set(tabs.map((t) => t.path))
|
||||
tabs.forEach((tab) => {
|
||||
if (tab.name) {
|
||||
addKeepAliveExclude(tab)
|
||||
if (!tab.keepAlive || !tab.name) return
|
||||
const stillOpen = opened.value.some(
|
||||
(t) => t.name === tab.name && !removePaths.has(t.path)
|
||||
)
|
||||
if (stillOpen) return
|
||||
if (!keepAliveExclude.value.includes(tab.name)) {
|
||||
keepAliveExclude.value.push(tab.name)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@@ -60,6 +60,11 @@ export interface RouteMeta extends Record<string | number | symbol, unknown> {
|
||||
roles?: string[]
|
||||
/** 是否固定标签页 */
|
||||
fixedTab?: boolean
|
||||
/**
|
||||
* 同路由 name 允许多开(按完整 path 区分)
|
||||
* 用于如「历史记录/:appId」等需同时保留多份的页面
|
||||
*/
|
||||
worktabMulti?: boolean
|
||||
/** 激活菜单路径 */
|
||||
activePath?: string
|
||||
/** 是否为全屏页面 */
|
||||
|
||||
@@ -91,6 +91,11 @@ export interface WorkTab {
|
||||
keepAlive: boolean
|
||||
/** 是否固定标签 */
|
||||
fixedTab?: boolean
|
||||
/**
|
||||
* 同路由 name 允许多开(按 path 区分,如历史记录按 appId)
|
||||
* 为 true 时 openTab 不按 name 复用已有标签
|
||||
*/
|
||||
worktabMulti?: boolean
|
||||
/** 路由参数 */
|
||||
params?: object
|
||||
/** 路由查询参数 */
|
||||
|
||||
@@ -63,7 +63,8 @@ export const setWorktab = (to: RouteLocationNormalized): void => {
|
||||
keepAlive: meta.keepAlive as boolean,
|
||||
params,
|
||||
query,
|
||||
fixedTab: meta.fixedTab as boolean
|
||||
fixedTab: meta.fixedTab as boolean,
|
||||
worktabMulti: Boolean(meta.worktabMulti)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,201 @@
|
||||
import ExcelJS from 'exceljs'
|
||||
import FileSaver from 'file-saver'
|
||||
|
||||
export type OaHistoryExportColumn = {
|
||||
key: string
|
||||
label: string
|
||||
kind?: 'business' | 'related'
|
||||
subLabel?: string
|
||||
}
|
||||
|
||||
export type OaHistoryExportFixedColumn = {
|
||||
key: string
|
||||
label: string
|
||||
}
|
||||
|
||||
export type OaHistoryExportRow = {
|
||||
index?: number
|
||||
id?: string
|
||||
business?: Record<string, string>
|
||||
fixed?: Record<string, string>
|
||||
}
|
||||
|
||||
export type OaHistoryExportPayload = {
|
||||
appName?: string
|
||||
businessColumns?: OaHistoryExportColumn[]
|
||||
fixedColumns?: OaHistoryExportFixedColumn[]
|
||||
rows?: OaHistoryExportRow[]
|
||||
}
|
||||
|
||||
type SheetColumn = {
|
||||
key: string
|
||||
label: string
|
||||
subLabel?: string
|
||||
width: number
|
||||
}
|
||||
|
||||
const HEADER_FILL: ExcelJS.Fill = {
|
||||
type: 'pattern',
|
||||
pattern: 'solid',
|
||||
fgColor: { argb: 'FFF0FDF4' }
|
||||
}
|
||||
|
||||
const HEADER_FONT: Partial<ExcelJS.Font> = {
|
||||
bold: true,
|
||||
color: { argb: 'FF065F46' },
|
||||
size: 11
|
||||
}
|
||||
|
||||
const BORDER: Partial<ExcelJS.Borders> = {
|
||||
top: { style: 'thin', color: { argb: 'FFE2E8F0' } },
|
||||
left: { style: 'thin', color: { argb: 'FFE2E8F0' } },
|
||||
bottom: { style: 'thin', color: { argb: 'FFE2E8F0' } },
|
||||
right: { style: 'thin', color: { argb: 'FFE2E8F0' } }
|
||||
}
|
||||
|
||||
function pad(n: number) {
|
||||
return String(n).padStart(2, '0')
|
||||
}
|
||||
|
||||
function exportTimestamp() {
|
||||
const d = new Date()
|
||||
return (
|
||||
`${d.getFullYear()}${pad(d.getMonth() + 1)}${pad(d.getDate())}` +
|
||||
`${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}`
|
||||
)
|
||||
}
|
||||
|
||||
function sanitizeFilename(name: string) {
|
||||
return String(name || '历史记录')
|
||||
.replace(/[\\/:*?"<>|]/g, '_')
|
||||
.trim()
|
||||
}
|
||||
|
||||
function styleHeaderCell(cell: ExcelJS.Cell) {
|
||||
cell.fill = HEADER_FILL
|
||||
cell.font = HEADER_FONT
|
||||
cell.alignment = { vertical: 'middle', horizontal: 'center', wrapText: true }
|
||||
cell.border = BORDER
|
||||
}
|
||||
|
||||
function styleBodyCell(cell: ExcelJS.Cell) {
|
||||
cell.alignment = { vertical: 'top', horizontal: 'left', wrapText: true }
|
||||
cell.border = BORDER
|
||||
}
|
||||
|
||||
function buildSheetColumns(payload: OaHistoryExportPayload): SheetColumn[] {
|
||||
const cols: SheetColumn[] = [
|
||||
{ key: '__index', label: '序号', width: 8 },
|
||||
{ key: '__id', label: '数据id', width: 28 }
|
||||
]
|
||||
for (const col of payload.businessColumns || []) {
|
||||
if (col.kind === 'related') {
|
||||
cols.push({ key: col.key, label: col.label, width: 18 })
|
||||
cols.push({
|
||||
key: `${col.key}__titles`,
|
||||
label: col.label,
|
||||
subLabel: col.subLabel || '关联标题',
|
||||
width: 24
|
||||
})
|
||||
} else {
|
||||
cols.push({ key: col.key, label: col.label, width: 20 })
|
||||
}
|
||||
}
|
||||
for (const col of payload.fixedColumns || []) {
|
||||
cols.push({
|
||||
key: col.key,
|
||||
label: col.label,
|
||||
width: col.key === 'approvalRecord' ? 48 : 18
|
||||
})
|
||||
}
|
||||
return cols
|
||||
}
|
||||
|
||||
function cellValue(row: OaHistoryExportRow, key: string) {
|
||||
if (key === '__index') return row.index ?? ''
|
||||
if (key === '__id') return row.id ?? ''
|
||||
const fixed = row.fixed || {}
|
||||
const business = row.business || {}
|
||||
if (key in fixed) return fixed[key] ?? ''
|
||||
return business[key] ?? ''
|
||||
}
|
||||
|
||||
function writeHeaderRows(worksheet: ExcelJS.Worksheet, sheetColumns: SheetColumn[]) {
|
||||
const headerRow1 = worksheet.getRow(1)
|
||||
const headerRow2 = worksheet.getRow(2)
|
||||
headerRow1.height = 24
|
||||
headerRow2.height = 20
|
||||
|
||||
let colIdx = 1
|
||||
let i = 0
|
||||
while (i < sheetColumns.length) {
|
||||
const col = sheetColumns[i]
|
||||
const next = sheetColumns[i + 1]
|
||||
const isRelatedPair = Boolean(next?.subLabel && next.label === col.label && !col.subLabel)
|
||||
|
||||
if (isRelatedPair) {
|
||||
const c1 = headerRow1.getCell(colIdx)
|
||||
c1.value = col.label
|
||||
styleHeaderCell(c1)
|
||||
worksheet.mergeCells(1, colIdx, 1, colIdx + 1)
|
||||
|
||||
const c2a = headerRow2.getCell(colIdx)
|
||||
c2a.value = ''
|
||||
styleHeaderCell(c2a)
|
||||
|
||||
const c2b = headerRow2.getCell(colIdx + 1)
|
||||
c2b.value = next.subLabel || '关联标题'
|
||||
styleHeaderCell(c2b)
|
||||
|
||||
colIdx += 2
|
||||
i += 2
|
||||
continue
|
||||
}
|
||||
|
||||
const c1 = headerRow1.getCell(colIdx)
|
||||
c1.value = col.label
|
||||
styleHeaderCell(c1)
|
||||
const c2 = headerRow2.getCell(colIdx)
|
||||
c2.value = ''
|
||||
styleHeaderCell(c2)
|
||||
worksheet.mergeCells(1, colIdx, 2, colIdx)
|
||||
colIdx += 1
|
||||
i += 1
|
||||
}
|
||||
}
|
||||
|
||||
export async function downloadOaHistoryExcel(
|
||||
payload: OaHistoryExportPayload,
|
||||
options?: { filenamePrefix?: string }
|
||||
) {
|
||||
const rows = payload.rows || []
|
||||
if (!rows.length) {
|
||||
throw new Error('暂无可导出数据')
|
||||
}
|
||||
|
||||
const sheetColumns = buildSheetColumns(payload)
|
||||
const workbook = new ExcelJS.Workbook()
|
||||
const sheetName = sanitizeFilename(payload.appName || '历史记录').slice(0, 31)
|
||||
const worksheet = workbook.addWorksheet(sheetName)
|
||||
|
||||
worksheet.columns = sheetColumns.map((c) => ({ width: c.width }))
|
||||
writeHeaderRows(worksheet, sheetColumns)
|
||||
|
||||
rows.forEach((row, rowIndex) => {
|
||||
const excelRow = worksheet.getRow(rowIndex + 3)
|
||||
sheetColumns.forEach((col, i) => {
|
||||
const cell = excelRow.getCell(i + 1)
|
||||
cell.value = cellValue(row, col.key)
|
||||
styleBodyCell(cell)
|
||||
})
|
||||
})
|
||||
|
||||
worksheet.views = [{ state: 'frozen', ySplit: 2 }]
|
||||
|
||||
const buffer = await workbook.xlsx.writeBuffer()
|
||||
const prefix = sanitizeFilename(options?.filenamePrefix || payload.appName || '历史记录')
|
||||
const blob = new Blob([buffer], {
|
||||
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
||||
})
|
||||
FileSaver.saveAs(blob, `${prefix}-${exportTimestamp()}.xlsx`)
|
||||
}
|
||||
@@ -74,7 +74,7 @@ export const PRODUCTION_WORK_ORDER_TABS: ProductionWorkOrderTabConfig[] = [
|
||||
},
|
||||
{
|
||||
key: 'temporary',
|
||||
label: '临时生产',
|
||||
label: '扩增/传代生产',
|
||||
group: 'temporary',
|
||||
workOrderType: 'temporary',
|
||||
listLayout: 'standalone'
|
||||
|
||||
@@ -119,6 +119,14 @@ const SOP_SHARED_CONTENT_STYLE = `
|
||||
.sop-body-table tbody {
|
||||
height: 100%;
|
||||
}
|
||||
.sop-header-table.sop-row-hidden,
|
||||
.sop-body-table tr.sop-row-hidden {
|
||||
display: none !important;
|
||||
}
|
||||
.sop-record.sop-a4:has(.sop-row-hidden) {
|
||||
min-height: auto !important;
|
||||
height: auto !important;
|
||||
}
|
||||
.sop-body-table tr.sop-fill-row {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,874 @@
|
||||
<!-- OA 发起审批 · 单流程历史记录(WorkTab 页,按 appId 多开) -->
|
||||
<template>
|
||||
<div class="page-container">
|
||||
<section class="panel">
|
||||
<div class="panel-top">
|
||||
<h2 class="title-bar-heading">{{ pageTitle }}</h2>
|
||||
</div>
|
||||
|
||||
<div class="filter-block">
|
||||
<el-form :model="searchForm" class="filter-form" @submit.prevent>
|
||||
<div class="filter-grid">
|
||||
<el-form-item label="流程名称">
|
||||
<el-input :model-value="appName" readonly placeholder="流程名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="审批状态">
|
||||
<el-select v-model="searchForm.instanceStatus" placeholder="全部" clearable>
|
||||
<el-option label="全部" value="" />
|
||||
<el-option label="进行中" value="running" />
|
||||
<el-option label="已完成" value="completed" />
|
||||
<el-option label="已拒绝" value="rejected" />
|
||||
<el-option label="已打回" value="returned" />
|
||||
<el-option label="已撤销" value="cancelled" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="审批 ID">
|
||||
<el-input
|
||||
v-model="searchForm.instanceId"
|
||||
placeholder="请输入审批 ID"
|
||||
clearable
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="发起时间">
|
||||
<el-date-picker
|
||||
v-model="applyTimeRange"
|
||||
type="daterange"
|
||||
range-separator="至"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
value-format="YYYY-MM-DD"
|
||||
style="width: 100%"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="完成时间">
|
||||
<el-date-picker
|
||||
v-model="finishTimeRange"
|
||||
type="daterange"
|
||||
range-separator="至"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
value-format="YYYY-MM-DD"
|
||||
style="width: 100%"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="canViewAll" label="申请人">
|
||||
<el-input
|
||||
v-model="searchForm.initiatorName"
|
||||
placeholder="请输入申请人"
|
||||
clearable
|
||||
/>
|
||||
</el-form-item>
|
||||
</div>
|
||||
<div class="filter-actions-row">
|
||||
<div class="filter-actions-end">
|
||||
<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>
|
||||
</div>
|
||||
|
||||
<div class="list-toolbar">
|
||||
<div class="list-toolbar-row">
|
||||
<div class="list-toolbar-selected">
|
||||
已选 <span class="sel-num">{{ selectedRows.length }}</span> 项
|
||||
</div>
|
||||
<el-button
|
||||
class="btn-ghost"
|
||||
:disabled="selectedRows.length === 0 || exporting"
|
||||
:loading="exporting && exportMode === 'selected'"
|
||||
@click="handleExportSelected"
|
||||
>
|
||||
<el-icon><Download /></el-icon>
|
||||
导出勾选
|
||||
</el-button>
|
||||
<el-button
|
||||
class="btn-ghost"
|
||||
:disabled="total <= 0 || exporting"
|
||||
:loading="exporting && exportMode === 'all'"
|
||||
@click="handleExportAll"
|
||||
>
|
||||
<el-icon><Download /></el-icon>
|
||||
导出全部
|
||||
</el-button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="list-body list-wrap">
|
||||
<el-table
|
||||
class="list-table"
|
||||
:data="rows"
|
||||
v-loading="loading"
|
||||
stripe
|
||||
row-key="id"
|
||||
empty-text="暂无历史记录"
|
||||
@selection-change="onSelectionChange"
|
||||
@row-dblclick="openDetail"
|
||||
>
|
||||
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
|
||||
<el-table-column
|
||||
type="index"
|
||||
label="序号"
|
||||
min-width="68"
|
||||
align="center"
|
||||
header-align="center"
|
||||
:index="indexMethod"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="id"
|
||||
label="审批 ID"
|
||||
min-width="160"
|
||||
align="center"
|
||||
header-align="center"
|
||||
show-overflow-tooltip
|
||||
>
|
||||
<template #default="{ row }">{{ row.id || '-' }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="appName"
|
||||
label="流程名称"
|
||||
min-width="140"
|
||||
align="center"
|
||||
header-align="center"
|
||||
show-overflow-tooltip
|
||||
>
|
||||
<template #default="{ row }">{{ row.appName || appName || '-' }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="initiatorUserName"
|
||||
label="申请人"
|
||||
min-width="100"
|
||||
align="center"
|
||||
header-align="center"
|
||||
>
|
||||
<template #default="{ row }">{{ row.initiatorUserName || '-' }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
v-for="label in previewFieldLabels"
|
||||
:key="label"
|
||||
:label="label"
|
||||
:min-width="previewColumnMinWidth(label)"
|
||||
align="center"
|
||||
header-align="center"
|
||||
:show-overflow-tooltip="!isUploadPreviewLabel(label)"
|
||||
>
|
||||
<template #default="{ row }">
|
||||
<div
|
||||
v-if="previewFiles(row, label).length"
|
||||
class="hist-attach"
|
||||
:class="{ 'is-multi': previewFiles(row, label).length > 1 }"
|
||||
>
|
||||
<div
|
||||
v-for="(file, idx) in previewFiles(row, label)"
|
||||
:key="`${file.url}-${idx}`"
|
||||
class="hist-attach__card"
|
||||
:title="file.name || '附件'"
|
||||
>
|
||||
<div class="hist-attach__preview">
|
||||
<el-image
|
||||
v-if="isImageFile(file)"
|
||||
class="hist-attach__img"
|
||||
:src="fileFullUrl(file.url)"
|
||||
:preview-src-list="imagePreviewList(row, label)"
|
||||
:initial-index="imagePreviewIndex(row, label, file.url)"
|
||||
fit="cover"
|
||||
preview-teleported
|
||||
>
|
||||
<template #error>
|
||||
<div class="hist-attach__fallback">
|
||||
<el-icon :size="18"><Picture /></el-icon>
|
||||
</div>
|
||||
</template>
|
||||
</el-image>
|
||||
<button
|
||||
v-else
|
||||
type="button"
|
||||
class="hist-attach__doc"
|
||||
@click="previewFile(file)"
|
||||
>
|
||||
<span class="hist-attach__doc-icon">
|
||||
<el-icon :size="18"><Document /></el-icon>
|
||||
</span>
|
||||
<span class="hist-attach__ext">{{ fileExt(file) }}</span>
|
||||
</button>
|
||||
<div class="hist-attach__hint" aria-hidden="true">
|
||||
<el-icon :size="14">
|
||||
<ZoomIn v-if="isImageFile(file)" />
|
||||
<View v-else />
|
||||
</el-icon>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hist-attach__footer">
|
||||
<span class="hist-attach__name">{{ shortFileLabel(file) }}</span>
|
||||
<button
|
||||
type="button"
|
||||
class="hist-attach__dl"
|
||||
title="下载"
|
||||
@click.stop="downloadFile(file)"
|
||||
>
|
||||
<el-icon :size="12"><Download /></el-icon>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<span v-else>{{ previewValue(row, label) }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="applyTime"
|
||||
label="发起时间"
|
||||
min-width="170"
|
||||
align="center"
|
||||
header-align="center"
|
||||
>
|
||||
<template #default="{ row }">{{ row.applyTime || '-' }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="finishTime"
|
||||
label="完成时间"
|
||||
min-width="170"
|
||||
align="center"
|
||||
header-align="center"
|
||||
>
|
||||
<template #default="{ row }">{{ row.finishTime || '-' }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="instanceStatus"
|
||||
label="审批状态"
|
||||
min-width="110"
|
||||
align="center"
|
||||
header-align="center"
|
||||
>
|
||||
<template #default="{ row }">
|
||||
<el-tag size="small" :type="statusType(row.instanceStatus || row.status)">
|
||||
{{ statusText(row.instanceStatus || row.status) }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="currentNodeName"
|
||||
label="当前节点"
|
||||
min-width="140"
|
||||
align="center"
|
||||
header-align="center"
|
||||
show-overflow-tooltip
|
||||
>
|
||||
<template #default="{ row }">{{ row.currentNodeName || '-' }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" min-width="260" fixed="right" align="center">
|
||||
<template #default="{ row }">
|
||||
<el-button class="btn-op-item primary" @click="openDetail(row)">
|
||||
<el-icon><View /></el-icon>
|
||||
查看
|
||||
</el-button>
|
||||
<el-button
|
||||
class="btn-op-item"
|
||||
:loading="printingId === row.id"
|
||||
@click="printRow(row)"
|
||||
>
|
||||
<el-icon><Printer /></el-icon>
|
||||
打印
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<div class="pagination list-pager-bar">
|
||||
<el-pagination
|
||||
v-model:current-page="page"
|
||||
v-model:page-size="pageSize"
|
||||
:total="total"
|
||||
:page-sizes="[10, 20, 50]"
|
||||
layout="total, sizes, prev, pager, next"
|
||||
background
|
||||
@size-change="load"
|
||||
@current-change="load"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import {
|
||||
Document,
|
||||
Download,
|
||||
Picture,
|
||||
Printer,
|
||||
RefreshLeft,
|
||||
Search,
|
||||
View,
|
||||
ZoomIn
|
||||
} from '@element-plus/icons-vue'
|
||||
import { fetchOaInstanceDetail, fetchOaInstanceHistory, fetchOaInstanceHistoryExport } from '@/api/oaApproval'
|
||||
import { attachmentFullUrl } from '@/composables/useAttachmentActions'
|
||||
import { useMenuPerm } from '@/hooks/core/useMenuPerm'
|
||||
import { useUserStore } from '@/store/modules/user'
|
||||
import { useWorktabStore } from '@/store/modules/worktab'
|
||||
import { downloadAttachmentFile } from '@/utils/download-attachment'
|
||||
import { downloadOaHistoryExcel } from '@/utils/oa-history-export'
|
||||
import { exportOaApprovalPdf } from '@/utils/oa-approval-print'
|
||||
import { isOaUploadImageFile } from '@/utils/oa-upload-file-type'
|
||||
|
||||
defineOptions({ name: 'OaApprovalHistory' })
|
||||
|
||||
type PreviewFile = { url: string; name: string }
|
||||
|
||||
const OA_START_HISTORY_ALL = 'oa:start:history:all'
|
||||
const { hasMenuPerm } = useMenuPerm()
|
||||
const canViewAll = computed(() => hasMenuPerm(OA_START_HISTORY_ALL))
|
||||
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
const userStore = useUserStore()
|
||||
const worktabStore = useWorktabStore()
|
||||
|
||||
// KeepAlive 多开:setup 时锁定本实例对应的流程,避免全局 route 切走后串数据/标题
|
||||
const boundAppId = String(route.params.appId || route.query.appId || '').trim()
|
||||
const boundPath = String(route.path || '')
|
||||
const boundAppName = ref(String(route.query.appName || '').trim())
|
||||
|
||||
const loading = ref(false)
|
||||
const exporting = ref(false)
|
||||
const exportMode = ref<'selected' | 'all' | ''>('')
|
||||
const printingId = ref('')
|
||||
const selectedRows = ref<any[]>([])
|
||||
const rows = ref<any[]>([])
|
||||
const page = ref(1)
|
||||
const pageSize = ref(20)
|
||||
const total = ref(0)
|
||||
const applyTimeRange = ref<string[] | null>(null)
|
||||
const finishTimeRange = ref<string[] | null>(null)
|
||||
const searchForm = reactive({
|
||||
instanceStatus: '',
|
||||
instanceId: '',
|
||||
initiatorName: ''
|
||||
})
|
||||
|
||||
const appId = computed(() => boundAppId)
|
||||
const appName = computed(() => boundAppName.value)
|
||||
const pageTitle = computed(() =>
|
||||
appName.value ? `历史记录 · ${appName.value}` : '历史记录'
|
||||
)
|
||||
|
||||
function isActiveHistoryInstance() {
|
||||
return (
|
||||
route.name === 'OaApprovalHistory' &&
|
||||
String(route.params.appId || route.query.appId || '').trim() === boundAppId
|
||||
)
|
||||
}
|
||||
|
||||
const previewFieldLabels = computed(() => {
|
||||
const labels: string[] = []
|
||||
for (const row of rows.value) {
|
||||
for (const f of row.previewFields || []) {
|
||||
const lb = String(f?.label || '').trim()
|
||||
if (lb && !labels.includes(lb)) labels.push(lb)
|
||||
}
|
||||
}
|
||||
return labels.slice(0, 6)
|
||||
})
|
||||
|
||||
const uploadPreviewLabels = computed(() => {
|
||||
const set = new Set<string>()
|
||||
for (const row of rows.value) {
|
||||
for (const f of row.previewFields || []) {
|
||||
const lb = String(f?.label || '').trim()
|
||||
if (!lb) continue
|
||||
const files = Array.isArray(f?.files) ? f.files : []
|
||||
if (files.length || isUploadFieldType(f?.fieldType)) set.add(lb)
|
||||
}
|
||||
}
|
||||
return set
|
||||
})
|
||||
|
||||
function isUploadFieldType(t: unknown) {
|
||||
const s = String(t || '')
|
||||
return s === 'upload' || s === 'fcUpload' || s === 'image' || s === 'oaAttachment'
|
||||
}
|
||||
|
||||
function isUploadPreviewLabel(label: string) {
|
||||
return uploadPreviewLabels.value.has(label)
|
||||
}
|
||||
|
||||
function previewColumnMinWidth(label: string) {
|
||||
return isUploadPreviewLabel(label) ? 168 : 120
|
||||
}
|
||||
|
||||
function syncWorktabTitle() {
|
||||
if (!isActiveHistoryInstance() || !boundPath) return
|
||||
worktabStore.updateTabTitle(boundPath, pageTitle.value)
|
||||
}
|
||||
|
||||
function indexMethod(index: number) {
|
||||
return (page.value - 1) * pageSize.value + index + 1
|
||||
}
|
||||
|
||||
function onSelectionChange(selection: any[]) {
|
||||
selectedRows.value = selection
|
||||
}
|
||||
|
||||
function buildExportParams(instanceIds?: string[]) {
|
||||
const params: Record<string, string> = { appId: appId.value }
|
||||
if (searchForm.instanceId) params.instanceId = searchForm.instanceId
|
||||
if (searchForm.instanceStatus) params.instanceStatus = searchForm.instanceStatus
|
||||
if (applyTimeRange.value?.[0]) params.applyTimeFrom = applyTimeRange.value[0]
|
||||
if (applyTimeRange.value?.[1]) params.applyTimeTo = applyTimeRange.value[1]
|
||||
if (finishTimeRange.value?.[0]) params.finishTimeFrom = finishTimeRange.value[0]
|
||||
if (finishTimeRange.value?.[1]) params.finishTimeTo = finishTimeRange.value[1]
|
||||
if (canViewAll.value && searchForm.initiatorName) {
|
||||
params.initiatorName = searchForm.initiatorName
|
||||
}
|
||||
if (instanceIds?.length) {
|
||||
params.instanceIds = instanceIds.join(',')
|
||||
}
|
||||
return params
|
||||
}
|
||||
|
||||
async function runExport(instanceIds?: string[]) {
|
||||
if (!appId.value) {
|
||||
ElMessage.warning('缺少流程信息,无法导出')
|
||||
return
|
||||
}
|
||||
exporting.value = true
|
||||
try {
|
||||
const data = await fetchOaInstanceHistoryExport(buildExportParams(instanceIds))
|
||||
if (!data?.rows?.length) {
|
||||
ElMessage.warning('暂无可导出数据')
|
||||
return
|
||||
}
|
||||
await downloadOaHistoryExcel(data, {
|
||||
filenamePrefix: appName.value || data.appName || '历史记录'
|
||||
})
|
||||
ElMessage.success(`已导出 ${data.rows.length} 条`)
|
||||
} catch {
|
||||
ElMessage.error('导出失败')
|
||||
} finally {
|
||||
exporting.value = false
|
||||
exportMode.value = ''
|
||||
}
|
||||
}
|
||||
|
||||
function handleExportSelected() {
|
||||
const ids = selectedRows.value.map((r) => String(r?.id || '').trim()).filter(Boolean)
|
||||
if (!ids.length) {
|
||||
ElMessage.warning('请先勾选要导出的记录')
|
||||
return
|
||||
}
|
||||
exportMode.value = 'selected'
|
||||
void runExport(ids)
|
||||
}
|
||||
|
||||
function handleExportAll() {
|
||||
if (total.value <= 0) {
|
||||
ElMessage.warning('暂无可导出数据')
|
||||
return
|
||||
}
|
||||
exportMode.value = 'all'
|
||||
void runExport()
|
||||
}
|
||||
|
||||
function previewField(row: any, label: string) {
|
||||
return (row.previewFields || []).find((f: any) => f.label === label)
|
||||
}
|
||||
|
||||
function previewValue(row: any, label: string) {
|
||||
const hit = previewField(row, label)
|
||||
return hit?.value || '-'
|
||||
}
|
||||
|
||||
function previewFiles(row: any, label: string): PreviewFile[] {
|
||||
const hit = previewField(row, label)
|
||||
const files = Array.isArray(hit?.files) ? hit.files : []
|
||||
return files
|
||||
.map((f: any) => ({
|
||||
url: String(f?.url || '').trim(),
|
||||
name: String(f?.name || '').trim()
|
||||
}))
|
||||
.filter((f: PreviewFile) => !!f.url)
|
||||
}
|
||||
|
||||
function fileFullUrl(url: string) {
|
||||
return attachmentFullUrl(url) || url
|
||||
}
|
||||
|
||||
function isImageFile(file: PreviewFile) {
|
||||
return isOaUploadImageFile({ url: file.url, name: file.name })
|
||||
}
|
||||
|
||||
function fileExt(file: PreviewFile) {
|
||||
const name = String(file.name || file.url || '')
|
||||
const m = name.match(/\.([a-z0-9]+)(?:\?|$)/i)
|
||||
return (m?.[1] || 'FILE').toUpperCase().slice(0, 4)
|
||||
}
|
||||
|
||||
/** 列表内短名:UUID 文件名改为「图片/文件.ext」,避免一长串哈希 */
|
||||
function shortFileLabel(file: PreviewFile) {
|
||||
const raw = String(file.name || '').trim()
|
||||
if (!raw) return isImageFile(file) ? '图片' : '附件'
|
||||
const extMatch = raw.match(/\.([a-z0-9]+)$/i)
|
||||
const ext = extMatch?.[1] || ''
|
||||
const base = ext ? raw.slice(0, -(ext.length + 1)) : raw
|
||||
if (/^[a-f0-9_-]{16,}$/i.test(base)) {
|
||||
if (isImageFile(file)) return ext ? `图片.${ext.toLowerCase()}` : '图片'
|
||||
return ext ? `文件.${ext.toLowerCase()}` : '文件'
|
||||
}
|
||||
if (raw.length <= 14) return raw
|
||||
if (ext) {
|
||||
const keep = Math.max(4, 10 - ext.length)
|
||||
return `${base.slice(0, keep)}….${ext.toLowerCase()}`
|
||||
}
|
||||
return `${raw.slice(0, 12)}…`
|
||||
}
|
||||
|
||||
function imagePreviewList(row: any, label: string) {
|
||||
return previewFiles(row, label)
|
||||
.filter((f) => isImageFile(f))
|
||||
.map((f) => fileFullUrl(f.url))
|
||||
}
|
||||
|
||||
function imagePreviewIndex(row: any, label: string, url: string) {
|
||||
const list = previewFiles(row, label).filter((f) => isImageFile(f))
|
||||
const idx = list.findIndex((f) => f.url === url)
|
||||
return idx >= 0 ? idx : 0
|
||||
}
|
||||
|
||||
function previewFile(file: PreviewFile) {
|
||||
const url = fileFullUrl(file.url)
|
||||
if (url) window.open(url, '_blank')
|
||||
}
|
||||
|
||||
function downloadFile(file: PreviewFile) {
|
||||
void downloadAttachmentFile(
|
||||
{ fileUrl: file.url, fileName: file.name || undefined },
|
||||
{ fullFileUrl: (u) => attachmentFullUrl(u) }
|
||||
)
|
||||
}
|
||||
|
||||
function currentPrinterName() {
|
||||
const info: any = userStore.info || userStore.getUserInfo || {}
|
||||
return String(
|
||||
info.realName || info.nickName || info.userName || info.username || ''
|
||||
).trim()
|
||||
}
|
||||
|
||||
function statusType(s: string) {
|
||||
if (s === 'pending' || s === 'running') return 'warning'
|
||||
if (s === 'approved' || s === 'completed' || s === 'done') return 'success'
|
||||
if (s === 'rejected' || s === 'cancelled' || s === 'returned') return 'danger'
|
||||
return 'info'
|
||||
}
|
||||
|
||||
function statusText(s: string) {
|
||||
if (!s) return '-'
|
||||
const map: Record<string, string> = {
|
||||
pending: '待处理',
|
||||
running: '进行中',
|
||||
approved: '已同意',
|
||||
rejected: '已拒绝',
|
||||
completed: '已完成',
|
||||
cancelled: '已撤销',
|
||||
done: '已结束',
|
||||
returned: '已打回',
|
||||
transferred: '已转交'
|
||||
}
|
||||
return map[s] || s
|
||||
}
|
||||
|
||||
function resetFilters() {
|
||||
searchForm.instanceStatus = ''
|
||||
searchForm.instanceId = ''
|
||||
searchForm.initiatorName = ''
|
||||
applyTimeRange.value = null
|
||||
finishTimeRange.value = null
|
||||
page.value = 1
|
||||
}
|
||||
|
||||
function handleSearch() {
|
||||
page.value = 1
|
||||
void load()
|
||||
}
|
||||
|
||||
function handleReset() {
|
||||
resetFilters()
|
||||
void load()
|
||||
}
|
||||
|
||||
async function load() {
|
||||
if (!appId.value) {
|
||||
rows.value = []
|
||||
total.value = 0
|
||||
return
|
||||
}
|
||||
loading.value = true
|
||||
try {
|
||||
const params: any = {
|
||||
appId: appId.value,
|
||||
instanceId: searchForm.instanceId || undefined,
|
||||
instanceStatus: searchForm.instanceStatus || undefined,
|
||||
applyTimeFrom: applyTimeRange.value?.[0],
|
||||
applyTimeTo: applyTimeRange.value?.[1],
|
||||
finishTimeFrom: finishTimeRange.value?.[0],
|
||||
finishTimeTo: finishTimeRange.value?.[1],
|
||||
page: page.value,
|
||||
pageSize: pageSize.value
|
||||
}
|
||||
if (canViewAll.value && searchForm.initiatorName) {
|
||||
params.initiatorName = searchForm.initiatorName
|
||||
}
|
||||
const data = await fetchOaInstanceHistory(params)
|
||||
rows.value = data?.list || []
|
||||
total.value = Number(data?.total || 0)
|
||||
} catch {
|
||||
rows.value = []
|
||||
total.value = 0
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
function openDetail(row: any) {
|
||||
const id = row?.id
|
||||
if (!id) return
|
||||
router.push({ path: `/system-manage/oa-approval/instances/${id}` })
|
||||
}
|
||||
|
||||
async function printRow(row: any) {
|
||||
const id = String(row?.id || '').trim()
|
||||
if (!id || printingId.value) return
|
||||
printingId.value = id
|
||||
let detail: any
|
||||
try {
|
||||
detail = await fetchOaInstanceDetail(id)
|
||||
} catch {
|
||||
printingId.value = ''
|
||||
ElMessage.error('加载审批单失败')
|
||||
return
|
||||
}
|
||||
try {
|
||||
await exportOaApprovalPdf(detail, { printerName: currentPrinterName() })
|
||||
ElMessage.success('PDF 已下载')
|
||||
} catch {
|
||||
ElMessage.error('导出 PDF 失败')
|
||||
} finally {
|
||||
printingId.value = ''
|
||||
}
|
||||
}
|
||||
|
||||
function bootstrapFromRoute() {
|
||||
if (!isActiveHistoryInstance()) return
|
||||
const qName = String(route.query.appName || '').trim()
|
||||
if (qName) boundAppName.value = qName
|
||||
resetFilters()
|
||||
syncWorktabTitle()
|
||||
void load()
|
||||
}
|
||||
|
||||
watch(
|
||||
() => [route.name, route.params.appId, route.query.appId, route.query.appName] as const,
|
||||
() => {
|
||||
if (!isActiveHistoryInstance()) return
|
||||
bootstrapFromRoute()
|
||||
}
|
||||
)
|
||||
|
||||
onMounted(bootstrapFromRoute)
|
||||
onActivated(() => {
|
||||
if (!isActiveHistoryInstance()) return
|
||||
const qName = String(route.query.appName || '').trim()
|
||||
if (qName) boundAppName.value = qName
|
||||
syncWorktabTitle()
|
||||
void load()
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.hist-attach {
|
||||
display: inline-flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 8px;
|
||||
justify-content: center;
|
||||
max-width: 100%;
|
||||
padding: 2px 0;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.hist-attach__card {
|
||||
width: 88px;
|
||||
overflow: hidden;
|
||||
background: #fff;
|
||||
border: 1px solid #e2e8f0;
|
||||
border-radius: 8px;
|
||||
transition:
|
||||
border-color 0.15s ease,
|
||||
box-shadow 0.15s ease,
|
||||
transform 0.15s ease;
|
||||
|
||||
&:hover {
|
||||
border-color: #10b981;
|
||||
box-shadow: 0 4px 12px rgb(16 185 129 / 14%);
|
||||
transform: translateY(-1px);
|
||||
|
||||
.hist-attach__hint {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.hist-attach__preview {
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
height: 64px;
|
||||
overflow: hidden;
|
||||
background: linear-gradient(180deg, #f8fafc 0%, #f1f5f9 100%);
|
||||
}
|
||||
|
||||
.hist-attach__img {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 64px;
|
||||
cursor: zoom-in;
|
||||
|
||||
:deep(.el-image__inner) {
|
||||
width: 100%;
|
||||
height: 64px;
|
||||
object-fit: cover;
|
||||
}
|
||||
}
|
||||
|
||||
.hist-attach__fallback,
|
||||
.hist-attach__doc {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
height: 64px;
|
||||
padding: 0;
|
||||
color: #64748b;
|
||||
cursor: pointer;
|
||||
background: transparent;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.hist-attach__doc-icon {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
color: #0284c7;
|
||||
background: #e0f2fe;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.hist-attach__ext {
|
||||
font-size: 10px;
|
||||
font-weight: 600;
|
||||
line-height: 1;
|
||||
color: #475569;
|
||||
letter-spacing: 0.02em;
|
||||
}
|
||||
|
||||
.hist-attach__hint {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: #fff;
|
||||
pointer-events: none;
|
||||
background: rgb(15 23 42 / 38%);
|
||||
opacity: 0;
|
||||
transition: opacity 0.15s ease;
|
||||
}
|
||||
|
||||
.hist-attach__footer {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
align-items: center;
|
||||
min-width: 0;
|
||||
padding: 5px 6px;
|
||||
background: #fff;
|
||||
border-top: 1px solid #f1f5f9;
|
||||
}
|
||||
|
||||
.hist-attach__name {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
overflow: hidden;
|
||||
font-size: 11px;
|
||||
line-height: 1.3;
|
||||
color: #334155;
|
||||
text-align: left;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.hist-attach__dl {
|
||||
display: inline-flex;
|
||||
flex-shrink: 0;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
padding: 0;
|
||||
color: #64748b;
|
||||
cursor: pointer;
|
||||
background: #f1f5f9;
|
||||
border: none;
|
||||
border-radius: 5px;
|
||||
transition:
|
||||
background 0.15s ease,
|
||||
color 0.15s ease;
|
||||
|
||||
&:hover {
|
||||
color: #fff;
|
||||
background: #10b981;
|
||||
}
|
||||
}
|
||||
|
||||
.hist-attach.is-multi {
|
||||
gap: 6px;
|
||||
|
||||
.hist-attach__card {
|
||||
width: 72px;
|
||||
border-radius: 7px;
|
||||
}
|
||||
|
||||
.hist-attach__preview,
|
||||
.hist-attach__img,
|
||||
.hist-attach__fallback,
|
||||
.hist-attach__doc {
|
||||
height: 52px;
|
||||
}
|
||||
|
||||
.hist-attach__img :deep(.el-image__inner) {
|
||||
height: 52px;
|
||||
}
|
||||
|
||||
.hist-attach__footer {
|
||||
padding: 4px 5px;
|
||||
}
|
||||
|
||||
.hist-attach__name {
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
.hist-attach__dl {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -93,33 +93,32 @@
|
||||
@saved="onDialogSaved"
|
||||
@submitted="onDialogSubmitted"
|
||||
/>
|
||||
<OaAppHistoryDialog ref="historyDialogRef" />
|
||||
</section>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { computed, onMounted, ref } from 'vue'
|
||||
import { computed, onActivated, onMounted, ref } from 'vue'
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
import { Clock, Promotion, Search } from '@element-plus/icons-vue'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { fetchOaGroupList, fetchOaTemplates } from '@/api/oaApproval'
|
||||
import OaAppIcon from '@/components/oa-approval/OaAppIcon.vue'
|
||||
import OaAppHistoryDialog from '@/components/oa-approval/OaAppHistoryDialog.vue'
|
||||
import OaStartFormDialog from '@/components/oa-approval/OaStartFormDialog.vue'
|
||||
import { useWorktabStore } from '@/store/modules/worktab'
|
||||
import { refreshOaMenuBadges } from '@/utils/oa-menu-badge'
|
||||
|
||||
defineOptions({ name: 'OaApprovalStart' })
|
||||
|
||||
const router = useRouter()
|
||||
const route = useRoute()
|
||||
const worktabStore = useWorktabStore()
|
||||
const loading = ref(false)
|
||||
const templates = ref<any[]>([])
|
||||
const groupOptions = ref<Array<{ id: string; groupName: string }>>([])
|
||||
const searchKeyword = ref('')
|
||||
const activeGroupId = ref('')
|
||||
const startDialogRef = ref<InstanceType<typeof OaStartFormDialog> | null>(null)
|
||||
const historyDialogRef = ref<InstanceType<typeof OaAppHistoryDialog> | null>(null)
|
||||
|
||||
const displayGroups = computed(() => {
|
||||
const kw = (searchKeyword.value || '').trim().toLowerCase()
|
||||
@@ -168,7 +167,14 @@
|
||||
}
|
||||
|
||||
function openHistory(row: any) {
|
||||
historyDialogRef.value?.open({ id: row.id, appName: row.appName })
|
||||
const id = String(row?.id || '').trim()
|
||||
if (!id) return
|
||||
router.push({
|
||||
path: `/system-manage/oa-approval/history/${encodeURIComponent(id)}`,
|
||||
query: {
|
||||
appName: String(row?.appName || '').trim()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function onDialogSaved() {
|
||||
@@ -182,7 +188,16 @@
|
||||
}
|
||||
}
|
||||
|
||||
function restoreStartTabTitle() {
|
||||
worktabStore.resetTabTitle('/system-manage/oa-approval/start')
|
||||
}
|
||||
|
||||
onActivated(() => {
|
||||
restoreStartTabTitle()
|
||||
})
|
||||
|
||||
onMounted(async () => {
|
||||
restoreStartTabTitle()
|
||||
loading.value = true
|
||||
try {
|
||||
const [tpl, groupsRes] = await Promise.all([fetchOaTemplates(), fetchOaGroupList()])
|
||||
|
||||
@@ -2456,16 +2456,98 @@
|
||||
}
|
||||
}
|
||||
|
||||
function buildBatchStockOutPrefillFromSelection(): {
|
||||
lines: BatchStockOutLine[]
|
||||
options: ProductionMaterialBatchOption[]
|
||||
skippedZero: number
|
||||
} {
|
||||
const sel = selectedRows.value || []
|
||||
const lines: BatchStockOutLine[] = []
|
||||
const options: ProductionMaterialBatchOption[] = []
|
||||
const seen = new Set<string>()
|
||||
let skippedZero = 0
|
||||
for (const row of sel) {
|
||||
const rem = Number(row.remainingQty) || 0
|
||||
if (rem <= 0) {
|
||||
skippedZero += 1
|
||||
continue
|
||||
}
|
||||
const batchId = row.batchId || row.id
|
||||
if (!batchId || seen.has(batchId)) continue
|
||||
seen.add(batchId)
|
||||
const unit = (row.unit || '').trim()
|
||||
const mfr = (row.manufacturer || '').trim()
|
||||
const cat = (row.catalogNo || '').trim()
|
||||
lines.push({
|
||||
batchId,
|
||||
stockInNo: row.stockInNo || '',
|
||||
materialName: row.materialName || '',
|
||||
batchNo: row.batchNo || '',
|
||||
remainingQty: rem,
|
||||
qty: Math.min(1, rem),
|
||||
usageUnit: unit,
|
||||
remark: ''
|
||||
})
|
||||
options.push({
|
||||
id: batchId,
|
||||
batchId,
|
||||
stockInNo: row.stockInNo || '',
|
||||
stockInDate: row.stockInDate,
|
||||
expireDate: row.expireDate,
|
||||
productionDate: row.productionDate,
|
||||
materialId: row.materialId,
|
||||
materialCode: row.materialCode || '',
|
||||
materialName: row.materialName || '',
|
||||
materialType: row.materialType || '',
|
||||
specModel: row.specModel || '',
|
||||
unit,
|
||||
batchNo: row.batchNo || '',
|
||||
catalogNo: row.catalogNo || '',
|
||||
manufacturer: row.manufacturer || '',
|
||||
storageLocation: row.storageLocation,
|
||||
unitPrice: row.unitPrice,
|
||||
amount: row.amount,
|
||||
remainingQty: rem,
|
||||
label: `${row.stockInNo || ''} / ${row.materialName || ''} / 厂家:${mfr || '—'} / 批号:${
|
||||
row.batchNo || '—'
|
||||
} / 货号:${cat || '—'} / 剩:${rem}${unit}`
|
||||
})
|
||||
if (unit) ensureUnitOption(unit)
|
||||
}
|
||||
return { lines, options, skippedZero }
|
||||
}
|
||||
|
||||
function mergeBatchOptions(extra: ProductionMaterialBatchOption[]) {
|
||||
if (!extra.length) return
|
||||
const ids = new Set(batchOptions.value.map((o) => o.id))
|
||||
const missing = extra.filter((o) => o.id && !ids.has(o.id))
|
||||
if (missing.length) {
|
||||
batchOptions.value = [...missing, ...batchOptions.value]
|
||||
}
|
||||
}
|
||||
|
||||
function handleBatchStockOut() {
|
||||
batchStockOutLines.value = [newBatchStockOutLine()]
|
||||
const { lines, options, skippedZero } = buildBatchStockOutPrefillFromSelection()
|
||||
const selectedCount = (selectedRows.value || []).length
|
||||
if (selectedCount > 0 && lines.length === 0) {
|
||||
ElMessage.warning('所选物料剩余数量均为 0,无法出库,请手动选择有库存的批次')
|
||||
} else if (skippedZero > 0) {
|
||||
ElMessage.warning(`已跳过 ${skippedZero} 项剩余数量为 0 的物料`)
|
||||
}
|
||||
batchStockOutLines.value = lines.length ? lines : [newBatchStockOutLine()]
|
||||
batchOptions.value = options
|
||||
batchStockOutForm.stockOutTime = formatNowDatetime()
|
||||
batchStockOutForm.receiver = ''
|
||||
batchStockOutForm.purpose = ''
|
||||
batchStockOutForm.remark = ''
|
||||
batchStockOutVisible.value = true
|
||||
void searchReceiverUsers('')
|
||||
void searchBatchOptions('')
|
||||
void searchUnitOptions('')
|
||||
void searchBatchOptions('').then(() => mergeBatchOptions(options))
|
||||
void searchUnitOptions('').then(() => {
|
||||
for (const line of batchStockOutLines.value) {
|
||||
if (line.usageUnit) ensureUnitOption(line.usageUnit)
|
||||
}
|
||||
})
|
||||
batchStockOutFormRef.value?.clearValidate?.()
|
||||
}
|
||||
|
||||
|
||||
@@ -2434,16 +2434,95 @@
|
||||
}
|
||||
}
|
||||
|
||||
function buildBatchStockOutPrefillFromSelection(): {
|
||||
lines: BatchStockOutLine[]
|
||||
options: QcMaterialBatchOption[]
|
||||
skippedZero: number
|
||||
} {
|
||||
const sel = selectedRows.value || []
|
||||
const lines: BatchStockOutLine[] = []
|
||||
const options: QcMaterialBatchOption[] = []
|
||||
const seen = new Set<string>()
|
||||
let skippedZero = 0
|
||||
for (const row of sel) {
|
||||
const rem = Number(row.remainingQty) || 0
|
||||
if (rem <= 0) {
|
||||
skippedZero += 1
|
||||
continue
|
||||
}
|
||||
const batchId = row.batchId || row.id
|
||||
if (!batchId || seen.has(batchId)) continue
|
||||
seen.add(batchId)
|
||||
const unit = (row.unit || '').trim()
|
||||
const mfr = (row.manufacturer || '').trim()
|
||||
const cat = (row.catalogNo || '').trim()
|
||||
lines.push({
|
||||
batchId,
|
||||
stockInNo: row.stockInNo || '',
|
||||
materialName: row.materialName || '',
|
||||
batchNo: row.batchNo || '',
|
||||
remainingQty: rem,
|
||||
qty: Math.min(1, rem),
|
||||
usageUnit: unit,
|
||||
remark: ''
|
||||
})
|
||||
options.push({
|
||||
id: batchId,
|
||||
batchId,
|
||||
stockInNo: row.stockInNo || '',
|
||||
stockInDate: row.stockInDate,
|
||||
expireDate: row.expireDate,
|
||||
materialId: row.materialId,
|
||||
materialCode: row.materialCode || '',
|
||||
materialName: row.materialName || '',
|
||||
specModel: row.specModel || '',
|
||||
unit,
|
||||
batchNo: row.batchNo || '',
|
||||
catalogNo: row.catalogNo || '',
|
||||
manufacturer: row.manufacturer || '',
|
||||
unitPrice: row.unitPrice,
|
||||
amount: row.amount,
|
||||
remainingQty: rem,
|
||||
label: `${row.stockInNo || ''} / ${row.materialName || ''} / 厂家:${mfr || '—'} / 批号:${
|
||||
row.batchNo || '—'
|
||||
} / 货号:${cat || '—'} / 剩:${rem}${unit}`
|
||||
})
|
||||
if (unit) ensureUnitOption(unit)
|
||||
}
|
||||
return { lines, options, skippedZero }
|
||||
}
|
||||
|
||||
function mergeBatchOptions(extra: QcMaterialBatchOption[]) {
|
||||
if (!extra.length) return
|
||||
const ids = new Set(batchOptions.value.map((o) => o.id))
|
||||
const missing = extra.filter((o) => o.id && !ids.has(o.id))
|
||||
if (missing.length) {
|
||||
batchOptions.value = [...missing, ...batchOptions.value]
|
||||
}
|
||||
}
|
||||
|
||||
function handleBatchStockOut() {
|
||||
batchStockOutLines.value = [newBatchStockOutLine()]
|
||||
const { lines, options, skippedZero } = buildBatchStockOutPrefillFromSelection()
|
||||
const selectedCount = (selectedRows.value || []).length
|
||||
if (selectedCount > 0 && lines.length === 0) {
|
||||
ElMessage.warning('所选物料剩余数量均为 0,无法出库,请手动选择有库存的批次')
|
||||
} else if (skippedZero > 0) {
|
||||
ElMessage.warning(`已跳过 ${skippedZero} 项剩余数量为 0 的物料`)
|
||||
}
|
||||
batchStockOutLines.value = lines.length ? lines : [newBatchStockOutLine()]
|
||||
batchOptions.value = options
|
||||
batchStockOutForm.stockOutTime = formatNowDatetime()
|
||||
batchStockOutForm.receiver = ''
|
||||
batchStockOutForm.purpose = ''
|
||||
batchStockOutForm.remark = ''
|
||||
batchStockOutVisible.value = true
|
||||
void searchReceiverUsers('')
|
||||
void searchBatchOptions('')
|
||||
void searchUnitOptions('')
|
||||
void searchBatchOptions('').then(() => mergeBatchOptions(options))
|
||||
void searchUnitOptions('').then(() => {
|
||||
for (const line of batchStockOutLines.value) {
|
||||
if (line.usageUnit) ensureUnitOption(line.usageUnit)
|
||||
}
|
||||
})
|
||||
batchStockOutFormRef.value?.clearValidate?.()
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user