diff --git a/api/insurance/ppt/routes.py b/api/insurance/ppt/routes.py index 1fa03f6..782bdbc 100644 --- a/api/insurance/ppt/routes.py +++ b/api/insurance/ppt/routes.py @@ -450,6 +450,61 @@ def validate_extraction(session_id): }) +# ─── 更新提取数据 ───────────────────────────────────────── + +@ppt_bp.route("/session//extractions", methods=["PUT"]) +@jwt_required +def update_extractions(session_id): + """保存用户修改后的提取数据。""" + user_id = str(getattr(request, "user_id", "guest")) + session = _get_session(session_id, user_id) + if not session: + return error(ErrorCode.NOT_FOUND, "会话不存在") + + data = request.get_json(silent=True) or {} + extractions = data.get("extractions") + if not isinstance(extractions, list): + return error(ErrorCode.PARAM_ERROR, "extractions 必须是数组") + + # 合并更新:只更新 data 字段,保留 pdfPath/status 等元信息 + existing = json.loads(session.extractions_json) if session.extractions_json else [] + existing_map = {e["pdfName"]: e for e in existing} + + for ext in extractions: + pdf_name = ext.get("pdfName") + if not pdf_name or pdf_name not in existing_map: + continue + # 更新数据字段 + if "data" in ext: + existing_map[pdf_name]["data"] = ext["data"] + if "productName" in ext: + existing_map[pdf_name]["productName"] = ext["productName"] + if "planType" in ext: + existing_map[pdf_name]["planType"] = ext["planType"] + # 重新计算行数 + d = existing_map[pdf_name].get("data") + if d: + rows = d.get("benefit_illustration") or d.get("benefitRows") or [] + existing_map[pdf_name]["yearCount"] = len(rows) + + updated = list(existing_map.values()) + session.extractions_json = json.dumps(updated, ensure_ascii=False) + session.status = "parsed" # 回到 parsed 状态,需要重新生成 + _save_session(session) + + return success({ + "sessionId": session_id, + "status": "updated", + "extractions": [{ + "pdfName": e["pdfName"], + "planType": e["planType"], + "status": e["status"], + "productName": e["productName"], + "yearCount": e["yearCount"], + } for e in updated], + }) + + # ─── 公司知识库匹配 ─────────────────────────────────────── @ppt_bp.route("/company-kb/match", methods=["POST"]) diff --git a/frontend/src/pages/PptPage.vue b/frontend/src/pages/PptPage.vue index 35b907f..49d2d2b 100644 --- a/frontend/src/pages/PptPage.vue +++ b/frontend/src/pages/PptPage.vue @@ -4,6 +4,7 @@ + @@ -20,16 +21,22 @@ @parsed="onParsed" @back="currentStep = 0" /> - - + @@ -40,6 +47,7 @@ import { ref } from 'vue' import PptUpload from './components/ppt/PptUpload.vue' import PptParsing from './components/ppt/PptParsing.vue' +import PptDataReview from './components/ppt/PptDataReview.vue' import PptGenerate from './components/ppt/PptGenerate.vue' import PptResult from './components/ppt/PptResult.vue' @@ -55,10 +63,14 @@ function onParsed() { currentStep.value = 2 } -function onGenerated() { +function onDataConfirmed() { currentStep.value = 3 } +function onGenerated() { + currentStep.value = 4 +} + function resetAll() { currentStep.value = 0 sessionId.value = '' diff --git a/frontend/src/pages/components/ppt/PptDataReview.vue b/frontend/src/pages/components/ppt/PptDataReview.vue new file mode 100644 index 0000000..6bcebcd --- /dev/null +++ b/frontend/src/pages/components/ppt/PptDataReview.vue @@ -0,0 +1,497 @@ + + + + + diff --git a/frontend/src/pages/components/ppt/PptParsing.vue b/frontend/src/pages/components/ppt/PptParsing.vue index 01b3bc3..eb1a5f8 100644 --- a/frontend/src/pages/components/ppt/PptParsing.vue +++ b/frontend/src/pages/components/ppt/PptParsing.vue @@ -35,7 +35,7 @@ > diff --git a/frontend/src/utils/ppt-api.ts b/frontend/src/utils/ppt-api.ts index f702c73..9a9d4c1 100644 --- a/frontend/src/utils/ppt-api.ts +++ b/frontend/src/utils/ppt-api.ts @@ -81,6 +81,11 @@ export const pptApi = { return api.get(`/ppt/validate/${sessionId}`) }, + /** 保存用户修改后的提取数据 */ + updateExtractions(sessionId: string, extractions: any[]) { + return api.put(`/ppt/session/${sessionId}/extractions`, { extractions }) + }, + /** 获取渲染选项 */ getRenderOptions() { return api.get('/ppt/render-options')