feat: OKR模板库改造 — 弹窗模板库联动+时间分解落库+制造业包6个

This commit is contained in:
Hermes CI Fix
2026-08-11 00:11:25 +08:00
parent 32fe3e4d50
commit 0b191d278e
7 changed files with 413 additions and 8 deletions
+36 -1
View File
@@ -147,7 +147,7 @@
<script setup lang="ts">
import { ref, reactive, computed, watch, onMounted, nextTick, onUnmounted } from "vue"
import { ElMessage, ElMessageBox } from "element-plus"
import { mapApi, kpiApi } from "../api/index"
import { mapApi, kpiApi, okrTemplateApi } from "../api/index"
import KnowledgePanel from '../components/KnowledgePanel.vue'
import api from "../api/index"
import { LAYER_CONFIG, LAYER_KEYS, getLayerList } from "../config/layers"
@@ -574,6 +574,11 @@ function onNodeSave(data: any) {
template_name: data.template_name || null, // 来源模板名
}
// 用户自定义O自动入库(第3层:用户贡献模板)
if (data.template_id == null && Array.isArray(data.krs) && data.krs.length >= 2) {
saveUserTemplate(data, layer)
}
if (editingNodeData.value?._index != null && editingNodeData.value._dimKey === layer) {
// 编辑已有节点
const idx = editingNodeData.value._index
@@ -606,6 +611,36 @@ function onNodeSave(data: any) {
nextTick(triggerRecalc)
}
// ── 用户自定义O自动入库(OKR模板库第3层) ──
let userTemplateCooldown: Record<string, number> = {}
async function saveUserTemplate(data: any, layer: string) {
const name = (data.name || '').trim()
if (!name) return
// 防抖:同一名称30秒内不重复入库
const now = Date.now()
if (userTemplateCooldown[name] && now - userTemplateCooldown[name] < 30000) return
userTemplateCooldown[name] = now
try {
await okrTemplateApi.create({
name,
description: (data.description || '').trim(),
dimension: layer,
preset_krs: (data.krs || []).map((kr: any) => ({
name: kr.name,
target_value: kr.target_value,
weight: kr.weight || 33,
})),
})
// 静默成功,不打扰用户
} catch (e: any) {
// 已存在同名模板等错误静默忽略
const detail = e?.response?.data?.detail || ''
if (detail && !String(detail).includes('重复')) {
console.warn('[OKR模板库] 用户模板入库失败:', detail)
}
}
}
async function deleteNode(dimKey: string, oi: number) {
try {
const dim = dimensions.find((d: any) => d.key === dimKey)