fix(ui): 系统级设置归位(KPI对齐/预算模式切换入口收归系统设置)+ 业务页右下浮窗提醒
ci/woodpecker/push/main Pipeline failed

- KPIAlignment.vue: 移除页头切换按钮与模式选择器,去 saveAlignConfig;新增右下浮窗
- BudgetManagement.vue: 预算模式 el-switch -> 只读标签,去 onBudgetModeChange;新增右下浮窗
- RolePermissions.vue: 保留目标对齐正本,新增「预算模式」Tab(系统级切换入口)
- 仅 frontend/ 三件;build 通过
This commit is contained in:
wecom-fullstack
2026-10-13 23:04:07 +08:00
committed by Hermes CI Fix
parent 424c33c085
commit 26db15e6d3
3 changed files with 107 additions and 81 deletions
+52 -1
View File
@@ -134,6 +134,24 @@
</div>
</div>
</el-tab-pane>
<!-- Tab 3: 预算模式(系统级) -->
<el-tab-pane label="预算模式" name="budget">
<p style="color:#999;font-size:13px;margin-top:4px;">
系统级设置,影响全部账套。业务页「预算管理」仅只读展示当前模式,切换入口统一在此。
</p>
<div style="margin-top:20px;display:flex;align-items:center;gap:12px;flex-wrap:wrap;">
<el-radio-group v-model="budgetModeSel">
<el-radio-button value="fixed">固定预算</el-radio-button>
<el-radio-button value="rolling">滚动预算</el-radio-button>
</el-radio-group>
<el-button type="primary" :loading="savingBudget"
:disabled="!budgetModeSel || budgetModeSel === budgetModeCur" @click="saveBudgetMode">保存</el-button>
<span style="color:#909399;font-size:13px;">
当前:{{ budgetModeCur === 'rolling' ? '滚动预算(滚动12月)' : '固定预算(固定年度)' }}
</span>
</div>
</el-tab-pane>
</el-tabs>
</div>
</template>
@@ -142,7 +160,7 @@
import { ref, onMounted, computed } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
// 统一走 api/index.ts 的 axios 实例(拦截器自动带 Bearer / 401 跳登录)
import { permissionApi, alignmentApi } from '../api/index'
import { permissionApi, alignmentApi, budgetApi } from '../api/index'
// ── Tab 控制 ──
const activeTab = ref('permissions')
@@ -290,6 +308,38 @@ async function saveAlignmentConfig() {
savingAlign.value = false
}
// ── 预算模式(系统级;业务页仅只读,切换入口统一在此) ──
const budgetModeCur = ref('fixed')
const budgetModeSel = ref('fixed')
const savingBudget = ref(false)
async function loadBudgetMode() {
try {
const r: any = await budgetApi.getConfig()
budgetModeCur.value = r.budget_mode || r.mode || 'fixed'
budgetModeSel.value = budgetModeCur.value
} catch { budgetModeCur.value = 'fixed'; budgetModeSel.value = 'fixed' }
}
async function saveBudgetMode() {
if (!budgetModeSel.value || budgetModeSel.value === budgetModeCur.value) return
const label = budgetModeSel.value === 'rolling' ? '滚动预算' : '固定预算'
try {
await ElMessageBox.confirm(
`预算模式为系统级设置,切换后将立即作用于全部账套。确认切换为「${label}」?`,
'系统级设置二次确认',
{ type: 'warning', confirmButtonText: '确认切换', cancelButtonText: '取消' }
)
} catch { return }
savingBudget.value = true
try {
await budgetApi.setConfig({ mode: budgetModeSel.value, rolling_months: 12 })
ElMessage.success('预算模式已设置')
await loadBudgetMode()
} catch { ElMessage.error('设置失败') }
savingBudget.value = false
}
async function previewTree() {
loadingTree.value = true
try {
@@ -304,6 +354,7 @@ async function previewTree() {
onMounted(() => {
loadPermData()
loadAlignmentConfig()
loadBudgetMode()
})
</script>