Преглед изворни кода

feat(mode_workflow示例): 为/all_process接口添加精简模式以加快首屏加载

新增lite查询参数,传入1/true/yes即可启用精简模式。精简模式下仅保留平铺展示所需字段,丢弃大字段并截断输入输出值,减少返回数据体积以提升首屏加载速度。完整工序数据可由前端通过单独接口懒加载,同时更新了数据库查询相关函数以支持该参数。
刘文武 пре 1 дан
родитељ
комит
531dda7f28
2 измењених фајлова са 47 додато и 5 уклоњено
  1. 44 4
      examples/mode_workflow/db.py
  2. 3 1
      examples/mode_workflow/server.py

+ 44 - 4
examples/mode_workflow/db.py

@@ -794,9 +794,10 @@ def fetch_process(case_id, version=None):
     return _proc_payload(case_id, version, rows)
 
 
-def fetch_all_process(case_ids=None):
+def fetch_all_process(case_ids=None, lite=False):
     """批量取多帖工序解构(每帖取最新真实版,link_ 排后),一次查询拍平。
       - case_ids:选填 case_id 列表;None=全表所有有解构的帖,[]=空(直接返回空)。
+      - lite:True 走精简投影(丢大字段 + 截断 value),供工序库平铺表快速首屏。
     返回 {case_id: _proc_payload(...)};无解构记录的 case_id 不出现在结果里。"""
     if case_ids is not None and not case_ids:
         return {}
@@ -821,7 +822,7 @@ def fetch_all_process(case_ids=None):
         ver = best["version"]
         vrows = sorted((r for r in crows if r["version"] == ver),
                        key=lambda r: (r["seq"] if r["seq"] is not None else 0, r["id"]))
-        out[cid] = _proc_payload(cid, ver, vrows)
+        out[cid] = _proc_payload(cid, ver, vrows, lite=lite)
     return out
 
 
@@ -941,10 +942,49 @@ def fetch_categorized_cases(case_ids, mode="process"):
     return _categorized_from_rows(rows)
 
 
-def _proc_payload(case_id, version, rows):
-    """mode_process 行集 → {case_id, version, …, procedures:[...]}。无行返回 None。"""
+_LITE_VALUE_LIMIT = 300  # lite 模式 输入/输出 value 截断字节上限
+
+
+def _trunc(s, limit=_LITE_VALUE_LIMIT):
+    """按 UTF-8 字节截断长文本(不切坏多字节字符),超限追加省略号。非字符串原样返回。"""
+    if not isinstance(s, str):
+        return s
+    b = s.encode("utf-8")
+    if len(b) <= limit:
+        return s
+    return b[:limit].decode("utf-8", "ignore") + "…"
+
+
+def _lite_steps(steps):
+    """lite 模式:仅截断每步 inputs/outputs 的 value(其余字段供平铺表/分组用,保留)。"""
+    if not isinstance(steps, list):
+        return steps
+    for st in steps:
+        if not isinstance(st, dict):
+            continue
+        for io_key in ("inputs", "outputs"):
+            ios = st.get(io_key)
+            if isinstance(ios, list):
+                for io in ios:
+                    if isinstance(io, dict) and "value" in io:
+                        io["value"] = _trunc(io.get("value"))
+    return steps
+
+
+def _proc_payload(case_id, version, rows, lite=False):
+    """mode_process 行集 → {case_id, version, …, procedures:[...]}。无行返回 None。
+    lite=True:工序库平铺表只需 procedures[].{id,name,steps},丢弃大字段
+    (source/declarations/type_registry/tools_used)并截断输入/输出 value;
+    完整值由前端展开时按 case 调 /api/process 懒加载。"""
     if not rows:
         return None
+    if lite:
+        procedures = [{
+            "id": r["procedure_id"], "name": r["name"],
+            "steps": _lite_steps(_loads(r["steps"], [])),
+        } for r in rows]
+        return {"case_id": case_id, "version": version,
+                "title": rows[0]["post_title"], "procedures": procedures}
     procedures = [{
         "id": r["procedure_id"], "name": r["name"], "purpose": r["purpose"],
         "category": r["category"], "declarations": _loads(r["declarations"]),

+ 3 - 1
examples/mode_workflow/server.py

@@ -699,7 +699,9 @@ class Handler(BaseHTTPRequestHandler):
             elif u.path == "/api/all_process":
                 # 批量解构:一次取多帖(或全表)的最新版工序+steps,供工序库平铺表一次加载。
                 # case_ids 选填(逗号/重复/JSON 三种写法,同 query_list),不传=全表。
-                m = db.fetch_all_process(_parse_list_param(u.query, "case_ids"))
+                # lite=1:精简投影(丢大字段 + 截断 value),首屏更快;完整值前端按 case 懒加载。
+                _lite = qs.get("lite") in ("1", "true", "yes")
+                m = db.fetch_all_process(_parse_list_param(u.query, "case_ids"), lite=_lite)
                 self._json({"count": len(m), "procedures_by_case": m})
             elif u.path == "/api/tools_versions":
                 self._json(db.fetch_tools_versions(qs.get("case_id", "")))