feat: P0/P1/P2全部功能 — 四层泳道/视角切换/KPI看板/预警/差异反打/预算/知识面板/回顾会/情景预测/Excel导入/角色权限
This commit is contained in:
@@ -0,0 +1,119 @@
|
||||
/**
|
||||
* 四层战略地图泳道配置常量
|
||||
* 管理会计OS — BSC四层因果链
|
||||
*
|
||||
* 颜色规范:
|
||||
* 财务层 #F56C6C (红) — 滞后指标(结果)
|
||||
* 客户层 #409EFF (蓝) — 领先指标(驱动)
|
||||
* 流程层 #67C23A (绿) — 领先指标(驱动)
|
||||
* 学习层 #E6A23C (橙) — 领先指标(根本驱动)
|
||||
*/
|
||||
|
||||
export const LAYER_KEYS = ['financial', 'customer', 'process', 'learning']
|
||||
|
||||
/** 每层默认的颜色/图标/预设节点 */
|
||||
export const LAYER_CONFIG = {
|
||||
financial: {
|
||||
key: 'financial',
|
||||
label: '财务层',
|
||||
enLabel: 'Financial',
|
||||
icon: '💰',
|
||||
iconComponent: 'Money',
|
||||
color: '#F56C6C',
|
||||
bgColor: '#FEF0F0',
|
||||
lightColor: '#FDE2E2',
|
||||
order: 1,
|
||||
description: '股东价值目标 — 滞后指标(结果)',
|
||||
defaultNodes: [
|
||||
{ name: '营收目标', targetValue: null, unit: '万元', isLeading: false },
|
||||
{ name: '净利润率', targetValue: null, unit: '%', isLeading: false },
|
||||
{ name: '现金流', targetValue: null, unit: '万元', isLeading: false },
|
||||
],
|
||||
},
|
||||
customer: {
|
||||
key: 'customer',
|
||||
label: '客户层',
|
||||
enLabel: 'Customer',
|
||||
icon: '👥',
|
||||
iconComponent: 'User',
|
||||
color: '#409EFF',
|
||||
bgColor: '#ECF5FF',
|
||||
lightColor: '#D9ECFF',
|
||||
order: 2,
|
||||
description: '客户价值主张 — 领先指标(驱动)',
|
||||
defaultNodes: [
|
||||
{ name: '客户满意度', targetValue: null, unit: '%', isLeading: true },
|
||||
{ name: '市场份额', targetValue: null, unit: '%', isLeading: true },
|
||||
{ name: '客户保留率', targetValue: null, unit: '%', isLeading: true },
|
||||
],
|
||||
},
|
||||
process: {
|
||||
key: 'process',
|
||||
label: '内部流程层',
|
||||
enLabel: 'Internal Process',
|
||||
icon: '⚙️',
|
||||
iconComponent: 'Setting',
|
||||
color: '#67C23A',
|
||||
bgColor: '#F0F9EB',
|
||||
lightColor: '#E1F3D8',
|
||||
order: 3,
|
||||
description: '流程卓越 — 领先指标(驱动)',
|
||||
defaultNodes: [
|
||||
{ name: '运营效率', targetValue: null, unit: '%', isLeading: true },
|
||||
{ name: '质量合格率', targetValue: null, unit: '%', isLeading: true },
|
||||
],
|
||||
},
|
||||
learning: {
|
||||
key: 'learning',
|
||||
label: '学习成长层',
|
||||
enLabel: 'Learning & Growth',
|
||||
icon: '📚',
|
||||
iconComponent: 'Reading',
|
||||
color: '#E6A23C',
|
||||
bgColor: '#FDF6EC',
|
||||
lightColor: '#FAECD8',
|
||||
order: 4,
|
||||
description: '无形资产 — 领先指标(根本驱动)',
|
||||
defaultNodes: [
|
||||
{ name: '关键岗位胜任度', targetValue: null, unit: '%', isLeading: true },
|
||||
{ name: '培训完成率', targetValue: null, unit: '%', isLeading: true },
|
||||
],
|
||||
},
|
||||
}
|
||||
|
||||
/** 根据层KEY获取颜色 */
|
||||
export function getLayerColor(layerKey) {
|
||||
return LAYER_CONFIG[layerKey]?.color || '#909399'
|
||||
}
|
||||
|
||||
/** 根据层KEY获取中文标签 */
|
||||
export function getLayerLabel(layerKey) {
|
||||
return LAYER_CONFIG[layerKey]?.label || layerKey
|
||||
}
|
||||
|
||||
/** 根据层KEY获取英文标签 */
|
||||
export function getLayerEnLabel(layerKey) {
|
||||
return LAYER_CONFIG[layerKey]?.enLabel || layerKey
|
||||
}
|
||||
|
||||
/** 获取所有层的配置数组(按order排序) */
|
||||
export function getLayerList() {
|
||||
return LAYER_KEYS.map((k) => LAYER_CONFIG[k]).sort(
|
||||
(a, b) => a.order - b.order
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算节点状态
|
||||
* @param {number|null} currentValue
|
||||
* @param {number|null} targetValue
|
||||
* @param {boolean} isLeading - 领先指标
|
||||
* @returns {'success'|'warning'|'danger'|'info'}
|
||||
*/
|
||||
export function computeNodeStatus(currentValue, targetValue) {
|
||||
if (currentValue == null || targetValue == null) return 'info'
|
||||
const ratio = targetValue === 0 ? 0 : currentValue / targetValue
|
||||
if (ratio >= 1.0) return 'success'
|
||||
if (ratio >= 0.8) return 'warning'
|
||||
return 'danger'
|
||||
}
|
||||
Reference in New Issue
Block a user