chore(v2): 从兴邦预审v2白名单抽取独立可运行基座
按 docs/v2/05-implementation-plan.md §1 候选迁移表与 claude_use/T00 白名单, 从 55e2cdb 抽取 224 个文件(2.48 MB)到独立目录 F:/mini-OpenClaw-v2。 - 排除:凭据(.env/server-deploy.conf/旧DELIVERY.md)、运行数据(xingbang_data 等 4 个 SQLite)、依赖(venv/node_modules 符号链接)、归档(_backup*/test-evidence/ ori_file)、Office 临时文件 - 目标目录独立 git 仓库,初始恢复点;Gitea 远程与分支待 OQ-06 Q2 定案 - 未部署、未启动服务、未调用模型 Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
// Prototype-only browser checks. Requires Playwright and a Chromium installation.
|
||||
// PROTOTYPE_URL optionally targets the Superdesign preview; otherwise tests saved HTML.
|
||||
const {chromium}=require('playwright');
|
||||
const fs=require('fs'),path=require('path'),{pathToFileURL}=require('url');
|
||||
(async()=>{
|
||||
const dir=path.resolve(process.env.EVIDENCE_DIR||'test-evidence/20260929-radar-prototype/local');fs.mkdirSync(dir,{recursive:true});
|
||||
const browser=await chromium.launch({headless:true,...(process.env.CHROMIUM_PATH?{executablePath:process.env.CHROMIUM_PATH}:{})});
|
||||
const page=await browser.newPage({viewport:{width:1440,height:1000}});const errors=[],checks=[];page.on('pageerror',e=>errors.push(e.message));
|
||||
const check=(name,value)=>{checks.push({name,passed:!!value});if(!value)throw Error(name)};
|
||||
const shot=async(name)=>page.screenshot({path:path.join(dir,name+'.png'),fullPage:true});
|
||||
try{
|
||||
await page.goto(process.env.PROTOTYPE_URL||pathToFileURL(path.join(__dirname,'prescreen-workbench.html')).href,{waitUntil:'networkidle',timeout:60000});
|
||||
await page.waitForFunction(()=>getComputedStyle(document.querySelector('[data-sd-id="1"]')).display==='flex',{timeout:15000});
|
||||
check('P08 baseline 42%',await page.locator('#baseline-probability').innerText()==='42%');
|
||||
check('P08 explicit demo label',await page.getByText('审批通过概率 · 演示值',{exact:true}).isVisible());
|
||||
check('P08 uncalibrated explanation',await page.getByText('人工设定,仅演示交互;未经历史数据校准。',{exact:false}).isVisible());
|
||||
await require('./check-radar.cjs')({page,check,shot});
|
||||
const baseline=await page.locator('#real-recommendation').innerText();await shot('01-overview');
|
||||
await page.locator('#btn-show-basis').click();check('P11 basis opens',await page.locator('#basis-dialog').isVisible());
|
||||
const basis=await page.locator('#basis-dialog').innerText();
|
||||
for(const word of ['DC-CASH','SKILL-04','H-018','RULE-01','非模型计算','原型情景表','不代表红线核查已经通过'])check('P11 trace '+word,basis.includes(word));
|
||||
await shot('02-basis');await page.keyboard.press('Escape');check('P07 focus restored',await page.locator('#btn-show-basis').evaluate(e=>e===document.activeElement));
|
||||
await page.locator('#tab-simulation').click();
|
||||
for(const [bank,title,prob,delta,remaining,reason] of [[false,false,42,0,'2 项','未选择'],[true,false,58,16,'设备权属','银行流水'],[true,true,64,22,'两项证据','不简单相加'],[false,true,51,9,'实际回款','合同'],[false,false,42,0,'2 项','未选择'],[false,true,51,9,'实际回款','合同'],[true,true,64,22,'两项证据','不简单相加']]){
|
||||
await page.locator('#assume-bank').setChecked(bank);await page.locator('#assume-title').setChecked(title);
|
||||
check(`P09 immediate ${bank}/${title} = ${prob}`,await page.locator('#sim-prob-val').innerText()===prob+'%');
|
||||
check(`P09 delta ${delta}`,await page.locator('#sim-prob-delta').innerText()==='+'+delta+' 百分点');
|
||||
check(`P10 remaining ${bank}/${title}`,(await page.locator('#sim-remaining').innerText()).includes(remaining));
|
||||
check(`P10 reason ${bank}/${title}`,(await page.locator('#sim-explanation').innerText()).includes(reason));
|
||||
check('P10 comparison visible',await page.locator('#simulation-comparison').isVisible());
|
||||
}
|
||||
await page.locator('#panel-simulation').scrollIntoViewIfNeeded();await shot('03-simulation-64');
|
||||
await page.locator('#run-simulation').click();check('P11 scenario basis',await page.locator('#basis-dialog').isVisible());await page.keyboard.press('Escape');
|
||||
await page.getByRole('button',{name:'← 返回真实预审'}).click();check('P12 recommendation unchanged',await page.locator('#real-recommendation').innerText()===baseline);check('P12 baseline unchanged',await page.locator('#baseline-probability').innerText()==='42%');
|
||||
check('P05 Jev disabled',await page.getByRole('radio',{name:'Jev官方服务(未配置)'}).isDisabled());
|
||||
await page.getByRole('radio',{name:'关闭专项核查',exact:true}).check();check('P05 off label',(await page.locator('#model-status').innerText()).includes('已关闭'));check('P12 provider preserves baseline',await page.locator('#baseline-probability').innerText()==='42%');
|
||||
await page.locator('#tab-simulation').click();check('P12 provider preserves scenario',await page.locator('#sim-prob-val').innerText()==='64%');await page.locator('#tab-overview').click();await page.getByRole('radio',{name:'本地开源模型(演示)',exact:true}).check();
|
||||
await page.locator('#btn-open-drawer-1').click();await page.locator('#evidence-basis-tab').click();check('P02 evidence',await page.locator('#evidence-basis').isVisible());await page.keyboard.press('Escape');
|
||||
await page.locator('#tab-experience').click();check('P03 experience',await page.locator('#panel-experience').isVisible());await page.locator('#tab-overview').click();
|
||||
await page.locator('#btn-generate-list').click();check('P06 checklist',await page.locator('#checklist-dialog').isVisible());await page.keyboard.press('Escape');
|
||||
await page.locator('#nav-link-4').click();check('P07 validation',await page.locator('#validation-dialog').isVisible());await page.keyboard.press('Escape');
|
||||
for(const width of [1440,1024,390]){
|
||||
await page.setViewportSize({width,height:1000});
|
||||
for(const tab of ['overview','simulation']){
|
||||
await page.locator('#tab-'+tab).click();await page.locator('[data-sd-id="8"]').evaluate(e=>e.scrollTop=0);await shot(`responsive-${width}-${tab}`);
|
||||
check(`P13 document width ${width}/${tab}`,await page.evaluate(()=>document.documentElement.scrollWidth<=innerWidth));
|
||||
check(`P13 content width ${width}/${tab}`,await page.locator('[data-sd-id="8"]').evaluate(e=>e.scrollWidth<=e.clientWidth+1));
|
||||
}
|
||||
}
|
||||
check('P07 mobile nav closed',!await page.locator('#prototype-navigation').isVisible());await page.locator('#mobile-menu').click();check('P07 mobile nav opens',await page.locator('#prototype-navigation').isVisible());await page.locator('#nav-link-2').click();check('P07 mobile navigation',await page.locator('#panel-experience').isVisible()&&!await page.locator('#prototype-navigation').isVisible());
|
||||
check('no runtime errors',errors.length===0);
|
||||
}catch(e){checks.push({name:'execution',passed:false,error:e.message});await shot('failure');}
|
||||
await browser.close();const result={status:checks.every(x=>x.passed)?'PASS':'FAIL',target:process.env.PROTOTYPE_URL||'saved prototype',checks,errors,boundary:'Fictional prototype only; no backend/model connection or independent visual review'};fs.writeFileSync(path.join(dir,'interaction-checks.json'),JSON.stringify(result,null,2));console.log(JSON.stringify(result,null,2));process.exit(result.status==='PASS'?0:1);
|
||||
})();
|
||||
@@ -0,0 +1,40 @@
|
||||
// Shared radar assertions for the standalone prototype test runner.
|
||||
module.exports = async function verifyRadar({page,check,shot}) {
|
||||
const dimensions=['回款核验','财务勾稽','权属核验','交易要素','经验适配','规则覆盖'];
|
||||
await page.locator('#tab-overview').click();
|
||||
check('P14 baseline radar visible',await page.locator('#radar-baseline').isVisible());
|
||||
const points=await page.locator('#radar-baseline polygon[data-series="baseline"]').getAttribute('points');
|
||||
check('P14 six vertices',points.trim().split(/\s+/).length===6);
|
||||
for(let i=0;i<6;i++){
|
||||
const button=page.locator(`button[data-dimension="${i}"][data-context="baseline"]`).first();
|
||||
await button.focus();await page.keyboard.press('Enter');
|
||||
check(`P15 dimension ${i} title`,(await page.locator('#dimension-title').innerText()).includes(dimensions[i]));
|
||||
const trace=await page.locator('#dimension-trace').innerText();
|
||||
for(const term of ['数据卡','Skill','Tools','Rules','read_'])check(`P15 ${i} trace ${term}`,trace.includes(term));
|
||||
check(`P15 ${i} simulated trace`,trace.includes('演示'));
|
||||
await page.keyboard.press('Escape');check(`P15 ${i} focus return`,await button.evaluate(e=>e===document.activeElement));
|
||||
}
|
||||
await page.locator('#radar-baseline [data-dimension="2"]').click();check('P15 radar axis clickable',(await page.locator('#dimension-title').innerText()).includes('权属核验'));await page.keyboard.press('Escape');
|
||||
await page.locator('#btn-probability-method').click();
|
||||
check('P16 baseline lookup', (await page.locator('#method-result').innerText()).includes('42%'));
|
||||
check('P16 demo table version',(await page.locator('#probability-method-dialog').innerText()).includes('DEMO-TABLE-v1'));
|
||||
await shot('radar-method-baseline');await page.keyboard.press('Escape');
|
||||
await page.locator('#tab-simulation').click();
|
||||
const scenarioBase=await page.locator('#radar-scenario polygon[data-series="baseline"]').getAttribute('points');
|
||||
const basePoints=scenarioBase.trim().split(/\s+/);
|
||||
for(const [bank,title,key,value] of [[false,false,'00',42],[true,false,'10',58],[true,true,'11',64],[false,true,'01',51],[false,false,'00',42]]){
|
||||
await page.locator('#assume-bank').setChecked(bank);await page.locator('#assume-title').setChecked(title);
|
||||
const selected=(await page.locator('#radar-scenario polygon[data-series="scenario"]').getAttribute('points')).trim().split(/\s+/);
|
||||
check(`P17 unchanged baseline ${key}`,await page.locator('#radar-scenario polygon[data-series="baseline"]').getAttribute('points')===scenarioBase);
|
||||
check(`P17 independent baseline ${key}`,await page.locator('#radar-baseline polygon[data-series="baseline"]').getAttribute('points')===points);
|
||||
check(`P17 cash axis ${key}`,bank?selected[0]!==basePoints[0]:selected[0]===basePoints[0]);
|
||||
check(`P17 title axis ${key}`,title?selected[2]!==basePoints[2]:selected[2]===basePoints[2]);
|
||||
check(`P17 other axes ${key}`,[1,3,4,5].every(i=>selected[i]===basePoints[i]));
|
||||
await page.locator('#btn-scenario-method').click();check(`P16 scenario result ${key}`,(await page.locator('#method-result').innerText()).includes(value+'%'));
|
||||
check(`P16 selected row ${key}`,await page.locator('#method-row-'+key).getAttribute('aria-selected')==='true');await page.keyboard.press('Escape');
|
||||
}
|
||||
await page.locator('#assume-bank').check();await page.locator('#assume-title').check();
|
||||
await page.locator('button[data-dimension="0"][data-context="scenario"]').first().click();check('P15 scenario labeled assumption',(await page.locator('#dimension-trace').innerText()).includes('假设'));await shot('radar-dimension-scenario');await page.keyboard.press('Escape');
|
||||
await page.locator('#radar-scenario').scrollIntoViewIfNeeded();await shot('radar-scenario-overlay');
|
||||
await page.locator('#tab-overview').click();await page.locator('[data-sd-id="8"]').evaluate(e=>e.scrollTop=0);await shot('radar-overview');
|
||||
};
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 121 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 119 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 97 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 163 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 108 KiB |
@@ -0,0 +1,473 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
|
||||
<title>兴邦金租 - 智审工作台</title>
|
||||
<meta content="same-origin" name="view-transition"/>
|
||||
<script src="https://cdn.tailwindcss.com"></script>
|
||||
<script src="https://code.iconify.design/iconify-icon/1.0.7/iconify-icon.min.js"></script>
|
||||
<script>
|
||||
tailwind.config = {
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
nav: { bg: '#102B27', active: '#244D41', text: '#F3F7F5', muted: '#B1C6BE' },
|
||||
canvas: '#F3F5F4',
|
||||
card: '#FFFFFF',
|
||||
panel: '#F8FAF9',
|
||||
border: '#DCE4DF',
|
||||
ink: { main: '#182D26', sub: '#52675C', mute: '#64766C' },
|
||||
primary: { DEFAULT: '#17634C', hover: '#124F3D', text: '#FFFFFF' },
|
||||
warning: { text: '#805418', bg: '#FBF2DF' },
|
||||
risk: { text: '#A33C38', bg: '#FBEFEC' },
|
||||
tech: { line: '#226A7A', bg: '#EDF5F7' },
|
||||
normal: { text: '#17634C', bg: '#EAF3EC' }
|
||||
},
|
||||
fontFamily: { sans: ['Microsoft YaHei', 'PingFang SC', 'sans-serif'] },
|
||||
spacing: { 4: '4px', 8: '8px', 12: '12px', 16: '16px', 20: '20px', 24: '24px', 32: '32px', 40: '40px', 48: '48px' },
|
||||
borderRadius: { button: '8px', panel: '12px' },
|
||||
boxShadow: { card: '0 4px 20px rgba(16,43,39,.04)' },
|
||||
transitionDuration: { 160: '160ms', 200: '200ms' }
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style>
|
||||
body { font-family: 'Microsoft YaHei', 'PingFang SC', sans-serif; background-color: #F3F5F4; color: #182D26; margin: 0; padding: 0; }
|
||||
*:focus-visible { outline: 2px solid #17634C; outline-offset: 2px; }
|
||||
@media (prefers-reduced-motion: reduce) { * { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; scroll-behavior: auto !important; } }
|
||||
::-webkit-scrollbar { width: 6px; height: 6px; }
|
||||
::-webkit-scrollbar-track { background: transparent; }
|
||||
::-webkit-scrollbar-thumb { background: #DCE4DF; border-radius: 3px; }
|
||||
::-webkit-scrollbar-thumb:hover { background: #B1C6BE; }
|
||||
[hidden]{display:none!important}main,body [data-sd-id="9"]{min-width:0}button,a,input{touch-action:manipulation}button{cursor:pointer}button:disabled,input:disabled{cursor:not-allowed}
|
||||
#prototype-navigation{flex-shrink:0}#prototype-navigation a:hover,#prototype-navigation a.is-active{background:#244D41;border-radius:8px}#prototype-navigation a:first-child:hover{background:transparent}
|
||||
body [data-sd-id="3"]{gap:16px}body [data-sd-id="5"]{font-size:12px}body [data-sd-id="6"]{white-space:nowrap}body [data-sd-id="11"],body [data-sd-id="14"],body [data-sd-id="20"]{flex-wrap:wrap;gap:16px}body [data-sd-id="22"]{font-size:24px}body [data-sd-id="12"]{font-weight:600}
|
||||
body [data-sd-id="46"]{padding-left:0;padding-right:0;gap:12px}body [data-sd-id="46"] button{padding:12px;min-width:0}body [data-sd-id="60"]{padding:16px 12px;font-size:14px;max-width:104px}body [data-sd-id="42"]{min-height:280px}
|
||||
#panel-overview body [data-sd-id="70"],#panel-overview body [data-sd-id="79"]{font-size:15px}.mobile-menu{display:none}
|
||||
.proto-panel{background:#fff;border:1px solid #DCE4DF;border-radius:12px;padding:24px}.proto-panel h2,.center-dialog h2,.evidence-dialog h2{font-size:22px;font-weight:600;margin:8px 0 16px}.proto-panel h3,.evidence-dialog h3{font-size:16px;font-weight:600;margin:8px 0}.proto-panel p,.evidence-dialog p,.center-dialog p{font-size:15px;line-height:1.75;margin:8px 0 16px}.muted{color:#64766C}.section-eyebrow{font-size:12px;letter-spacing:1.5px;color:#52675C}.notice{padding:16px;border-radius:8px;background:#FBF2DF;color:#805418;font-size:14px;line-height:1.7;margin:16px 0}
|
||||
.experience-timeline{list-style:none;padding:16px 0;margin:0}.experience-timeline li{display:flex;gap:16px;position:relative;padding-bottom:24px}.experience-timeline li:not(:last-child):before{content:'';position:absolute;left:19px;top:40px;bottom:0;width:1px;background:#DCE4DF}.step-num{width:40px;height:40px;display:grid;place-items:center;border:1px solid #DCE4DF;border-radius:50%;background:#F8FAF9;color:#17634C;font-size:14px;flex-shrink:0}.experience-timeline small{font-size:12px;color:#64766C}.condition-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin:16px 0}.condition-grid>div{background:#F8FAF9;border:1px solid #DCE4DF;border-radius:8px;padding:16px}.condition-grid strong{color:#17634C;font-size:15px}.condition-grid small{font-size:12px;color:#64766C}
|
||||
.primary-button{background:#17634C;color:#fff;border:0;border-radius:8px;min-height:44px;padding:12px 24px;font-size:14px;font-weight:600;margin-top:16px}.primary-button:hover{background:#124F3D}.text-action{color:#17634C;font-size:14px;min-height:44px;text-align:left}.scenario-choice{display:flex;gap:12px;align-items:flex-start;padding:16px;border:1px solid #DCE4DF;border-radius:8px;margin:12px 0;cursor:pointer}.scenario-choice input{margin-top:5px;accent-color:#17634C;width:16px;height:16px}.scenario-choice small{display:block;color:#64766C;font-size:13px;margin-top:8px}
|
||||
dialog{color:#182D26;border:1px solid #DCE4DF;box-shadow:0 16px 48px rgba(16,43,39,.16);padding:24px;background:#fff}dialog::backdrop{background:rgba(16,43,39,.32)}.center-dialog{width:min(560px,calc(100% - 32px));border-radius:12px;max-height:90vh}.evidence-dialog{height:100dvh;max-height:100dvh;width:min(520px,100%);max-width:100%;margin:0 0 0 auto;border-radius:12px 0 0 12px;border-right:0}.dialog-header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;border-bottom:1px solid #DCE4DF;margin-bottom:20px}.close-button{width:44px;height:44px;font-size:28px;color:#52675C;flex-shrink:0}.drawer-tabs{display:flex;gap:24px;border-bottom:1px solid #DCE4DF;margin-bottom:24px}.drawer-tabs button{min-height:44px;font-size:14px}.drawer-tabs [aria-selected=true]{border-bottom:2px solid #17634C;color:#17634C}blockquote{font-size:18px;line-height:1.9;border-left:3px solid #17634C;padding:24px;background:#F8FAF9;margin:24px 0}.checklist{list-style:decimal;padding-left:24px;font-size:15px;line-height:1.8}.checklist li{padding:8px 0}.checklist p{color:#52675C}
|
||||
@media(max-width:1100px){body [data-sd-id="8"]{flex-direction:column}body [data-sd-id="82"]{width:100%;display:grid;grid-template-columns:1fr 1fr}body [data-sd-id="5"]{line-height:1.6}body [data-sd-id="6"]{display:none}}
|
||||
@media(max-width:768px){.mobile-menu{display:flex;font-size:22px;min-width:44px;height:44px;align-items:center;justify-content:center}#prototype-navigation{display:none!important;position:fixed;top:68px;bottom:0;left:0;z-index:30;min-height:0!important;box-shadow:0 16px 48px rgba(16,43,39,.16)}#prototype-navigation.mobile-open{display:flex!important}body [data-sd-id="8"]{padding:20px}body [data-sd-id="3"]{padding:8px 12px}body [data-sd-id="12"]{font-size:24px}body [data-sd-id="19"]{padding:20px}body [data-sd-id="82"]{display:flex}body [data-sd-id="46"]{display:grid;grid-template-columns:1fr 1fr}body [data-sd-id="53"]{gap:12px}body [data-sd-id="60"]{max-width:none;text-align:center}body [data-sd-id="44"]{display:none}.condition-grid{grid-template-columns:1fr}body [data-sd-id="37"]{gap:24px}body [data-sd-id="26"]{gap:32px}body [data-sd-id="14"]{font-size:14px}.proto-panel{padding:20px}}
|
||||
body [data-sd-id="60"]{min-width:112px;max-width:none;white-space:nowrap;text-align:center}input[type=radio]{accent-color:#17634C}#prototype-navigation>a.is-active{background:transparent}
|
||||
|
||||
#probability-hero{flex-wrap:wrap}#probability-hero>div{flex-wrap:wrap;gap:12px}#probability-hero>div>span:last-child{white-space:nowrap}#sim-prob-delta{white-space:nowrap}#basis-dialog>div{padding:0;height:auto!important}body [data-sd-id="9"]{flex-shrink:0}
|
||||
.radar-polygon { transition: all 300ms ease; }
|
||||
.radar-polygon-sandbox { fill: rgba(23,99,76,0.15); stroke: #17634C; stroke-width: 2; }
|
||||
.radar-polygon-baseline { fill: transparent; stroke: #DCE4DF; stroke-width: 1; stroke-dasharray: 4; }
|
||||
.radar-axis { stroke: #DCE4DF; stroke-width: 1; }
|
||||
.radar-tick { stroke: #B1C6BE; stroke-width: 1; }
|
||||
.radar-label { font-size: 11px; fill: #52675C; cursor: pointer; }
|
||||
.radar-label:hover { fill: #17634C; font-weight: bold; }
|
||||
|
||||
body #probability-hero{display:block;width:100%;background:#102B27;color:#F3F7F5;border:1px solid #244D41;border-radius:12px;padding:20px;background-image:linear-gradient(#B1C6BE08 1px,transparent 1px),linear-gradient(90deg,#B1C6BE08 1px,transparent 1px);background-size:24px 24px}
|
||||
.cockpit-heading{display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;font-size:12px;letter-spacing:1px;color:#B1C6BE}.cockpit-badge{border:1px solid #52675C;border-radius:20px;padding:3px 10px}.cockpit-grid{display:grid;grid-template-columns:minmax(190px,.8fr) minmax(260px,1.2fr);gap:16px;align-items:center}.probability-center{text-align:center}.probability-ring{position:relative;width:200px;height:200px;margin:0 auto}.probability-ring svg{width:100%;height:100%}.ring-ticks{fill:none;stroke:#52675C;stroke-width:2;stroke-dasharray:1 7}.ring-track{fill:none;stroke:#244D41;stroke-width:8}.ring-value{fill:none;stroke:#B1C6BE;stroke-width:8;stroke-linecap:round;transform:rotate(-90deg);transform-origin:100px 100px}.ring-copy{position:absolute;inset:0;display:flex;flex-direction:column;justify-content:center;align-items:center;gap:8px}.ring-copy strong{font-size:46px;line-height:1;font-weight:600;letter-spacing:-2px}.ring-copy span{font-size:12px;color:#B1C6BE}.cockpit-button{border:1px solid #B1C6BE;border-radius:8px;padding:10px 16px;font-size:14px;color:#F3F7F5;min-height:44px}.cockpit-button:hover{background:#244D41}.cockpit-muted{font-size:12px;color:#B1C6BE;margin-top:12px}.radar-caption{font-size:15px;font-weight:600;display:flex;justify-content:space-between;gap:12px}.radar-caption small{font-size:12px;color:#B1C6BE}.radar-chart svg{width:100%;height:auto;max-height:275px;overflow:visible;display:block}.radar-chart .grid-line{fill:none;stroke:currentColor;opacity:.25;stroke-width:1}.radar-chart .stage-label{font-size:10px;fill:currentColor;opacity:.75}.radar-chart .dimension-label{font-size:12px;fill:currentColor;cursor:pointer}.radar-chart .dimension-label:hover{text-decoration:underline}.radar-chart [data-series=baseline]{fill:#B1C6BE22;stroke:#B1C6BE;stroke-width:2}.dimension-list{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px}.dimension-list button{font-size:12px;text-align:left;padding:8px;border:1px solid #52675C;border-radius:6px;min-height:44px}.dimension-list b{font-weight:500;display:block}.dimension-list span{font-size:11px;color:#B1C6BE}.dimension-list button:hover{background:#244D41}.cockpit-foot{font-size:12px;line-height:1.8;color:#F3F7F5;border-top:1px solid #52675C;padding-top:12px;margin-top:16px}.cockpit-foot span{color:#B1C6BE}.trace-strip{display:flex;flex-wrap:wrap;align-items:center;gap:8px 16px;font-size:12px;color:#52675C}.trace-strip .text-action{font-size:12px;min-height:36px}.scenario-radar-card{min-width:0;flex:1;background:#F8FAF9;border:1px solid #DCE4DF;border-radius:12px;padding:20px;color:#52675C}.scenario-probabilities{display:flex;justify-content:space-between;gap:16px}.scenario-probabilities>div:last-child{text-align:right}.scenario-probabilities small{display:block;font-size:12px}.scenario-probabilities strong{display:block;font-size:30px;color:#17634C}.scenario-probabilities #sim-prob-delta{font-size:12px;color:#17634C;display:block;white-space:nowrap}.scenario-meter{height:5px;background:#DCE4DF;border-radius:4px;margin:12px 0;overflow:hidden}.scenario-meter>div{height:100%;background:#17634C;transition:width 180ms}.radar-legend{display:flex;justify-content:center;gap:16px;font-size:12px}.scenario-radar-card [data-series=baseline]{fill:none;stroke:#64766C;stroke-dasharray:5 4}.scenario-radar-card [data-series=scenario]{fill:#17634C22;stroke:#17634C;stroke-width:2}.scenario-radar-card .dimension-list{grid-template-columns:repeat(2,minmax(0,1fr))}.scenario-radar-card .dimension-list button{border-color:#DCE4DF}.scenario-radar-card .dimension-list span{color:#52675C}.scenario-radar-card .dimension-list button:hover{background:#EAF3EC}.proto-panel .radar-help{font-size:12px;line-height:1.65;margin:12px 0;color:#64766C}.method-table{width:100%;font-size:14px;border-collapse:collapse}.method-table caption{font-size:12px;color:#64766C;text-align:left;margin-bottom:12px}.method-table th,.method-table td{padding:12px 8px;border-bottom:1px solid #DCE4DF;text-align:left}.method-table [aria-selected=true]{background:#EAF3EC;color:#17634C;font-weight:600;outline:1px solid #17634C}.method-subheading{font-size:17px;font-weight:600;margin:24px 0 12px}.trace-chain{list-style:none;padding:0;margin:0}.trace-chain li{border-left:2px solid #B1C6BE;padding:0 0 16px 16px;margin-left:5px}.trace-chain li b{font-size:14px}.trace-chain li p{font-size:14px;overflow-wrap:anywhere}.trace-chip{font-size:12px;color:#52675C;background:#F8FAF9;padding:8px;border:1px solid #DCE4DF;border-radius:6px;overflow-wrap:anywhere}.cockpit-grid *:focus-visible{outline-color:#B1C6BE}body [role=tab][data-tab][aria-selected=false]{border-color:transparent!important}
|
||||
@media(max-width:1250px) and (min-width:1101px){.cockpit-grid{grid-template-columns:1fr}.probability-ring{width:170px;height:170px}}
|
||||
@media(max-width:768px){body #probability-hero{padding:16px}.cockpit-grid{grid-template-columns:1fr}.radar-chart svg{max-height:none}.probability-ring{width:180px;height:180px}.cockpit-heading{font-size:11px}.dimension-list{grid-template-columns:repeat(2,minmax(0,1fr))}.scenario-radar-card{padding:12px}.radar-caption{margin-top:16px}.trace-strip{line-height:1.8}}
|
||||
@media(max-width:768px){.radar-chart .dimension-label{font-size:16px}.radar-chart .stage-label{font-size:14px}}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="min-h-screen flex w-full max-w-[1440px] mx-auto bg-canvas overflow-hidden" data-sd-id="1">
|
||||
<aside id="prototype-navigation" style="width:216px;min-height:100vh;background:#102B27;color:#F3F7F5;display:flex;flex-direction:column;padding:32px 16px;font-family:'Microsoft YaHei','PingFang SC',sans-serif;box-sizing:border-box">
|
||||
<a href="#overview" id="nav-link-0" style="display:block;padding:0 12px 32px;text-decoration:none;color:inherit"><strong style="font-size:22px;letter-spacing:2px">兴邦金租</strong><span style="display:block;font-size:12px;letter-spacing:3px;color:#B1C6BE;margin-top:8px">智审工作台</span></a>
|
||||
<div style="padding:0 12px 12px;color:#B1C6BE;font-size:12px">业务工作区</div>
|
||||
<nav aria-label="兴邦预审导航" style="display:flex;flex-direction:column;gap:8px">
|
||||
<a class="flex items-center gap-3 rounded-lg px-3 py-3 text-sm" data-nav="overview" href="#overview" id="nav-link-1" style="text-decoration:none;color:inherit"><iconify-icon icon="lucide:layout-dashboard" style="width:18px;height:18px;font-size:18px"></iconify-icon>项目预审</a>
|
||||
<a class="flex items-center gap-3 rounded-lg px-3 py-3 text-sm" data-nav="experience" href="#experience" id="nav-link-2" style="text-decoration:none;color:inherit"><iconify-icon icon="lucide:history" style="width:18px;height:18px;font-size:18px"></iconify-icon>历史经验</a>
|
||||
<a class="flex items-center gap-3 rounded-lg px-3 py-3 text-sm" data-nav="simulation" href="#simulation" id="nav-link-3" style="text-decoration:none;color:inherit"><iconify-icon icon="lucide:git-branch" style="width:18px;height:18px;font-size:18px"></iconify-icon>推进沙盘</a>
|
||||
<a class="flex items-center gap-3 rounded-lg px-3 py-3 text-sm" data-nav="validation" href="#validation" id="nav-link-4" style="text-decoration:none;color:inherit"><iconify-icon icon="lucide:chart-no-axes-combined" style="width:18px;height:18px;font-size:18px"></iconify-icon>验证看板</a>
|
||||
</nav>
|
||||
<div style="margin-top:auto;padding:32px 12px 0"><div style="border-top:1px solid #244D41;padding-top:24px"><span style="font-size:14px">演示评审员</span><p style="font-size:12px;line-height:1.6;color:#B1C6BE;margin:8px 0 0">历史经验驱动<br/>每一步判断都有依据</p></div></div>
|
||||
</aside>
|
||||
<main class="flex-1 flex flex-col h-screen overflow-hidden" data-sd-id="2">
|
||||
<div class="bg-warning-bg text-warning-text px-32 py-12 text-[14px] flex items-center justify-between border-b border-warning-text/10 shrink-0" data-sd-id="3">
|
||||
<button aria-expanded="false" aria-label="打开导航" class="mobile-menu" id="mobile-menu"><iconify-icon icon="lucide:menu"></iconify-icon></button>
|
||||
<div class="flex items-center gap-8" data-sd-id="4">
|
||||
<iconify-icon icon="lucide:alert-circle"></iconify-icon>
|
||||
<span data-sd-id="5">原型演示 · 未连接真实数据与模型。所有材料、判断、数值为虚构演示。综合意见不是正式审批意见。</span>
|
||||
</div>
|
||||
<div class="flex items-center gap-16" data-sd-id="6">
|
||||
<span class="flex items-center gap-4" data-sd-id="7">
|
||||
<iconify-icon icon="lucide:user"></iconify-icon>
|
||||
演示评审员
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex-1 overflow-y-auto p-32 flex gap-24 relative" data-sd-id="8">
|
||||
<div class="flex-1 flex flex-col gap-24" data-sd-id="9">
|
||||
<header class="flex flex-col gap-12" data-sd-id="10">
|
||||
<div class="flex items-center gap-16" data-sd-id="11">
|
||||
<h1 class="text-[28px] font-bold leading-tight" data-sd-id="12">恒远精密设备有限公司</h1>
|
||||
<span class="bg-normal-bg text-normal-text px-12 py-4 rounded-full text-[12px] font-medium border border-normal-text/20" data-sd-id="13">项目 DEMO-026</span>
|
||||
</div>
|
||||
<div class="flex items-center gap-24 text-[16px] text-ink-sub" data-sd-id="14">
|
||||
<span class="flex items-center gap-8" data-sd-id="15"><iconify-icon icon="lucide:briefcase"></iconify-icon>设备直租</span>
|
||||
<span class="flex items-center gap-8" data-sd-id="16"><iconify-icon icon="lucide:coins"></iconify-icon>融资 3,000 万元</span>
|
||||
<span class="flex items-center gap-8" data-sd-id="17"><iconify-icon icon="lucide:calendar"></iconify-icon>36 个月</span>
|
||||
<span class="flex items-center gap-8" data-sd-id="18"><iconify-icon icon="lucide:settings"></iconify-icon>装备制造</span>
|
||||
</div>
|
||||
</header>
|
||||
<section class="bg-card rounded-panel p-32 shadow-card border border-border flex flex-col gap-24" data-sd-id="19">
|
||||
<div class="flex justify-between items-start" data-sd-id="20">
|
||||
<div class="flex flex-col gap-8 w-full max-w-3xl" data-sd-id="21">
|
||||
<div class="probability-cockpit" id="probability-hero">
|
||||
<div class="cockpit-heading"><span>DECISION INTELLIGENCE / 预审透视</span><span class="cockpit-badge">DEMO · 人工演示</span></div>
|
||||
<div class="cockpit-grid"><div class="probability-center"><div class="probability-ring"><svg aria-hidden="true" viewbox="0 0 200 200"><circle class="ring-ticks" cx="100" cy="100" r="87"></circle><circle class="ring-track" cx="100" cy="100" r="73"></circle><circle class="ring-value" cx="100" cy="100" pathlength="100" r="73" stroke-dasharray="42 100"></circle></svg><div class="ring-copy"><strong id="baseline-probability">42%</strong><span>审批通过概率 · 演示值</span></div></div><button class="cockpit-button" id="btn-probability-method">42% 如何得到 <span aria-hidden="true">↗</span></button><p class="cockpit-muted">依据可追溯 · 正式审批由人工决定</p></div>
|
||||
<div class="radar-main"><div class="radar-caption">六维证据雷达 <small>基线 / 阶段 0—4</small></div><div class="radar-chart"><svg aria-label="六维证据核验阶段,详细内容见下方维度按钮" id="radar-baseline" role="group" viewbox="-180 -140 360 280"></svg></div><div class="dimension-list" data-dimension-list="baseline"></div></div></div>
|
||||
<div class="cockpit-foot">证据阶段 ≠ 审批概率 · 雷达面积不换算为 42%<br/><span>0 未提供 · 1 仅有说明 · 2 资料待核 · 3 交叉核验 · 4 人工复核</span></div>
|
||||
</div><div class="trace-strip"><span><b>miniOpenClaw</b> 受控编排</span><span>数据卡 → Skills → Tools → Rules → 主审</span><button class="text-action" id="btn-show-basis">查看判断依据 ↗</button></div>
|
||||
<div class="text-[12px] text-warning-text bg-warning-bg px-12 py-8 rounded-button border border-warning-text/20 inline-flex w-fit items-center gap-6 mb-8">
|
||||
<iconify-icon class="text-[14px]" icon="lucide:info"></iconify-icon> 人工设定,仅演示交互;未经历史数据校准。目标定义:以本次材料版本提交后的首次审批通过。
|
||||
</div>
|
||||
<h2 class="text-[24px] font-bold text-ink-main mt-4" data-sd-id="22" id="real-recommendation">主审意见:补充材料后再判断</h2>
|
||||
<p class="text-[16px] text-ink-sub max-w-2xl leading-relaxed" data-sd-id="23">
|
||||
经营现金流与回款说明存在待核实差异,建议先补齐两项关键证据,再推进评审。
|
||||
</p>
|
||||
</div>
|
||||
<div class="flex gap-16 items-start shrink-0" data-sd-id="24">
|
||||
<button class="h-[44px] px-24 bg-primary text-primary-text rounded-button text-[14px] font-medium transition-colors duration-160 hover:bg-primary-hover flex items-center gap-8 focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-primary" data-sd-id="25" id="btn-generate-list">
|
||||
<iconify-icon icon="lucide:list-checks"></iconify-icon>
|
||||
生成补件清单
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex gap-40 pt-24 border-t border-border mt-8" data-sd-id="26">
|
||||
<div class="flex flex-col gap-4" data-sd-id="27">
|
||||
<span class="text-[12px] text-ink-mute uppercase tracking-wider" data-sd-id="28">引用材料</span>
|
||||
<span class="text-[20px] font-medium" data-sd-id="29">6 份</span>
|
||||
</div>
|
||||
<div class="flex flex-col gap-4" data-sd-id="30">
|
||||
<span class="text-[12px] text-ink-mute uppercase tracking-wider" data-sd-id="31">参考经验</span>
|
||||
<span class="text-[20px] font-medium" data-sd-id="32">3 条</span>
|
||||
</div>
|
||||
<div class="flex flex-col gap-4" data-sd-id="33">
|
||||
<span class="text-[12px] text-warning-text uppercase tracking-wider font-medium" data-sd-id="34">待补充项</span>
|
||||
<span class="text-[20px] font-medium text-warning-text" data-sd-id="35">2 项</span>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="flex flex-col gap-24 flex-1" data-sd-id="36">
|
||||
<div aria-label="预审内容" class="flex items-center gap-32 border-b border-border" data-sd-id="37" role="tablist">
|
||||
<button aria-controls="panel-overview" aria-selected="true" class="pb-12 text-[16px] font-medium text-primary border-b-2 border-primary" data-sd-id="38" data-tab="overview" id="tab-overview" role="tab">综合预审</button>
|
||||
<button aria-controls="panel-experience" aria-selected="false" class="pb-12 text-[16px] font-medium text-ink-sub hover:text-ink-main transition-colors duration-160 border-b-2 border-transparent" data-sd-id="39" data-tab="experience" id="tab-experience" role="tab">历史经验</button>
|
||||
<button aria-controls="panel-simulation" aria-selected="false" class="pb-12 text-[16px] font-medium text-ink-sub hover:text-ink-main transition-colors duration-160 border-b-2 border-transparent" data-sd-id="40" data-tab="simulation" id="tab-simulation" role="tab">推进沙盘</button>
|
||||
</div>
|
||||
<div aria-labelledby="tab-overview" class="flex flex-col gap-24" data-sd-id="41" id="panel-overview" role="tabpanel">
|
||||
<div class="bg-panel rounded-panel p-24 border border-border flex flex-col gap-16 min-h-[300px] relative overflow-hidden" data-sd-id="42">
|
||||
<h3 class="text-[14px] font-medium text-ink-main flex items-center gap-8" data-sd-id="43">
|
||||
<iconify-icon icon="lucide:git-merge"></iconify-icon>
|
||||
证据关系图
|
||||
</h3>
|
||||
<div class="absolute inset-0 top-[60px] flex items-center justify-center pointer-events-none opacity-50" data-sd-id="44">
|
||||
<svg data-sd-id="45" height="100%" preserveaspectratio="xMidYMid meet" viewbox="0 0 800 200" width="100%">
|
||||
<path d="M 100 100 L 250 100 L 400 50 L 600 100" fill="none" stroke="#226A7A" stroke-dasharray="4 4" stroke-width="2"></path>
|
||||
<path d="M 250 100 L 400 150 L 600 100" fill="none" stroke="#805418" stroke-width="3"></path>
|
||||
<circle cx="100" cy="100" fill="#17634C" r="6"></circle>
|
||||
<circle cx="250" cy="100" fill="#17634C" r="6"></circle>
|
||||
<circle cx="400" cy="50" fill="#226A7A" r="6"></circle>
|
||||
<circle cx="400" cy="150" fill="#805418" r="6"></circle>
|
||||
<circle cx="600" cy="100" fill="#182D26" r="8"></circle>
|
||||
</svg>
|
||||
</div>
|
||||
<div class="flex-1 flex items-center justify-between px-48 z-10" data-sd-id="46">
|
||||
<button class="bg-card border border-border px-16 py-12 rounded-panel shadow-sm hover:border-primary transition-colors text-[14px] text-ink-main flex flex-col gap-4 focus-visible:ring-2 focus-visible:ring-primary outline-none" data-sd-id="47" id="node-1">
|
||||
<span class="font-medium" data-sd-id="48">回款说明</span>
|
||||
<span class="text-[12px] text-ink-mute" data-sd-id="49">已提供</span>
|
||||
</button>
|
||||
<button class="bg-card border border-border px-16 py-12 rounded-panel shadow-sm hover:border-primary transition-colors text-[14px] text-ink-main flex flex-col gap-4 focus-visible:ring-2 focus-visible:ring-primary outline-none" data-sd-id="50" id="node-2">
|
||||
<span class="font-medium" data-sd-id="51">账期变化解释</span>
|
||||
<span class="text-[12px] text-ink-mute" data-sd-id="52">待核实</span>
|
||||
</button>
|
||||
<div class="flex flex-col gap-40" data-sd-id="53">
|
||||
<button class="bg-tech-bg border border-tech-line px-16 py-12 rounded-panel shadow-sm hover:bg-tech-bg/80 transition-colors text-[14px] text-ink-main flex flex-col gap-4 focus-visible:ring-2 focus-visible:ring-tech-line outline-none" data-sd-id="54" id="node-3">
|
||||
<span class="font-medium" data-sd-id="55">专项支持</span>
|
||||
<span class="text-[12px] text-tech-line" data-sd-id="56">不足</span>
|
||||
</button>
|
||||
<button class="bg-warning-bg border border-warning-text/30 px-16 py-12 rounded-panel shadow-sm hover:bg-warning-bg/80 transition-colors text-[14px] text-ink-main flex flex-col gap-4 focus-visible:ring-2 focus-visible:ring-warning-text outline-none" data-sd-id="57" id="node-4">
|
||||
<span class="font-medium" data-sd-id="58">银行流水匹配</span>
|
||||
<span class="text-[12px] text-warning-text font-medium" data-sd-id="59">待补充</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="bg-card border-2 border-ink-main px-24 py-16 rounded-panel shadow-sm text-[16px] font-bold text-ink-main" data-sd-id="60">
|
||||
主审补件建议
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col gap-16" data-sd-id="61">
|
||||
<h3 class="text-[20px] font-bold text-ink-main" data-sd-id="62">关键问题核实</h3>
|
||||
<div class="bg-card rounded-panel border border-border overflow-hidden" data-sd-id="63">
|
||||
<div class="p-20 border-b border-border hover:bg-panel transition-colors flex items-start gap-16" data-sd-id="64">
|
||||
<div class="mt-4 w-8 h-8 rounded-full bg-warning-text shrink-0" data-sd-id="65"></div>
|
||||
<div class="flex-1 flex flex-col gap-8" data-sd-id="66">
|
||||
<div class="flex justify-between items-center" data-sd-id="67">
|
||||
<h4 class="text-[16px] font-medium text-ink-main" data-sd-id="68">回款依据尚不完整</h4>
|
||||
<span class="text-[12px] text-warning-text bg-warning-bg px-8 py-2 rounded-full border border-warning-text/20" data-sd-id="69">待核实</span>
|
||||
</div>
|
||||
<p class="text-[14px] text-ink-sub leading-relaxed" data-sd-id="70">主要客户账期延长,需通过近六个月银行流水穿透核实实际回款情况,当前证据链断裂。</p>
|
||||
<div class="flex gap-12 mt-8" data-sd-id="71">
|
||||
<button class="text-[12px] text-primary hover:text-primary-hover font-medium flex items-center gap-4" data-sd-id="72" id="btn-open-drawer-1">
|
||||
<iconify-icon icon="lucide:file-text"></iconify-icon> 查看原文与依据
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="p-20 hover:bg-panel transition-colors flex items-start gap-16" data-sd-id="73">
|
||||
<div class="mt-4 w-8 h-8 rounded-full bg-warning-text shrink-0" data-sd-id="74"></div>
|
||||
<div class="flex-1 flex flex-col gap-8" data-sd-id="75">
|
||||
<div class="flex justify-between items-center" data-sd-id="76">
|
||||
<h4 class="text-[16px] font-medium text-ink-main" data-sd-id="77">设备权属证明待核实</h4>
|
||||
<span class="text-[12px] text-warning-text bg-warning-bg px-8 py-2 rounded-full border border-warning-text/20" data-sd-id="78">待核实</span>
|
||||
</div>
|
||||
<p class="text-[14px] text-ink-sub leading-relaxed" data-sd-id="79">拟租赁设备发票与实际采购清单存在部分品名不符,需核实底层资产真实权属。</p>
|
||||
<div class="flex gap-12 mt-8" data-sd-id="80">
|
||||
<button class="text-[12px] text-primary hover:text-primary-hover font-medium flex items-center gap-4" data-sd-id="81">
|
||||
<iconify-icon icon="lucide:history"></iconify-icon> 查看历史依据
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<section aria-labelledby="tab-experience" class="proto-panel" hidden="" id="panel-experience" role="tabpanel">
|
||||
<div class="section-eyebrow">EXPERIENCE / 历史示例</div><h2>一条经验,如何改变判断</h2>
|
||||
<p class="muted">案例 H-018 · 制造业设备直租 · 虚构演示案例</p>
|
||||
<ol class="experience-timeline">
|
||||
<li><span class="step-num">01</span><div><small>初审关注</small><h3>利润增长,经营现金流偏弱</h3><p>最初意见:暂不能确认还款来源,要求说明回款变化。</p></div></li>
|
||||
<li><span class="step-num">02</span><div><small>评审问询</small><h3>账期延长,还是回款能力下降?</h3><p>要求提供客户合同、应收账龄与逐笔回款记录,验证解释。</p></div></li>
|
||||
<li><span class="step-num">03</span><div><small>证据补充</small><h3>银行流水与应收明细逐笔匹配</h3><p>历史示例中,补充材料支持主要客户正常结算周期变化。</p><button class="text-action" data-open-evidence="history">查看历史证据示例 ↗</button></div></li>
|
||||
<li><span class="step-num">04</span><div><small>判断变化</small><h3>待核实 → 附条件推进(历史示例)</h3><p>约定持续跟踪回款。此历史意见不能直接用于当前项目。</p></div></li>
|
||||
</ol>
|
||||
<div class="condition-grid"><div><strong>适用条件</strong><p>客户结构稳定,回款与应收记录可逐笔匹配。</p></div><div><strong>例外边界</strong><p>收入集中、关联回款未穿透或材料真实性未核实。</p></div></div>
|
||||
<div class="notice">条件相似不等于结论相同。当前项目仍缺银行流水与权属核验。</div>
|
||||
</section>
|
||||
<section aria-labelledby="tab-simulation" class="proto-panel" hidden="" id="panel-simulation" role="tabpanel">
|
||||
<div class="section-eyebrow">SCENARIO / 证据成熟度推演</div>
|
||||
<h2>补齐证据之后,审批概率如何变化?</h2>
|
||||
<div class="notice">模拟结果,不改变真实项目。仅假设证据真实且核验支持解释;补件也可能发现新风险,实际概率未必上升。</div>
|
||||
<div class="flex flex-col lg:flex-row gap-24 mt-24 mb-24">
|
||||
<div class="flex-1 flex flex-col gap-12">
|
||||
<p class="muted mb-8">选择假设补充核验的材料,观察证据六边形扩张与概率变化:</p>
|
||||
<label class="scenario-choice"><input id="assume-bank" type="checkbox"/> <span><strong>假设银行流水逐笔匹配</strong><small>假设核验支持账期变化解释;只改变回款核验维度</small></span></label>
|
||||
<label class="scenario-choice"><input id="assume-title" type="checkbox"/> <span><strong>假设设备权属证明一致</strong><small>假设合同、发票与设备清单核验一致;只改变权属维度</small></span></label>
|
||||
</div>
|
||||
<div class="scenario-radar-card"><div aria-live="polite" class="scenario-probabilities"><div><small>当前基线 · 演示值</small><strong>42%</strong></div><div><small>所选情景 · 演示值</small><strong id="sim-prob-val">42%</strong><span id="sim-prob-delta">+0 百分点</span></div></div><div class="scenario-meter"><div id="sim-prob-bar" style="width:42%"></div></div><div class="radar-legend"><span>┄┄ 基线</span><span>━━ 所选假设</span></div><div class="radar-chart"><svg aria-label="六维证据核验阶段,详细内容见下方维度按钮" id="radar-scenario" role="group" viewbox="-180 -140 360 280"></svg></div><div class="dimension-list" data-dimension-list="scenario"></div><p class="radar-help">证据阶段 ≠ 审批概率;0 未提供 · 1 仅有说明 · 2 资料待核 · 3 交叉核验 · 4 人工复核</p><p class="radar-help">人工设定,仅演示交互;未经历史数据校准</p><button class="text-action" id="btn-scenario-method">所选情景概率如何得到 ↗</button></div>
|
||||
</div>
|
||||
<button class="primary-button" id="run-simulation">查看模拟判断依据</button>
|
||||
<p aria-live="polite" class="muted mt-12" id="simulation-feedback">概率、原因与待核实事项随勾选即时更新。</p>
|
||||
<div aria-live="polite" class="condition-grid mt-16" id="simulation-comparison">
|
||||
<div><small>真实预审 · 保持不变</small><h3>2 项待核实</h3><p>补充材料后再判断</p></div>
|
||||
<div><small>模拟情景 · 假设成立时</small><h3 id="sim-remaining"></h3><p id="sim-explanation"></p><strong>仍需人工复核</strong></div>
|
||||
</div>
|
||||
<button class="text-action mt-24 block" data-tab="overview">← 返回真实预审</button>
|
||||
</section>
|
||||
</section>
|
||||
</div>
|
||||
<aside class="w-[320px] shrink-0 flex flex-col gap-24" data-sd-id="82">
|
||||
<div class="bg-card rounded-panel p-24 border border-border shadow-card flex flex-col gap-16" data-sd-id="83">
|
||||
<h3 class="text-[16px] font-bold text-ink-main flex items-center gap-8" data-sd-id="84">
|
||||
<iconify-icon icon="lucide:arrow-right-circle"></iconify-icon>
|
||||
下一步行动
|
||||
</h3>
|
||||
<div class="flex flex-col gap-12" data-sd-id="85">
|
||||
<label class="flex items-start gap-12 p-12 bg-panel rounded-button border border-border cursor-pointer hover:border-primary transition-colors" data-sd-id="86">
|
||||
<span class="text-primary text-[14px] font-bold shrink-0">1</span>
|
||||
<div class="flex flex-col gap-4" data-sd-id="88">
|
||||
<span class="text-[14px] font-medium text-ink-main" data-sd-id="89">补充近六个月银行流水</span>
|
||||
<span class="text-[12px] text-ink-mute" data-sd-id="90">用于核实账期延长后的实际回款节奏</span>
|
||||
</div>
|
||||
</label>
|
||||
<label class="flex items-start gap-12 p-12 bg-panel rounded-button border border-border cursor-pointer hover:border-primary transition-colors" data-sd-id="91">
|
||||
<span class="text-primary text-[14px] font-bold shrink-0">2</span>
|
||||
<div class="flex flex-col gap-4" data-sd-id="93">
|
||||
<span class="text-[14px] font-medium text-ink-main" data-sd-id="94">核实设备权属</span>
|
||||
<span class="text-[12px] text-ink-mute" data-sd-id="95">提供品名不符的补充说明及采购合同附件</span>
|
||||
</div>
|
||||
</label>
|
||||
</div>
|
||||
<button class="w-full h-[44px] mt-8 bg-card border border-primary text-primary rounded-button text-[14px] font-medium transition-colors duration-160 hover:bg-primary/5 flex items-center justify-center gap-8 focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-primary" data-sd-id="96">
|
||||
<iconify-icon icon="lucide:play"></iconify-icon>
|
||||
模拟补件 (沙盘)
|
||||
</button>
|
||||
</div>
|
||||
<div class="bg-panel rounded-panel p-24 border border-border flex flex-col gap-16" data-sd-id="97">
|
||||
<div class="flex justify-between items-center" data-sd-id="98">
|
||||
<h3 class="text-[14px] font-medium text-ink-main" data-sd-id="99">专项核查模型</h3>
|
||||
<button class="text-ink-mute hover:text-primary transition-colors" data-sd-id="100" title="验证看板">
|
||||
<iconify-icon icon="lucide:bar-chart-2"></iconify-icon>
|
||||
</button>
|
||||
</div>
|
||||
<div class="flex flex-col gap-8" data-sd-id="101">
|
||||
<label class="flex justify-between items-center p-8 -mx-8 rounded-button hover:bg-black/5 cursor-pointer" data-sd-id="102">
|
||||
<span class="text-[14px] text-ink-main" data-sd-id="103">本地开源模型 (演示)</span>
|
||||
<input aria-label="本地开源模型(演示)" checked="" class="text-primary focus:ring-primary" data-sd-id="104" name="model" type="radio" value="local"/>
|
||||
</label>
|
||||
<label class="flex justify-between items-center p-8 -mx-8 rounded-button hover:bg-black/5 cursor-pointer opacity-50" data-sd-id="105" title="未配置官方服务">
|
||||
<span class="text-[14px] text-ink-main" data-sd-id="106">Jev官方服务(未配置)</span>
|
||||
<input aria-label="Jev官方服务(未配置)" class="text-primary focus:ring-primary" data-sd-id="107" disabled="" name="model" type="radio" value="jev"/>
|
||||
</label>
|
||||
<label class="flex justify-between items-center p-8 -mx-8 rounded-button hover:bg-black/5 cursor-pointer" data-sd-id="108">
|
||||
<span class="text-[14px] text-ink-main" data-sd-id="109">关闭专项核查</span>
|
||||
<input aria-label="关闭专项核查" class="text-primary focus:ring-primary" data-sd-id="110" name="model" type="radio" value="off"/>
|
||||
</label>
|
||||
</div>
|
||||
<p aria-live="polite" class="text-[12px] text-ink-mute mt-4 border-t border-border pt-12" data-sd-id="111" id="model-status">
|
||||
仅演示。无真实模型请求。主审仍可基于证据给出有限意见。
|
||||
</p>
|
||||
</div>
|
||||
</aside>
|
||||
</div>
|
||||
</main>
|
||||
<dialog aria-labelledby="evidence-title" class="evidence-dialog" id="evidence-dialog">
|
||||
<header class="dialog-header"><div><div class="section-eyebrow">EVIDENCE / 演示材料</div><h2 id="evidence-title">回款说明与判断依据</h2></div><button aria-label="关闭证据抽屉" class="close-button" data-close="evidence-dialog">×</button></header>
|
||||
<div aria-label="证据视图" class="drawer-tabs" role="tablist"><button aria-controls="evidence-source" aria-selected="true" data-evidence-tab="source" id="evidence-source-tab" role="tab">原文片段</button><button aria-controls="evidence-basis" aria-selected="false" data-evidence-tab="basis" id="evidence-basis-tab" role="tab">判断依据</button></div>
|
||||
<section aria-labelledby="evidence-source-tab" id="evidence-source" role="tabpanel"><p class="muted" id="source-location">回款说明.pdf · 第3页 · 虚构演示</p><blockquote id="source-quote">主要客户账期延长,预计下一季度集中回款。</blockquote><div class="notice" id="source-gap">尚未提供对应银行流水,不能仅凭解释确认回款。</div><p class="muted">来源可定位不代表材料真实性已经核验。</p></section>
|
||||
<section aria-labelledby="evidence-basis-tab" hidden="" id="evidence-basis" role="tabpanel"><h3>从解释到判断,仍缺一环</h3><p id="basis-copy">现有说明提出了账期变化的解释,但需要银行流水与应收账龄交叉核验。专项判断不能替代主审综合意见。</p><h3>建议下一步</h3><p id="basis-next">补充近六个月银行流水,逐笔匹配主要客户回款。</p></section>
|
||||
</dialog>
|
||||
<dialog aria-labelledby="basis-title" class="evidence-dialog" id="basis-dialog">
|
||||
<header class="dialog-header">
|
||||
<div>
|
||||
<div class="section-eyebrow">BASIS / 判断依据</div>
|
||||
<h2 id="basis-title">为什么是这个判断</h2>
|
||||
</div>
|
||||
<button aria-label="关闭依据抽屉" class="close-button" data-close="basis-dialog">×</button>
|
||||
</header>
|
||||
<div class="p-24 overflow-y-auto" style="height:calc(100vh - 90px)">
|
||||
<div class="notice mb-24">当前基线 42% 来自人工设定的原型情景表,非模型计算、非历史统计。以下展示未来的追溯结构,不构成数字的计算来源。</div>
|
||||
<div class="flex flex-col gap-24">
|
||||
<div>
|
||||
<h3 class="text-[16px] font-bold text-ink-main mb-12 flex items-center gap-8"><iconify-icon icon="lucide:database"></iconify-icon> 1. 状态与数据卡</h3>
|
||||
<ul class="checklist">
|
||||
<li><strong>现金流 / 回款</strong> <span class="text-ink-mute text-[12px]">DC-CASH · v1.2(演示)</span><p>发现待核实差异,无法确认对应关系。</p></li>
|
||||
<li><strong>设备权属</strong> <span class="text-ink-mute text-[12px]">DC-TITLE · v1.0(演示)</span><p>品名存在部分不符,底层资产真实权属待确认。</p></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="text-[16px] font-bold text-ink-main mb-12 flex items-center gap-8"><iconify-icon icon="lucide:cpu"></iconify-icon> 2. 技能与规则 (Skill Trace)</h3>
|
||||
<ul class="checklist">
|
||||
<li><strong>回款交叉核验</strong> <span class="text-ink-mute text-[12px]">SKILL-04 · v1.0(演示)</span><p>状态:待核实。缺少对应时间段银行流水,不能判定核验通过或不通过。</p></li>
|
||||
<li><strong>权属一致性比 timelines</strong> <span class="text-ink-mute text-[12px]">SKILL-09 · v1.0(演示)</span><p>发现发票与清单异常。</p></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="text-[16px] font-bold text-ink-main mb-12 flex items-center gap-8"><iconify-icon icon="lucide:history"></iconify-icon> 3. 历史经验参考</h3>
|
||||
<div class="bg-panel p-16 rounded-panel border border-border">
|
||||
<div class="font-medium text-[14px] text-ink-main mb-8">案例 H-018 适用与例外</div>
|
||||
<p class="text-[13px] text-ink-sub leading-relaxed mb-8">适用条件:客户结构稳定且回款可逐笔匹配。<br/>例外:收入集中或关联回款未穿透。</p>
|
||||
<div class="text-[13px] text-warning-text bg-warning-bg p-8 rounded-button border border-warning-text/20">当前项目:尚未满足逐笔匹配证据条件,无法直接应用条件推进。</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="text-[16px] font-bold text-ink-main mb-12 flex items-center gap-8"><iconify-icon icon="lucide:shield-alert"></iconify-icon> 4. 硬性规则核查</h3>
|
||||
<p class="text-[14px] text-ink-sub">RULE-01 · v1.0(演示):权属证据不足,规则状态待核实。尚未确认阻断,不代表红线核查已经通过。</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</dialog>
|
||||
<dialog aria-labelledby="dimension-title" class="evidence-dialog" id="dimension-dialog"><header class="dialog-header"><div><div class="section-eyebrow">TRACE / miniOpenClaw</div><h2 id="dimension-title"></h2></div><button aria-label="关闭维度依据" class="close-button" data-close="dimension-dialog">×</button></header><div id="dimension-trace"></div></dialog><dialog aria-labelledby="method-title" class="center-dialog" id="probability-method-dialog"><header class="dialog-header"><div><div class="section-eyebrow">PROBABILITY / 结果出处</div><h2 id="method-title">这次概率如何得到</h2></div><button aria-label="关闭概率出处" class="close-button" data-close="probability-method-dialog">×</button></header><div aria-live="polite" class="notice" id="method-result"></div><p>当前依据:人工情景表 <strong>DEMO-TABLE-v1</strong>。没有模型计算、真实样本统计或校准结果;六维雷达不能求和、平均或按面积换算成概率。</p><table class="method-table"><caption>选择键:流水假设 / 权属假设;数字为人工演示值</caption><thead><tr><th>键</th><th>假设组合</th><th>演示输出</th></tr></thead><tbody><tr id="method-row-00"><td>00</td><td>两项均未选择</td><td>42%</td></tr><tr id="method-row-10"><td>10</td><td>流水核验支持解释</td><td>58%</td></tr><tr id="method-row-01"><td>01</td><td>权属核验一致</td><td>51%</td></tr><tr id="method-row-11"><td>11</td><td>两项假设均成立</td><td>64%</td></tr></tbody></table><h3 class="method-subheading">真实版如何计算 · 后续规划</h3><ol class="trace-chain"><li><b>01 数据卡 → Skills / 授权 Tools</b><p>读取冻结事实与核验记录,保留来源和方法版本。</p></li><li><b>02 特征构建 → 概率估计 → 历史校准</b><p>在明确审批口径、样本范围和制度版本后训练与验证。模型、样本、校准:当前均未接入。</p></li><li><b>03 Rules / 有效性检查 → 主审解释</b><p>缺证标待核实;硬性阻断不能被高概率抵消。未校准的真实概率保持空值。</p></li><li><b>04 miniOpenClaw 保留轨迹 → 人工审批</b><p>主审解释综合结论;Jev/local只承担可选专项判断,不能用其置信度替代审批概率。</p></li></ol></dialog>
|
||||
<dialog aria-labelledby="checklist-title" class="center-dialog" id="checklist-dialog">
|
||||
<header class="dialog-header"><div><div class="section-eyebrow">NEXT ACTION / 演示清单</div><h2 id="checklist-title">项目补件清单</h2></div><button aria-label="关闭补件清单" class="close-button" data-close="checklist-dialog">×</button></header>
|
||||
<ol class="checklist">
|
||||
<li><strong>近六个月银行流水与应收账龄</strong><p>标注主要客户逐笔回款,说明与合同账期的对应关系。</p></li>
|
||||
<li><strong>设备权属材料</strong><p>提供采购合同、发票和设备清单,并解释品名差异。</p></li>
|
||||
</ol>
|
||||
<div class="notice">DEMO-026 · 虚构演示,未发送至任何业务系统。</div>
|
||||
<button class="primary-button" id="copy-checklist">复制清单</button>
|
||||
<p aria-live="polite" id="copy-status"></p>
|
||||
</dialog>
|
||||
<dialog aria-labelledby="validation-title" class="center-dialog" id="validation-dialog">
|
||||
<header class="dialog-header"><div><div class="section-eyebrow">VALIDATION / 验证计划</div><h2 id="validation-title">待开展脱敏盲测</h2></div><button aria-label="关闭验证计划" class="close-button" data-close="validation-dialog">×</button></header>
|
||||
<p>先冻结样本和预测,再揭示专家参考意见。当前没有真实验证结果。</p>
|
||||
<ol class="checklist">
|
||||
<li>基础预审:不使用历史经验</li>
|
||||
<li>经验增强:主审结合已审核经验</li>
|
||||
<li>专项增强:分别验证本地模型与 Jev(可选)</li>
|
||||
</ol>
|
||||
<div class="notice">关注重大问题漏检、无依据结论、有效补件与耗时。阈值在试点前约定。</div>
|
||||
</dialog>
|
||||
<script>
|
||||
(()=>{
|
||||
const $=s=>document.querySelector(s),all=s=>[...document.querySelectorAll(s)],sd=n=>$('[data-sd-id="'+n+'"]');
|
||||
let active='overview'; const openers=new WeakMap();
|
||||
function showDialog(id){const d=$('#'+id);openers.set(d,document.activeElement);d.showModal();d.querySelector('button').focus();}
|
||||
all('dialog').forEach(d=>{d.addEventListener('close',()=>openers.get(d)?.focus());d.addEventListener('click',e=>{if(e.target===d){const b=d.getBoundingClientRect();if(e.clientX<b.left||e.clientX>b.right||e.clientY<b.top||e.clientY>b.bottom)d.close();}})});
|
||||
all('[data-close]').forEach(b=>b.onclick=()=>$('#'+b.dataset.close).close());
|
||||
function tab(name){if(name==='validation'){showDialog('validation-dialog');return;}if(!['overview','experience','simulation'].includes(name))return;active=name;all('[role=tabpanel][id^="panel-"]').forEach(p=>p.hidden=p.id!=='panel-'+name);all('[role=tab][data-tab]').forEach(b=>{const selected=b.dataset.tab===name;b.setAttribute('aria-selected',selected);b.tabIndex=selected?0:-1;b.classList.toggle('text-primary',selected);b.classList.toggle('border-primary',selected);b.classList.toggle('border-transparent',!selected)});all('[data-nav]').forEach(a=>a.classList.toggle('is-active',a.dataset.nav===name));$('#prototype-navigation').classList.remove('mobile-open');$('#mobile-menu').setAttribute('aria-expanded','false');}
|
||||
all('[data-tab]').forEach(b=>b.onclick=()=>tab(b.dataset.tab));all('[data-nav]').forEach(a=>a.onclick=e=>{e.preventDefault();tab(a.dataset.nav)});
|
||||
all('[role=tab][data-tab]').forEach((b,i)=>b.addEventListener('keydown',e=>{if(!['ArrowLeft','ArrowRight','Home','End'].includes(e.key))return;e.preventDefault();const tabs=all('[role=tab][data-tab]');const j=e.key==='Home'?0:e.key==='End'?2:(i+(e.key==='ArrowRight'?1:2))%3;tabs[j].click();tabs[j].focus()}));
|
||||
$('#mobile-menu').onclick=()=>{const on=$('#prototype-navigation').classList.toggle('mobile-open');$('#mobile-menu').setAttribute('aria-expanded',on)};
|
||||
function evidence(kind='current'){const history=kind==='history';$('#evidence-title').textContent=history?'历史回款证据示例':'回款说明与判断依据';$('#source-location').textContent=history?'历史案例 H-018 · 补件记录 · 虚构演示':'回款说明.pdf · 第3页 · 虚构演示';$('#source-quote').textContent=history?'历史示例中,主要客户实际回款与应收明细逐笔匹配。':'主要客户账期延长,预计下一季度集中回款。';$('#source-gap').textContent=history?'仅为说明经验形成过程的虚构材料,不能替代当前项目核查。':'尚未提供对应银行流水,不能仅凭解释确认回款。';$('#basis-copy').textContent=history?'历史案例补充证据支持当时的解释,适用前提是客户结构稳定且回款可逐笔匹配。当前项目尚未满足同样的证据条件。':'现有说明提出了账期变化的解释,但需要银行流水与应收账龄交叉核验。专项判断不能替代主审综合意见。';$('#evidence-source-tab').click();showDialog('evidence-dialog');}
|
||||
['node-1','node-2','node-3','node-4','btn-open-drawer-1'].forEach(id=>$('#'+id).onclick=()=>evidence());all('[data-open-evidence]').forEach(b=>b.onclick=()=>evidence(b.dataset.openEvidence));
|
||||
all('[data-evidence-tab]').forEach(b=>b.onclick=()=>{all('[data-evidence-tab]').forEach(x=>x.setAttribute('aria-selected',x===b));$('#evidence-source').hidden=b.dataset.evidenceTab!=='source';$('#evidence-basis').hidden=b.dataset.evidenceTab!=='basis'});
|
||||
|
||||
$('#btn-generate-list').onclick=()=>showDialog('checklist-dialog');sd(81).onclick=()=>tab('experience');sd(96).onclick=()=>{tab('simulation');$('#assume-bank').focus()};sd(100).onclick=()=>showDialog('validation-dialog');
|
||||
$('#btn-show-basis').onclick=()=>showDialog('basis-dialog');
|
||||
|
||||
all('input[name=model]').forEach(r=>r.onchange=()=>{const off=r.value==='off';$('#model-status').textContent=off?'专项核查已关闭。主审仍可基于证据与经验给出有限意见。':'本地开源模型(演示)。无真实模型请求;主审负责综合预审意见。';sd(56).textContent=off?'未执行':'不足';sd(55).textContent=off?'专项核查':'专项支持'});
|
||||
|
||||
const dimensionNames=['回款核验','财务勾稽','权属核验','交易要素','经验适配','规则覆盖'];
|
||||
const baseStages=[1,2,1,2,2,1],stageNames=['未提供','仅有说明','资料待核','交叉核验','人工复核'];
|
||||
const dimensionTraces=[
|
||||
{card:'DC-CASH v1.2',skill:'SKILL-04 v1.0 · 回款交叉核验',tools:'read_project_snapshot / read_document / read_method / read_checks',input:'回款说明.pdf第3页与应收明细;近六个月银行流水缺失。',output:'账期变化仍只有说明,无法逐笔比对。',rule:'RULE-CASH v1.0 · 待核实,不能把解释当成已收回资金。',experience:'H-018:客户结构稳定且能逐笔匹配时参考;关联回款未穿透时不适用。'},
|
||||
{card:'DC-FIN v1.0',skill:'SKILL-FIN v1.0 · 财务口径核对',tools:'read_project_snapshot / read_document / read_method / read_checks',input:'演示报表与财务说明;原始凭证和口径待复核。',output:'仅说明资料待核,未完成收入、利润、现金流勾稽。',rule:'RULE-FIN v1.0 · 期间和口径未确认时不得直接比较或加分。',experience:'经验只在期间、口径、行业适用条件一致时参考,不能套用阈值。'},
|
||||
{card:'DC-TITLE v1.0',skill:'SKILL-09 v1.0 · 权属一致性',tools:'read_project_snapshot / read_document / read_method / read_checks',input:'设备清单与发票品名差异;采购合同附件待补。',output:'只有差异说明,真实权属尚待核验。',rule:'RULE-01 v1.0 · 待核实,尚未确认阻断不代表红线核查通过。',experience:'参考核验步骤而非套用审批结论;权属链不完整时不适用通过意见。'},
|
||||
{card:'DC-DEAL v1.0',skill:'SKILL-DEAL v1.0 · 交易要素核对',tools:'read_project_snapshot / read_method / read_checks',input:'演示融资3,000万元、36个月、设备直租。',output:'要素已列示,未核对合同条件和租金安排。',rule:'RULE-DEAL v1.0 · 条款和还款安排待复核,列示不等于有效。',experience:'交易类型与期限匹配只是筛选条件,不是审批依据。'},
|
||||
{card:'DC-EXP v1.0',skill:'SKILL-EXP v1.0 · 经验适用性核查',tools:'read_project_snapshot / read_method / read_experiences',input:'虚构经验H-018及适用条件与例外。',output:'已展示候选经验;当前缺少逐笔匹配证据,不能直接套用。',rule:'RULE-EXP v1.0 · 真实经验须审核、发布并冻结版本;本条仅演示。',experience:'客户结构稳定、逐笔回款匹配;收入集中或关联回款未穿透属于例外。'},
|
||||
{card:'DC-RULE v1.0',skill:'SKILL-RULE v1.0 · 规则结果汇总',tools:'read_project_snapshot / read_method / read_checks',input:'演示规则清单与缺证状态,真实制度尚未接入。',output:'仍有待核实规则,未形成规则全部通过的判断。',rule:'RULE-GATE v1.0 · 未知不能当通过;确认硬阻断时独立提示,不能被高分抵消。',experience:'历史案例不能豁免当前有效规则;制度版本变化需重新确认适用。'}
|
||||
];
|
||||
function scenarioKey(){return Number($('#assume-bank').checked)+''+Number($('#assume-title').checked)}
|
||||
function points(stages){return stages.map((v,i)=>{const a=i*Math.PI/3;return ((v/4)*90*Math.sin(a)).toFixed(2)+','+(-(v/4)*90*Math.cos(a)).toFixed(2)}).join(' ')}
|
||||
function selectedStages(){const v=[...baseStages];if($('#assume-bank').checked)v[0]=3;if($('#assume-title').checked)v[2]=3;return v}
|
||||
function buildRadar(context){
|
||||
const svg=$('#radar-'+(context==='baseline'?'baseline':'scenario'));
|
||||
let html='';
|
||||
for(let n=1;n<=4;n++)html+='<polygon class="grid-line" points="'+points(Array(6).fill(n))+'"/><text class="stage-label" x="5" y="'+(-n*22.5+3)+'">'+n+'</text>';
|
||||
const labelPositions=[[0,-111,'middle'],[96,-49,'start'],[96,58,'start'],[0,117,'middle'],[-96,58,'end'],[-96,-49,'end']];
|
||||
dimensionNames.forEach((name,i)=>{const a=i*Math.PI/3;html+='<line class="grid-line" x1="0" y1="0" x2="'+90*Math.sin(a)+'" y2="'+(-90*Math.cos(a))+'"/>'});
|
||||
html+='<polygon data-series="baseline" points="'+points(baseStages)+'"/>';
|
||||
if(context==='scenario')html+='<polygon data-series="scenario" points="'+points(baseStages)+'"/>';
|
||||
dimensionNames.forEach((name,i)=>{const [x,y,anchor]=labelPositions[i];html+='<text class="dimension-label" data-dimension="'+i+'" data-context="'+context+'" role="button" tabindex="0" aria-label="查看'+name+'依据" x="'+x+'" y="'+y+'" text-anchor="'+anchor+'">'+name+'</text>'});
|
||||
svg.innerHTML=html;
|
||||
$('[data-dimension-list="'+context+'"]').innerHTML=dimensionNames.map((name,i)=>'<button data-dimension="'+i+'" data-context="'+context+'"><b>'+name+'</b><span data-stage-label="'+i+'">'+baseStages[i]+' · '+stageNames[baseStages[i]]+'</span></button>').join('');
|
||||
}
|
||||
function updateRadar(){const stages=selectedStages();$('#radar-scenario [data-series="scenario"]').setAttribute('points',points(stages));all('[data-dimension-list="scenario"] [data-stage-label]').forEach(el=>{const i=Number(el.dataset.stageLabel),v=stages[i];el.textContent=v+' · '+(v!==baseStages[i]?'假设已核验':stageNames[v]);});}
|
||||
function openDimension(i,context){const d=dimensionTraces[i],assumed=context==='scenario'&&selectedStages()[i]!==baseStages[i];$('#dimension-title').textContent=dimensionNames[i]+' · '+(context==='scenario'?'情景依据':'当前依据');$('#dimension-trace').innerHTML='<div class="notice">虚构演示链,未执行真实工具调用。'+(assumed?'本情景假设该维度交叉核验成立;原项目仍待核实。':'当前材料仍须核验,不能仅凭阶段推出概率。')+'</div><div class="trace-chip">miniOpenClaw · 受控编排示意 / 组件版本为示例</div><ol class="trace-chain"><li><b>01 数据卡 · '+d.card+'</b><p>'+d.input+'</p></li><li><b>02 Skill · '+d.skill+'</b><p>组织专业方法;只使用授权的数据域与工具。</p></li><li><b>03 Tools · 允许的只读能力</b><p>'+d.tools+'</p><p>读取上下文、方法或核验记录,不代表读取工具已完成业务认证。</p></li><li><b>04 核查输出 · '+(assumed?'假设状态':'当前示例')+'</b><p>'+(assumed?'假设补充材料真实,交叉核验支持解释;实际调用尚未发生。':d.output)+'</p></li><li><b>05 Rules · 不可被模型分数覆盖</b><p>'+d.rule+'</p></li><li><b>06 历史经验 · 适用与例外</b><p>'+d.experience+'</p></li></ol><div class="notice">该链解释专业判断的方法与边界,不是42%的数学计算。Jev/local为可选专项判断;概率服务与校准仍待建设。</div>';showDialog('dimension-dialog');}
|
||||
function openMethod(context){const key=context==='baseline'?'00':scenarioKey(),value=demoScenarios[key].demoProbability;$('#method-result').textContent=(context==='baseline'?'当前基线':'所选假设情景')+' → 命中 '+key+' 条目 → '+value+'%(人工演示值)';all('[id^="method-row-"]').forEach(row=>row.setAttribute('aria-selected',row.id==='method-row-'+key));showDialog('probability-method-dialog');}
|
||||
buildRadar('baseline');buildRadar('scenario');
|
||||
all('[data-dimension][data-context]').forEach(el=>{el.onclick=()=>openDimension(Number(el.dataset.dimension),el.dataset.context);if(el.tagName.toLowerCase()==='text')el.onkeydown=e=>{if(e.key==='Enter'||e.key===' '){e.preventDefault();el.onclick()}}});
|
||||
$('#btn-probability-method').onclick=()=>openMethod('baseline');$('#btn-scenario-method').onclick=()=>openMethod('scenario');
|
||||
|
||||
// Artificial prototype lookup only: never writes a production probability.
|
||||
const demoScenarios = {
|
||||
'00': {demoProbability:42, remaining:'2 项仍待核实(模拟)', reason:'未选择假设。回款与设备权属证据仍有缺口,保持演示基线。'},
|
||||
'10': {demoProbability:58, remaining:'设备权属仍待核实(模拟)', reason:'假设银行流水逐笔核验后支持账期变化解释,回款不确定性减小;设备权属缺口仍在。演示变化 +16 个百分点。'},
|
||||
'01': {demoProbability:51, remaining:'实际回款仍待核实(模拟)', reason:'假设合同、发票与清单一致且经核验,权属争议得到回应;实际回款仍缺银行流水。演示变化 +9 个百分点。'},
|
||||
'11': {demoProbability:64, remaining:'两项证据缺口在假设下得到回应', reason:'假设回款与权属核验均支持项目解释。组合情景为 64%,变化 +22 个百分点;组合影响不简单相加,仍需综合复核其他风险。'}
|
||||
};
|
||||
function updateSimulation(){
|
||||
const key=Number($('#assume-bank').checked)+''+Number($('#assume-title').checked);
|
||||
const scenario=demoScenarios[key];
|
||||
$('#sim-prob-val').textContent=scenario.demoProbability+'%';
|
||||
$('#sim-prob-delta').textContent='+'+(scenario.demoProbability-42)+' 百分点';
|
||||
$('#sim-prob-delta').style.opacity='1';
|
||||
$('#sim-prob-bar').style.width=scenario.demoProbability+'%';
|
||||
$('#sim-remaining').textContent=scenario.remaining;
|
||||
$('#sim-explanation').textContent=scenario.reason;
|
||||
$('#simulation-comparison').hidden=false;
|
||||
updateRadar();
|
||||
}
|
||||
['assume-bank','assume-title'].forEach(id=>$('#'+id).addEventListener('change',updateSimulation));
|
||||
$('#run-simulation').onclick=()=>showDialog('basis-dialog');
|
||||
updateSimulation();
|
||||
$('#copy-checklist').onclick=async()=>{const text='DEMO-026 演示补件清单\n1.近六个月银行流水及应收账龄,逐笔匹配主要客户回款。\n2.设备采购合同、发票和清单,解释品名差异。';try{await navigator.clipboard.writeText(text);$('#copy-status').textContent='演示清单已复制。';}catch{$('#copy-status').textContent='浏览器未允许复制,请选择上方清单文字手动复制。'}};
|
||||
tab('overview');
|
||||
})();
|
||||
</script>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user