qiaoqichaoandClaude Code 985e2f6a53 feat(v2): S1d 最薄界面——工作台内的材料集合导入面板
T02 收尾子卡。挂在既有 /xingbang-workbench「材料与问题」页内,**不新建路由**,
复用 workspace.css 既有 class(无新增样式表)。

- src/components/xingbang/ImportBatchPanel.tsx:登记清单 → 逐项上传 → 重试/取消 →
  冲突并列展示与裁定。浏览器端用 crypto.subtle 算 sha256 生成清单(服务端仍重算核对)
- src/lib/prescreen.ts:错误信封解包 + 契约类型(**手工对齐**,OpenAPI→TS 生成链
  未建设,已在文件头标注为临时)+ 服务端状态标签
- page.tsx 仅三处小改:导入面板、挂载面板、request() 改用 messageOf
  (兼容信封与既有 detail 的 string/array/object 三种形态,不丢既有信息量)

面向用户的诚实性约束(有源码守卫锁定):明确写出"未上传或未确认的文件不会进入
项目事实""不会按上传先后覆盖""不会自动挑一个";空批次用既有空状态,不绘制虚构行;
面板不含任何审批概率。

验证:
- npx tsc --noEmit 通过;npm run build 通过
- 新增 scripts/test_prescreen_panel.cjs(10 条源码守卫),已加入 verify.py 用例
- scripts/verify.py 10/10 PASS(exit 0)

**未验证**:面板未经浏览器端到端验证。它依赖客户端数据加载,SSR HTML 不含它,
且本项目没有浏览器自动化依赖。目前只有类型检查、构建与源码断言三层证据。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-29 18:14:14 +08:00
S
Description
No description provided
Readme
1.9 MiB
Languages
Python 78.8%
TypeScript 18.4%
JavaScript 1.7%
CSS 0.5%
Shell 0.3%
Other 0.3%