diff --git a/frontend/web-admin/src/views/ConfigPage.vue b/frontend/web-admin/src/views/ConfigPage.vue
index fa9d35b..c71dc44 100644
--- a/frontend/web-admin/src/views/ConfigPage.vue
+++ b/frontend/web-admin/src/views/ConfigPage.vue
@@ -33,7 +33,8 @@
-
+
+ 配置联动提醒中心与报表模块。分组:提醒规则(物流超时/欠款/沉默客户)、权限规则(脱敏/视图隔离)、利润规则(阈值/提成)。
@@ -42,7 +43,15 @@
{{ item.description }}
@@ -50,21 +59,11 @@
-
+
-
-
-
-
- {{ group.title }}
- {{ group.description }}
-
-
-
-
-
-
-
-
提醒联动
直接触发后端提醒检查,配合提醒中心查看结果。
-
报表联动
报表分类映射将影响核对口径和导出结果。
-
权限联动
脱敏与可见范围规则可在权限中心继续收口。
-
-
-
{{ item.name }}
@@ -120,18 +110,13 @@ const configKeys = [
/** 配置项列表数据(含值、启用状态、修改标记) */
const configs = ref([]);
+/** 加载时的原始配置快照,用于撤销修改 */
+const originalConfigs = ref([]);
/** 保存操作进行中标识 */
const saving = ref(false);
/** 最近一次保存时间 */
const lastSavedAt = ref('');
-/** 配置分组定义(提醒规则、权限规则、利润规则) */
-const groups = [
- { title: '提醒规则', description: '物流超时、欠款提醒、长期未下单。' },
- { title: '权限规则', description: '字段可见性、手机号脱敏、角色视图隔离。' },
- { title: '利润规则', description: '利润阈值、提成核对、电商订单剔除。' },
-];
-
/** 自动校验项列表(已对齐/待收口) */
const validationItems = ref([
{ name: '字段映射检查表', detail: '客户、订单、司机、报表字段已完成主口径整理。', state: 'done', stateText: '已对齐' },
@@ -165,22 +150,27 @@ async function reloadConfig() {
});
}));
configs.value = items;
+ originalConfigs.value = JSON.parse(JSON.stringify(items));
}
async function saveAll() {
saving.value = true;
try {
- for (const item of configs.value) {
- if (!item.dirty) continue;
- await updateConfigItem(item.key, {
+ const dirtyItems = configs.value.filter(item => item.dirty);
+ if (!dirtyItems.length) {
+ toast.success('没有需要保存的修改。');
+ return;
+ }
+ await Promise.all(dirtyItems.map(item =>
+ updateConfigItem(item.key, {
config_value: item.value,
config_name: item.name,
remark: item.remark,
status: item.enabled ? 1 : 0,
- });
- item.dirty = false;
- }
+ }).then(() => { item.dirty = false; })
+ ));
lastSavedAt.value = new Date().toLocaleString();
+ originalConfigs.value = JSON.parse(JSON.stringify(configs.value));
toast.success('配置已保存。');
} catch (error) {
toast.error(error?.message || '保存配置失败');
@@ -190,7 +180,7 @@ async function saveAll() {
}
function resetDirty() {
- configs.value.forEach((item) => { item.dirty = false; });
+ configs.value = JSON.parse(JSON.stringify(originalConfigs.value));
}
async function runChecks(type) {
@@ -209,5 +199,5 @@ onMounted(reloadConfig);