diff --git a/activities/quote-intake/src/manifest.ts b/activities/quote-intake/src/manifest.ts index afdf46d..2800789 100644 --- a/activities/quote-intake/src/manifest.ts +++ b/activities/quote-intake/src/manifest.ts @@ -73,7 +73,7 @@ export const manifest: ActivityManifest = { identity: { activityId: ACTIVITY_ID, name: 'A1 · 询价受理', - packageVersion: '41.0.0', + packageVersion: '42.0.0', category: '统一报价', sdkVersion: '0.1.0-m5', checksum: 'dev-checksum-quote-intake', diff --git a/activities/quote-intake/src/views/report.ts b/activities/quote-intake/src/views/report.ts index c7f7b7f..4dbaf65 100644 --- a/activities/quote-intake/src/views/report.ts +++ b/activities/quote-intake/src/views/report.ts @@ -96,7 +96,15 @@ const BIND_CSS = ` .proto-root .jc-tbl-in.on td > .jc-cell { display: block; } /* 类那一列平时只有一枚 24px 的徽,编辑态要放得下一个字 */ .proto-root .jc-tbl-in.on td.jc-ty, .proto-root .jc-tbl-in.on th:nth-child(2) { width: 56px; min-width: 56px; } -.proto-root .jc-tbl-in.on td.num > .jc-cell, .proto-root .jc-tbl-in.on .jc-cell.num { text-align: right; } +/* + * **数值列也左对齐**(2026-08-02 用户:「目标价的价格也要跟标题左对齐,右对齐太奇怪了」)。 + * + * 右对齐是给**要竖着相加的那种数**用的(金额合计、数量小计)——这张表里的目标价 + * 一行一个料、彼此不相加,右对齐只是让它和自己的表头分家:标题贴左、数贴右, + * 中间空一条,眼睛得来回找。等宽字体留着(位数对齐仍有用),对齐方式跟表头走。 + */ +.proto-root .jc-vcell.num, .proto-root .jc-cell.num { text-align: left; } +.proto-root .jc-tbl-in.on td.num > .jc-cell, .proto-root .jc-tbl-in.on .jc-cell.num { text-align: left; } /* 编辑态下必填空格子:红框 + 红 placeholder(原型的 req-empty 同款,只是由 :placeholder-shown 认) */ .proto-root .jc-tbl-in.on td.req > .jc-cell:placeholder-shown { border-color: #f3b6b3; background: #fffafa; } .proto-root .jc-tbl-in.on tbody tr:has(td.req > .jc-cell:placeholder-shown) td { background: #fffbfb; } @@ -136,6 +144,20 @@ html.editable .proto-root .jc-editgate { .proto-root .jc-editgate.on .jc-egbtn.open { display: none; } .proto-root .jc-editgate.on .jc-egbtn.ghost, .proto-root .jc-editgate.on .jc-egbtn.save { display: inline-flex; } .proto-root .jc-editgate.on .jc-editgate-t { visibility: hidden; } +/* 缺项红带 —— **只在这一屏可改时出现**,且一格不缺就不出(判断在样式表,不在填数里) */ +.proto-root .jc-gapbar { display: none; } +html.editable .proto-root .jc-gapbar { + display: flex; align-items: flex-start; gap: 8px; + margin: 0 0 10px; padding: 9px 12px; border-radius: 9px; + background: #fff5f5; border: 1px solid #f3b6b3; color: var(--danger); + font-size: 12px; line-height: 1.65; +} +.proto-root .jc-gapbar svg { flex: 0 0 auto; margin-top: 2px; } +.proto-root .jc-gapbar b { font-weight: 800; } +.proto-root .jc-gapbar span { color: #9a3b36; } +/* 一格不缺 —— 那条带没有话可说 */ +html.editable .proto-root .jc-gapbar.v-0 { display: none; } + /* 那条「怎么改」的提示只在开了闸之后说 —— 锁着的时候它是句废话 */ .proto-root .jc-editbar { display: none; } .proto-root .jc-editgate.on + .jc-editbar { display: flex; } @@ -402,6 +424,23 @@ const listTable = (mode: 'draft' | 'final'): string => { }; /** 编辑态那条提示带 —— 原型的 `jc-editbar`,只在待处理那一屏现身 */ +/** + * **缺哪几格,红字直说**(2026-08-02 用户:「执行单现在要怎么填不明显,在报告上明显一点」)。 + * + * 从前这一屏只在空格子里摆一枚小小的「必填」胶囊 —— 九行料摊开,那几枚胶囊淹在表里, + * 人得逐行扫过去才知道自己要动哪一格。而他打开这一屏就是来填的。 + * + * 现在表上方直接一条红带:**还差 N 格,分别是哪一行的哪一列**。 + * 两个数都由基座现算(`域_对象_missing` / `_missing_keys`),模版不算也不判 —— + * 「一格不缺就别出这条带」这个判断交给样式表:`data-class-of` 把数消毒成 + * `v-0` / `v-1` / …,`v-0` 那一档 `display:none`。件本身仍然只做取值。 + */ +const gapBar = `
${ico('alert', 14)} + 还差 格必填没补 + —— 。 + 按右上角「编辑」开表,红框那几格就是要填的;补齐了才提交得了。 +
`; + /** * 一张可改的表的**闸** —— 默认锁着,按「编辑」才开(2026-08-01 用户定)。 * @@ -492,6 +531,7 @@ export const INTAKE_OVERVIEW = doc({ part('受理要素', 'F-01 完整度自检') + four('gap') + part('有效 PN 清单', ' 条 · 已剔除 ') + + gapBar + editGate('quote_intake.record', '有效 PN 清单') + listTable('draft') + addRowBar('quote_intake.record') + diff --git a/apps/api/src/app/agent-runner.ts b/apps/api/src/app/agent-runner.ts index 6ea12e8..eb24343 100644 --- a/apps/api/src/app/agent-runner.ts +++ b/apps/api/src/app/agent-runner.ts @@ -441,8 +441,22 @@ export function createAgentRunner(deps: AgentRunnerDeps): { ' (空着 = 这一列没有值);数值列(:number/:integer)尤其不能写空串。', ' write 的 `itemId` 是**记账**:填正在干的那一项(它会亮进「进行中」);', ' 挂不上(项已完成等)写也照落 —— 写的授权在台账声明,不在计划项。', - ' tool / ask 的 `itemId` 则要落在**当下可为**里;阶段(stage)只能 start,', - ' 标了「须你启动」的项要先 start 再调工具。', + ' tool / ask 的 `itemId` 则要落在**当下可为**里;阶段(stage)只能 start。', + /* + * **话说的范围要盖住门拦的范围**(2026-08-02 实测逼出来的)。 + * + * 从前这一句写的是「标了「须你启动」的项要先 start **再调工具**」—— + * 只说了调工具。而拦截那一侧(`readyToWork`)管的是 tool / ask / human / + * decide / entry / finish 一整片。模型那一拍要发的是 `human`(派工单), + * 照字面读这条规矩管不着它,于是漏了 start,撞上 + * 「S3_confirm 标了人工激活,要先 start 再干活」白烧一拍。 + * + * **门拦住的事和话说的事必须是同一件** —— 话窄一格,模型就正好漏在那一格上。 + * 例外只有 write:它的 itemId 只是记账,挂不上照写不拦(见 turn-runner 的注释)。 + */ + ' 标了「须你启动」的项,**动它之前先 start** —— 调工具、发卡(ask / human / decide / entry)、', + ' 宣告完成(finish)都算,一拍里 start 排在那个动作前面即可。', + ' 只有 write 例外:它的 itemId 只是记账,挂不上也照写。', '② **系统能干的活不要交给人**:调工具就在「可调工具」里挑,照它的入参键名填 ——', ' 把一件工具做得到的事发成一张卡问人,是白占人的时间(实测踩过:该调历史价工具,', ' 却发了一张「请查这三个 PN 的历史价」的卡)。触达世界的动作也只能 tool',