diff --git a/document/development/2026-07-18/dev-logs/bugs/rule-management-permission-reference-crash.md b/document/development/2026-07-18/dev-logs/bugs/rule-management-permission-reference-crash.md new file mode 100644 index 0000000..032239f --- /dev/null +++ b/document/development/2026-07-18/dev-logs/bugs/rule-management-permission-reference-crash.md @@ -0,0 +1,18 @@ +# 规则管理权限状态未导出导致页面崩溃 + +日期:2026-07-18 +文档路径:document/development/2026-07-18/dev-logs/bugs/rule-management-permission-reference-crash.md + +## 修复记录 +- 15:00:记录 bug 修复:进入规则管理时模板引用未定义的 `isRuleManager`,导致规则列表和操作区整页崩溃。 + - Git 提交检查:`git fetch --all --prune` 成功;upstream `origin/main`;upstream 新提交:未发现;本地 ahead 19 条,最新为 `07241b46 fix(docker): manage local postgres in default compose`、`787bc3a4 feat(platform): close AI expense value loop`、`242d68c3 feat(approval): add task workflow and waiver decisions`、`28b834ed fix(approval): replay immutable action responses`、`4940ebc4 feat(approval): add safe risk disposition workflow`、`ee88a36b feat(ai): add tenant-safe hierarchical expense learning`、`6bdf65bc feat(expenses): add authoritative pre-review workflow`、`ae3f02c3 feat(expense): add persistent zero-entry receipt association`,另有 11 条。 + - 原因:`useAuditViewPermissions` 内部已经计算 `isRuleManager`,但未在返回对象中暴露;`AuditView` 同时没有解构该状态,渲染权限按钮时触发未定义引用。 + - 修改:权限 composable 明确返回 `isRuleManager`,视图层同步解构;新增权限状态导出与视图接线回归测试。 + - 验证:容器内前端测试 `816/816` 通过,Vite 生产构建成功;使用 `admin/admin` 实际进入规则管理,基础规则 8 条、风险规则列表和 MCP 服务 2 条均正常加载,页面无崩溃。 + - 影响:规则管理员与系统管理员的规则操作权限可以稳定参与渲染,基础规则、风险规则和 MCP 三个页签恢复可用。 +- 15:40:追加修复风险规则详情操作状态未向模板暴露的问题。 + - Git 提交检查:`git fetch --all --prune` 成功;upstream `origin/main` 无新提交;本地 ahead 19 条,最新包括 `07241b46 fix(docker): manage local postgres in default compose`、`787bc3a4 feat(platform): close AI expense value loop`、`242d68c3 feat(approval): add task workflow and waiver decisions`,另有 16 条。 + - 修改:`AuditView.js` 的 `setup()` 返回对象补齐 `riskRuleHasPublishableRevision`、`canEditRiskRuleDraft` 和 `canCreateRiskRuleRevision`;`audit-view-permissions.test.mjs` 新增模板权限暴露回归。 + - 操作:在 `local-x-financial-linux` 容器内运行规则权限、风险规则详情和员工模型定向测试,并执行 Vite 生产构建与 `git diff --check`。 + - 验证:定向前端测试 9 项全部通过,前端全量测试 `820/820` 通过,Vite 生产构建成功,差异格式检查通过。 + - 影响:已发布风险规则可正常显示“创建修订版本”,未发布草稿和待发布修订也能显示对应的编辑、发布入口。 diff --git a/web/src/views/scripts/AuditView.js b/web/src/views/scripts/AuditView.js index 3f7ede1..2a7e577 100644 --- a/web/src/views/scripts/AuditView.js +++ b/web/src/views/scripts/AuditView.js @@ -90,6 +90,7 @@ export default { const { detailBusy, isAdmin, + isRuleManager, selectedSkillIsRule, selectedSkillUsesSpreadsheet, selectedSkillUsesJsonRisk, @@ -650,8 +651,11 @@ export default { canOpenRiskRuleReviewSubmit, canSubmitRiskRuleReview, canReturnRiskRule, + riskRuleHasPublishableRevision, canPublishRiskRule, canToggleRiskRuleEnabled, + canEditRiskRuleDraft, + canCreateRiskRuleRevision, riskRuleTestPassed, riskRuleInReview, canSubmitReview, diff --git a/web/src/views/scripts/useAuditViewPermissions.js b/web/src/views/scripts/useAuditViewPermissions.js index 209335e..fc955b1 100644 --- a/web/src/views/scripts/useAuditViewPermissions.js +++ b/web/src/views/scripts/useAuditViewPermissions.js @@ -127,6 +127,7 @@ export function useAuditViewPermissions({ return { detailBusy, isAdmin, + isRuleManager, selectedSkillIsRule, selectedSkillUsesSpreadsheet, selectedSkillUsesJsonRisk, diff --git a/web/tests/audit-view-permissions.test.mjs b/web/tests/audit-view-permissions.test.mjs new file mode 100644 index 0000000..b9f579f --- /dev/null +++ b/web/tests/audit-view-permissions.test.mjs @@ -0,0 +1,39 @@ +import assert from 'node:assert/strict' +import { readFileSync } from 'node:fs' +import test from 'node:test' +import { fileURLToPath } from 'node:url' +import { ref } from 'vue' + +import { useAuditViewPermissions } from '../src/views/scripts/useAuditViewPermissions.js' + +function readSource(path) { + return readFileSync(fileURLToPath(new URL(path, import.meta.url)), 'utf8') +} + +test('规则管理向创建流程传递当前用户的规则管理权限', () => { + const permissions = useAuditViewPermissions({ + currentUser: ref({ username: 'admin', isAdmin: true, roleCodes: ['manager', 'finance'] }), + selectedSkill: ref(null), + actionState: ref('') + }) + const auditViewScript = readSource('../src/views/scripts/AuditView.js') + + assert.equal(permissions.isRuleManager.value, true) + assert.match( + auditViewScript, + /const\s*\{[\s\S]*?isRuleManager[\s\S]*?\}\s*=\s*useAuditViewPermissions\(/ + ) + assert.match( + auditViewScript, + /useAuditRiskRuleCreateFlow\(\{[\s\S]*?isRuleManager[\s\S]*?\}\)/ + ) +}) + +test('风险规则详情向模板暴露草稿、修订和发布权限', () => { + const auditViewScript = readSource('../src/views/scripts/AuditView.js') + const setupReturnBlock = auditViewScript.slice(auditViewScript.lastIndexOf('\n return {')) + + assert.match(setupReturnBlock, /\briskRuleHasPublishableRevision\s*,/) + assert.match(setupReturnBlock, /\bcanEditRiskRuleDraft\s*,/) + assert.match(setupReturnBlock, /\bcanCreateRiskRuleRevision\s*,/) +})