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