init: 管理会计OS初始代码

包含前后端完整代码:
- 前端:Vue3+Vite+ElementPlus
- 后端:FastAPI+SQLAlchemy
- 模块:驾驶舱/KPI/战略地图/预警/预算/成本/预测/改善行动
- 当前版本:v1.0.0
This commit is contained in:
Hermes CI Fix
2026-05-28 17:32:22 +08:00
commit 3dddd36866
142 changed files with 18533 additions and 0 deletions
+103
View File
@@ -0,0 +1,103 @@
<template>
<div>
<div style="display:flex;justify-content:space-between;margin-bottom:16px;">
<h3>战略地图</h3>
<el-button type="primary" @click="showForm=true;form={}">新建地图</el-button>
</div>
<el-table :data="maps" style="width:100%">
<el-table-column prop="title" label="地图名称" min-width="200" />
<el-table-column prop="version" label="版本" width="80" />
<el-table-column prop="status" label="状态" width="80">
<template #default="{ row }">{{ row.status === "published" ? "已发布" : "草稿" }}</template>
</el-table-column>
<el-table-column prop="created_at" label="创建时间" width="180" />
<el-table-column label="操作" width="250">
<template #default="{ row }">
<el-button size="small" @click='goCanvas(row.id)'>画布</el-button>
<el-button size="small" @click='editMap(row)'>编辑</el-button>
<el-button size="small" @click='goVersion(row.id)'>版本</el-button>
<el-button size="small" type="danger" @click="deleteMap(row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- 新建/编辑弹窗 -->
<el-dialog v-model="showForm" :title="editingMap ? '编辑地图' : '新建战略地图'" width="500">
<el-form :model="form" label-width="100px">
<el-form-item label="地图名称"><el-input v-model="form.title" /></el-form-item>
<el-form-item label="版本号"><el-input v-model="form.version" placeholder="v1.0" /></el-form-item>
<el-form-item label="创建方式" v-if="!editingMap">
<el-radio-group v-model="createMode">
<el-radio value="blank">空白地图</el-radio>
<el-radio value="template">快速模板4维度+预设目标</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="showForm=false">取消</el-button>
<el-button type="primary" @click="saveMap">保存</el-button>
</template>
</el-dialog>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from "vue"
import { useRouter } from "vue-router"
import { ElMessage, ElMessageBox } from "element-plus"
import { mapApi } from "../api/index"
const router = useRouter()
const maps = ref<any[]>([])
const showForm = ref(false)
const editingMap = ref<any>(null)
const form = ref<any>({})
const createMode = ref("blank")
async function load() {
try { const r: any = await mapApi.list(); maps.value = r.data || [] } catch (e) {}
}
function goCanvas(id: number) { router.push('/maps/canvas/' + id) }
function goVersion(id: number) { router.push('/maps/versions/' + id) }
async function saveMap() {
try {
if (editingMap.value) {
await mapApi.update(editingMap.value.id, form.value)
ElMessage.success("已更新")
} else if (createMode.value === "template") {
await mapApi.createWithTemplate ? await mapApi.createWithTemplate(form.value) : await mapApi.create(form.value)
ElMessage.success("模板地图已创建")
} else {
await mapApi.create(form.value)
ElMessage.success("创建成功")
}
showForm.value = false
editingMap.value = null
load()
} catch (e) {
ElMessage.error("操作失败")
}
}
function editMap(map: any) {
editingMap.value = map
form.value = { title: map.title, version: map.version }
showForm.value = true
}
function handleClick(path: string) { window.location.href = path }
async function deleteMap(map: any) {
try {
await ElMessageBox.confirm(`确定删除「${map.title}」?`)
await mapApi.delete ? await mapApi.delete(map.id) : ElMessage.warning("当前API不支持删除")
ElMessage.success("已删除")
load()
} catch (e: any) {
if (e !== "cancel") ElMessage.error("删除失败")
}
}
onMounted(load)
</script>