Commit 7b7c281e authored by David Yang's avatar David Yang

update: ui

parent 6f4521a3
...@@ -14,6 +14,8 @@ const ROUTE_PATHS = { ...@@ -14,6 +14,8 @@ const ROUTE_PATHS = {
export default defineConfig({ export default defineConfig({
layout: false, layout: false,
fastRefresh: true, fastRefresh: true,
base: '/risk_case_library/',
publicPath: '/risk_case_library/',
alias: { alias: {
react: resolvePackageRoot('react'), react: resolvePackageRoot('react'),
'react-dom': resolvePackageRoot('react-dom'), 'react-dom': resolvePackageRoot('react-dom'),
......
{
"name": "project_manager_new",
"version": "1.0.1",
"build": "abc",
"description": "merge master",
"date": "2025-07-14 19:27:20",
"author": "yang"
}
...@@ -17,7 +17,7 @@ const menuGroups = [ ...@@ -17,7 +17,7 @@ const menuGroups = [
title: '案例库工作台', title: '案例库工作台',
items: [ items: [
{ {
name: '案例总览', name: '驾驶舱',
path: '/resource/stat', path: '/resource/stat',
icon: Squares2X2Icon, icon: Squares2X2Icon,
}, },
......
...@@ -22,14 +22,15 @@ ...@@ -22,14 +22,15 @@
保留现有两级菜单框架,但替换业务语义: 保留现有两级菜单框架,但替换业务语义:
- 左侧菜单:`案例总览` - 左侧菜单:`驾驶舱`
- 左侧菜单:`案例管理` - 左侧菜单:`案例管理`
推荐职责划分: 推荐职责划分:
- `案例总览` - `驾驶舱`
- 展示案例总数、案例性质分布、关键字热度、最近更新 - 展示案例总数、分类数量、标签数量、案例类型数量、待整理数量、最近 7 天更新
- 通过图表展示案例性质占比、案例年份分布、近 7 日更新活跃度 - 通过图表展示分类结构、案例类型排行、案例来源分布
- 展示关键字词云与最近更新案例
- 提供对库内内容密度和结构完整度的快速判断 - 提供对库内内容密度和结构完整度的快速判断
- `案例管理` - `案例管理`
- 搜索、筛选、浏览案例卡片 - 搜索、筛选、浏览案例卡片
...@@ -55,7 +56,7 @@ ...@@ -55,7 +56,7 @@
- `case_attribute`:案例属性 - `case_attribute`:案例属性
- `case_details`:案例详情正文 - `case_details`:案例详情正文
- `case_warning`:案例警示 - `case_warning`:案例警示
- `keyword`:关键字,用于检索和热度统计 - `keyword`:关键字,多值字符串数组,用于检索和热度统计
- `case_source`:案例来源 - `case_source`:案例来源
- `case_level`:案例等级 - `case_level`:案例等级
- `case_year`:案例年份 - `case_year`:案例年份
...@@ -88,7 +89,7 @@ ...@@ -88,7 +89,7 @@
- `案例属性` → `metadata.case_attribute` - `案例属性` → `metadata.case_attribute`
- `案例详情` → `content`、`metadata.case_details` - `案例详情` → `content`、`metadata.case_details`
- `案例警示` → `metadata.case_warning` - `案例警示` → `metadata.case_warning`
- `关键字` → `metadata.keyword`,同时回填 `metadata.tag` 以兼容现有检索 - `关键字` → 按英文逗号或中文逗号拆分、去空、去重后写入 `metadata.keyword` 字符串数组,同时回填 `metadata.tag` 以兼容现有检索
- `案例来源` → `metadata.case_source` - `案例来源` → `metadata.case_source`
- `案例等级` → `metadata.case_level` - `案例等级` → `metadata.case_level`
- `案例年份` → `metadata.case_year` - `案例年份` → `metadata.case_year`
...@@ -114,6 +115,7 @@ ...@@ -114,6 +115,7 @@
- `案例等级` - `案例等级`
- `案例年份` - `案例年份`
5. 浏览器直接下载 `.xlsx` 文件 5. 浏览器直接下载 `.xlsx` 文件
6. `metadata.keyword` 导出到 `关键字` 列时恢复为逗号拼接字符串,便于线下继续维护
### 4.4 浏览与检索案例 ### 4.4 浏览与检索案例
...@@ -124,14 +126,16 @@ ...@@ -124,14 +126,16 @@
5. 页面顶部提供 `Segment` 视图切换,可在“卡片视图 / 表格视图”之间切换 5. 页面顶部提供 `Segment` 视图切换,可在“卡片视图 / 表格视图”之间切换
6. 卡片视图用于浏览案例摘要,点击卡片后以弹框方式查看并编辑详情 6. 卡片视图用于浏览案例摘要,点击卡片后以弹框方式查看并编辑详情
7. 表格视图展示标题、分类、标签、案例类型、关键字、来源、等级、年份、更新时间等字段 7. 表格视图展示标题、分类、标签、案例类型、关键字、来源、等级、年份、更新时间等字段
8. 表格视图支持单选、全选当前已加载案例,并显示当前勾选数量 8. 表格视图按页加载案例,支持选择每页 20、50、100 条,并显示页码、当前页范围和匹配总数
9. 表格视图支持单选、全选当前页案例,并显示当前勾选数量
### 4.5 编辑案例 ### 4.5 编辑案例
1. 用户在列表中打开某个案例详情 1. 用户在列表中打开某个案例详情
2. 修改标题、分类、标签、案例类型、案例属性、案例详情、案例警示、关键字、案例来源、案例等级、案例年份 2. 修改标题、分类、标签、案例类型、案例属性、案例详情、案例警示、关键字、案例来源、案例等级、案例年份
3. 前端调用 `PUT /record/:name` 3. 关键字编辑区支持逗号输入,并实时预览为关键字标签;保存时拆分为 `metadata.keyword` 字符串数组
4. 保存成功后刷新列表与统计数据 4. 前端调用 `PUT /record/:name`
5. 保存成功后刷新列表与统计数据
### 4.6 批量修改案例 ### 4.6 批量修改案例
...@@ -176,40 +180,44 @@ ...@@ -176,40 +180,44 @@
- 未识别到的列忽略,不中断导入 - 未识别到的列忽略,不中断导入
- 空行直接跳过 - 空行直接跳过
- `标题` 为空时,优先使用 `案例类型`,再回退为 `案例详情` 摘要自动生成 `title` - `标题` 为空时,优先使用 `案例类型`,再回退为 `案例详情` 摘要自动生成 `title`
- 所有文本字段统一按字符串保存 - 普通文本字段统一按字符串保存
- `关键字` 是多值字段,导入时将逗号拼接文本拆分为字符串数组保存
- `案例年份` 优先按数字写入,不可解析时保留原字符串 - `案例年份` 优先按数字写入,不可解析时保留原字符串
- 导出模板固定为 11 列标准表头,便于线下统一维护 - 导出模板固定为 11 列标准表头,便于线下统一维护
### 5.3 筛选规则 ### 5.3 筛选规则
- 案例性质筛选使用 `metadata.category` - 案例性质筛选使用 `metadata.category`
- 关键字筛选优先使用 `metadata.keyword`,同时兼容历史 `metadata.tag` - 关键字筛选优先使用多值数组 `metadata.keyword`,同时兼容历史字符串型 `metadata.keyword` 与 `metadata.tag`
- 关键词检索同时覆盖 `title`、`metadata.label`、`metadata.case_type`、`metadata.case_attribute`、`metadata.case_details`、`metadata.case_warning`、`metadata.keyword`、`metadata.case_source`、`metadata.case_level`、`metadata.category`、`metadata.tag` - 关键词检索同时覆盖 `title`、`metadata.label`、`metadata.case_type`、`metadata.case_attribute`、`metadata.case_details`、`metadata.case_warning`、`metadata.keyword`、`metadata.case_source`、`metadata.case_level`、`metadata.category`、`metadata.tag`
--- ---
## 6. 页面与交互要求 ## 6. 页面与交互要求
### 6.1 案例总览 ### 6.1 驾驶舱
建议至少展示: 建议至少展示:
- 案例总数 - 案例总数
- 分类数量
- 标签数量
- 案例类型数量
- 最近 7 天更新数 - 最近 7 天更新数
- 案例性质分布 - 分类结构饼图
- 关键字热度 - 案例类型排行柱状图
- 案例年份分布趋势图 - 案例来源分布横向柱状图
- 近 7 日更新活跃度图 - 关键字词云
- 最近更新案例 - 最近更新案例
- 重点长文本案例或待整理案例,待整理规则关注缺少案例性质、关键字、案例详情或详情偏短
- 数据洞察卡片,例如分类最集中主题、最高频关键字、结构完整度 - 数据洞察卡片,例如分类最集中主题、最高频关键字、结构完整度
图表口径说明: 图表口径说明:
- 案例性质分布:按 `metadata.category` 聚合 - 分类结构:按 `metadata.category` 聚合,缺失时归入 `未分类`
- 关键字热度:按 `metadata.keyword`,缺失时兼容 `metadata.tag` - 案例类型排行:按 `metadata.case_type` 聚合,缺失时归入 `未填写类型`
- 案例年份分布:按 `metadata.case_year` 聚合 - 案例来源分布:按 `metadata.case_source` 聚合,缺失时归入 `未填写来源`
- 近 7 日更新活跃度:按 `updated_at` 汇总最近 7 天更新次数 - 关键字词云:按 `metadata.keyword` 聚合并按热度调整字号,缺失时兼容 `metadata.tag`
- 最近 7 天更新:按 `updated_at` 统计近 7 天更新的案例数量
### 6.2 案例管理 ### 6.2 案例管理
...@@ -243,6 +251,7 @@ ...@@ -243,6 +251,7 @@
- 案例详情全文 - 案例详情全文
- 案例性质 - 案例性质
- 关键字 - 关键字
- 关键字以标签形式展示;编辑时保留逗号输入并即时预览拆分后的标签
- 案例警示 - 案例警示
- 案例来源 / 案例等级 / 案例年份 - 案例来源 / 案例等级 / 案例年份
- 案例详情字数 - 案例详情字数
...@@ -274,10 +283,11 @@ ...@@ -274,10 +283,11 @@
## 8. 分页与性能建议 ## 8. 分页与性能建议
- 首屏只加载一页,建议每页 24 条 - 首屏只加载第一页,默认每页 20 条
- 列表滚动到底部时自动加载下一页 - 表格与卡片列表通过页码分页加载,不使用下滑自动加载
- 用户可选择每页 20、50、100 条;切换每页数量时从第一页重新加载
- 当用户切换分类或搜索条件时,从第一页重新加载 - 当用户切换分类或搜索条件时,从第一页重新加载
- 总数通过 `count` 接口单独获取 - 总数优先读取 `POST /record/query` 返回的 `total_records`;接口未返回总数时再回退到 `count` 接口
--- ---
...@@ -297,4 +307,4 @@ ...@@ -297,4 +307,4 @@
1. `risk_case_library` 1. `risk_case_library`
当前不拆分独立关键字表、案例性质表或附件表。 当前不拆分独立关键字表、案例性质表或附件表。
案例性质与关键字先通过文本字段实现,后续如有需要再演进。 案例性质先通过文本字段实现,关键字通过多值文本数组实现,后续如有需要再演进。
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
- 所有业务字段都放在 `metadata` 中 - 所有业务字段都放在 `metadata` 中
- 案例详情走纯文本,不单独拆分附件对象 - 案例详情走纯文本,不单独拆分附件对象
- 一期先不建独立关键字表、案例性质表 - 一期先不建独立关键字表、案例性质表
- 案例性质和关键字先通过文本字段实现 - 案例性质先通过文本字段实现,关键字通过多值文本字段实现
--- ---
...@@ -47,7 +47,7 @@ ...@@ -47,7 +47,7 @@
| 案例属性 | `case_attribute` | `text` | 否 | 否 | 否 | 无 | 案例属性或归属维度 | | 案例属性 | `case_attribute` | `text` | 否 | 否 | 否 | 无 | 案例属性或归属维度 |
| 案例详情 | `case_details` | `long_text` | 否 | 否 | 否 | 无 | 案例详细内容正文 | | 案例详情 | `case_details` | `long_text` | 否 | 否 | 否 | 无 | 案例详细内容正文 |
| 案例警示 | `case_warning` | `text` | 否 | 否 | 否 | 无 | 警示或风险提示 | | 案例警示 | `case_warning` | `text` | 否 | 否 | 否 | 无 | 警示或风险提示 |
| 关键字 | `keyword` | `text` | 否 | 否 | 否 | 无 | 用户自定义检索关键字 | | 关键字 | `keyword` | `text` | 否 | 是 | 否 | 无 | 用户自定义检索关键字;导入逗号拼接值需拆分为数组 |
| 案例来源 | `case_source` | `text` | 否 | 否 | 否 | 无 | 如监管通报、内部复盘 | | 案例来源 | `case_source` | `text` | 否 | 否 | 否 | 无 | 如监管通报、内部复盘 |
| 案例等级 | `case_level` | `text` | 否 | 否 | 否 | 无 | 风险等级或分级 | | 案例等级 | `case_level` | `text` | 否 | 否 | 否 | 无 | 风险等级或分级 |
| 案例年份 | `case_year` | `number` | 否 | 否 | 否 | 无 | 案例发生或归档年份 | | 案例年份 | `case_year` | `number` | 否 | 否 | 否 | 无 | 案例发生或归档年份 |
...@@ -98,7 +98,7 @@ ...@@ -98,7 +98,7 @@
1. 在案例管理页手动创建后,能生成 `risk_case_library` 1. 在案例管理页手动创建后,能生成 `risk_case_library`
2. 通过 Excel 导入后,能批量生成 `risk_case_library` 2. 通过 Excel 导入后,能批量生成 `risk_case_library`
3. 案例总览页能正确读取案例性质、关键字和更新统计 3. 驾驶舱页能正确读取分类、案例类型、案例来源、关键字和更新统计
4. 案例详情页能完成编辑与删除 4. 案例详情页能完成编辑与删除
--- ---
......
...@@ -154,7 +154,7 @@ ...@@ -154,7 +154,7 @@
"case_attribute": "流程绕行", "case_attribute": "流程绕行",
"case_details": "某项目在高峰采购期内,多次通过拆分订单绕过审批阈值……", "case_details": "某项目在高峰采购期内,多次通过拆分订单绕过审批阈值……",
"case_warning": "涉及审批阈值、例外授权和供应商集中度的场景应设置联合预警。", "case_warning": "涉及审批阈值、例外授权和供应商集中度的场景应设置联合预警。",
"keyword": "采购审批, 拆单", "keyword": ["采购审批", "拆单"],
"case_source": "内部审计复盘", "case_source": "内部审计复盘",
"case_level": "高", "case_level": "高",
"case_year": 2024 "case_year": 2024
...@@ -229,7 +229,7 @@ ...@@ -229,7 +229,7 @@
"case_attribute": "财务舞弊", "case_attribute": "财务舞弊",
"case_details": "财务负责人通过虚构往来科目转移资金……", "case_details": "财务负责人通过虚构往来科目转移资金……",
"case_warning": "资金支付复核应与月末异常波动分析交叉验证。", "case_warning": "资金支付复核应与月末异常波动分析交叉验证。",
"keyword": "资金管理, 异常调账", "keyword": ["资金管理", "异常调账"],
"case_source": "内部通报", "case_source": "内部通报",
"case_level": "高", "case_level": "高",
"case_year": 2025 "case_year": 2025
...@@ -242,3 +242,5 @@ ...@@ -242,3 +242,5 @@
- `title`、`content_type`、`content`、`metadata`、`subject` 这一层结构正确 - `title`、`content_type`、`content`、`metadata`、`subject` 这一层结构正确
- 案例业务字段全部放入 `metadata` - 案例业务字段全部放入 `metadata`
- `metadata.keyword` 为多值字符串数组;Excel 导入如读取到 `资金管理, 异常调账`,前端需拆分为 `["资金管理", "异常调账"]` 后保存
- Excel 导出时,`metadata.keyword` 数组需恢复为逗号拼接字符串写入 `关键字` 列
...@@ -48,7 +48,7 @@ type Record = { ...@@ -48,7 +48,7 @@ type Record = {
"case_attribute": "内部控制缺陷", "case_attribute": "内部控制缺陷",
"case_details": "项目经理通过虚构供应商合同套取资金……", "case_details": "项目经理通过虚构供应商合同套取资金……",
"case_warning": "供应商准入与合同审批需交叉复核", "case_warning": "供应商准入与合同审批需交叉复核",
"keyword": "资金挪用, 虚构合同", "keyword": ["资金挪用", "虚构合同"],
"case_source": "内部通报", "case_source": "内部通报",
"case_level": "高", "case_level": "高",
"case_year": 2025 "case_year": 2025
...@@ -64,6 +64,7 @@ type Record = { ...@@ -64,6 +64,7 @@ type Record = {
- 统一存储为字符串 - 统一存储为字符串
- Excel 导入时,空单元格需要转换为空字符串,避免 `undefined` - Excel 导入时,空单元格需要转换为空字符串,避免 `undefined`
- 若字段配置 `multiple: true`,统一存储为字符串数组;Excel 单元格中的英文逗号或中文逗号拼接值需要拆分、去空并去重
### 2.2 `Record.title` ### 2.2 `Record.title`
...@@ -78,7 +79,7 @@ type Record = { ...@@ -78,7 +79,7 @@ type Record = {
- 卡片或详情摘要使用 `case_details` - 卡片或详情摘要使用 `case_details`
- 案例性质筛选读取 `category` - 案例性质筛选读取 `category`
- 标签筛选读取 `tag` - 标签筛选读取 `tag`
- 关键字筛选读取 `keyword`,历史数据可兼容读取 `tag` - 关键字筛选读取多值数组 `keyword`,历史数据可兼容读取字符串型 `keyword` 与 `tag`
- 关键词检索优先覆盖 `label`、`keyword`、`case_details`、`case_warning` - 关键词检索优先覆盖 `label`、`keyword`、`case_details`、`case_warning`
--- ---
...@@ -100,7 +101,7 @@ type Record = { ...@@ -100,7 +101,7 @@ type Record = {
- `case_attribute` 用于补充案例属性、归属维度或风险特征 - `case_attribute` 用于补充案例属性、归属维度或风险特征
- `case_details` 为案例详情正文,通常为几百到上千字 - `case_details` 为案例详情正文,通常为几百到上千字
- `case_warning` 用于提炼关键警示信息 - `case_warning` 用于提炼关键警示信息
- `keyword` 用于检索和热度统计,可与历史 `tag` 并存 - `keyword` 用于检索和热度统计,按多值字符串数组存储,可与历史 `tag` 并存
- `case_year` 建议存储为数字类型年份,便于筛选和排序 - `case_year` 建议存储为数字类型年份,便于筛选和排序
| 字段标签 | 字段别名 | 字段类型 | 默认值 | 是否主键 | 是否多值 | 是否必填 | 搜索 | 聚合 | 说明 | | 字段标签 | 字段别名 | 字段类型 | 默认值 | 是否主键 | 是否多值 | 是否必填 | 搜索 | 聚合 | 说明 |
...@@ -112,7 +113,7 @@ type Record = { ...@@ -112,7 +113,7 @@ type Record = {
| 案例属性 | `case_attribute` | `text` | `null` | 否 | 否 | 否 | 否 | 否 | 案例属性或归属维度 | | 案例属性 | `case_attribute` | `text` | `null` | 否 | 否 | 否 | 否 | 否 | 案例属性或归属维度 |
| 案例详情 | `case_details` | `long_text` | `null` | 否 | 否 | 否 | 否 | 否 | 案例详细内容正文 | | 案例详情 | `case_details` | `long_text` | `null` | 否 | 否 | 否 | 否 | 否 | 案例详细内容正文 |
| 案例警示 | `case_warning` | `text` | `null` | 否 | 否 | 否 | 否 | 否 | 案例提炼出的警示或风险提示 | | 案例警示 | `case_warning` | `text` | `null` | 否 | 否 | 否 | 否 | 否 | 案例提炼出的警示或风险提示 |
| 关键字 | `keyword` | `text` | `null` | 否 | 否 | 否 | 否 | 否 | 检索关键字,支持人工维护 | | 关键字 | `keyword` | `text` | `null` | 否 | 是 | 否 | 否 | 否 | 检索关键字,支持人工维护;导入时逗号拼接值需拆分为数组 |
| 案例来源 | `case_source` | `text` | `null` | 否 | 否 | 否 | 否 | 否 | 案例来源,如监管通报、内部复盘 | | 案例来源 | `case_source` | `text` | `null` | 否 | 否 | 否 | 否 | 否 | 案例来源,如监管通报、内部复盘 |
| 案例等级 | `case_level` | `text` | `null` | 否 | 否 | 否 | 否 | 否 | 案例风险等级或分级 | | 案例等级 | `case_level` | `text` | `null` | 否 | 否 | 否 | 否 | 否 | 案例风险等级或分级 |
| 案例年份 | `case_year` | `number` | `null` | 否 | 否 | 否 | 否 | 否 | 案例发生或归档年份 | | 案例年份 | `case_year` | `number` | `null` | 否 | 否 | 否 | 否 | 否 | 案例发生或归档年份 |
...@@ -130,7 +131,7 @@ type Record = { ...@@ -130,7 +131,7 @@ type Record = {
{ "name": "case_attribute", "label": "案例属性", "type": "text", "default": null, "multiple": false, "required": false, "primary": false, "search": { "enabled": false }, "aggregation": { "enabled": false }, "settings": {} }, { "name": "case_attribute", "label": "案例属性", "type": "text", "default": null, "multiple": false, "required": false, "primary": false, "search": { "enabled": false }, "aggregation": { "enabled": false }, "settings": {} },
{ "name": "case_details", "label": "案例详情", "type": "long_text", "default": null, "multiple": false, "required": false, "primary": false, "search": { "enabled": false }, "aggregation": { "enabled": false }, "settings": {} }, { "name": "case_details", "label": "案例详情", "type": "long_text", "default": null, "multiple": false, "required": false, "primary": false, "search": { "enabled": false }, "aggregation": { "enabled": false }, "settings": {} },
{ "name": "case_warning", "label": "案例警示", "type": "text", "default": null, "multiple": false, "required": false, "primary": false, "search": { "enabled": false }, "aggregation": { "enabled": false }, "settings": {} }, { "name": "case_warning", "label": "案例警示", "type": "text", "default": null, "multiple": false, "required": false, "primary": false, "search": { "enabled": false }, "aggregation": { "enabled": false }, "settings": {} },
{ "name": "keyword", "label": "关键字", "type": "text", "default": null, "multiple": false, "required": false, "primary": false, "search": { "enabled": false }, "aggregation": { "enabled": false }, "settings": {} }, { "name": "keyword", "label": "关键字", "type": "text", "default": null, "multiple": true, "required": false, "primary": false, "search": { "enabled": false }, "aggregation": { "enabled": false }, "settings": {} },
{ "name": "case_source", "label": "案例来源", "type": "text", "default": null, "multiple": false, "required": false, "primary": false, "search": { "enabled": false }, "aggregation": { "enabled": false }, "settings": {} }, { "name": "case_source", "label": "案例来源", "type": "text", "default": null, "multiple": false, "required": false, "primary": false, "search": { "enabled": false }, "aggregation": { "enabled": false }, "settings": {} },
{ "name": "case_level", "label": "案例等级", "type": "text", "default": null, "multiple": false, "required": false, "primary": false, "search": { "enabled": false }, "aggregation": { "enabled": false }, "settings": {} }, { "name": "case_level", "label": "案例等级", "type": "text", "default": null, "multiple": false, "required": false, "primary": false, "search": { "enabled": false }, "aggregation": { "enabled": false }, "settings": {} },
{ "name": "case_year", "label": "案例年份", "type": "number", "default": null, "multiple": false, "required": false, "primary": false, "search": { "enabled": false }, "aggregation": { "enabled": false }, "settings": {} } { "name": "case_year", "label": "案例年份", "type": "number", "default": null, "multiple": false, "required": false, "primary": false, "search": { "enabled": false }, "aggregation": { "enabled": false }, "settings": {} }
...@@ -148,7 +149,7 @@ type Record = { ...@@ -148,7 +149,7 @@ type Record = {
"case_attribute": "流程绕行", "case_attribute": "流程绕行",
"case_details": "某项目在高峰采购期内,多次通过拆分订单绕过审批阈值,导致同一供应商在短期内累计发生异常采购金额。复盘发现,审批节点设置与例外授权规则未同步更新,最终形成流程漏洞。", "case_details": "某项目在高峰采购期内,多次通过拆分订单绕过审批阈值,导致同一供应商在短期内累计发生异常采购金额。复盘发现,审批节点设置与例外授权规则未同步更新,最终形成流程漏洞。",
"case_warning": "涉及审批阈值、例外授权和供应商集中度的场景应设置联合预警。", "case_warning": "涉及审批阈值、例外授权和供应商集中度的场景应设置联合预警。",
"keyword": "审批, 采购, 拆单", "keyword": ["审批", "采购", "拆单"],
"case_source": "内部审计复盘", "case_source": "内部审计复盘",
"case_level": "高", "case_level": "高",
"case_year": 2024 "case_year": 2024
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment