feat: OKR模板库改造 — 弹窗模板库联动+时间分解落库+制造业包6个
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user