PageSourceSearch

https://www.innoinsight.cn/assets/QuantSurveyLab-BUceraaD.js

js innoinsight.cn collected 2026-10-09 17:43:06 UTC 36,824 bytes, 4 lines download raw bytes

1import{r as V,z as vt,l as x,d as z,w as it,a as s,s as e,F as w,a1 as E,b as t,a6 as X,i as l,x as m,n as R,k as T,m as Tt,S as H,g as J,bb as st,am as ot,A as o,c as F,bE as At,ad as St,ae as Et,v as pt,e as ht}from"./index-B6Ol4me1.js";const yt=[{label:"样例画像A(28岁互联网PM)",text:"28岁女性,居住在上海,互联网公司产品经理,月收入2.5万。每天通勤1小时,重度咖啡依赖(每天至少2杯),注重身材管理,偏好低糖;愿意为品质和包装颜值付溢价,常在便利店和盒马购物,喜欢尝试新品牌。"},{label:"样例画像B(54岁县城教师)",text:"54岁男性,县城中学教师,月收入7千。平时喝茶,不常喝咖啡,只在儿女来访时偶尔跟着喝一杯;消费节俭,对价格敏感,咖啡品牌只认得雀巢;网购不熟练,主要在本地超市购物。"}];function Dt(n,i){return V.post("/open/quant-demo/browser-answer",{surveyUrl:n,personaText:i})}function Ct(n){return V.get(`/open/quant-demo/browser-answer/${n}`)}function _t(n,i=!1){return V.post("/open/quant-demo/scan",{surveyUrl:n,force:i})}function kt(n){return V.get(`/open/quant-demo/scan/${n}`)}function Rt(n,i){const b=new FormData;return b.append("file",n),b.append("surveyUrl",i),V.post("/open/quant-demo/survey-doc",b)}function Lt(n){return V.get(`/open/quant-demo/survey-doc/${n}`)}function Ot(n){const i=new FormData;return i.append("file",n),V.post("/open/quant-demo/parse-quota",i)}function Ut(n,i){return V.post("/open/quant-demo/alignment",{surveyUrl:n,quota:i})}function Pt(n,i=""){return V.post("/open/quant-demo/generate-personas",{quota:n,surveyUrl:i})}function Bt(n){return V.post("/open/quant-demo/batch",n)}function Mt(n){return V.get(`/open/quant-demo/batch/${n}`)}function Gt(n){return V.post(`/open/quant-demo/batch/${n}/advance`)}const Vt=1500;function Ft(){const n=x(""),i=x(""),b=x(null),_=x(!1),r=x(null);let d=null;const p=()=>{d&&(clearInterval(d),d=null),_.value=!1},f=async c=>{try{b.value=await Ct(c),b.value.status!=="RUNNING"&&p()}catch(h){r.value=h instanceof Error?h.message:"查询任务进度失败",p()}},a=async()=>{if(!_.value){_.value=!0,r.value=null,b.value=null;try{const{taskId:c}=await Dt(n.value.trim(),i.value.trim());d=setInterval(()=>f(c),Vt)}catch(c){r.value=c instanceof Error?c.message:"启动答题任务失败",_.value=!1}}};return vt(p),{surveyUrl:n,personaText:i,task:b,isRunning:_,errorMessage:r,start:a}}const Qt=2e3;function jt(n){const i=x(null),b=x(!1),_=x(null);let r=null;const d=()=>{r&&(clearInterval(r),r=null),b.value=!1},p=async a=>{try{i.value=await kt(a),i.value.status!=="RUNNING"&&d()}catch(c){_.value=c instanceof Error?c.message:"查询拆解进度失败",d()}},f=async(a=!1)=>{if(!(!n.value.trim()||b.value)){b.value=!0,_.value=null,i.value=null;try{const{taskId:c}=await _t(n.value.trim(),a);await p(c),i.value&&i.value.status==="RUNNING"&&(r=setInterval(()=>p(c),Qt))}catch(c){_.value=c instanceof Error?c.message:"启动问卷拆解失败",b.value=!1}}};return vt(d),{scanTask:i,isScanning:b,errorMessage:_,startScan:f}}const Wt=/^第 (\d+) [轮页]/,$t=["模型判断","模型判定","本页题目"],zt=n=>n.startsWith("点击")?"click":n.startsWith("填写")?"fill":n.startsWith("操作失败")||n.startsWith("任务失败")||n.startsWith("拆解失败")?"error":"system",Ht=n=>$t.some(i=>n.startsWith(i)),Kt=n=>{const i=$t.find(b=>n.startsWith(b));return i?n.slice(i.length).replace(/^[::]\s*/,""):n};function Xt(n){const i=[];let b=0,_=null;const r=()=>{const d={id:i.length,round:b,thought:null,tools:[]};return i.push(d),d};for(const d of n){const p=d.description.match(Wt);if(p){b=Number(p[1]),_=r();continue}if(_||(_=r()),Ht(d.description)){(_.thought!==null||_.tools.length>0)&&(_=r()),_.thought=Kt(d.description);continue}_.tools.push({seq:d.seq,time:d.time,kind:zt(d.description),text:d.description})}return i.filter(d=>d.thought!==null||d.tools.length>0)}const Yt={key:0,class:"agent-thought"},Zt={key:1,class:"tool-group"},Jt={class:"tool-icon"},ts={class:"tool-text"},ss={class:"tool-time"},es={key:0,class:"agent-typing"},ns=z({__name:"AgentStreamView",props:{steps:{},isRunning:{type:Boolean}},setup(n){const i=n,b=T(()=>Xt(i.steps)),_={click:"⊙",fill:"✎",error:"⚠",system:"⋯"},r=x(null);return it(()=>i.steps.length,async()=>{await Tt(),r.value&&(r.value.scrollTop=r.value.scrollHeight)}),(d,p)=>(s(),e("div",{ref_key:"scrollEl",ref:r,class:"agent-stream"},[(s(!0),e(w,null,E(b.value,f=>(s(),e("article",{key:f.id,class:"agent-block"},[f.thought?(s(),e("p",Yt,[p[0]||(p[0]=t("span",{class:"thought-badge"},"AI",-1)),X(l(f.thought),1)])):m("",!0),f.tools.length>0?(s(),e("div",Zt,[(s(!0),e(w,null,E(f.tools,a=>(s(),e("div",{key:a.seq,class:R(["tool-call",`is-${a.kind}`])},[t("span",Jt,l(_[a.kind]),1),t("span",ts,l(a.text),1),t("span",ss,l(a.time),1)],2))),128))])):m("",!0)]))),128)),n.isRunning?(s(),e("div",es,[...p[1]||(p[1]=[t("span",{class:"dot"},null,-1),t("span",{class:"dot"},null,-1),t("span",{class:"dot"},null,-1)])])):m("",!0)],512))}}),et=H(ns,[["__scopeId","data-v-cfe9ae1e"]]),as={class:"lab-pane-body"},ls={key:0,class:"lab-alert"},os={key:1,class:"scan-empty"},is={key:2,class:"list-toolbar"},us={class:"toolbar-count"},rs={key:0,class:"group-head"},cs={class:"group-title"},ds={key:0,class:"option-chips"},vs={class:"row-seq"},ps={class:"row-body"},hs={class:"row-title-line"},ys={class:"row-title"},fs=["title"],bs={class:"meta-tag"},_s={key:0,class:"meta-tag"},ks={key:0,class:"row-condition"},$s={key:1,class:"option-chips"},ft=" - ",ms=z({__name:"ParsedQuestionList",props:{task:{}},setup(n){const i=n,b=T(()=>{const h=[];for(const u of i.task.questions){const v=u.title.indexOf(ft),$=v>0?u.title.slice(0,v):"",N=$?u.title.slice(v+ft.length):u.title,D=h[h.length-1];$&&D&&D.main===$?D.items.push({sub:N,question:u}
1):h.push({main:$,sharedOptions:null,items:[{sub:N,question:u}]})}for(const u of h){const v=u.items[0];if(!v||u.items.length<2)continue;const $=v.question.options.join("");u.items.every(D=>D.question.options.join("")===$)&&(u.sharedOptions=v.question.options)}return h}),_={single:"单选",multi:"多选",matrix:"矩阵",scale:"打分",text:"填空"},r={甄别题:"is-screen",人设题:"is-persona",认知题:"is-aware",评价题:"is-rate",问答题:"is-open",其他题:"is-other"},d=()=>{const h=[];for(const u of i.task.questions){const v=_[u.control]??u.control,$=u.required?"必答":"选答";h.push(`${u.seq}. ${u.title} [${v}·${$}·${u.category||"未分类"}]`),u.displayCondition&&h.push(`   条件: ${u.displayCondition}`),u.options.length>0&&h.push(`   选项: ${u.options.join(" / ")}`),u.terminateOptions.length>0&&h.push(`   ⚠ 终止选项: ${u.terminateOptions.join(" / ")}`)}return h.join(`
2`)},p=x(!1),f=async()=>{try{await navigator.clipboard.writeText(d()),p.value=!0,window.setTimeout(()=>p.value=!1,2e3)}catch{p.value=!1}},a=(h,u)=>h.terminateOptions.includes(u),c=(h,u)=>{const v=h.items[0];return v?a(v.question,u):!1};return(h,u)=>(s(),e("div",as,[n.task.status==="FAILED"?(s(),e("div",ls," 解析未完整:"+l(n.task.error||"未知错误")+"(以下为已收集到的题目) ",1)):m("",!0),n.task.questions.length===0?(s(),e("div",os," 未解析出题目"+l(n.task.error?`:${n.task.error}`:""),1)):(s(),e("div",is,[t("span",us,"共 "+l(n.task.questions.length)+" 项作答单元",1),t("button",{class:"lab-chip",onClick:f},l(p.value?"✓ 已复制":"复制为文本"),1)])),(s(!0),e(w,null,E(b.value,(v,$)=>(s(),e("div",{key:$,class:"question-group"},[v.main?(s(),e("div",rs,[t("p",cs,l(v.main),1),v.sharedOptions?.length?(s(),e("div",ds,[(s(!0),e(w,null,E(v.sharedOptions,N=>(s(),e("span",{key:N,class:R(["option-chip",{"is-terminate":c(v,N)}])},l(N),3))),128))])):m("",!0)])):m("",!0),(s(!0),e(w,null,E(v.items,N=>(s(),e("div",{key:N.question.seq,class:R(["question-row",{"is-sub":v.main!==""}])},[t("span",vs,l(N.question.seq),1),t("div",ps,[t("div",hs,[t("p",ys,l(N.sub),1),t("span",{class:R(["category-badge",r[N.question.category]??"is-other"]),title:N.question.reason},l(N.question.category||"未分类"),11,fs),t("span",bs,l(_[N.question.control]??N.question.control),1),N.question.required?m("",!0):(s(),e("span",_s,"选答"))]),N.question.displayCondition?(s(),e("p",ks," ⤷ "+l(N.question.displayCondition),1)):m("",!0),!v.sharedOptions&&N.question.options.length>0?(s(),e("div",$s,[(s(!0),e(w,null,E(N.question.options,D=>(s(),e("span",{key:D,class:R(["option-chip",{"is-terminate":a(N.question,D)}])},l(D),3))),128))])):m("",!0)])],2))),128))]))),128))]))}}),mt=H(ms,[["__scopeId","data-v-35358cb0"]]),gs={class:"browser-panel"},xs={class:"lab-card"},Is={class:"control-field"},Ns={class:"control-field"},ws={class:"quick-fill"},qs=["onClick"],Ts=["disabled"],As={key:0,class:"lab-alert"},Ss={class:"lab-pane"},Es={class:"pane-head"},Ds={class:"view-switch"},Cs=["disabled"],Rs=["disabled"],Ls={key:0,class:"elapsed"},Os={key:1,class:"elapsed"},Us={key:2,class:"elapsed"},Ps={key:0,class:"scan-alert"},Bs={key:3,class:"pane-empty"},Ms={key:0,class:"diagnostic-panel"},Gs={class:"diagnostic-head"},Vs={class:"diagnostic-body"},Fs={key:1,class:"pane-empty"},Qs={key:3,class:"answer-result"},js={class:"result-meta"},Ws={class:"result-count"},zs={key:0,class:"result-elapsed"},Hs={key:1,class:"result-elapsed"},Ks={class:"result-list"},Xs={class:"result-index"},Ys={class:"result-body"},Zs={class:"result-question"},Js={class:"result-answer"},te=z({__name:"BrowserAnswerPanel",setup(n){const i=x("process"),{surveyUrl:b,personaText:_,task:r,isRunning:d,errorMessage:p,start:f}=Ft(),{scanTask:a,isScanning:c,errorMessage:h,startScan:u}=jt(b),v=()=>{i.value="parsed";const I=b.value.trim();I&&(!a.value||a.value.surveyUrl!==I)&&u(!1)},$=T(()=>b.value.trim()!==""&&_.value.trim()!==""&&!d.value),N=T(()=>r.value?.answers??[]),D=T(()=>r.value?.status==="DONE"),O=T(()=>{const I=r.value?.elapsedMs;if(I==null)return"";const g=I/1e3;return g<60?`${g.toFixed(1)} 秒`:`${Math.floor(g/60)}
2 分 ${Math.round(g%60)} 秒`}),C=T(()=>{const I=r.value?.totalTokens;return I?`${I.toLocaleString()} tokens`:""}),j=T(()=>r.value?.status==="FAILED"),B=T(()=>{const I=r.value;if(!I)return"";const g=I.steps.slice(-8).map(A=>`[${A.time}] ${A.description}`).join(`
3`);return["===== AI 定量答题 · 排查信息 =====",`任务ID(taskId): ${I.taskId}`,`状态: ${I.status}`,`错误: ${I.error??"无"}`,`耗时: ${O.value}`,`消耗 tokens: ${I.totalTokens??0}`,`问卷链接: ${b.value}`,`被访者画像: ${_.value}`,"","数据库定位:","  MongoDB collection: quant_demo_answer_task",`  查询条件: { "taskId": "${I.taskId}" }`,"",`最后 ${Math.min(8,I.steps.length)} 步操作日志:`,g||"(无)","================================"].join(`
4`)}),q=x(!1),Y=async()=>{try{await navigator.clipboard.writeText(B.value),q.value=!0,window.setTimeout(()=>q.value=!1,2e3)}catch{q.value=!1}},K=T(()=>!r.value||r.value.status==="RUNNING"?"is-running":r.value.status==="DONE"?"is-done":"is-failed"),Q=T(()=>r.value?r.value.status==="RUNNING"?"答题中":r.value.status==="DONE"?"已完成":"失败":"启动中"),M=()=>{b.value=`${window.location.origin}/lab-mock-survey.html`},P=I=>{_.value=yt[I]?.text??""};return it(()=>r.value?.status,I=>{I==="DONE"?i.value="result":I==="RUNNING"&&(i.value="process")}),(I,g)=>(s(),e("section",gs,[t("aside",xs,[t("div",Is,[g[6]||(g[6]=t("label",{class:"field-label"},"问卷链接",-1)),J(t("input",{"onUpdate:modelValue":g[0]||(g[0]=A=>st(b)?b.value=A:null),class:"lab-input",placeholder:"https://… 问卷地址"},null,512),[[ot,o(b)]]),t("div",{class:"quick-fill"},[t("button",{class:"lab-chip",onClick:M},"填入 Mock 问卷")])]),t("div",Ns,[g[8]||(g[8]=t("label",{class:"field-label"},"被访者画像",-1)),J(t("textarea",{"onUpdate:modelValue":g[1]||(g[1]=A=>st(_)?_.value=A:null),class:"lab-textarea",rows:"7",placeholder:"描述这位被访者是什么人:年龄、职业、收入、生活方式、消费习惯……"},null,512),[[ot,o(_)]]),t("div",ws,[g[7]||(g[7]=t("span",{class:"quick-fill-label"},"快捷示例",-1)),(s(!0),e(w,null,E(o(yt),(A,W)=>(s(),e("button",{key:A.label,class:"lab-chip",onClick:Z=>P(W)},l(A.label),9,qs))),128))])]),t("button",{class:"lab-btn-primary",disabled:!$.value,onClick:g[2]||(g[2]=(...A)=>o(f)&&o(f)(...A))},l(o(d)?"答题进行中 …":"启动答题"),9,Ts),g[9]||(g[9]=t("p",{class:"lab-hint"}," 启动后由 AI 在后台真实浏览器中逐题作答,右侧实时呈现它的思考与每一步操作。 ",-1)),o(p)?(s(),e("div",As,l(o(p)),1)):m("",!0)]),t("div",Ss,[t("div",Es,[g[11]||(g[11]=t("span",{class:"pane-title"},"答题详情",-1)),t("div",Ds,[t("button",{class:R({active:i.value==="process"}),onClick:g[3]||(g[3]=A=>i.value="process")}," 答题过程 ",2),t("button",{class:R({active:i.value==="result"}),disabled:!D.value,onClick:g[4]||(g[4]=A=>i.value="result")}," 答题结果 ",10,Cs),t("button",{class:R({active:i.value==="parsed"}),disabled:!o(b).trim(),onClick:v}," 问卷解析 ",10,Rs)]),i.value==="parsed"?(s(),e(w,{key:0},[o(a)?.status==="DONE"?(s(),e("span",Ls," 共 "+l(o(a).questions.length)+" 项 ",1)):m("",!0),o(a)&&!o(c)?(s(),e("button",{key:1,class:"lab-chip",onClick:g[5]||(g[5]=A=>o(u)(!0))}," 重新解析 ")):m("",!0)],64)):(s(),e(w,{key:1},[o(r)||o(d)?(s(),e("span",{key:0,class:R(["status-chip",K.value])},[g[10]||(g[10]=t("span",{class:"dot"},null,-1)),X(l(Q.value),1)],2)):m("",!0),o(r)&&O.value?(s(),e("span",Os,"耗时 "+l(O.value),1)):m("",!0),o(r)&&C.value?(s(),e("span",Us,"消耗 "+l(C.value),1)):m("",!0)],64))]),i.value==="parsed"?(s(),e(w,{key:0},[o(h)?(s(),e("div",Ps,l(o(h)),1)):m("",!0),o(a)&&o(a).status==="RUNNING"?(s(),F(et,{key:1,steps:o(a).steps,"is-running":""},null,8,["steps"])):o(a)?(s(),F(mt,{key:2,task:o(a)},null,8,["task"])):(s(),e("div",Bs,[...g[12]||(g[12]=[t("span",{class:"empty-glyph"},"☰",-1),t("p",{class:"empty-text"}," 解析问卷链接后,这里会展示 AI 拆解出的每道题的完整结构(题干、选项原文、控件、显隐与终止逻辑),用来与文字版问卷逐题对比排查。 ",-1)])]))],64)):(s(),e(w,{key:1},[j.value?(s(),e("div",Ms,[t("div",Gs,[g[13]||(g[13]=t("span",{class:"diagnostic-title"},"⚠ 答题出错 · 排查信息",-1)),t("button",{class:"lab-chip",onClick:Y},l(q.value?"✓ 已复制":"复制排查信息"),1)]),t("pre",Vs,l(B.value),1),g[14]||(g[14]=t("p",{class:"diagnostic-hint"},"把上面这段复制发给开发,可直接定位数据库记录与出错步骤。",-1))])):m("",!0),o(r)?i.value==="process"?(s(),F(et,{key:2,steps:o(r)?.steps??[],"is-running":o(d)},null,8,["steps","is-running"])):(s(),e("div",Qs,[t("div",js,[t("span",Ws,"共答 "+l(N.value.length)+" 题",1),O.value?(s(),e("span",zs,"耗时 "+l(O.value),1)):m("",!0),C.value?(s(),e("span",Hs,"消耗 "+l(C.value),1)):m("",!0),g[16]||(g[16]=t("span",{class:"result-tip"},"下方为本次问卷的最终作答",-1))]),t("div",Ks,[(s(!0),e(w,null,E(N.value,(A,W)=>(s(),e("div",{key:W,class:"result-row"},[t("span",Xs,l(W+1),1),t("div",Ys,[t("p",Zs,l(A.question),1),t("p",Js,l(A.answer),1)])]))),128))])])):(s(),e("div",Fs,[...g[15]||(g[15]=[t("span",{class:"empty-glyph"},"◎",-1),t("p",{class:"empty-text"}," 填入问卷链接与被访者画像后点击「启动答题」,这里会像和 AI 对话一样,逐步展示它的思考与每一步操作。 ",-1)])]))],64))])]))}}),se=H(te,[["__scopeId","data-v-27781704"]]),bt=2500,ee=2e3,ne=2e3,ae=50;function le(){const n=x(""),i=x(null),b=x(""),_=x(null),r=x(null),d=x(!1);let p=null;const f=x(null),a=x(!1);let c=null;const h=x(""),u=x(null),v=x(null),$=x(!1),N=x(0),D=x(null),O=x([]),C=x(!1),j=x(0),B=x(null),q=x(!1),Y=x(ae),K=x(!1),Q=x(!1);let M=null;const P=k=>{k&&clearInterval(k)},I=(k,L)=>{i.value=k instanceof Error?k.message:L},g=k=>{_.value=k,b.value=k.name},A=async k=>{try{r.value=await Lt(k),r.value.status!=="RUNNING"&&(P(p),p=null,d.value=!1)}catch(L){I(L,"查询纸质问卷解析进度失败"),P(p),p=null,d.value=!1}},W=async()=>
4{if(!(!_.value||!n.value.trim()||d.value)){d.value=!0,i.value=null,r.value=null;try{const{docId:k}=await Rt(_.value,n.value.trim());await A(k),r.value&&r.value.status==="RUNNING"&&(p=setInterval(()=>A(k),ne))}catch(k){I(k,"纸质问卷上传解析失败"),d.value=!1}}},Z=async k=>{try{f.value=await kt(k),f.value.status!=="RUNNING"&&(P(c),c=null,a.value=!1)}catch(L){I(L,"查询拆解进度失败"),P(c),c=null,a.value=!1}},G=async(k=!1)=>{if(!(!n.value.trim()||a.value)){a.value=!0,i.value=null,f.value=null;try{const{taskId:L}=await _t(n.value.trim(),k);await Z(L),f.value&&f.value.status==="RUNNING"&&(c=setInterval(()=>Z(L),ee))}catch(L){I(L,"启动问卷拆解失败"),a.value=!1}}},tt=k=>{u.value=k,h.value=k.name,v.value=null,D.value=null},ut=async()=>{if(!(!v.value||!n.value.trim()))try{D.value=await Ut(n.value.trim(),v.value)}catch{D.value=null}},rt=async()=>{if(!(!u.value||$.value)){$.value=!0,i.value=null,v.value=null,D.value=null;try{const k=await Ot(u.value);if(k.error||!k.quota){i.value=k.error??"配额表解析失败";return}v.value=k.quota,N.value=k.totalTokens??0,O.value=[],j.value=0,await ut()}catch(k){I(k,"配额表解析请求失败")}finally{$.value=!1}}},ct=async()=>{if(!(!v.value||C.value)){C.value=!0,i.value=null,O.value=[];try{const k=await Pt(v.value,n.value.trim());if(k.error){i.value=k.error;return}O.value=k.personas,j.value=k.totalTokens??0}catch(k){I(k,"画像生成请求失败")}finally{C.value=!1}}},nt=async k=>{try{B.value=await Mt(k),(B.value.status==="FINISHED"||B.value.status==="PLAN_FAILED")&&(P(M),M=null,q.value=!1)}catch(L){I(L,"查询批次进度失败"),P(M),M=null,q.value=!1}},at=async()=>{if(!(O.value.length===0||!n.value.trim()||q.value)){q.value=!0,i.value=null,B.value=null;try{const{batchId:k}=await Bt({surveyUrl:n.value.trim(),personas:O.value,quotaParseTokens:N.value,personaTokens:j.value,batchSize:Y.value,autoAdvance:K.value});M=setInterval(()=>nt(k),bt)}catch(k){I(k,"启动批次答题失败"),q.value=!1}}},lt=async()=>{const k=B.value;if(!(!k||Q.value)){Q.value=!0;try{B.value=await Gt(k.batchId),M||(q.value=!0,M=setInterval(()=>nt(k.batchId),bt))}catch(L){I(L,"开始下一批失败")}finally{Q.value=!1}}};return vt(()=>{P(M),P(c),P(p)}),{surveyUrl:n,errorMessage:i,docFileName:b,surveyDoc:r,isDocParsing:d,setDocFile:g,uploadDoc:W,scanTask:f,isScanning:a,startScan:G,quotaFileName:h,quota:v,isParsing:$,quotaParseTokens:N,alignment:D,setQuotaFile:tt,parseQuota:rt,personas:O,isGenerating:C,personaTokens:j,generate:ct,batch:B,isBatchRunning:q,batchSize:Y,autoAdvance:K,isAdvancing:Q,startAnswering:at,advance:lt}}const oe={key:1,class:"lab-pane-body"},ie={key:0,class:"lab-alert"},ue={key:1,class:"doc-warn"},re={key:2,class:"coverage-card"},ce={class:"coverage-text"},de={key:0,class:"coverage-missing"},ve={class:"section-name"},pe={class:"question-head"},he={class:"question-code"},ye={class:"question-title"},fe={key:0,class:"meta-tag"},be={key:0,class:"question-rule"},_e={key:1,class:"question-logic"},ke={key:2,class:"option-chips"},$e=["title"],me={key:0,class:"option-code"},ge=z({__name:"SurveyDocView",props:{doc:{},coverage:{}},setup(n){const i=n,b=T(()=>i.doc.status==="RUNNING"),_=T(()=>{const d=[];for(const p of i.doc.questions){const f=d[d.length-1];f&&f.name===p.section?f.questions.push(p):d.push({name:p.section,questions:[p]})}return d}),r=T(()=>{const d=i.coverage;if(!d)return"";const p=d.docTotal>0?Math.round(d.matchedCount/d.docTotal*100):0;return`网页拆解覆盖 ${d.matchedCount}/${d.docTotal} 题(${p}%)`});return(d,p)=>b.value?(s(),F(et,{key:0,steps:n.doc.steps,"is-running":""},null,8,["steps"])):(s(),e("div",oe,[n.doc.status==="FAILED"?(s(),e("div",ie," 解析失败:"+l(n.doc.error||"未知错误"),1)):n.doc.error?(s(),e("div",ue,"⚠ "+l(n.doc.error),1)):m("",!0),n.coverage?(s(),e("div",re,[t("span",ce,l(r.value),1),n.coverage.unmatchedCodes.length>0?(s(),e("span",de," 未对上:"+l(n.coverage.unmatchedCodes.join("、")),1)):m("",!0)])):m("",!0),(s(!0),e(w,null,E(_.value,f=>(s(),e("div",{key:f.name,class:"doc-section"},[t("p",ve,l(f.name||"未分章节"),1),(s(!0),e(w,null,E(f.questions,a=>(s(),e("div",{key:a.code,class:"doc-question"},[t("div",pe,[t("span",he,l(a.code),1),t("p",ye,l(a.title),1),a.control?
4(s(),e("span",fe,l(a.control),1)):m("",!0)]),a.terminateRule?(s(),e("p",be,"⛔ "+l(a.terminateRule),1)):m("",!0),a.showLogic?(s(),e("p",_e,"⤷ "+l(a.showLogic),1)):m("",!0),a.options.length>0?(s(),e("div",ke,[(s(!0),e(w,null,E(a.options,c=>(s(),e("span",{key:c.code+c.text,class:R(["option-chip",{"is-terminate":c.terminate}]),title:c.terminateNote},[c.code?(s(),e("em",me,l(c.code),1)):m("",!0),X(l(c.text)+" ",1),c.terminateNote?(s(),e(w,{key:1},[X("("+l(c.terminateNote)+")",1)],64)):m("",!0)],10,$e))),128))])):m("",!0)]))),128))]))),128))]))}}),xe=H(ge,[["__scopeId","data-v-e88ca9fa"]]),Ie={class:"lab-pane-body"},Ne={class:"quota-summary"},we={class:"summary-main"},qe={key:0,class:"summary-extra"},Te={key:1,class:"summary-cross"},Ae={class:"quota-table"},Se=["rowspan"],Ee={class:"cell-num"},De=z({__name:"QuotaDetailView",props:{quota:{},alignment:{}},setup(n){const i=n,b=T(()=>i.quota.crossAxis?.groups??[]),_=p=>!p||p.type==="NONE"?"-":p.type==="MIN"?`≥${p.n}`:String(p.n),r=(p,f)=>i.alignment?.bindings.find(a=>a.dimension===p&&a.itemValue===f),d=(p,f)=>{const a=r(p,f);return a?a.status==="UNALIGNED"?a.questionRef?`${a.questionRef}(未对齐)`:"":a.computed?`${a.questionRef} → ${a.docTitle.slice(0,18)}…(计算)`:a.negate?`${a.questionRef} → 不选「${a.optionText}」`:a.optionText?`${a.questionRef} → 选「${a.optionText}」`:`${a.questionRef} → ${a.docTitle.slice(0,18)}…`:""};return(p,f)=>(s(),e("div",Ie,[t("div",Ne,[t("span",we,"主样本量 "+l(n.quota.sampleSize),1),n.quota.extraSampleSize>0?(s(),e("span",qe," 追加 "+l(n.quota.extraSampleSize)+"("+l(n.quota.extraCondition||"未说明条件")+") ",1)):m("",!0),n.quota.crossAxis?(s(),e("span",Te," 交叉轴:"+l(n.quota.crossAxis.name)+" ("+l(b.value.map(a=>`${a.value}=${a.count}`).join(" / "))+") ",1)):m("",!0)]),t("table",Ae,[t("thead",null,[t("tr",null,[f[0]||(f[0]=t("th",null,"维度",-1)),f[1]||(f[1]=t("th",null,"档位",-1)),f[2]||(f[2]=t("th",null,"整体",-1)),(s(!0),e(w,null,E(b.value,a=>(s(),e("th",{key:a.value},l(a.value),1))),128)),f[3]||(f[3]=t("th",null,"对应题目",-1))])]),t("tbody",null,[(s(!0),e(w,null,E(n.quota.dimensions,a=>(s(),e(w,{key:a.name},[(s(!0),e(w,null,E(a.items,(c,h)=>(s(),e("tr",{key:c.value},[h===0?(s(),e("td",{key:0,rowspan:a.items.length,class:"cell-dim"},l(a.name),9,Se)):m("",!0),t("td",null,l(c.value),1),t("td",Ee,l(c.count),1),(s(!0),e(w,null,E(b.value,u=>(s(),e("td",{key:u.value,class:"cell-num"},l(_(c.cross?.[u.value])),1))),128)),t("td",{class:R(["cell-binding",{"is-unaligned":r(a.name,c.value)?.status==="UNALIGNED"}])},l(d(a.name,c.value)||c.questionRef||"-"),3)]))),128))],64))),128))])]),f[4]||(f[4]=t("p",{class:"quota-hint"}," 交叉列:数字=精确配额、≥N=下限、-=不限;「对应题目」列展示配额档位经纸质问卷翻译后的作答绑定。 ",-1))]))}}),Ce=H(De,[["__scopeId","data-v-dc68b446"]]),Re={class:"lab-pane-body persona-list"},Le={class:"persona-index"},Oe={class:"persona-body"},Ue={class:"persona-attrs"},Pe={key:0,class:"proxy-line"},Be={class:"proxy-area"},Me={key:1,class:"screener-line"},Ge={class:"persona-desc"},Ve=z({__name:"PersonaListView",props:{personas:{},proxyByIndex:{},hasAreaDimension:{type:Boolean}},setup(n){const i=n,b=["地区","城市","省份","区域","所在地","居住地"],_=c=>{const h=Object.entries(c.attributes).find(([u])=>b.includes(u));return h?h[1]:""},r=c=>i.proxyByIndex?.[c],d=c=>{const h=r(c.index);if(!h||!h.exitIp&&!h.status)return"IP 待分配";if(h.status==="UNAVAILABLE"||!h.exitIp)return"IP 不可用,本次直连答题";const u=h.status==="DOWNGRADED"?"(已降级至省级)":"";return`${h.exitIp}${h.area?`(实测:${h.area})`:""}${u}`},p=c=>{const h=r(c.index);return!h||!h.exitIp&&!h.status?"pending":h.status==="UNAVAILABLE"||!h.exitIp?"failed":h.status==="DOWNGRADED"?"downgraded":"ok"},f=c=>!!i.hasAreaDimension||!!_(c),a=c=>c.action==="FILL"?`${c.questionCode} 填「${c.fillValue}」`:c.action==="AVOID"?`${c.questionCode} 避开「${c.optionText}」`:`${c.questionCode} 选「${c.optionText}」`;return(c,h)=>(s(),e("div",Re,[(s(!0),e(w,null,E(n.personas,u=>(s(),e("div",{key:u.index,class:"persona-row"},[t("span",Le,l(u.index),1),t("div",Oe,[t("div",Ue,[(s(!0),e(w,null,E(u.attributes,(v,$)=>(s(),e("span",{key:$,class:"persona-attr"},l($)+"·"+l(v),1))),128))]),f(u)?(s(),e("div",Pe,[t("span",Be,l(_(u)||"未指定地区"),1),h[0]||(h[0]=t("span",{class:"proxy-dot"},"·",-1)),t("span",{class:R(["proxy-ip",p(u)])},l(d(u)),3)])):m("",!0),u.screener?.answers.length?(s(),e("div",Me,[h[1]||(h[1]=t("span",{class:"screener-label"},"甄别档案",-1)),(s(!0),e(w,null,E(u.screener.answers,v=>(s(),e("span",{key:v.questionCode+v.action,class:"screener-item"}
4,l(a(v)),1))),128))])):m("",!0),t("p",Ge,l(u.description),1)])]))),128))]))}}),Fe=H(Ve,[["__scopeId","data-v-42840267"]]),Qe={key:1,class:"lab-pane-body"},je={class:"lab-alert"},We={key:2,class:"lab-pane-body"},ze={class:"group-strip"},He={class:"group-name"},Ke={class:"group-count"},Xe={class:"group-status"},Ye=["disabled"],Ze={class:"strip-hint"},Je={class:"batch-grid"},tn={class:"member-head"},sn={class:"member-index"},en={class:"member-status"},nn={class:"member-attrs"},an={class:"member-meta"},ln={key:0},on=z({__name:"BatchProgressView",props:{batch:{},isAdvancing:{type:Boolean}},emits:["advance","download"],setup(n,{emit:i}){const b=n,_=i,r={RUNNING:"答题中",DONE:"已完成",FAILED:"失败",UNKNOWN:"等待中"},d=u=>u==="DONE"?"is-done":u==="FAILED"?"is-failed":u==="RUNNING"?"is-running":"is-waiting",p=u=>u==="FINISHED"?"已完成":u==="RUNNING"?"进行中":"待启动",f=u=>{const v=Math.round(u/1e3);return v<60?`${v}秒`:`${Math.floor(v/60)}分${v%60}秒`},a=T(()=>b.batch.status==="WAITING_NEXT"),c=u=>{if(u.proxyStatus==="UNAVAILABLE"||!u.proxyExitIp)return"IP 不可用 · 直连";const v=u.proxyStatus==="DOWNGRADED"?" · 降级省级":"";return`${u.proxyExitIp}${u.proxyArea?` · ${u.proxyArea}`:""}${v}`},h=u=>u.proxyStatus==="UNAVAILABLE"||!u.proxyExitIp?"is-proxy-failed":u.proxyStatus==="DOWNGRADED"?"is-proxy-downgraded":"is-proxy-ok";return(u,v)=>n.batch.status==="PLANNING"?(s(),F(et,{key:0,steps:n.batch.planSteps,"is-running":""},null,8,["steps"])):n.batch.status==="PLAN_FAILED"?(s(),e("div",Qe,[t("div",je,"答案规划失败:"+l(n.batch.planError||"未知错误"),1)])):(s(),e("div",We,[t("div",ze,[(s(!0),e(w,null,E(n.batch.groups,$=>(s(),e("div",{key:$.groupIndex,class:R(["group-pill",{"is-running":$.status==="RUNNING","is-finished":$.status==="FINISHED","is-current":$.groupIndex===n.batch.currentGroupIndex}])},[t("span",He,"第 "+l($.groupIndex)+" 组",1),t("span",Ke,l($.doneCount+$.failedCount)+"/"+l($.total),1),t("span",Xe,l(p($.status)),1)],2))),128)),a.value?(s(),e("button",{key:0,class:"lab-btn-primary advance-btn",disabled:n.isAdvancing,onClick:v[0]||(v[0]=$=>_("advance"))},l(n.isAdvancing?"启动中 …":"开始下一批"),9,Ye)):m("",!0),n.batch.status==="FINISHED"?(s(),e("button",{key:1,class:"lab-chip",onClick:v[1]||(v[1]=$=>_("download"))}," 下载汇总 Excel ")):m("",!0)]),t("p",Ze," 当前展示第 "+l(n.batch.currentGroupIndex)+" 组明细;全部 "+l(n.batch.total)+" 人已完成 "+l(n.batch.doneCount)+" 人"+l(n.batch.failedCount>0?`、失败 ${n.batch.failedCount} 人`:"")+"。 ",1),t("div",Je,[(s(!0),e(w,null,E(n.batch.members,$=>(s(),e("div",{key:$.index,class:R(["member-card",d($.status)])},[t("div",tn,[t("span",sn,l($.index),1),t("span",en,[v[2]||(v[2]=t("span",{class:"status-dot"},null,-1)),X(l(r[$.status]),1)])]),t("div",nn,l(Object.values($.attributes).join(" · ")),1),$.proxyStatus?(s(),e("div",{key:0,class:R(["member-proxy",h($)])},l(c($)),3)):m("",!0),t("div",an,[t("span",null,"已答 "+l($.answeredCount)+" 题",1),t("span",null,l(f($.elapsedMs)),1),$.totalTokens>0?(s(),e("span",ln,l($.totalTokens.toLocaleString())+" tokens",1)):m("",!0)])],2))),128))])]))}}),un=H(on,[["__scopeId","data-v-40c4cd0b"]]),rn={class:"batch-panel"},cn={class:"lab-card"},dn={class:"control-field"},vn={class:"control-field"},pn={class:"upload-row"},hn=["disabled"],yn={class:"control-field"},fn=["disabled"],bn={key:0,class:"quick-fill"},_n=["disabled"],kn={class:"control-field"},$n={class:"upload-row"},mn=["disabled"],gn={key:0,class:"control-field"},xn=["disabled"],In={key:1,class:"control-field"},Nn={class:"batch-options"},wn={class:"option-line"},qn={class:"option-line"},Tn=["disabled"],An={key:2,class:"lab-alert"},Sn={class:"lab-pane"},En={class:"pane-head"},Dn={class:"view-switch"},Cn=["disabled","onClick"],Rn={key:0,class:"pane-metrics"},Ln={key:0},On={key:1},Un={key:1,class:"pane-metrics"},Pn={key:0},Bn={key:1},Mn={key:2,class:"pane-metrics"},Gn={key:3,class:"pane-metrics"},Vn={key:0},Fn={key:1},Qn={key:2},jn={key:2,class:"pane-empty"},Wn=z({__name:"BatchAnswerPanel",setup(n){const{surveyUrl:i,errorMessage:b,docFileName:_,surveyDoc:r,isDocParsing:d,setDocFile:p,uploadDoc:f,scanTask:a,isScanning:c,startScan:h,quotaFileName:u,quota:v,isParsing:$,alignment:N,setQuotaFile:D,parseQuota:O,personas:C,isGenerating:j,generate:B,batch:q,isBatchRunning:Y,batchSize:K,autoAdvance:Q,isAdvancing:M,startAnswering:P,advance:I}=le(),g=[{key:"scan",label:"问卷解析"},{key:"doc",label:"纸质问卷"},{key:"quota",label:"配额"},{key:"personas",label:"画像"},{key:"batch",label:"批次答题"}],A=T(()=>({scan:a.value!=null,doc:r.value!=null,quota:v.value!=null,personas:C.value.length>0,batch:q.value!=null})),W=T(()=>q.value?"batch":C.value.length>0?"personas":v.value?"quota":a.value?"scan":r.value?"doc":"scan"),Z=x(null);it(W,()=>Z.value=null);const G=T(()=>{const U=Z.value;return U&&A.value[U]?U:W.value}),tt=T(()=>a.value?.status==="DONE"),ut=T(()=>i.value.trim()!==""&&!c.value),rt=T(()=>
4_.value!==""&&i.value.trim()!==""&&!d.value),ct=T(()=>u.value!==""&&!$.value),nt=T(()=>C.value.length>0&&i.value.trim()!==""&&tt.value&&!Y.value),at=x(null),lt=x(null),k=U=>{const y=U.target.files?.[0];y&&p(y)},L=U=>{const y=U.target.files?.[0];y&&D(y)},gt=()=>{i.value=`${window.location.origin}/lab-mock-survey.html`},xt=()=>{window.open(`${window.location.origin}/lab-mock-quota.xlsx`,"_blank")},It=()=>{q.value&&window.open(`/api/open/quant-demo/batch/${q.value.batchId}/export`,"_blank")},dt=U=>U.toLocaleString(),Nt=["地区","城市","省份","区域","所在地","居住地"],wt=T(()=>{const U={};for(const y of q.value?.members??[])U[y.index]={exitIp:y.proxyExitIp,area:y.proxyArea,status:y.proxyStatus};return U}),qt=T(()=>C.value.some(U=>Object.keys(U.attributes).some(y=>Nt.includes(y))));return(U,y)=>(s(),e("section",rn,[t("aside",cn,[t("div",dn,[y[11]||(y[11]=t("label",{class:"field-label"},"① 问卷链接",-1)),J(t("input",{"onUpdate:modelValue":y[0]||(y[0]=S=>st(i)?i.value=S:null),class:"lab-input",placeholder:"https://… 问卷地址"},null,512),[[ot,o(i)]]),t("div",{class:"quick-fill"},[t("button",{class:"lab-chip",onClick:gt},"填入 Mock 问卷")])]),t("div",vn,[y[12]||(y[12]=t("label",{class:"field-label"},"② 纸质问卷(推荐上传)",-1)),t("div",pn,[t("button",{class:"upload-btn",onClick:y[1]||(y[1]=S=>at.value?.click())},l(o(_)||"选择问卷文档(docx / xlsx)"),1),t("input",{ref_key:"docInput",ref:at,type:"file",accept:".docx,.xlsx,.xls",class:"file-hidden",onChange:k},null,544)]),t("button",{class:"lab-btn-secondary",disabled:!rt.value,onClick:y[2]||(y[2]=(...S)=>o(f)&&o(f)(...S))},l(o(d)?"解析中 …":o(r)?.status==="DONE"?"✓ 已解析,重新上传解析":"上传并解析"),9,hn)]),t("div",yn,[y[13]||(y[13]=t("label",{class:"field-label"},"③ 拆解问卷(网页扫描)",-1)),t("button",{class:"lab-btn-primary",disabled:!ut.value,onClick:y[3]||(y[3]=S=>o(h)(!1))},l(o(c)?"拆解中 …":tt.value?"✓ 问卷已拆解":"拆解问卷"),9,fn),tt.value?(s(),e("div",bn,[t("button",{class:"lab-chip",disabled:o(c),onClick:y[4]||(y[4]=S=>o(h)(!0))},"重新拆解",8,_n)])):m("",!0)]),t("div",kn,[y[14]||(y[14]=t("label",{class:"field-label"},"④ 配额表(Excel)",-1)),t("div",$n,[t("button",{class:"upload-btn",onClick:y[5]||(y[5]=S=>lt.value?.click())},l(o(u)||"选择配额表文件"),1),t("input",{ref_key:"quotaInput",ref:lt,type:"file",accept:".xlsx,.xls",class:"file-hidden",onChange:L},null,544)]),t("button",{class:"lab-btn-primary",disabled:!ct.value,onClick:y[6]||(y[6]=(...S)=>o(O)&&o(O)(...S))},l(o($)?"解析中 …":"解析配额表"),9,mn),t("div",{class:"quick-fill"},[t("button",{class:"lab-chip",onClick:xt},"下载样例配额表")])]),o(v)?(s(),e("div",gn,[y[15]||(y[15]=t("label",{class:"field-label"},"⑤ 生成画像",-1)),t("button",{class:"lab-btn-primary",disabled:o(j),onClick:y[7]||(y[7]=(...S)=>o(B)&&o(B)(...S))},l(o(j)?`生成画像中 …(共 ${o(v).sampleSize} 人)`:`按配额生成 ${o(v).sampleSize} 个画像`),9,xn)])):m("",!0),o(C).length>0?(s(),e("div",In,[y[19]||(y[19]=t("label",{class:"field-label"},"⑥ 启动答题",-1)),t("div",Nn,[t("label",wn,[y[16]||(y[16]=X(" 每组 ",-1)),J(t("input",{"onUpdate:modelValue":y[8]||(y[8]=S=>st(K)?K.value=S:null),type:"number",min:"1",max:"200",class:"lab-input size-input"},null,512),[[ot,o(K),void 0,{number:!0}]]),y[17]||(y[17]=X(" 人 ",-1))]),t("label",qn,[J(t("input",{"onUpdate:modelValue":y[9]||(y[9]=S=>st(Q)?Q.value=S:null),type:"checkbox"},null,512),[[At,o(Q)]]),y[18]||(y[18]=X(" 组完成后自动开始下一组 ",-1))])]),t("button",{class:"lab-btn-primary",disabled:!nt.value,onClick:y[10]||(y[10]=(...S)=>o(P)&&o(P)(...S))},l(o(Y)?"答题进行中 …":`启动 ${o(C).length} 人分组答题`),9,Tn)])):m("",!0),y[20]||(y[20]=t("p",{class:"lab-hint"}," 流程:链接 → 纸质问卷 → 拆解 → 配额表 → 画像 → 分组答题;右侧按阶段分 Tab 展示解析内容,随时可切换回看。 ",-1)),o(b)?(s(),e("div",An,l(o(b)),1)):m("",!0)]),t("div",Sn,[t("div",En,[t("div",Dn,[(s(),e(w,null,E(g,S=>t("button",{key:S.key,class:R({active:G.value===S.key}),disabled:!A.value[S.key],onClick:ea=>Z.value=S.key},l(S.label),11,Cn)),64))]),G.value==="scan"&&o(a)?(s(),e("span",Rn,[tt.value?(s(),e("span",Ln,"共 "+l(o(a).questions.length)+" 项",1)):m("",!0),o(a).totalTokens>0?(s(),e("span",On,"消耗 "+l(dt(o(a).totalTokens))+" tokens",1)):m("",!0)])):G.value==="doc"&&o(r)?(s(),e("span",Un,[o(r).status==="DONE"?(s(),e("span",Pn,"共 "+l(o(r).questions.length)+" 题",1)):m("",!0),o(r).totalTokens>0?(s(),e("span",Bn,"消耗 "+l(dt(o(r).totalTokens))+" tokens",1)):m("",!0)])):G.value==="personas"?(s(),e("span",Mn,[t("span",null,"共 "+l(o(C).length)+" 人",1)])):G.value==="batch"&&o(q)?(s(),e("span",Gn,[o(q).status==="PLANNING"?(s(),e("span",Vn,"答案规划中 …")):(s(),e("span",Fn,"完成 "+l(o(q).doneCount)+"/"+l(o(q).total),1)),o(q).totalTokens>0?(s(),e("span",Qn,"全程消耗 "+l(dt(o(q).totalTokens))+" tokens",1)):m("",!0)])):m("",!0)]),G.value==="scan"?(s(),e(w,{key:0},[o(a)&&o(a).status==="RUNNING"?(s(),F(et,{key:0,steps:o(a).steps,"is-running":""},null,8,["steps"])):o(a)?(s(),F(mt,{key:1,task:o(a)},null,8,["task"])):(s(),e("div",jn,[...y[21]||(y[21]=[t("span",{class:"empty-glyph"},"▤",-1),t("p",{class:"empty-text"},"填入问卷链接并点击「拆解问卷」,这里展示扫æ
4è¿‡ç¨‹ä¸Žæ‹†è§£å‡ºçš„题目结构。",-1)])]))],64)):G.value==="doc"&&o(r)?(s(),F(xe,{key:1,doc:o(r),coverage:o(N)?.coverage??null},null,8,["doc","coverage"])):G.value==="quota"&&o(v)?(s(),F(Ce,{key:2,quota:o(v),alignment:o(N)},null,8,["quota","alignment"])):G.value==="personas"?(s(),F(Fe,{key:3,personas:o(C),"proxy-by-index":wt.value,"has-area-dimension":qt.value},null,8,["personas","proxy-by-index","has-area-dimension"])):G.value==="batch"&&o(q)?(s(),F(un,{key:4,batch:o(q),"is-advancing":o(M),onAdvance:o(I),onDownload:It},null,8,["batch","is-advancing","onAdvance"])):m("",!0)])]))}}),zn=H(Wn,[["__scopeId","data-v-56a861c5"]]),Hn={class:"quant-lab"},Kn={class:"lab-topbar"},Xn={class:"lab-topbar-inner"},Yn={class:"lab-tabs"},Zn=["onClick"],Jn={class:"lab-stage"},ta={class:"lab-stage-inner"},sa=z({__name:"QuantSurveyLab",setup(n){const i=St(),b=Et(),r=x((p=>p==="batch"?"batch":"answer")(i.query.tab));it(r,p=>{b.replace({query:{...i.query,tab:p}})});const d=[{key:"answer",label:"单份答题验证"},{key:"batch",label:"多人答题"}];return(p,f)=>(s(),e("div",Hn,[t("header",Kn,[t("div",Xn,[f[0]||(f[0]=t("div",{class:"lab-brand"},[t("span",{class:"brand-mark"},"Q"),t("div",{class:"brand-text"},[t("h1",null,"AI 定量实验台"),t("span",{class:"brand-sub"},"浏览器模拟答题技术调研")])],-1)),t("nav",Yn,[(s(),e(w,null,E(d,a=>t("button",{key:a.key,class:R({active:r.value===a.key}),onClick:c=>r.value=a.key},l(a.label),11,Zn)),64))])])]),t("main",Jn,[t("div",ta,[J(ht(se,null,null,512),[[pt,r.value==="answer"]]),J(ht(zn,null,null,512),[[pt,r.value==="batch"]])])])]))}}),aa=H(sa,[["__scopeId","data-v-fcc2a2eb"]]);export{aa as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.