const dayjs = require("dayjs"); const Sequelize = require('sequelize'); module.exports = (db) => { const pla_account = db.define("pla_account", { name: { comment: '账户名', type: Sequelize.STRING(50), allowNull: false, defaultValue: '' }, sn_code: { comment: '唯一标识码', type: Sequelize.STRING(50), allowNull: false, defaultValue: '' }, device_id: { comment: '设备ID', type: Sequelize.STRING(200), allowNull: true, defaultValue: '' }, platform_type: { comment: '平台', type: Sequelize.STRING(50), allowNull: false, defaultValue: '' }, login_name: { comment: '登录名', type: Sequelize.STRING(50), allowNull: false, defaultValue: '' }, pwd: { comment: '密码', type: Sequelize.STRING(50), allowNull: false, defaultValue: '' }, keyword: { comment: '关键词', type: Sequelize.STRING(50), allowNull: false, defaultValue: '' }, is_enabled: { comment: '账号启用状态(1=启用,0=禁用)', type: Sequelize.TINYINT(1), allowNull: false, defaultValue: 1 }, job_type_id: { comment: '职位类型ID(关联 job_types 表)', type: Sequelize.INTEGER, allowNull: true, defaultValue: null }, //优先 排序 ,距离,薪资,工作年限 ,学历 is_salary_priority: { comment: '排序优先级', type: Sequelize.JSON(), allowNull: false, get: function () { const value = this.getDataValue('is_salary_priority'); if (!value) { return [{ "key": "distance", "weight": 50 }, { "key": "salary", "weight": 20 }, { "key": "work_years", "weight": 10 }, { "key": "education", "weight": 20}]; } if (typeof value === 'string') { try { return JSON.parse(value); } catch (e) { return [{ "key": "distance", "weight": 50 }, { "key": "salary", "weight": 20 }, { "key": "work_years", "weight": 10 }, { "key": "education", "weight": 20}]; } } return value; }, set: function (value) { if (value === null || value === undefined) { this.setDataValue('is_salary_priority', JSON.stringify([{ "key": "distance", "weight": 50 }, { "key": "salary", "weight": 20 }, { "key": "work_years", "weight": 10 }, { "key": "education", "weight": 20}])); } else if (typeof value === 'string') { // 如果已经是字符串,直接使用 this.setDataValue('is_salary_priority', value); } else { // 如果是对象/数组,序列化为字符串 this.setDataValue('is_salary_priority', JSON.stringify(value)); } }, defaultValue: JSON.stringify([{ "key": "distance", "weight": 50 }, { "key": "salary", "weight": 20 }, { "key": "work_years", "weight": 10 }, { "key": "education", "weight": 20}]) }, // 用户地址 user_address: { comment: '用户地址', type: Sequelize.STRING(200), allowNull: false, defaultValue: '' }, // 用户经度 user_longitude: { comment: '用户经度', type: Sequelize.STRING(50), allowNull: false, defaultValue: '' }, // 用户纬度 user_latitude: { comment: '用户纬度', type: Sequelize.STRING(50), allowNull: false, defaultValue: '' }, // 自动投递相关配置 auto_deliver: { comment: '自动投递开关', type: Sequelize.TINYINT(1), allowNull: false, defaultValue: 0 }, // 自动投递配置(JSON格式,包含:deliver_interval-投递间隔分钟数, min_salary-最低薪资, max_salary-最高薪资, page_count-滚动获取职位列表次数, max_deliver-每次最多投递数量, filter_keywords-过滤关键词, exclude_keywords-排除关键词) deliver_config: { comment: '自动投递配置(JSON对象)', type: Sequelize.JSON(), allowNull: true, get: function () { const value = this.getDataValue('deliver_config'); if (!value) return null; if (typeof value === 'string') { try { return JSON.parse(value); } catch (e) { return null; } } return value; }, set: function (value) { if (value === null || value === undefined) { this.setDataValue('deliver_config', null); } else if (typeof value === 'string') { // 如果已经是字符串,直接使用 this.setDataValue('deliver_config', value); } else { // 如果是对象,序列化为字符串 this.setDataValue('deliver_config', JSON.stringify(value)); } }, // 默认值说明: // deliver_interval: 30 - 投递间隔时间,单位:分钟,默认30分钟执行一次自动投递 // min_salary: 0 - 最低薪资(单位:元),0表示不限制 // max_salary: 0 - 最高薪资(单位:元),0表示不限制 // page_count: 3 - 滚动获取职位列表次数,默认3次 // max_deliver: 10 - 每次最多投递数量,默认10个 // filter_keywords: [] - 过滤关键词数组,包含这些关键词的职位会被优先考虑 // exclude_keywords: [] - 排除关键词数组,包含这些关键词的职位会被排除 defaultValue: JSON.stringify({ deliver_interval: 30, min_salary: 0, max_salary: 0, page_count: 3, max_deliver: 10, time_range: { start_time: '09:00', end_time: '18:00', workdays_only: 1 }, filter_keywords: [], exclude_keywords: [] }) }, // 自动沟通相关配置 auto_chat: { comment: '自动沟通开关', type: Sequelize.TINYINT(1), allowNull: false, defaultValue: 0 }, // 自动沟通配置(JSON格式,包含:chat_interval-沟通间隔分钟数, is_chat_outsourcing-是否沟通外包岗位, time_range-沟通时间段) chat_strategy: { comment: '自动沟通策略配置(JSON对象)', type: Sequelize.JSON(), allowNull: true, get: function () { const value = this.getDataValue('chat_strategy'); if (!value) return null; if (typeof value === 'string') { try { return JSON.parse(value); } catch (e) { return null; } } return value; }, set: function (value) { if (value === null || value === undefined) { this.setDataValue('chat_strategy', null); } else if (typeof value === 'string') { // 如果已经是字符串,直接使用 this.setDataValue('chat_strategy', value); } else { // 如果是对象,序列化为字符串 this.setDataValue('chat_strategy', JSON.stringify(value)); } }, // 默认值说明: // chat_interval: 30 - 沟通间隔时间,单位:分钟,默认30分钟执行一次自动沟通 // is_chat_outsourcing: 0 - 是否沟通外包岗位,0=不沟通外包岗位,1=沟通外包岗位 // time_range: 沟通时间段配置 // - start_time: 开始时间,格式:HH:mm,默认 "09:00" // - end_time: 结束时间,格式:HH:mm,默认 "18:00" // - workdays_only: 是否仅工作日,0=包含周末,1=仅工作日,默认1 defaultValue: JSON.stringify({ chat_interval: 30, is_chat_outsourcing: 0, time_range: { start_time: '09:00', end_time: '18:00', workdays_only: 1 } }) }, // 自动活跃相关配置 auto_active: { comment: '自动活跃开关', type: Sequelize.TINYINT(1), allowNull: false, defaultValue: 0 }, // 自动活跃配置(JSON格式,包含:active_interval-活跃间隔分钟数, actions-活跃动作列表) active_actions: { comment: '自动活跃动作配置(JSON对象)', type: Sequelize.JSON(), allowNull: true, get: function () { const value = this.getDataValue('active_actions'); if (!value) return null; if (typeof value === 'string') { try { return JSON.parse(value); } catch (e) { return null; } } return value; }, set: function (value) { if (value === null || value === undefined) { this.setDataValue('active_actions', null); } else if (typeof value === 'string') { // 如果已经是字符串,直接使用 this.setDataValue('active_actions', value); } else { // 如果是对象,序列化为字符串 this.setDataValue('active_actions', JSON.stringify(value)); } }, // 默认值说明: // active_interval: 60 - 活跃间隔时间,单位:分钟,默认60分钟执行一次活跃动作 // actions: [] - 活跃动作列表,数组格式,可包含多个活跃动作配置对象 defaultValue: JSON.stringify({ active_interval: 60, actions: [] }) }, // 授权相关字段 authorization_date: { comment: '授权日期(授权开始时间)', type: Sequelize.DATE, allowNull: true, defaultValue: null }, authorization_days: { comment: '授权天数', type: Sequelize.INTEGER, allowNull: false, defaultValue: 0 }, remaining_days: { comment: '剩余天数(虚拟字段,通过计算得出)', type: Sequelize.VIRTUAL, get: function () { const authDate = this.getDataValue('authorization_date'); const authDays = this.getDataValue('authorization_days') || 0; if (!authDate || authDays <= 0) { return 0; } const startDate = dayjs(authDate); const endDate = startDate.add(authDays, 'day'); const now = dayjs(); // 计算剩余天数 const remaining = endDate.diff(now, 'day', true); return Math.max(0, Math.ceil(remaining)); } } }); // pla_account.sync({ force: true }); return pla_account };