fix(audit): expose rule management permission state

This commit is contained in:
caoxiaozhu
2026-07-20 10:30:35 +08:00
parent 140efd1a2a
commit 208e1bed59
4 changed files with 62 additions and 0 deletions

View File

@@ -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 生产构建成功,差异格式检查通过。
- 影响:已发布风险规则可正常显示“创建修订版本”,未发布草稿和待发布修订也能显示对应的编辑、发布入口。

View File

@@ -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,

View File

@@ -127,6 +127,7 @@ export function useAuditViewPermissions({
return {
detailBusy,
isAdmin,
isRuleManager,
selectedSkillIsRule,
selectedSkillUsesSpreadsheet,
selectedSkillUsesJsonRisk,

View File

@@ -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*,/)
})