diff --git a/admin/src/views/account/pla_account_edit.vue b/admin/src/views/account/pla_account_edit.vue
index 64d92e7..88b5485 100644
--- a/admin/src/views/account/pla_account_edit.vue
+++ b/admin/src/views/account/pla_account_edit.vue
@@ -147,10 +147,20 @@
-
+
-
+
@@ -364,16 +374,18 @@ export default {
const deliverConfig = typeof row.deliver_config === 'string'
? JSON.parse(row.deliver_config)
: row.deliver_config
+ // 保存原有配置以便合并
+ this.formData.original_deliver_config = deliverConfig
this.formData.deliver_interval = deliverConfig.deliver_interval || 30
this.formData.min_salary = deliverConfig.min_salary || 0
this.formData.max_salary = deliverConfig.max_salary || 0
this.formData.page_count = deliverConfig.page_count || 3
this.formData.max_deliver = deliverConfig.max_deliver || 10
this.formData.filter_keywords = Array.isArray(deliverConfig.filter_keywords)
- ? deliverConfig.filter_keywords.join(',')
+ ? deliverConfig.filter_keywords.join('\n')
: (deliverConfig.filter_keywords || '')
this.formData.exclude_keywords = Array.isArray(deliverConfig.exclude_keywords)
- ? deliverConfig.exclude_keywords.join(',')
+ ? deliverConfig.exclude_keywords.join('\n')
: (deliverConfig.exclude_keywords || '')
// 处理时间区间配置
if (deliverConfig.time_range) {
@@ -381,6 +393,8 @@ export default {
this.formData.deliver_end_time = deliverConfig.time_range.end_time || '18:00'
this.formData.deliver_workdays_only = deliverConfig.time_range.workdays_only !== undefined ? deliverConfig.time_range.workdays_only : 1
}
+ } else {
+ this.formData.original_deliver_config = {}
}
// chat_strategy 配置
@@ -560,24 +574,42 @@ export default {
weight: Number(item.weight) || 0
}))
- // 处理 deliver_config
- const deliverConfig = {}
- deliverConfig.deliver_interval = Number(saveData.deliver_interval) || 30
- deliverConfig.min_salary = Number(saveData.min_salary) || 0
- deliverConfig.max_salary = Number(saveData.max_salary) || 0
- deliverConfig.page_count = Number(saveData.page_count) || 3
- deliverConfig.max_deliver = Number(saveData.max_deliver) || 10
- deliverConfig.filter_keywords = typeof saveData.filter_keywords === 'string' && saveData.filter_keywords.trim()
- ? saveData.filter_keywords.split(',').map(k => k.trim()).filter(k => k)
- : []
- deliverConfig.exclude_keywords = typeof saveData.exclude_keywords === 'string' && saveData.exclude_keywords.trim()
- ? saveData.exclude_keywords.split(',').map(k => k.trim()).filter(k => k)
- : []
- // 处理时间区间配置
- deliverConfig.time_range = {
- start_time: saveData.deliver_start_time || '09:00',
- end_time: saveData.deliver_end_time || '18:00',
- workdays_only: saveData.deliver_workdays_only ? 1 : 0
+ // 处理 deliver_config(合并原有配置)
+ const originalDeliverConfig = saveData.original_deliver_config || {}
+ const deliverConfig = { ...originalDeliverConfig }
+
+ // 只覆盖传入的字段
+ if (saveData.deliver_interval !== undefined) {
+ deliverConfig.deliver_interval = Number(saveData.deliver_interval) || 30
+ }
+ if (saveData.min_salary !== undefined) {
+ deliverConfig.min_salary = Number(saveData.min_salary) || 0
+ }
+ if (saveData.max_salary !== undefined) {
+ deliverConfig.max_salary = Number(saveData.max_salary) || 0
+ }
+ if (saveData.page_count !== undefined) {
+ deliverConfig.page_count = Number(saveData.page_count) || 3
+ }
+ if (saveData.max_deliver !== undefined) {
+ deliverConfig.max_deliver = Number(saveData.max_deliver) || 10
+ }
+ // 解析过滤关键词:支持换行和逗号分隔
+ if (saveData.filter_keywords !== undefined) {
+ deliverConfig.filter_keywords = this.parseKeywords(saveData.filter_keywords)
+ }
+ // 解析排除关键词:支持换行和逗号分隔
+ if (saveData.exclude_keywords !== undefined) {
+ deliverConfig.exclude_keywords = this.parseKeywords(saveData.exclude_keywords)
+ }
+ // 处理时间区间配置(合并原有配置)
+ if (saveData.deliver_start_time !== undefined || saveData.deliver_end_time !== undefined || saveData.deliver_workdays_only !== undefined) {
+ deliverConfig.time_range = {
+ ...(originalDeliverConfig.time_range || {}),
+ start_time: saveData.deliver_start_time !== undefined ? (saveData.deliver_start_time || '09:00') : (originalDeliverConfig.time_range?.start_time || '09:00'),
+ end_time: saveData.deliver_end_time !== undefined ? (saveData.deliver_end_time || '18:00') : (originalDeliverConfig.time_range?.end_time || '18:00'),
+ workdays_only: saveData.deliver_workdays_only !== undefined ? (saveData.deliver_workdays_only ? 1 : 0) : (originalDeliverConfig.time_range?.workdays_only !== undefined ? originalDeliverConfig.time_range.workdays_only : 1)
+ }
}
saveData.deliver_config = deliverConfig
delete saveData.deliver_interval
@@ -590,6 +622,7 @@ export default {
delete saveData.deliver_start_time
delete saveData.deliver_end_time
delete saveData.deliver_workdays_only
+ delete saveData.original_deliver_config
// 处理 chat_strategy
const chatStrategy = {}
@@ -682,6 +715,28 @@ export default {
this.priorityList[0].weight += diff
}
}
+ },
+ // 解析关键词:支持换行和逗号分隔
+ parseKeywords(keywords) {
+ if (!keywords || typeof keywords !== 'string') {
+ return []
+ }
+
+ const trimmed = keywords.trim()
+ if (!trimmed) {
+ return []
+ }
+
+ // 先按换行分割,再按逗号分割,然后过滤空值
+ const result = []
+ trimmed.split(/\n|,|,/).forEach(keyword => {
+ const trimmedKeyword = keyword.trim()
+ if (trimmedKeyword) {
+ result.push(trimmedKeyword)
+ }
+ })
+
+ return result
}
},
computed: {
diff --git a/api/services/pla_account_service.js b/api/services/pla_account_service.js
index f0bc637..9c2c7ab 100644
--- a/api/services/pla_account_service.js
+++ b/api/services/pla_account_service.js
@@ -208,9 +208,55 @@ class PlaAccountService {
}
});
+ // 深度合并 JSON 配置字段(deliver_config、chat_strategy、active_actions)
+ const jsonConfigFields = ['deliver_config', 'chat_strategy', 'active_actions'];
+ jsonConfigFields.forEach(field => {
+ if (processedData[field] !== undefined && processedData[field] !== null) {
+ // 获取原有配置
+ const originalConfig = account[field] || {};
+ const newConfig = processedData[field];
+
+ // 深度合并配置(只覆盖传入的字段,保留原有的其他字段)
+ if (typeof newConfig === 'object' && !Array.isArray(newConfig)) {
+ // 对于对象类型,深度合并
+ processedData[field] = this.deepMerge(originalConfig, newConfig);
+ } else {
+ // 对于非对象类型(如 null、数组等),直接使用新值
+ processedData[field] = newConfig;
+ }
+ }
+ });
+
await pla_account.update(processedData, { where: { id } });
}
+ /**
+ * 深度合并对象(只合并一层,用于 JSON 配置字段)
+ * @param {Object} target - 目标对象(原有配置)
+ * @param {Object} source - 源对象(新配置)
+ * @returns {Object} 合并后的对象
+ */
+ deepMerge(target, source) {
+ const result = { ...target };
+
+ // 遍历源对象的所有键
+ Object.keys(source).forEach(key => {
+ const sourceValue = source[key];
+ const targetValue = target[key];
+
+ // 如果源值是对象且目标值也是对象,递归合并
+ if (sourceValue && typeof sourceValue === 'object' && !Array.isArray(sourceValue) &&
+ targetValue && typeof targetValue === 'object' && !Array.isArray(targetValue)) {
+ result[key] = this.deepMerge(targetValue, sourceValue);
+ } else {
+ // 否则直接覆盖(包括 null、undefined、数组等)
+ result[key] = sourceValue;
+ }
+ });
+
+ return result;
+ }
+
/**
* 删除账号(软删除)
* @param {number} id - 账号ID