forked from ChaiHao/BPOS-MVP
汇报流:活动按步序位置推视图,容器沙箱渲染
「flow:按**步序位置**推送声明的模版」(AM 07)。原先这条链只有写面没有读面,
活动的 viewTemplates 是一行占位字符串,工作台视图区永远只显示一份硬编码概览。
补齐整条链:
· 步声明新增 `view`:这一步呈现哪张模版 —— 推什么由声明给定,不由临场决定。
· 新增模版填数的纯函数(interaction/domain):`data-slot` 取值、`data-rows` 逐条展开。
**填数只做取值与转义**,没有表达式、没有分支、没有循环 —— 一旦模版能算,
它就成了代码,容器的「无脚本执行权」也就形同虚设。填充**消费槽位**,
交出去的是干净 HTML,不是带模板属性的半成品。
· interaction 补读面 `viewOf`;desk 路由把推送的 HTML 交给前端;
ViewRegion 经 `@ui` 的 ViewContainer(sandbox="" 的 iframe)渲染 —— feature 不碰 innerHTML。
· A1 写了三张真模版(事态全景 / 打标判据 / 成果预览),内联自带样式
(沙箱页面不继承工作台 CSS),按步序位置挂在 S3 / S5 / S6 上。
沿路两处修:
① 取值路径遇到**本身带点号的键**(台账地址 `域.对象`)会被拆成两级、永远取不到。
改为整键优先、找不到再下行;`view-render` 与 `step-sequence` 两处同修。
② 「本单交付」不能画成台账全表:任务视图是正式版 + 我的草稿的合并结果,
直接拿来列会把**别单**放行过的记录一并列出。本单自己写下的行单独放在
`mine:域.对象` 下(整键,取值不歧义)。
另:视图推送失败原先静默吞掉 —— 会让「视图区一直空着」变成查不出原因的怪事;
改为留痕(仍不影响步序推进,呈现是投影)。
实测:一封 RFQ 入站 → 放行前那一屏列出本单交付 LM358DR / TI / 12000 / 8.2 / 10周,
以及 Type A「直接快答」的分类结论与四项打标判据。
gates: tsc / eslint / depcruise(321 模块)/ api-report / 423 测试 全绿
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
*/
|
||||
import type { ActivityManifest, DmnModel } from '@contracts';
|
||||
import { activityIdSchema } from '@contracts';
|
||||
import { INTAKE_CLASSIFIED, INTAKE_OVERVIEW, INTAKE_RELEASE } from './views/report.ts';
|
||||
|
||||
const INTAKE_DOMAIN = 'quote_intake';
|
||||
const ACTIVITY_ID = activityIdSchema.parse('quote-intake');
|
||||
@@ -40,7 +41,7 @@ export const manifest: ActivityManifest = {
|
||||
identity: {
|
||||
activityId: ACTIVITY_ID,
|
||||
name: 'A1 · RFQ 需求分析',
|
||||
packageVersion: '0.1.5',
|
||||
packageVersion: '0.1.7',
|
||||
category: '统一报价',
|
||||
paradigm: 'flow',
|
||||
sdkVersion: '0.1.0-m5',
|
||||
@@ -223,6 +224,7 @@ export const manifest: ActivityManifest = {
|
||||
missingKeyFields: { type: 'integer' },
|
||||
},
|
||||
},
|
||||
view: 'intake-overview',
|
||||
failure: { retry: { times: 2, backoff: 'PT30S' }, fallback: { kind: 'human', workOrder: 'execution' } },
|
||||
},
|
||||
{
|
||||
@@ -270,6 +272,7 @@ export const manifest: ActivityManifest = {
|
||||
fields: { type_tag: 'type', basis: 'play' },
|
||||
},
|
||||
tool: 'quote-intake.classify',
|
||||
view: 'intake-classified',
|
||||
failure: { retry: { times: 1, backoff: 'PT10S' }, fallback: { kind: 'blocked' } },
|
||||
},
|
||||
{
|
||||
@@ -279,6 +282,7 @@ export const manifest: ActivityManifest = {
|
||||
input: {},
|
||||
workOrder: 'acceptance',
|
||||
card: { title: '统一受理记录(打标)请验收' },
|
||||
view: 'intake-release',
|
||||
deadline: 'P1D',
|
||||
failure: { retry: { times: 0, backoff: 'PT30S' }, fallback: { kind: 'blocked' } },
|
||||
},
|
||||
@@ -286,11 +290,11 @@ export const manifest: ActivityManifest = {
|
||||
parallelGroups: [],
|
||||
},
|
||||
skills: [],
|
||||
// 三张模版对应三种局面(事态全景 / 进展 / 成果预览),由步序声明按位置推送
|
||||
viewTemplates: [
|
||||
{
|
||||
name: 'intake-summary',
|
||||
html: '<div class="jc-card"><h3>统一受理记录</h3><p>已归一 <b data-slot="count"></b> 条</p></div>',
|
||||
},
|
||||
{ name: 'intake-overview', html: INTAKE_OVERVIEW },
|
||||
{ name: 'intake-classified', html: INTAKE_CLASSIFIED },
|
||||
{ name: 'intake-release', html: INTAKE_RELEASE },
|
||||
],
|
||||
cardSchemas: {},
|
||||
distillHooks: [
|
||||
|
||||
Reference in New Issue
Block a user