if(!site) return <Panel><div className="empty-state">加载中…</div></Panel>;
const nameTooLong = countChars(site.name)>20;
const domainTooLong = newDomain.length>6;
- return <><div className="company-form-page"><aside className="form-section-nav"><b>1</b><span>站点信息</span><a href="#site-basic">基本信息</a><a href="#site-description">情况描述</a><a href="#site-files">参考资料</a></aside><div className="single-column-form"><Panel title="站点基本信息"><div className="form-grid" id="site-basic">
+ return <><div className="company-form-page"><aside className="form-section-nav"><b>1</b><span>站点信息</span><a href="#site-basic">基本信息</a><a href="#site-description">情况描述</a></aside><div className="single-column-form"><Panel title="站点基本信息"><div className="form-grid" id="site-basic">
<Field label="站点名称" required hint="最多 20 个汉字"><input value={site.name} maxLength={20} onChange={e=>onChange({name:e.target.value})} className={nameTooLong?"invalid":""}/></Field>
<Field label="所属领域" required>
<div className="domain-select">
</Field>
<div className="form-section-heading" id="site-description"><h3>情况描述</h3><p>说明站点用途、重点设备、管理目标及关注指标。</p></div>
<Field label="站点基本情况描述" required><textarea value={site.description} onChange={e=>onChange({description:e.target.value})}/></Field>
- <Field label="补充要求"><textarea className="small" value={site.supplement} onChange={e=>onChange({supplement:e.target.value})}/><div className="field-assist"><Button secondary onClick={()=>setAiOpen(true)}><RobotOutlined/> AI 智能补全</Button></div></Field>
- <div className="form-guidance"><strong>填写建议</strong><span>站点承担什么业务?哪些设备最重要?管理人员关注哪些指标?首页首先需要看到什么?</span></div>
- <div className="form-section-heading" id="site-files"><h3>参考资料</h3><p>上传需求文档、设备清单或参考图片,帮助生成结果贴近真实需求。</p></div>
- <Field label="文件上传">
- <label className="upload">
- <input type="file" onChange={e=>{const f=e.target.files?.[0]; if(f) onUpload(f);}} hidden/>
- <b>+</b><span>点击或拖拽上传文件</span><small>支持 PDF、DOCX、XLSX、PNG,单个文件不超过 20 MB</small>
- </label>
- {site.files.length>0&&<ul className="file-list">{site.files.map(f=><li key={f.id}><a href={`/api/db/sites/${site.id}/files/${f.id}`} download>{f.filename}</a> <small>({(f.size/1024).toFixed(1)} KB)</small></li>)}</ul>}
- </Field>
+ <div className="field-assist"><Button secondary onClick={()=>setAiOpen(true)}><RobotOutlined/> AI 智能补全</Button><span className="muted">补充要求、填写建议与参考资料均在右侧抽屉中维护</span></div>
{saving&&<div className="save-indicator">正在保存…</div>}
</div></Panel></div></div>
<Drawer title="AI 智能补全" width={440} open={aiOpen} onClose={()=>setAiOpen(false)}>
- <div className="ai-assist-drawer"><div className="ai-assist-intro"><RobotOutlined/><div><h3>补充站点需求</h3><p>AI 将根据站点名称、所属领域和基本情况描述生成补充要求。生成结果会写入表单,仍可继续编辑。</p></div></div><div className="drawer-actions"><Button disabled={completing} onClick={runComplete}>{completing?"补全中…":"开始补全"}</Button><Button secondary onClick={onViewCompletePrompt}>查看提示词</Button></div>{(completing||completeLog)&&<div className="modal-console"><div className="modal-console-head">生成进度</div><pre className="modal-console-body" ref={completeConsoleRef}>{completeLog||"(等待 AI 分析…)"}</pre></div>}</div>
+ <div className="ai-assist-drawer">
+ <div className="ai-assist-intro"><RobotOutlined/><div><h3>补充站点需求</h3><p>AI 将根据站点名称、所属领域和基本情况描述生成补充要求。生成结果会写入下方,仍可继续编辑。</p></div></div>
+ <Field label="补充要求"><textarea className="small" value={site.supplement} onChange={e=>onChange({supplement:e.target.value})}/></Field>
+ <div className="form-guidance"><strong>填写建议</strong><span>站点承担什么业务?哪些设备最重要?管理人员关注哪些指标?首页首先需要看到什么?</span></div>
+ <div className="form-section-heading" id="site-files"><h3>参考资料</h3><p>上传需求文档、设备清单或参考图片,帮助生成结果贴近真实需求。</p></div>
+ <Field label="文件上传">
+ <label className="upload">
+ <input type="file" onChange={e=>{const f=e.target.files?.[0]; if(f) onUpload(f);}} hidden/>
+ <b>+</b><span>点击或拖拽上传文件</span><small>支持 PDF、DOCX、XLSX、PNG,单个文件不超过 20 MB</small>
+ </label>
+ {site.files.length>0&&<ul className="file-list">{site.files.map(f=><li key={f.id}><a href={`/api/db/sites/${site.id}/files/${f.id}`} download>{f.filename}</a> <small>({(f.size/1024).toFixed(1)} KB)</small></li>)}</ul>}
+ </Field>
+ <div className="drawer-actions"><Button disabled={completing} onClick={runComplete}>{completing?"补全中…":"开始补全"}</Button><Button secondary onClick={onViewCompletePrompt}>查看提示词</Button></div>
+ {(completing||completeLog)&&<div className="modal-console"><div className="modal-console-head">生成进度</div><pre className="modal-console-body" ref={completeConsoleRef}>{completeLog||"(等待 AI 分析…)"}</pre></div>}
+ </div>
</Drawer></>;
}
--- /dev/null
+import { chromium } from 'playwright';
+
+const BASE = 'https://aidemo.istation.cloud/t/stationbuilder';
+const browser = await chromium.launch();
+const page = await browser.newPage();
+const errors = [];
+page.on('console', m => { if (m.type() === 'error') errors.push(m.text()); });
+page.on('response', r => { if (r.status() >= 400) errors.push('HTTP ' + r.status() + ' ' + r.url()); });
+
+await page.goto(BASE + '/?page=basic', { waitUntil: 'networkidle' });
+
+// Open a site first via the list -> need an existing site. Try navigating by clicking first company row.
+// Fallback: directly go to a known route if exists. We'll just click "打开项目" of first row.
+const row = page.locator('.company-table tbody tr').first();
+if (await row.count()) {
+ await row.click();
+ await page.waitForTimeout(800);
+ const openBtn = page.getByText('打开项目');
+ if (await openBtn.count()) { await openBtn.first().click(); await page.waitForTimeout(1000); }
+}
+
+const leftBefore = await page.locator('.single-column-form').innerText().catch(() => '');
+const leftHasSupplementBefore = leftBefore.includes('补充要求');
+
+// Now ensure we're on basic page: click the AI 智能补全 button
+const aiBtn = page.getByText('AI 智能补全').first();
+await aiBtn.click();
+await page.waitForTimeout(800);
+
+const drawerText = await page.locator('.ai-assist-drawer').innerText().catch(() => '');
+const leftHasSupplement = await page.locator('.single-column-form').innerText().then(t => t.includes('补充要求')).catch(() => false);
+
+console.log('DRAWER_HAS_补充要求:', drawerText.includes('补充要求'));
+console.log('DRAWER_HAS_填写建议:', drawerText.includes('填写建议'));
+console.log('DRAWER_HAS_参考资料:', drawerText.includes('参考资料'));
+console.log('DRAWER_HAS_文件上传:', drawerText.includes('上传文件') || drawerText.includes('点击或拖拽'));
+console.log('LEFT_FORM_HAS_补充要求_BEFORE_DRAWER:', leftHasSupplementBefore);
+console.log('LEFT_FORM_HAS_补充要求:', leftHasSupplement);
+console.log('ERRORS:', JSON.stringify(errors.slice(0, 10)));
+await browser.close();