From 0e68676369ce6f7a5a09c9d6688bbb347efbf404 Mon Sep 17 00:00:00 2001 From: tigerenwork Date: Fri, 19 Jun 2026 00:29:22 +0800 Subject: [PATCH] Update sync script, add DDL dump and SQL fix script for replication --- ddl_autoflowdemo.sql | 4161 ++++++++++++++++++++++++++++++++++++++++++ fix_errors.sql | 7 + sync.sh | 4 +- 3 files changed, 4170 insertions(+), 2 deletions(-) create mode 100644 ddl_autoflowdemo.sql create mode 100644 fix_errors.sql diff --git a/ddl_autoflowdemo.sql b/ddl_autoflowdemo.sql new file mode 100644 index 0000000..cad6c33 --- /dev/null +++ b/ddl_autoflowdemo.sql @@ -0,0 +1,4161 @@ +create table `autoflow-demo`.aldebaran_alembic_version +( + version_num varchar(32) not null + primary key +); + +create table `autoflow-demo`.alembic_version +( + version_num varchar(32) not null + primary key +); + +create table `autoflow-demo`.auth_roles +( + id int auto_increment + primary key, + create_time datetime default CURRENT_TIMESTAMP null, + update_time datetime default CURRENT_TIMESTAMP null, + code varchar(100) not null, + name varchar(100) not null, + description varchar(255) null, + is_system tinyint(1) default 0 not null, + permissions json null, + constraint code + unique (code), + constraint ix_auth_roles_code + unique (code) +); + +create table `autoflow-demo`.auth_user_roles +( + id int auto_increment + primary key, + create_time datetime default CURRENT_TIMESTAMP null, + update_time datetime default CURRENT_TIMESTAMP null, + user_id char(36) not null, + role_id int not null, + crm_user_id varchar(100) null, + constraint fk_1 + foreign key (role_id) references `autoflow-demo`.auth_roles (id) +); + +create index ix_auth_user_roles_crm_user_id + on `autoflow-demo`.auth_user_roles (crm_user_id); + +create index ix_auth_user_roles_user_id + on `autoflow-demo`.auth_user_roles (user_id); + +create table `autoflow-demo`.bi_reports +( + id int auto_increment + primary key, + report_id varchar(255) not null comment '报告ID', + plan_id varchar(255) null comment '执行计划ID', + execution_id varchar(255) not null comment '执行ID, naming convention: _', + report_type varchar(64) not null comment '报告类型,例如: previsit, postvisit, quarterly, etc.', + report_name varchar(255) null comment '报告名称', + report_status varchar(32) default 'published' null comment '报告状态: draft, published, archived', + report_content mediumtext null comment '报告内容,包含所有分析结果', + report_content_en mediumtext null comment '报告内容英文', + report_content_multi_lang mediumtext null comment '报告内容(多语言)', + report_metadata text null comment '报告元数据,例如生成参数、来源等', + version int default 1 null comment '报告版本号', + created_by varchar(64) null comment '创建人', + updated_by varchar(64) null comment '更新人', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + account_id varchar(255) null comment '关联客户唯一ID,用于避免报告查询时解析report_content', + constraint execution_id + unique (execution_id) +) + comment '销售报告表'; + +create index idx_bi_reports_type_account_created + on `autoflow-demo`.bi_reports (report_type, account_id, created_at); + +create index idx_created_at + on `autoflow-demo`.bi_reports (created_at); + +create index idx_execution_id + on `autoflow-demo`.bi_reports (execution_id); + +create index idx_report_id + on `autoflow-demo`.bi_reports (report_id); + +create index idx_report_type + on `autoflow-demo`.bi_reports (report_type); + +create table `autoflow-demo`.corporation +( + id bigint auto_increment comment '主键ID(自增序列)' + primary key, + corp_name varchar(255) not null comment '企业全称', + group_id varchar(255) null comment '集团名称', + social_credit_code varchar(18) null comment '统一社会信用代码(18位国家标准)', + registered_country varchar(255) null comment '企业注册国家/地区', + tenant_key varchar(128) null comment '飞书租户唯一标识', + app_id varchar(64) null comment '飞书应用ID', + app_secret varchar(256) null comment '飞书应用密钥', + business_status varchar(20) null comment '经营状态(如存续、吊销等)', + creator varchar(255) null comment '创建者', + create_time datetime default CURRENT_TIMESTAMP null comment '创建时间', + updater varchar(255) null comment '更新者', + update_time datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '最后更新时间', + version int default 1 null comment '数据版本', + delete_flag tinyint(1) default 0 null comment '删除标识, 1已删除', + corp_en_name varchar(255) not null comment '企业en名称', + extra_info json null comment '扩展信息' +); + +create table `autoflow-demo`.crm_account_assessment +( + id int auto_increment + primary key, + unique_id varchar(255) not null comment '唯一性ID(必填)', + assessment_date date not null comment '日期', + account_id varchar(255) null comment '客户ID', + account_name varchar(255) null comment '客户名称', + customer_type varchar(50) null comment '客户类型(end_customer/partner)', + account_level varchar(255) null comment '客户等级', + is_first_visit tinyint(1) null comment '是否首次拜访', + assessment_flag text null comment '评估结果(red/yellow/green)', + assessment_description text null comment '评估描述', + assessment_description_en text null comment '评估描述英文', + opportunity_ids text null comment '商机UniqueID列表, json Array格式', + opportunity_names text null comment '商机名称列表, json Array格式', + follow_up_note text null comment '销售跟进记录', + follow_up_note_en text null comment '销售跟进记录(英文)', + follow_up_next_step text null comment '销售跟进下一步', + follow_up_next_step_en text null comment '销售跟进下一步(英文)', + correlation_id varchar(255) null comment '关联ID,用于链接到CRMDailyAccountStatistics', + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', + update_time datetime default CURRENT_TIMESTAMP not null comment '更新时间', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间' +) + comment '客户评估表'; + +create table `autoflow-demo`.crm_account_opportunity_assessment +( + id int auto_increment + primary key, + unique_id varchar(255) not null comment '唯一性ID(必填)', + assessment_date date not null comment '评估日期', + account_id varchar(255) null comment '客户ID', + account_name varchar(255) null comment '客户名称', + opportunity_id varchar(255) null comment '商机ID(NULL表示未关联商机)', + opportunity_name varchar(255) null comment '商机名称(NULL表示未关联商机)', + assessment_flag text null comment '评估结果(red/yellow/green)', + assessment_description text null comment '评估描述', + assessment_description_en text null comment '评估描述(英文)', + customer_type varchar(50) null comment '客户类型(end_customer/partner)', + account_level varchar(255) null comment '客户等级', + is_first_visit tinyint(1) null comment '是否首次拜访', + follow_up_note text null comment '销售跟进记录', + follow_up_note_en text null comment '销售跟进记录(英文)', + follow_up_next_step text null comment '销售跟进下一步', + follow_up_next_step_en text null comment '销售跟进下一步(英文)', + correlation_id varchar(255) null comment '关联ID,用于链接到部门/公司汇总', + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', + update_time datetime default CURRENT_TIMESTAMP not null comment '更新时间', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间' +) + comment '客户商机评估表'; + +create index idx_account_opportunity_date + on `autoflow-demo`.crm_account_opportunity_assessment (account_id, opportunity_id, assessment_date); + +create index idx_assessment_date + on `autoflow-demo`.crm_account_opportunity_assessment (assessment_date); + +create index idx_correlation_id + on `autoflow-demo`.crm_account_opportunity_assessment (correlation_id); + +create index idx_opportunity_id + on `autoflow-demo`.crm_account_opportunity_assessment (opportunity_id); + +create table `autoflow-demo`.crm_account_review_execution_index +( + id int auto_increment + primary key, + account_id varchar(255) not null comment '客户唯一性ID', + execution_id varchar(255) not null comment '最新review2报告的execution_id', + report_id varchar(255) null comment '报告ID', + plan_id varchar(255) null comment '执行计划ID', + report_created_time datetime not null comment '报告创建时间', + last_updated_time datetime default CURRENT_TIMESTAMP not null comment '索引最后更新时间', + create_time datetime default CURRENT_TIMESTAMP not null comment '索引创建时间', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + constraint account_id + unique (account_id) +) + comment '客户复盘执行索引表'; + +create index idx_execution_id + on `autoflow-demo`.crm_account_review_execution_index (execution_id); + +create index idx_report_created_time + on `autoflow-demo`.crm_account_review_execution_index (report_created_time); + +create table `autoflow-demo`.crm_accounts +( + id int auto_increment comment '主键ID' + primary key, + unique_id varchar(255) null comment '唯一性ID(必填)', + customer_name varchar(255) null comment '客户名称(必填)', + customer_source varchar(255) null comment '客户来源(必填)', + person_in_charge varchar(255) null comment '负责人', + department varchar(255) null comment '负责人主属部门', + customer_level varchar(255) null comment '客户等级', + industry varchar(255) null comment '客户行业(必填)', + phone varchar(255) null comment '电话', + website text null comment '网址', + email varchar(255) null comment '邮件', + remarks text null comment '备注', + allocation_status varchar(255) null comment '分配状态', + deal_status varchar(255) null comment '成交状态', + last_follow_up datetime null comment '最后跟进时间', + last_deal_time datetime null comment '最后一次成交时间', + allocation_time datetime null comment '领取/分配时间', + business_type varchar(255) null comment '业务类型(必填)', + life_status varchar(255) null comment '生命状态', + belonging_department varchar(255) null comment '归属部门', + creator varchar(255) null comment '创建人', + creation_time datetime null comment '创建时间', + last_modifier varchar(255) null comment '最后修改人', + last_modified_time datetime null comment '最后修改时间', + customer_identifier varchar(255) null comment '客户标识', + customer_code varchar(255) null comment '客户编号', + earliest_deal_date datetime null comment '最早成交日期', + latest_deal_date datetime null comment '最新成交日期', + customer_abbreviation varchar(255) null comment '客户简称', + customer_attribute varchar(255) null comment '客户属性', + partner varchar(255) null comment '合作伙伴', + belonging_pool varchar(255) null comment '所属公海', + legal_representative varchar(255) null comment '法定代表人', + country varchar(255) null comment '国家', + province varchar(255) null comment '省', + city varchar(255) null comment '市', + district varchar(255) null comment '区', + address varchar(512) null comment '详细地址', + customer_scale_new varchar(255) null comment '客户规模-新', + first_deal_date varchar(255) null comment '最早成交日期(归档日期)', + account_level varchar(255) null comment 'Name Account 分级', + key_actions text null comment 'top 3 key action', + daily_followup text null comment '客户日常跟进', + account_type varchar(255) null comment '实体类型', + delete_flag tinyint(1) null comment '删除标识(0-正常,1-已删除)', + extra json null comment '扩展内容', + support_person json null comment '辅助人员列表,JSON格式存储多个辅助人员的userid和name', + status varchar(255) null comment '客户状态("未生效"、"审核中"、"活跃"、"已废弃")', + person_in_charge_id varchar(255) null comment '负责人ID(对应crm_user.user_id)', + constraint uq_crm_accounts_unique_id + unique (unique_id) +) + comment '客户表'; + +create table `autoflow-demo`.crm_accounts_snapshot +( + id int auto_increment comment '主键ID' + primary key, + unique_id varchar(255) null comment '唯一性ID(必填)', + customer_name varchar(255) null comment '客户名称(必填)', + customer_source varchar(255) null comment '客户来源(必填)', + person_in_charge varchar(255) null comment '负责人', + department varchar(255) null comment '负责人主属部门', + customer_level varchar(255) null comment '客户等级', + industry varchar(255) null comment '客户行业(必填)', + phone varchar(255) null comment '电话', + website text null comment '网址', + email varchar(255) null comment '邮件', + remarks text null comment '备注', + allocation_status varchar(255) null comment '分配状态', + deal_status varchar(255) null comment '成交状态', + last_follow_up datetime null comment '最后跟进时间', + last_deal_time datetime null comment '最后一次成交时间', + allocation_time datetime null comment '领取/分配时间', + business_type varchar(255) null comment '业务类型(必填)', + life_status varchar(255) null comment '生命状态', + belonging_department varchar(255) null comment '归属部门', + creator varchar(255) null comment '创建人', + creation_time datetime null comment '创建时间', + last_modifier varchar(255) null comment '最后修改人', + last_modified_time datetime null comment '最后修改时间', + customer_identifier varchar(255) null comment '客户标识', + customer_code varchar(255) null comment '客户编号', + earliest_deal_date datetime null comment '最早成交日期', + latest_deal_date datetime null comment '最新成交日期', + customer_abbreviation varchar(255) null comment '客户简称', + customer_attribute varchar(255) null comment '客户属性', + partner varchar(255) null comment '合作伙伴', + belonging_pool varchar(255) null comment '所属公海', + legal_representative varchar(255) null comment '法定代表人', + country varchar(255) null comment '国家', + province varchar(255) null comment '省', + city varchar(255) null comment '市', + district varchar(255) null comment '区', + address varchar(512) null comment '详细地址', + customer_scale_new varchar(255) null comment '客户规模-新', + first_deal_date varchar(255) null comment '最早成交日期(归档日期)', + account_level varchar(255) null comment 'Name Account 分级', + key_actions text null comment 'top 3 key action', + daily_followup text null comment '客户日常跟进', + snapshot_date date null comment '快照日期', + account_type varchar(255) null comment '实体类型', + delete_flag tinyint(1) null comment '删除标识(0-正常,1-已删除)', + extra json null comment '扩展内容', + support_person json null comment '辅助人员列表,JSON格式存储多个辅助人员的userid和name', + status varchar(255) null comment '客户状态("未生效"、"审核中"、"活跃"、"已废弃")', + person_in_charge_id varchar(255) null comment '负责人ID(对应crm_user.user_id)', + constraint uq_snapshot_unique_id_snapshot_date + unique (unique_id, snapshot_date) +) + comment '客户表快照'; + +create table `autoflow-demo`.crm_achievement_timeseries +( + id bigint auto_increment + primary key, + period_type varchar(10) not null comment 'yearly, quarterly, monthly', + period varchar (20) not null comment 'FY26, FY26Q1, 2025-04', + scope_type varchar(20) not null comment 'company, department, owner', + scope_id varchar(100) null comment 'department_id or owner_id; NULL for company', + scope_name varchar(200) null comment 'department or owner name; NULL for company', + granularity varchar(10) not null comment 'daily or weekly', + point_date date not null comment 'date this data point represents', + target decimal(18, 2) null comment 'target line', + cum_closed decimal(18, 2) null comment 'Closed Won by close_date ≤ point_date', + cum_commit_sales decimal(18, 2) null comment 'cum_closed + sales Commit projected', + cum_commit_ai decimal(18, 2) null comment 'cum_closed + AI Commit projected', + cum_upside_sales decimal(18, 2) null comment 'cum_closed + Commit + Upside projected', + version int default 1 not null, + is_active tinyint(1) default 1 not null comment '1=active, 0=superseded', + superseded_at datetime null, + superseded_by varchar(100) null, + as_of_date date not null comment 'run_date when this snapshot was computed', + data_cutoff_date date null comment 'Data cut-off (inclusive). When NULL, treat as_of_date as cut-off.', + computed_at datetime not null, + execution_id varchar(100) null +) + comment 'Pre-computed cumulative achievement time-series for line chart'; + +create index idx_ts_as_of + on `autoflow-demo`.crm_achievement_timeseries (as_of_date, is_active); + +create index idx_ts_lookup + on `autoflow-demo`.crm_achievement_timeseries (period_type, period, scope_type, scope_id, granularity, as_of_date, + point_date, is_active); + +create index idx_ts_version + on `autoflow-demo`.crm_achievement_timeseries (period, version, is_active); + +create table `autoflow-demo`.crm_acv_targets +( + id int auto_increment + primary key, + fiscal_year varchar(9) not null comment '财年(如2026/2027)', + quarter varchar(8) null comment '季度(如Q1、Q2、Q3、Q4,NULL表示全年)', + category varchar(255) null comment '类别(FCST/FCST_NE)', + department varchar(255) null comment '部门', + owner varchar(255) null comment '负责人', + target_acv decimal(18, 2) not null comment 'ACV目标', + notes text null comment '备注', + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', + update_time datetime default CURRENT_TIMESTAMP not null comment '更新时间', + biz_key varchar(16) as (null) comment '业务主键(如FY26Q1,全年为FY26)', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间' +) + comment '按财年/季度保存ACV目标(quarter为NULL表示全年)'; + +create table `autoflow-demo`.crm_alembic_version +( + version_num varchar(32) not null + primary key +); + +create table `autoflow-demo`.crm_api_clients +( + id int auto_increment comment '主键ID' + primary key, + client_id varchar(255) null comment '客户端ID', + client_secret_hash varchar(255) null comment '客户端密钥哈希', + client_name varchar(255) null comment '客户端名称', + is_active tinyint(1) null comment '是否激活', + access_token_expiry_hours int null comment '访问令牌过期时间(小时)', + refresh_token_expiry_days int null comment '刷新令牌过期时间(天)', + created_at timestamp null comment '创建时间', + updated_at timestamp null comment '更新时间' +) + comment 'CRM API 客户端'; + +create table `autoflow-demo`.crm_api_refresh_tokens +( + id int auto_increment comment '主键ID' + primary key, + client_id varchar(255) null comment '客户端ID', + token_hash varchar(255) null comment '令牌哈希', + expires_at timestamp not null comment '过期时间', + is_revoked tinyint(1) null comment '是否撤销', + created_at timestamp null comment '创建时间' +) + comment 'CRM API 刷新令牌'; + +create table `autoflow-demo`.crm_charge_audit +( + id int auto_increment + primary key, + execution_id varchar(255) not null comment '工作流执行ID', + plan_id varchar(255) not null comment '执行计划ID', + report_id varchar(255) null comment '报告ID', + version int null comment '执行版本', + step_id varchar(255) null comment '产生计费项的步骤ID', + charge_item_type varchar(100) not null comment '计费项类型', + business_object_type varchar(100) not null comment '业务对象类型,如account/opportunity', + business_object_id varchar(255) not null comment '业务对象ID', + business_object_name varchar(255) null comment '业务对象名称', + trace_id varchar(100) not null comment '外部计费trace_id', + operator varchar(100) not null comment '操作人', + item_url varchar(500) null comment '计费项结果URL', + review_detail varchar(500) not null comment '计费明细链接或引用', + ai_module_key varchar(100) not null comment 'AI模块key', + status varchar(50) default 'pending' not null comment 'pending/sent/failed/skipped', + external_usage_record_id varchar(255) null comment '外部用量记录ID', + external_sync_status varchar(100) null comment '外部同步状态', + charge_request json null comment '发送给外部计费服务的请求', + charge_response json null comment '外部计费服务响应', + error_message text null comment '错误信息', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + charged_at datetime null comment '发送计费时间', + constraint uq_crm_charge_audit_business_item + unique (execution_id, ai_module_key, business_object_type, business_object_id), + constraint uq_crm_charge_audit_trace_id + unique (trace_id) +) + comment 'AI计费审计表'; + +create index idx_crm_charge_audit_business_object + on `autoflow-demo`.crm_charge_audit (business_object_type, business_object_id); + +create index idx_crm_charge_audit_execution + on `autoflow-demo`.crm_charge_audit (execution_id, plan_id); + +create index idx_crm_charge_audit_status + on `autoflow-demo`.crm_charge_audit (status); + +create table `autoflow-demo`.crm_contacts +( + id int auto_increment comment '主键ID' + primary key, + unique_id varchar(255) not null comment '唯一性ID(必填)', + name varchar(255) not null comment '联系人姓名(必填)', + customer_id varchar(255) null comment '客户名称_唯一性ID', + customer_name varchar(255) null comment '客户名称', + department1 varchar(255) null comment '部门1', + position1 varchar(255) null comment '职务1', + gender varchar(10) null comment '性别', + birthday date null comment '生日', + key_decision_maker varchar(255) null comment '关键决策人', + mobile1 varchar(255) null comment '手机', + phone1 varchar(255) null comment '电话', + email varchar(255) null comment '邮件', + address varchar(255) null comment '联系地址', + responsible_person varchar(255) not null comment '负责人(必填)', + responsible_department varchar(255) null comment '负责人主属部门', + affiliate_department varchar(255) null comment '归属部门', + attitude varchar(255) null comment '态度', + status varchar(255) null comment '状态', + department varchar(255) null comment '部门', + position varchar(255) null comment '职务', + email_account varchar(255) null comment '邮箱账号', + wechat varchar(255) null comment '微信', + position_id varchar(255) null comment '联系人职务_唯一性ID', + position_name varchar(255) null comment '联系人职务', + source varchar(255) null comment '来源', + direct_superior varchar(255) null comment '直属上级', + direct_superior_id varchar(255) null comment '直属上级_唯一性ID', + last_modified_time datetime null comment '最后修改时间', + delete_flag tinyint(1) null comment '删除标识(0-正常,1-已删除)', + extra json null comment '扩展内容', + constraint uq_crm_contacts_unique_id + unique (unique_id) +) + comment '联系人信息表'; + +create table `autoflow-demo`.crm_daily_account_statistics +( + id int auto_increment + primary key, + unique_id varchar(255) not null comment '唯一性ID', + report_date date not null comment '日期', + sales_id varchar(255) null comment '销售ID', + sales_name varchar(255) null comment '销售名字', + department_id varchar(255) null comment '部门ID', + department_name varchar(255) null comment '部门名字', + assessment_red_count int null comment '评估为red的次数', + assessment_yellow_count int null comment '评估为yellow的次数', + assessment_green_count int null comment '评估为green的次数', + end_customer_total_follow_up int null comment '总跟进最终客户数', + end_customer_total_first_visit int null comment '总首次拜访最终客户数', + end_customer_total_multi_visit int null comment '总多次拜访最终客户数', + partner_total_follow_up int null comment '总跟进合作伙伴数', + partner_total_first_visit int null comment '总首次拜访合作伙伴数', + partner_total_multi_visit int null comment '总多次拜访合作伙伴数', + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', + update_time datetime default CURRENT_TIMESTAMP not null comment '更新时间', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间' +) + comment '客户日报统计表'; + +create table `autoflow-demo`.crm_data_authority +( + id bigint auto_increment comment '主键ID(自增序列)' + primary key, + data_id varchar(255) null comment '数据id', + user_id varchar(255) null comment '用户id', + crm_id varchar(255) null comment 'CRM用户id', + type varchar(255) null comment '数据类型', + create_time datetime null comment '创建时间', + update_time datetime null comment '最后更新时间', + delete_flag tinyint(1) null comment '删除标识, True已删除', + constraint uq_crm_data_authority + unique (data_id, crm_id, type) +) + comment 'crm数据权限表'; + +create index idx_crm_data_authority_crm_id + on `autoflow-demo`.crm_data_authority (crm_id); + +create index idx_crm_data_authority_data_id + on `autoflow-demo`.crm_data_authority (data_id); + +create index idx_crm_data_authority_type + on `autoflow-demo`.crm_data_authority (type); + +create index idx_crm_data_authority_user_id + on `autoflow-demo`.crm_data_authority (user_id); + +create table `autoflow-demo`.crm_data_quality_warnings +( + id int auto_increment + primary key, + unique_id varchar(255) not null comment '唯一性ID', + scan_id varchar(255) not null comment '扫描ID', + rule_id varchar(255) not null comment '规则ID', + severity varchar(50) default 'warning' not null comment '严重级别', + status varchar(50) default 'active' not null comment '状态(active/resolved)', + identity_hash varchar(64) not null comment '规则发现项身份哈希', + source_table varchar(255) not null comment '源表', + source_field varchar(255) null comment '源字段', + source_value varchar(255) null comment '源字段值', + handbook_id varchar(64) null comment 'Playbook handbook_id', + affected_count int default 0 not null comment '影响记录数', + sample_entity_ids text null comment '样例实体ID(JSON)', + details text null comment '规则上下文(JSON)', + first_seen_at datetime default CURRENT_TIMESTAMP not null comment '首次发现时间', + last_seen_at datetime default CURRENT_TIMESTAMP not null comment '最近发现时间', + resolved_at datetime null comment '解决时间', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + constraint idx_dq_warning_identity_status + unique (identity_hash, status) +) + comment '数据质量告警表'; + +create index idx_dq_warning_last_seen + on `autoflow-demo`.crm_data_quality_warnings (last_seen_at); + +create index idx_dq_warning_rule_status + on `autoflow-demo`.crm_data_quality_warnings (rule_id, status); + +create index idx_dq_warning_severity_status + on `autoflow-demo`.crm_data_quality_warnings (severity, status); + +create table `autoflow-demo`.crm_department +( + id int auto_increment comment '主键ID(自增)' + primary key, + unique_id varchar(255) not null comment '部门唯一标识', + department_name varchar(255) not null comment '部门名称', + parent_department_id varchar(255) null comment '父部门ID', + description text null comment '部门描述', + is_active tinyint(1) default 1 null comment '是否启用', + creator varchar(255) null comment '创建人', + creation_time datetime null comment '创建时间', + last_modifier varchar(255) null comment '最后修改人', + last_modified_time datetime null comment '最后修改时间', + delete_flag tinyint(1) null comment '删除标识(0-正常,1-已删除)', + extra json null comment '扩展内容', + constraint uq_crm_department_unique_id + unique (unique_id) +) + comment 'CRM 部门表'; + +create table `autoflow-demo`.crm_department_daily_summary +( + id int auto_increment + primary key, + unique_id varchar(255) not null comment '唯一性ID(必填)', + report_date date not null comment '日期', + summary_type varchar(50) not null comment '汇总类型(department/company)', + department_id varchar(255) null comment '部门ID(仅当summary_type=department时)', + department_name varchar(255) null comment '部门名称(仅当summary_type=department时)', + assessment_red_count int default 0 null comment '评估为red的次数', + assessment_yellow_count int default 0 null comment '评估为yellow的次数', + assessment_green_count int default 0 null comment '评估为green的次数', + total_assessments int default 0 null comment '总评估数', + total_first_visit int default 0 null comment '总首次拜访数', + total_multi_visit int default 0 null comment '总多次拜访数', + end_customer_total_red_count int default 0 null comment '最终客户总计评估为red的次数', + end_customer_total_yellow_count int default 0 null comment '最终客户总计评估为yellow的次数', + end_customer_total_green_count int default 0 null comment '最终客户总计评估为green的次数', + end_customer_total_count int default 0 null comment '最终客户总计数量', + end_customer_first_visit_red_count int default 0 null comment '最终客户首次跟进评估为red的次数', + end_customer_first_visit_yellow_count int default 0 null comment '最终客户首次跟进评估为yellow的次数', + end_customer_first_visit_green_count int default 0 null comment '最终客户首次跟进评估为green的次数', + end_customer_first_visit_count int default 0 null comment '最终客户首次跟进数量', + end_customer_regular_visit_red_count int default 0 null comment '最终客户多次跟进评估为red的次数', + end_customer_regular_visit_yellow_count int default 0 null comment '最终客户多次跟进评估为yellow的次数', + end_customer_regular_visit_green_count int default 0 null comment '最终客户多次跟进评估为green的次数', + end_customer_regular_visit_count int default 0 null comment '最终客户多次跟进数量', + partner_total_count int default 0 null comment '合作伙伴总计数量', + partner_first_visit_count int default 0 null comment '合作伙伴首次跟进数量', + partner_regular_visit_count int default 0 null comment '合作伙伴多次跟进数量', + partner_red_count int default 0 null comment '合作伙伴评估为red的次数', + partner_yellow_count int default 0 null comment '合作伙伴评估为yellow的次数', + partner_green_count int default 0 null comment '合作伙伴评估为green的次数', + summary_content text null comment '汇总内容(中文)', + summary_content_en text null comment '汇总内容(英文)', + summary_first_visit text null comment '首次拜访汇总内容(中文)', + summary_regular_visit text null comment '多次拜访汇总内容(中文)', + key_highlights text null comment '关键亮点(JSON格式)', + key_concerns text null comment '关键关注点(JSON格式)', + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', + update_time datetime default CURRENT_TIMESTAMP not null comment '更新时间', + summary_red text null comment '红灯评估汇总(中文;【首次跟进】与【多次跟进】分段)', + summary_yellow text null comment '黄灯评估汇总(中文;【首次跟进】与【多次跟进】分段)', + summary_green text null comment '绿灯评估汇总(中文;【首次跟进】与【多次跟进】分段)', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间' +) + comment '部门/公司日报汇总表'; + +create index idx_department_date + on `autoflow-demo`.crm_department_daily_summary (department_id, report_date); + +create index idx_report_date_type + on `autoflow-demo`.crm_department_daily_summary (report_date, summary_type); + +create index idx_unique_id + on `autoflow-demo`.crm_department_daily_summary (unique_id); + +create table `autoflow-demo`.crm_eval_metrics +( + id int auto_increment + primary key, + unique_id varchar(255) not null comment '唯一性ID', + metric_name varchar(255) not null comment '指标名称', + metric_type varchar(255) not null comment '指标类型', + account_id varchar(255) null comment '客户ID', + opportunity_id varchar(255) null comment '商机ID', + metric_value float null comment '指标值', + metric_content text null comment '指标内容', + metric_unit varchar(255) null comment '指标单位', + metric_description text null comment '指标描述', + eval_time datetime null comment '评估时间', + is_active tinyint(1) default 1 null comment '是否为当前有效评估', + owner varchar(255) null comment '负责人姓名(用于owner级别KPI)', + owner_id varchar(255) null comment '负责人唯一性ID(用于owner级别KPI)', + department varchar(255) null comment '部门名称(用于department级别KPI)', + department_id varchar(255) null comment '部门唯一性ID(用于department级别KPI)', + time_period varchar(50) null comment '时间周期(如Q1+Q2+Q3+Q4,用于Review 1s)', + report_date date null comment '报告日期(报告生成的日期)', + report_datetime datetime null comment '报告精确时间', + report_week_of_year int null comment '年内周数(1-53)', + report_month_of_year int null comment '年内月份(1-12)', + report_quarter_of_year int null comment '年内季度(1-4)', + report_year int null comment '报告年份', + execution_id varchar(255) null comment '工作流执行ID(关联到报告)', + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', + update_time datetime default CURRENT_TIMESTAMP not null comment '更新时间', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间' +) + comment '评估指标表'; + +create index idx_execution_id + on `autoflow-demo`.crm_eval_metrics (execution_id); + +create index idx_owner_dept_period + on `autoflow-demo`.crm_eval_metrics (owner, department, time_period); + +create index idx_owner_id_dept_id + on `autoflow-demo`.crm_eval_metrics (owner_id, department_id); + +create index idx_report_date + on `autoflow-demo`.crm_eval_metrics (report_date); + +create index idx_report_year_month + on `autoflow-demo`.crm_eval_metrics (report_year, report_month_of_year); + +create index idx_report_year_quarter + on `autoflow-demo`.crm_eval_metrics (report_year, report_quarter_of_year); + +create index idx_report_year_week + on `autoflow-demo`.crm_eval_metrics (report_year, report_week_of_year); + +create table `autoflow-demo`.crm_external_ingest_audit +( + id bigint auto_increment comment '主键ID(自增)' + primary key, + table_name varchar(64) not null comment '表名', + unique_id varchar(255) not null comment '唯一ID', + action varchar(16) not null comment '动作:insert/update', + ingested_at datetime default CURRENT_TIMESTAMP not null comment '写入时间' +); + +create index idx_crm_audit_table_time + on `autoflow-demo`.crm_external_ingest_audit (table_name, ingested_at); + +create index idx_crm_audit_table_uid_time + on `autoflow-demo`.crm_external_ingest_audit (table_name, unique_id, ingested_at); + +create table `autoflow-demo`.crm_forecast_type_mappings +( + id int auto_increment + primary key, + internal_type varchar(50) not null comment '内部类型键 (e.g. commit, closed_won, upside, pipeline, lost_cancel)', + customer_values text not null comment '客户侧文本值列表(JSON数组,不区分大小写匹配)', + display_order int not null comment '前端展示顺序(数字越小越靠前)', + is_active tinyint(1) default 1 not null comment '是否启用', + description text null comment '配置描述', + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', + update_time datetime default CURRENT_TIMESTAMP not null comment '更新时间', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + constraint idx_crm_ftm_internal_type + unique (internal_type) +) + comment 'Forecast type 标准映射表'; + +create index idx_crm_ftm_display_order + on `autoflow-demo`.crm_forecast_type_mappings (display_order); + +create index idx_crm_ftm_is_active + on `autoflow-demo`.crm_forecast_type_mappings (is_active); + +create table `autoflow-demo`.crm_ingest_push_audit +( + id bigint auto_increment + primary key, + push_key varchar(128) null, + table_name varchar(64) not null, + status varchar(16) not null, + inserted int default 0 not null, + updated int default 0 not null, + skipped int default 0 not null, + error_message text null, + detail_json json null, + created_at timestamp default CURRENT_TIMESTAMP not null, + updated_at timestamp default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP +) + charset = utf8mb4; + +create index idx_created_at + on `autoflow-demo`.crm_ingest_push_audit (created_at); + +create index idx_push_key + on `autoflow-demo`.crm_ingest_push_audit (push_key); + +create index idx_status + on `autoflow-demo`.crm_ingest_push_audit (status); + +create index idx_table_name + on `autoflow-demo`.crm_ingest_push_audit (table_name); + +create table `autoflow-demo`.crm_ka_accounts +( + id int auto_increment + primary key, + account_id varchar(255) not null comment '客户唯一性ID', + account_name varchar(255) not null comment '客户名称', + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', + status varchar(20) null comment '状态: active, inactive', + flag varchar(255) null comment '标志位,区分不同类别的KA客户', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间' +) + comment 'KA客户表'; + +create index idx_account + on `autoflow-demo`.crm_ka_accounts (account_id); + +create table `autoflow-demo`.crm_key_opportunities +( + id int auto_increment + primary key, + opportunity_id varchar(255) not null comment '商机唯一性ID', + opportunity_name varchar(255) not null comment '商机名称', + account_id varchar(255) not null comment '客户唯一性ID', + account_name varchar(255) not null comment '客户名称', + opportunity_stage varchar(255) null comment '商机阶段', + expected_closing_quarter varchar(50) null comment '预期成交季度', + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', + status varchar(20) default 'active' null comment '状态: active, inactive', + flag varchar(255) null comment '标志位,区分不同用途的关键商机', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间' +) + comment '关键商机表'; + +create index idx_account_id + on `autoflow-demo`.crm_key_opportunities (account_id); + +create index idx_expected_closing_quarter + on `autoflow-demo`.crm_key_opportunities (expected_closing_quarter); + +create index idx_flag + on `autoflow-demo`.crm_key_opportunities (flag); + +create index idx_opportunity_id + on `autoflow-demo`.crm_key_opportunities (opportunity_id); + +create index idx_status + on `autoflow-demo`.crm_key_opportunities (status); + +create table `autoflow-demo`.crm_log_processing_status +( + id int auto_increment + primary key, + unique_id varchar(255) not null comment '唯一性ID(必填)', + source_table varchar(255) null comment '源数据表名', + source_field_name varchar(255) null comment '源字段名称', + source_id int null comment '源数据ID', + source_unique_id varchar(255) null comment '源数据唯一性ID', + processing_status varchar(50) default 'PENDING' not null comment '处理状态(PENDING/PROCESSING/PROCESSED/FAILED)', + processing_stage varchar(50) null comment '处理阶段(如:INITIAL/EXTRACT/TRANSFORM/LOAD)', + processing_attempts int default 0 not null comment '处理尝试次数', + last_processing_time datetime null comment '最后处理时间', + processing_error text null comment '处理错误信息', + processing_mode varchar(50) null comment '处理模式(APPEND/CREATE)', + flag varchar(255) null comment '标志位,标记该数据被处理的任务', + source_data_hash varchar(64) null comment '源数据哈希值(用于检测变更)', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间' +) + comment '日志处理状态跟踪表'; + +create index idx_log_processing_flag_status_source + on `autoflow-demo`.crm_log_processing_status (flag, processing_status, source_unique_id); + +create index idx_log_processing_source_unique_id + on `autoflow-demo`.crm_log_processing_status (source_unique_id); + +create index idx_processing_status + on `autoflow-demo`.crm_log_processing_status (processing_status); + +create index idx_source_id + on `autoflow-demo`.crm_log_processing_status (source_id); + +create index idx_source_table + on `autoflow-demo`.crm_log_processing_status (source_table); + +create table `autoflow-demo`.crm_message_dispatch_logs +( + id int auto_increment + primary key, + message_id varchar(255) not null comment 'Message ID', + work_item_id varchar(255) null comment 'Work item ID', + event_type varchar(100) not null comment 'Dispatch event type', + detail json null comment 'Event detail', + error_message text null comment 'Error message', + created_at datetime default CURRENT_TIMESTAMP not null comment 'Create time' +) + comment 'Internal message dispatch logs'; + +create index idx_message_dispatch_logs_message + on `autoflow-demo`.crm_message_dispatch_logs (message_id); + +create index idx_message_dispatch_logs_work_item + on `autoflow-demo`.crm_message_dispatch_logs (work_item_id); + +create table `autoflow-demo`.crm_message_inbox +( + id int auto_increment + primary key, + message_id varchar(255) not null comment 'Message public ID', + message_type varchar(100) not null comment 'Message type, e.g. crm.visit_record.saved', + source_system varchar(100) not null comment 'Source system', + source_table varchar(255) null comment 'Source table', + source_unique_id varchar(255) null comment 'Source unique ID', + dedupe_key varchar(512) not null comment 'Idempotency key', + payload_hash varchar(64) not null comment 'Canonical payload SHA-256 hash', + payload json not null comment 'Raw message payload', + status varchar(50) default 'RECEIVED' not null comment 'Message status', + priority int default 0 not null comment 'Higher value is claimed first', + available_at datetime default CURRENT_TIMESTAMP not null comment 'Earliest dispatch time', + received_at datetime default CURRENT_TIMESTAMP not null comment 'Message receipt time', + orchestrated_at datetime null comment 'Work item orchestration time', + completed_at datetime null comment 'Terminal completion time', + attempt_count int default 0 not null comment 'Orchestration attempts', + last_error text null comment 'Last orchestration error', + trace_id varchar(255) null comment 'Upstream trace ID', + created_at datetime default CURRENT_TIMESTAMP not null comment 'Create time', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment 'Update time', + constraint dedupe_key + unique (dedupe_key), + constraint message_id + unique (message_id) +) + comment 'Internal message inbox'; + +create index idx_message_inbox_source + on `autoflow-demo`.crm_message_inbox (source_table, source_unique_id); + +create index idx_message_inbox_status_available + on `autoflow-demo`.crm_message_inbox (status, available_at, priority); + +create table `autoflow-demo`.crm_message_work_item_deps +( + work_item_id varchar(255) not null comment 'Dependent work item ID', + depends_on_work_item_id varchar(255) not null comment 'Prerequisite work item ID', + dependency_type varchar(50) default 'SUCCESS' not null comment 'SUCCESS/COMPLETION/OUTPUT_EXISTS', + output_condition json null comment 'Optional output condition', + created_at datetime default CURRENT_TIMESTAMP not null comment 'Create time', + primary key (work_item_id, depends_on_work_item_id) +) + comment 'Internal message work item dependencies'; + +create index idx_message_work_item_deps_depends_on + on `autoflow-demo`.crm_message_work_item_deps (depends_on_work_item_id); + +create table `autoflow-demo`.crm_message_work_items +( + id int auto_increment + primary key, + work_item_id varchar(255) not null comment 'Work item public ID', + message_id varchar(255) not null comment 'Parent message ID', + work_type varchar(100) default 'workflow_plan' not null comment 'Work item type', + queue_name varchar(100) default 'workflow_parallel' not null comment 'Logical queue name', + priority int default 0 not null comment 'Higher value is claimed first', + plan_id varchar(255) null comment 'Workflow plan ID', + execution_id varchar(255) null comment 'Workflow execution ID', + report_id varchar(255) null comment 'Workflow report ID', + bootstrap_inputs json null comment 'Workflow bootstrap inputs', + status varchar(50) default 'PENDING' not null comment 'Work item status', + attempt_count int default 0 not null comment 'Dispatch attempts', + max_attempts int default 3 not null comment 'Max dispatch attempts', + available_at datetime default CURRENT_TIMESTAMP not null comment 'Earliest dispatch time', + claimed_by varchar(255) null comment 'Dispatcher identity', + claimed_at datetime null comment 'Claim time', + started_at datetime null comment 'Start time', + submitted_at datetime null comment 'Celery submission time', + finished_at datetime null comment 'Terminal time', + last_error text null comment 'Last error', + output_ref json null comment 'Output references or guard results', + created_at datetime default CURRENT_TIMESTAMP not null comment 'Create time', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment 'Update time', + constraint work_item_id + unique (work_item_id) +) + comment 'Internal message work items'; + +create index idx_message_work_items_execution + on `autoflow-demo`.crm_message_work_items (execution_id); + +create index idx_message_work_items_message + on `autoflow-demo`.crm_message_work_items (message_id); + +create index idx_message_work_items_ready + on `autoflow-demo`.crm_message_work_items (status, queue_name, available_at, priority); + +create table `autoflow-demo`.crm_opportunities +( + id int auto_increment comment '主键ID' + primary key, + unique_id varchar(255) null comment '唯一性ID(必填)', + opportunity_name varchar(255) null comment '商机名称(必填)', + competitor_name varchar(255) null comment '友商名称', + former_name varchar(255) null comment '曾用名', + partner_opportunity_filing_id_unique_id varchar(255) null comment '合作伙伴商机报备编号_唯一性ID', + partner_opportunity_filing_number varchar(255) null comment '合作伙伴商机报备编号', + filing_opportunity_number varchar(255) null comment '报备商机编号', + call_high_notes text null comment 'Call high 情况', + department varchar(255) null comment '归属部门', + current_year_service_forecast float null comment '当财年 Service 收入预测金额(不含税)', + customer_budget_status text null comment '客户预算情况', + todo_and_followup text null comment 'Todo & follow up', + is_framework_quote varchar(255) null comment '是否框架协议报价商机', + customer_id varchar(255) null comment '客户名称_唯一性ID(必填)', + customer_name varchar(255) null comment '客户名称(必填)', + customer_type varchar(255) null comment '客户属性', + owner varchar(255) null comment '负责人(必填)', + customer_business_scenario varchar(255) null comment '客户业务场景', + forecast_type varchar(255) null comment '预测类型', + estimated_tcv int null comment '预估 TCV', + estimated_acv int null comment '预估 ACV', + expected_closing_date varchar(255) null comment '预计成交日期', + expected_closing_quarter varchar(255) null comment '预计成交季度', + opportunity_type varchar(255) null comment '商机类型', + signing_type varchar(255) null comment '签约类型', + general_agent varchar(255) null comment '总代理', + presales_owner varchar(255) null comment '售前负责人', + opportunity_source varchar(255) null comment '商机来源', + ppl_product_type varchar(255) null comment 'PPL 产品类型', + latest_followup_date_new varchar(255) null comment '最近跟进日期-新', + remarks text null comment '备注说明', + quotation_status varchar(255) null comment '报价单状态', + create_time varchar(255) null comment '创建时间', + last_modifier varchar(255) null comment '最后修改人', + opportunity_stage varchar(255) null comment '商机阶段(必填)', + stage_status varchar(255) null comment '阶段状态', + stage_change_time varchar(255) null comment '阶段变更时间', + last_modified_time datetime null comment '最后修改时间', + business_type varchar(255) null comment '业务类型(必填)', + last_followup_time varchar(255) null comment '最后跟进时间', + owner_main_department varchar(255) null comment '负责人主属部门', + weekly_update text null comment 'Weekly Update', + sl_pull_in varchar(255) null comment 'SL Pull IN', + lost_reason varchar(255) null comment '丢标原因', + bidding_time varchar(255) null comment '招标时间', + renew_risk_level varchar(255) null comment 'Renew 风险度', + customer_category varchar(255) null comment '客户分类', + quotation_order_status varchar(255) null comment '报价/下单状态', + source varchar(255) null comment '来源', + project_contribution text null comment '立项贡献(立项报告的内容)', + project_date varchar(255) null comment '立项日期', + budget_approval_status varchar(255) null comment '预算审批是否完成', + sales_order_archive_status varchar(255) null comment '销售订单归档状态', + is_channel_reported_opportunity varchar(255) null comment '是否渠道报备商机(必填)', + is_project_approved varchar(255) null comment '是否立项', + ops_cd_project_retrospective_schedule text null comment 'ops cd 项目进展倒排时间表', + ops_cd_critical_issues text null comment 'ops cd 重大问题卡点', + ops_cd_business_progress text null comment 'ops cd 商务进展', + kd_closure_milestone text null comment 'KD-关单节点', + kd_decision_chain text null comment 'KD-决策链条', + kd_competitor_strategy text null comment 'KD-友商策略和动态', + kd_breakthrough_basis text null comment 'KD-突破单依据', + key_deal_tag varchar(255) null comment 'key deal 标签', + product_capability_needs text null comment 'KD-急需产品能力(售前更新)', + kp_deal_flag_operations varchar(255) null comment 'KP deal 标记(运营)', + next_stage text null comment '下一阶段解决策略及资源需求', + is_poc varchar(255) null comment '是否进行poc', + poc_status varchar(255) null comment 'PoC 状态', + sales_order_review_status varchar(255) null comment '销售订单审核状态', + delete_flag tinyint(1) null comment '删除标识(0-正常,1-已删除)', + extra json null comment '扩展内容', + support_person json null comment '辅助人员列表,JSON格式存储多个辅助人员的userid和name', + expected_closing_month varchar(255) null comment '预计成交月份(如"2025-01"格式)', + eu_sales varchar(255) null comment 'EU销售人员', + project_delivery_date varchar(255) null comment '项目交付日期', + payment_received_date varchar(255) null comment '回款时间', + invoice_date varchar(255) null comment '开票时间', + belonging_department varchar(255) null comment '归属部门(默认用ETL填写owner部门)', + department_percentage varchar(255) null comment '部门百分比(默认填写"100%")', + owner_id varchar(255) null comment '负责人ID(对应crm_user.user_id)', + expected_closing_year int null comment '业绩归属年度', + owner_department_id varchar(255) null comment '负责人部门ID(关联crm_user.department_id)', + owner_department_name varchar(255) null comment '负责人部门名称(来自crm_user.department)', + derived_close_date date null comment 'APTSell derived close date (when CRM close_date is missing)', + close_date date null comment '实际成单日期(Closed Won)', + constraint uq_crm_opportunities_unique_id + unique (unique_id) +) + comment '商机表'; + +create table `autoflow-demo`.crm_opportunities_snapshot +( + id int auto_increment comment '主键ID' + primary key, + unique_id varchar(255) null comment '唯一性ID(必填)', + opportunity_name varchar(255) null comment '商机名称(必填)', + competitor_name varchar(255) null comment '友商名称', + former_name varchar(255) null comment '曾用名', + partner_opportunity_filing_id_unique_id varchar(255) null comment '合作伙伴商机报备编号_唯一性ID', + partner_opportunity_filing_number varchar(255) null comment '合作伙伴商机报备编号', + filing_opportunity_number varchar(255) null comment '报备商机编号', + call_high_notes text null comment 'Call high 情况', + department varchar(255) null comment '归属部门', + current_year_service_forecast float null comment '当财年 Service 收入预测金额(不含税)', + customer_budget_status text null comment '客户预算情况', + todo_and_followup text null comment 'Todo & follow up', + is_framework_quote varchar(255) null comment '是否框架协议报价商机', + customer_id varchar(255) null comment '客户名称_唯一性ID(必填)', + customer_name varchar(255) null comment '客户名称(必填)', + customer_type varchar(255) null comment '客户属性', + owner varchar(255) null comment '负责人(必填)', + customer_business_scenario varchar(255) null comment '客户业务场景', + forecast_type varchar(255) null comment '预测类型', + estimated_tcv int null comment '预估 TCV', + estimated_acv int null comment '预估 ACV', + expected_closing_date varchar(255) null comment '预计成交日期', + expected_closing_quarter varchar(255) null comment '预计成交季度', + opportunity_type varchar(255) null comment '商机类型', + signing_type varchar(255) null comment '签约类型', + general_agent varchar(255) null comment '总代理', + presales_owner varchar(255) null comment '售前负责人', + opportunity_source varchar(255) null comment '商机来源', + ppl_product_type varchar(255) null comment 'PPL 产品类型', + latest_followup_date_new varchar(255) null comment '最近跟进日期-新', + remarks text null comment '备注说明', + quotation_status varchar(255) null comment '报价单状态', + create_time varchar(255) null comment '创建时间', + last_modifier varchar(255) null comment '最后修改人', + opportunity_stage varchar(255) null comment '商机阶段(必填)', + stage_status varchar(255) null comment '阶段状态', + stage_change_time varchar(255) null comment '阶段变更时间', + last_modified_time datetime null comment '最后修改时间', + business_type varchar(255) null comment '业务类型(必填)', + last_followup_time varchar(255) null comment '最后跟进时间', + owner_main_department varchar(255) null comment '负责人主属部门', + weekly_update text null comment 'Weekly Update', + sl_pull_in varchar(255) null comment 'SL Pull IN', + lost_reason varchar(255) null comment '丢标原因', + bidding_time varchar(255) null comment '招标时间', + renew_risk_level varchar(255) null comment 'Renew 风险度', + customer_category varchar(255) null comment '客户分类', + quotation_order_status varchar(255) null comment '报价/下单状态', + source varchar(255) null comment '来源', + project_contribution text null comment '立项贡献(立项报告的内容)', + project_date varchar(255) null comment '立项日期', + budget_approval_status varchar(255) null comment '预算审批是否完成', + sales_order_archive_status varchar(255) null comment '销售订单归档状态', + is_channel_reported_opportunity varchar(255) null comment '是否渠道报备商机(必填)', + is_project_approved varchar(255) null comment '是否立项', + ops_cd_project_retrospective_schedule text null comment 'ops cd 项目进展倒排时间表', + ops_cd_critical_issues text null comment 'ops cd 重大问题卡点', + ops_cd_business_progress text null comment 'ops cd 商务进展', + kd_closure_milestone text null comment 'KD-关单节点', + kd_decision_chain text null comment 'KD-决策链条', + kd_competitor_strategy text null comment 'KD-友商策略和动态', + kd_breakthrough_basis text null comment 'KD-突破单依据', + key_deal_tag varchar(255) null comment 'key deal 标签', + product_capability_needs text null comment 'KD-急需产品能力(售前更新)', + snapshot_date date null comment '快照日期', + kp_deal_flag_operations varchar(255) null comment 'KP deal 标记(运营)', + next_stage text null comment '下一阶段解决策略及资源需求', + is_poc varchar(255) null comment '是否进行poc', + poc_status varchar(255) null comment 'PoC 状态', + sales_order_review_status varchar(255) null comment '销售订单审核状态', + delete_flag tinyint(1) null comment '删除标识(0-正常,1-已删除)', + extra json null comment '扩展内容', + support_person json null comment '辅助人员列表,JSON格式存储多个辅助人员的userid和name', + expected_closing_month varchar(255) null comment '预计成交月份(如"2025-01"格式)', + eu_sales varchar(255) null comment 'EU销售人员', + project_delivery_date varchar(255) null comment '项目交付日期', + payment_received_date varchar(255) null comment '回款时间', + invoice_date varchar(255) null comment '开票时间', + belonging_department varchar(255) null comment '归属部门(默认用ETL填写owner部门)', + department_percentage varchar(255) null comment '部门百分比(默认填写"100%")', + owner_id varchar(255) null comment '负责人ID(对应crm_user.user_id)', + expected_closing_year int null comment '业绩归属年度', + owner_department_id varchar(255) null comment '负责人部门ID(关联crm_user.department_id)', + owner_department_name varchar(255) null comment '负责人部门名称(来自crm_user.department)', + derived_close_date date null comment 'APTSell derived close date (when CRM close_date is missing)', + close_date date null comment '实际成单日期(快照)', + constraint uq_snapshot_unique_id_snapshot_date + unique (unique_id, snapshot_date) +) + comment '商机表快照'; + +create index idx_opportunity_snapshot_date_stage_owner + on `autoflow-demo`.crm_opportunities_snapshot (snapshot_date, opportunity_stage, unique_id, owner_id); + +create index idx_snapshot_date + on `autoflow-demo`.crm_opportunities_snapshot (snapshot_date); + +create table `autoflow-demo`.crm_opportunity_review_execution_index +( + id int auto_increment + primary key, + opportunity_id varchar(255) not null comment '商机唯一性ID', + execution_id varchar(255) not null comment '关联账户的最新review2报告的execution_id', + account_id varchar(255) null comment '关联的账户ID', + report_id varchar(255) null comment '报告ID', + plan_id varchar(255) null comment '执行计划ID', + report_created_time datetime not null comment '报告创建时间', + last_updated_time datetime default CURRENT_TIMESTAMP not null comment '索引最后更新时间', + create_time datetime default CURRENT_TIMESTAMP not null comment '索引创建时间', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + constraint opportunity_id + unique (opportunity_id) +) + comment '商机复盘执行索引表'; + +create index idx_account_id + on `autoflow-demo`.crm_opportunity_review_execution_index (account_id); + +create index idx_execution_id + on `autoflow-demo`.crm_opportunity_review_execution_index (execution_id); + +create index idx_report_created_time + on `autoflow-demo`.crm_opportunity_review_execution_index (report_created_time); + +create table `autoflow-demo`.crm_opportunity_stage_stay_bucket +( + opportunity_id varchar(255) not null comment 'Opportunity id (crm_opportunities.unique_id)', + opportunity_stage varchar(255) not null comment 'Stage name (non-closed stages only)', + stay_days int default 0 not null comment 'Cumulative days in this stage (bucket count)', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + primary key (opportunity_id, opportunity_stage) +) + comment '商机阶段停留时间汇总表'; + +create index idx_updated_at + on `autoflow-demo`.crm_opportunity_stage_stay_bucket (updated_at); + +create table `autoflow-demo`.crm_opportunity_stage_stay_daily +( + opportunity_id varchar(255) not null comment 'Opportunity id (crm_opportunities.unique_id)', + opportunity_stage varchar(255) not null comment 'Stage name (non-closed stages only)', + snapshot_date date not null comment 'Date this (opp, stage) was observed in snapshot', + primary key (opportunity_id, opportunity_stage, snapshot_date) +) + comment 'FR-ST-1: Idempotent daily ledger for stage stay; bucket is derived from this table'; + +create index idx_snapshot_date + on `autoflow-demo`.crm_opportunity_stage_stay_daily (snapshot_date); + +create table `autoflow-demo`.crm_orders +( + id bigint auto_increment comment '主键ID(自增序列)' + primary key, + signing_date datetime null comment '签约日期', + service_duration_months varchar(255) null comment '服务时长/月(订阅/维保)', + total_margin_percentage varchar(255) null comment 'Margin%(总代+经销)', + customer_name varchar(255) null comment '客户名称', + arr varchar(255) null comment 'ARR', + maintenance_ratio varchar(255) null comment '维保比例', + renew_arr varchar(255) null comment 'Renew ARR', + customer_id varchar(255) null comment '客户id', + sales_type varchar(255) null comment '销售类型', + product_subscription_amount decimal(18, 2) null comment '产品订阅金额', + shipping_status varchar(255) null comment '发货状态', + shipping_address varchar(255) null comment '收货地址', + sales_order_amount decimal(18, 2) null comment '销售订单金额', + third_level_distributor varchar(255) null comment '经销商三级', + planned_payment_amount decimal(18, 2) null comment '已计划回款金额', + created_by varchar(1024) null comment '创建人', + service_end_date_subscription_maintenance datetime null comment '服务结束日期(订阅/维保)', + outsourcing_cost decimal(18, 2) null comment '外采(外包)成本', + performance_accounting_sales_department varchar(1024) null comment '业绩核算销售所在部门', + project_name varchar(255) null comment '项目名称', + expected_renewal_time_fy varchar(255) null comment '应续约时间(FY)', + new_arr varchar(255) null comment 'New ARR', + owner varchar(1024) null comment '负责人', + product_perpetual_license_amount decimal(18, 2) null comment '产品永久授权金额', + split_ratio varchar(255) null comment '拆分比例', + contract_archiving_status varchar(255) null comment '合同归档状态', + pending_payment_amount varchar(512) null comment '待回款金额', + invoice_status varchar(512) null comment '开票状态', + order_type varchar(255) null comment '订单类型', + is_general_agent varchar(512) null comment '是否总代理', + source varchar(255) null comment '数据来源', + contract_type varchar(255) null comment '合同类型', + reported_partner_name varchar(255) null comment '报备合作伙伴名称', + commission_info varchar(255) null comment '提成信息', + has_sub_agents varchar(255) null comment '是否有下级代理商', + man_day_service_amount decimal(18, 2) null comment '人天服务金额', + old_service_end_date datetime null comment '服务结束日期(旧)', + owning_department varchar(1024) null comment '归属部门', + unique_id varchar(255) null comment '唯一性ID(必填)', + maintenance_service_amount decimal(18, 2) null comment '维保服务金额', + partner_id varchar(255) null comment '合作伙伴', + payment_status varchar(512) null comment '回款状态', + sales_order_amount_excluding_tax varchar(255) null comment '销售订单金额(不含税)', + arr_excluding_tax varchar(255) null comment 'ARR(不含税)', + settle_type varchar(255) null comment '结算方式', + contract_name varchar(255) null comment '合同名称', + second_level_distributor varchar(255) null comment '经销商二级', + opportunity_id varchar(255) null comment '商机id', + quote_id varchar(255) null comment '报价单编号', + total_payment_amount decimal(18, 2) null comment '累计回款金额', + is_framework_order varchar(255) null comment '是否框架下订单', + first_level_distributor varchar(255) null comment '经销商一级', + service_start_date_subscription_maintenance datetime null comment '服务开始日期(订阅/维保)', + previous_name varchar(255) null comment '曾用名', + owner_department varchar(255) null comment '负责人主属部门', + creation_time datetime null comment '创建时间', + sales_order_number varchar(255) null comment '销售订单编号', + invoice_completion_status varchar(255) null comment '开票完成状态', + contracting_party varchar(255) null comment '签约主体', + delivery_acceptance_progress text null comment '交付/验收进展', + product_type varchar(255) null comment '产品类型', + renewal_type varchar(1024) null comment '续约类型', + delivery_comment varchar(255) null comment '发货备注', + profit_statement varchar(1024) null comment '利润表', + opportunity_number varchar(255) null comment '商机编号', + last_modified_time datetime null comment '最后修改时间', + life_status varchar(255) null comment '生命状态', + framework_agreement_id varchar(255) null comment '框架协议名称', + acv varchar(255) null comment 'ACV', + contracting_partner varchar(255) null comment '合作伙伴(签约方)', + renewal_status varchar(255) null comment '续约状态', + resource varchar(255) null comment '来源', + contract_attribute varchar(255) null comment '合同属性', + remark text null comment '备注', + last_modified_by varchar(1024) null comment '最后修改人', + delivery_time datetime null comment '发货时间', + opportunity_name varchar(255) null comment '商机名称', + sales_organization varchar(255) null comment '销售组织', + delete_flag tinyint(1) null comment '删除标识(0-正常,1-已删除)', + extra json null comment '扩展内容' +) + comment '订单表'; + +create table `autoflow-demo`.crm_payment_plans +( + id bigint auto_increment comment '主键ID(自增序列)' + primary key, + actual_payment_fiscal_quarter varchar(512) null comment '实际回款日期-财年&季度', + lock_rule text null comment '锁定规则', + action_tag varchar(1024) null comment 'Action tag-多选', + extend_obj_data_id varchar(255) null comment 'extend_obj_data_id', + remind_time varchar(255) null comment '提前几日提醒', + life_status_before_invalid varchar(255) null comment '作废前生命状态', + order_amount varchar(255) null comment '销售订单金额', + contract_party varchar(255) null comment '签约方', + plan_payment_status varchar(255) null comment '状态', + owner_department varchar(255) null comment '负责人所在部门', + latest_plan_payment_fiscal_quarter varchar(512) null comment '最新计划回款日期-财年&季度', + plan_payment_method varchar(255) null comment '计划回款方式', + plan_payment_amount decimal(18, 2) null comment '计划回款金额(元)', + pending_payment_amount varchar(512) null comment '待回款金额', + plan_payment_ratio varchar(512) null comment '计划回款占比', + lock_status varchar(255) null comment '锁定状态', + first_plan_payment_fiscal_quarter varchar(512) null comment '首次计划回款日期-财年&季度', + create_time datetime null comment '创建时间', + booking_fiscal_year varchar(512) null comment 'Booking财年', + version varchar(255) null comment 'version', + created_by varchar(1024) null comment '创建人', + relevant_team varchar(1024) null comment '相关团队', + data_own_department varchar(1024) null comment '归属部门', + next_plan_description text null comment '下一步计划说明', + name varchar(255) null comment '回款计划编号', + unique_id varchar(255) null comment '唯一性ID(必填)', + order_id varchar(255) null comment '销售订单编号', + data_refresh_flag varchar(255) null comment '刷数据', + first_payment_overdue_days varchar(512) null comment '首次回款计划-逾期天数-后台计算', + approve_employee_id varchar(1024) null comment '当前审批人', + remark text null comment '备注', + contract_date varchar(512) null comment '签约日期', + origin_source varchar(255) null comment '数据来源', + lock_user varchar(1024) null comment '加锁人', + actual_payment_date datetime null comment '实际回款日期', + partner_id varchar(255) null comment '合作伙伴', + overdue_reason varchar(1024) null comment '逾期归因', + is_deleted tinyint(1) null comment 'is_deleted', + attachment varchar(1024) null comment '附件', + actual_payment_amount decimal(18, 2) null comment '实际回款金额(元)', + overdue_payment_reason text null comment '逾期回款原因', + latest_payment_overdue_days varchar(512) null comment '最新回款计划-逾期天数', + latest_plan_payment_date datetime null comment '最新计划回款日期', + backend_process_status varchar(255) null comment '后台处理状态', + next_plan varchar(255) null comment '下一步计划', + out_owner varchar(1024) null comment '外部负责人', + out_resources varchar(255) null comment '外部来源', + owner varchar(1024) null comment '负责人', + last_modified_time datetime null comment '最后修改时间', + life_status varchar(255) null comment '生命状态', + last_modified_by varchar(1024) null comment '最后修改人', + out_tenant_id varchar(255) null comment '外部企业', + record_type varchar(255) null comment '业务类型', + overdue_description_and_next_plan varchar(2048) null comment '逾期说明及下一步计划-刷数据至下一步计划说明', + account_id varchar(255) null comment '客户id', + plan_payment_time datetime null comment '首次计划回款日期', + target_payment_date datetime null comment 'Target 回款日期', + order_by varchar(255) null comment 'order_by', + first_plan_overdue_month varchar(512) null comment '首次计划回款-逾期月份', + contract_entity varchar(255) null comment '签约主体', + account_name varchar(255) null comment '客户名称', + delete_flag tinyint(1) null comment '删除标识(0-正常,1-已删除)', + extra json null comment '扩展内容' +) + comment '回款计划表'; + +create table `autoflow-demo`.crm_playbook +( + id int auto_increment + primary key, + handbook_id varchar(64) not null comment '销售手册ID', + name varchar(255) not null comment '销售手册名称', + description text null comment '描述', + is_active tinyint(1) default 1 null comment '是否启用', + is_default tinyint(1) default 0 null comment '是否默认销售手册', + created_by varchar(255) null comment '创建人', + updated_by varchar(255) null comment '更新人', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + constraint idx_crm_playbook_handbook_id + unique (handbook_id) +) + comment 'Playbook元数据表'; + +create index idx_crm_playbook_active + on `autoflow-demo`.crm_playbook (is_active); + +create index idx_crm_playbook_default + on `autoflow-demo`.crm_playbook (is_default); + +create table `autoflow-demo`.crm_playbook_mapping +( + id int auto_increment + primary key, + field_name varchar(100) not null comment '字段名 (e.g., business_type, opportunity_stage)', + field_value varchar(255) not null comment '字段值 (e.g., 新签, Discovery)', + handbook_id varchar(64) not null comment '关联的playbook handbook_id', + description text null comment '描述', + is_active tinyint(1) null comment '是否启用', + priority int null comment '优先级,高优先级优先匹配', + created_by varchar(255) null comment '创建人', + updated_by varchar(255) null comment '更新人', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + constraint idx_field_mapping + unique (field_name, field_value) +) + comment 'Playbook字段映射表'; + +create index idx_handbook_id + on `autoflow-demo`.crm_playbook_mapping (handbook_id); + +create index idx_is_active_priority + on `autoflow-demo`.crm_playbook_mapping (is_active, priority); + +create table `autoflow-demo`.crm_playbook_stage_metrics +( + id int auto_increment + primary key, + unique_id varchar(255) not null comment '唯一性ID(UUID)', + handbook_id varchar(64) not null comment '销售手册ID,关联diagnostic_playbook', + sales_stage varchar(255) not null comment '销售阶段名称', + stage_sequence int null comment '阶段顺序,用于计算剩余阶段所需时间', + avg_stay_days int default 0 not null comment '平均停留天数(初始为固定值,后续从历史数据计算)', + median_stay_days int null comment '中位数停留天数(可选)', + min_stay_days int null comment '最小停留天数(可选)', + max_stay_days int null comment '最大停留天数(可选)', + sample_size int null comment '计算平均值所用的样本数量', + data_source varchar(50) default 'fixed' null comment '数据来源:fixed(固定值)/calculated(历史计算)/manual(人工设置)', + calculation_period_start date null comment '计算时间段起始(仅data_source=calculated时有效)', + calculation_period_end date null comment '计算时间段结束', + is_active tinyint(1) default 1 null comment '是否启用', + version varchar(32) default '1.0' null comment '配置版本', + description text null comment '备注说明', + created_by varchar(255) null comment '创建人', + updated_by varchar(255) null comment '更新人', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + constraint idx_handbook_stage + unique (handbook_id, sales_stage) +) + comment '销售阶段平均停留时间表,用于AI FCST评估'; + +create index idx_handbook_active + on `autoflow-demo`.crm_playbook_stage_metrics (handbook_id, is_active); + +create index idx_handbook_sequence + on `autoflow-demo`.crm_playbook_stage_metrics (handbook_id, stage_sequence); + +create index idx_unique_id + on `autoflow-demo`.crm_playbook_stage_metrics (unique_id); + +create table `autoflow-demo`.crm_poc +( + id int auto_increment comment '主键ID(自增序列)' + primary key, + unique_id varchar(255) not null comment '唯一标识ID', + account_id varchar(255) null comment '客户ID', + account_name varchar(255) null comment '客户名称', + opportunity_name varchar(255) null comment '商机名称', + opportunity_id varchar(255) null comment '商机ID', + owner varchar(255) null comment '负责人', + is_poc varchar(10) null comment '是否POC', + poc_status varchar(20) null comment 'POC状态', + poc_result varchar(20) null comment 'POC结果', + poc_end_date date null comment 'POC结束日期', + created_by varchar(255) null comment '创建人', + created_time datetime default CURRENT_TIMESTAMP null comment '创建时间', + last_modified_by varchar(255) null comment '最后修改人', + last_modified_time datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '最后修改时间', + is_deleted tinyint(1) null comment '删除标记', + client_id varchar(255) null comment '客户端ID', + owner_id varchar(255) null comment '负责人ID(对应crm_user.user_id)', + constraint uq_crm_poc_unique_id + unique (unique_id) +) + comment 'POC管理表'; + +create table `autoflow-demo`.crm_push_notification +( + id int auto_increment + primary key, + unique_id varchar(255) not null comment '唯一性ID(必填)', + title varchar(255) not null comment '通知标题', + content text null comment '通知内容', + notification_type varchar(50) not null comment '通知类型(workflow_complete/workflow_started/workflow_failed/custom)', + priority varchar(20) null comment '优先级(high/medium/low)', + plan_id varchar(255) null comment '关联的工作流计划ID', + execution_id varchar(255) null comment '关联的工作流执行ID', + report_id varchar(255) null comment '关联的报告ID', + tenant_id varchar(255) not null comment '租户ID', + correlation_id varchar(255) null comment '关联ID,用于追踪相关联的业务实体', + status varchar(50) not null comment '通知状态(pending/scheduled/sent/failed/cancelled)', + scheduled_time datetime null comment '计划发送时间', + trigger_condition varchar(100) null comment '触发条件(immediate/workflow_complete/delay/custom)', + delay_minutes int null comment '延迟发送分钟数', + target_service varchar(100) null comment '目标第三方服务名称(webhook/email/sms/slack/dingtalk等)', + api_endpoint varchar(500) null comment '第三方服务API端点', + http_method varchar(10) null comment 'HTTP方法(GET/POST/PUT等)', + request_payload text null comment '发送给第三方服务的完整请求载荷(JSON格式)', + request_headers text null comment 'HTTP请求头(JSON格式)', + auth_config text null comment '认证配置(JSON格式,支持Bearer Token/API Key等)', + max_retry_attempts int null comment '最大重试次数', + current_retry_count int null comment '当前重试次数', + retry_interval_minutes int null comment '重试间隔(分钟)', + next_retry_time datetime null comment '下次重试时间', + last_sent_time datetime null comment '最后发送时间', + response_status_code int null comment '第三方服务响应状态码', + response_body text null comment '第三方服务响应内容', + error_message text null comment '错误信息', + linked_account_ids text null comment '关联的客户ID列表(JSON格式)', + linked_opportunity_ids text null comment '关联的商机ID列表(JSON格式)', + business_context text null comment '业务上下文信息(JSON格式,用于动态生成通知内容)', + created_by varchar(255) null comment '创建人', + created_by_id varchar(255) null comment '创建人ID', + tags varchar(255) null comment '标签(逗号分隔)', + notes text null comment '备注信息', + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', + update_time datetime default CURRENT_TIMESTAMP not null comment '更新时间', + completed_time datetime null comment '完成时间', + expired_time datetime null comment '过期时间', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间' +) + comment '推送通知配置表'; + +create table `autoflow-demo`.crm_report_index +( + id int auto_increment + primary key, + unique_id varchar(255) not null comment '唯一性ID', + report_id int not null comment '报告ID, 对应CRMReport表的id', + report_id_code varchar(255) not null comment '报告ID编码, 对应CRMReport表的report_id', + execution_id varchar(255) not null comment '执行ID', + plan_id varchar(255) not null comment '计划ID', + report_type varchar(64) not null comment '报告类型: review1/review1s/review2/review5/previsit/daily', + report_calendar_type varchar(64) not null comment '报告周期类型: daily/weekly/monthly/quarterly/yearly', + report_status varchar(32) not null comment '报告状态: draft/published/archived', + report_date date not null comment '报告日期', + report_datetime datetime not null comment '报告精确时间', + report_week_of_year int not null comment '年内周数(1-53)', + report_month_of_year int not null comment '年内月份(1-12)', + report_quarter_of_year int not null comment '年内季度(1-4)', + report_year int not null comment '报告年份', + created_by varchar(255) null comment '创建人', + department_id varchar(255) null comment '部门ID', + department_name varchar(255) null comment '部门名字', + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', + update_time datetime default CURRENT_TIMESTAMP not null comment '更新时间', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间' +) + comment '报告索引表'; + +create index idx_execution_id + on `autoflow-demo`.crm_report_index (execution_id); + +create index idx_report_id + on `autoflow-demo`.crm_report_index (report_id); + +create index idx_report_type_date + on `autoflow-demo`.crm_report_index (report_type, report_date); + +create index idx_unique_id + on `autoflow-demo`.crm_report_index (unique_id); + +create table `autoflow-demo`.crm_review_achievement_change_analysis +( + id bigint auto_increment + primary key, + unique_id varchar(255) not null, + session_id varchar(255) not null, + calc_phase varchar(16) not null, + snapshot_period varchar(32) not null, + report_date date null, + analysis_content mediumtext not null, + created_at datetime default CURRENT_TIMESTAMP not null, + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP +) + comment '复盘业绩变化分析(JSON单表存储)'; + +create index idx_review_change_analysis_session_phase + on `autoflow-demo`.crm_review_achievement_change_analysis (session_id, calc_phase); + +create index idx_review_change_analysis_snapshot_period + on `autoflow-demo`.crm_review_achievement_change_analysis (snapshot_period, calc_phase); + +create table `autoflow-demo`.crm_review_attendee +( + id int auto_increment + primary key, + unique_id varchar(255) not null comment 'Unique identifier', + session_id varchar(255) not null comment 'FK → crm_review_session.unique_id', + user_id varchar(255) not null comment 'User ID', + crm_user_id varchar(255) not null comment 'CRM user ID (matches opportunity.owner_id)', + user_name varchar(255) null comment 'User name', + department_id varchar(255) null comment 'Department ID', + department_name varchar(255) null comment 'Department name', + is_leader tinyint(1) null comment 'Is department lead', + is_primary_dept tinyint(1) null comment 'Is primary department', + has_submitted tinyint(1) default 0 null, + submitted_at datetime null, + submission_count int default 0 null, + modification_count int default 0 null, + last_modified_at datetime null, + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + constraint idx_session_user + unique (session_id, user_id) +) + comment '复盘参与者表'; + +create index idx_crm_user_id + on `autoflow-demo`.crm_review_attendee (crm_user_id); + +create index idx_has_submitted + on `autoflow-demo`.crm_review_attendee (has_submitted); + +create index idx_session_id + on `autoflow-demo`.crm_review_attendee (session_id); + +create table `autoflow-demo`.crm_review_attendee_todo_stats +( + id int auto_increment + primary key, + unique_id varchar(255) not null comment '唯一性ID', + session_id varchar(255) not null comment 'FK → crm_review_session.unique_id', + owner_id varchar(255) not null comment 'Attendee CRM user ID (matches crm_review_attendee.crm_user_id)', + owner_name varchar(255) null comment 'Attendee display name', + department_id varchar(255) null comment 'Attendee department ID', + department_name varchar(255) null comment 'Attendee department name', + period varchar (32) not null comment 'Review period (e.g., 2026-W11)', + report_date date not null comment 'Workflow report date (used as "today" for overdue calc)', + calc_phase varchar(32) not null comment 'first | second', + total_this_week int default 0 not null comment '本周任务总数:due_date在本周区间的任务数', + completed_this_week int default 0 not null comment '本周任务已完成:本周任务中ai_status=COMPLETED的数量', + incomplete_this_week int default 0 not null comment '本周未完成:本周任务中未完成的数量', + historical_overdue_completed_this_week int default 0 not null comment '历史逾期本周完成:due_date早于本周但在本周完成的任务数', + current_total_overdue int default 0 not null comment '当前总逾期:due_date早于report_date且未完成/未取消的任务数', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + constraint uk_review_attendee_todo_stats + unique (session_id, owner_id, calc_phase) +) + comment '复盘参与者任务统计表'; + +create index idx_review_attendee_todo_stats_owner + on `autoflow-demo`.crm_review_attendee_todo_stats (owner_id); + +create index idx_review_attendee_todo_stats_session + on `autoflow-demo`.crm_review_attendee_todo_stats (session_id); + +create table `autoflow-demo`.crm_review_department +( + id int auto_increment + primary key, + unique_id varchar(255) not null comment '唯一性ID(必填)', + department_id varchar(255) not null comment 'FK → crm_department.unique_id', + department_name varchar(255) null comment 'Department name (denormalized)', + parent_department_id varchar(255) null comment 'Parent department ID', + is_active tinyint(1) default 1 null comment 'Whether review is enabled for this dept', + review_frequency varchar(32) null comment 'weekly/monthly/quarterly', + include_sub_departments tinyint(1) default 1 null comment 'Whether to include sub-depts in review', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + created_by varchar(255) null comment 'User who added this dept to review list' +) + comment '复盘部门配置表'; + +create index idx_active + on `autoflow-demo`.crm_review_department (is_active); + +create index idx_department_id + on `autoflow-demo`.crm_review_department (department_id); + +create index idx_parent_id + on `autoflow-demo`.crm_review_department (parent_department_id); + +create table `autoflow-demo`.crm_review_kpi_metric_opp_link +( + id int auto_increment + primary key, + kpi_metric_unique_id varchar(255) not null comment 'Logical FK -> crm_review_kpi_metrics.unique_id', + snapshot_unique_id varchar(255) not null comment 'Logical FK -> crm_review_opp_branch_snapshot.unique_id', + session_id varchar(255) not null comment 'Redundant for filter', + opportunity_id varchar(255) not null comment 'Redundant for filter', + snapshot_period varchar(32) not null comment 'Redundant for filter (e.g., 2026-W15)', + scope_type varchar(32) not null comment 'owner | department | company', + scope_id varchar(255) null comment 'Owner/department id; null for company', + metric_name varchar(255) not null comment 'closed | commit_sales | commit_ai | upside_sales', + calc_phase varchar(32) not null comment 'first | second', + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', + update_time datetime default CURRENT_TIMESTAMP not null comment '更新时间', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + constraint uniq_kpi_snapshot + unique (kpi_metric_unique_id, snapshot_unique_id) +) + comment '复盘KPI指标与商机快照关联表(用于UI下钻)'; + +create index idx_kpi_metric_unique_id + on `autoflow-demo`.crm_review_kpi_metric_opp_link (kpi_metric_unique_id); + +create index idx_opportunity_period + on `autoflow-demo`.crm_review_kpi_metric_opp_link (opportunity_id, snapshot_period); + +create index idx_session_metric + on `autoflow-demo`.crm_review_kpi_metric_opp_link (session_id, metric_name); + +create table `autoflow-demo`.crm_review_kpi_metrics +( + id int auto_increment + primary key, + unique_id varchar(255) not null, + session_id varchar(255) not null, + scope_type varchar(32) not null, + scope_id varchar(255) null, + scope_name varchar(255) null, + parent_scope_id varchar(255) null, + metric_category varchar(64) not null, + metric_name varchar(255) not null, + metric_value decimal(18, 4) null comment 'Current period value', + metric_value_prev decimal(18, 4) null comment 'Previous period value', + metric_delta decimal(18, 4) null comment 'Change value', + metric_rate decimal(8, 4) null comment 'Rate 0-1 (e.g., 0.288 = 28.8%)', + metric_unit varchar(32) null, + metric_content text null, + metric_content_en text null, + calc_phase varchar(32) null, + period_type varchar(32) null, + period varchar (32) null, + report_date date null, + report_year int null, + report_week_of_year int null, + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', + update_time datetime default CURRENT_TIMESTAMP not null comment '更新时间', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间' +) + comment '复盘KPI指标表'; + +create index idx_period_scope_metric + on `autoflow-demo`.crm_review_kpi_metrics (period, scope_type, metric_name); + +create index idx_session_scope_cat + on `autoflow-demo`.crm_review_kpi_metrics (session_id, scope_type, metric_category); + +create index idx_session_scope_metric + on `autoflow-demo`.crm_review_kpi_metrics (session_id, scope_id, metric_name); + +create table `autoflow-demo`.crm_review_opp_audit_log +( + id char(32) not null + primary key, + session_id varchar(255) not null comment 'FK → crm_review_session.unique_id', + change_scope varchar(64) not null comment 'Field name that was changed', + old_value text null comment 'Previous value (string representation)', + new_value text null comment 'New value (string representation)', + change_type varchar(32) default 'UPDATE' not null comment 'Type: UPDATE', + edit_phase varchar(32) null comment 'initial/meeting - which phase the change was made', + updated_by varchar(255) not null comment 'User name who made the change', + updated_by_id varchar(255) not null comment 'User ID who made the change', + created_at datetime default CURRENT_TIMESTAMP null, + updated_at datetime default CURRENT_TIMESTAMP null +) + comment 'Audit log for branch snapshot modifications'; + +create index idx_session_id + on `autoflow-demo`.crm_review_opp_audit_log (session_id); + +create index idx_updated_at + on `autoflow-demo`.crm_review_opp_audit_log (updated_at); + +create index idx_updated_by_id + on `autoflow-demo`.crm_review_opp_audit_log (updated_by_id); + +create table `autoflow-demo`.crm_review_opp_branch_snapshot +( + id int auto_increment + primary key, + unique_id varchar(255) not null comment 'Unique record ID', + opportunity_id varchar(255) not null, + owner_id varchar(255) null comment 'Owner crm_user_id', + owner_name varchar(255) null, + owner_department_id varchar(255) null, + owner_department_name varchar(255) null, + snapshot_period varchar(32) not null comment 'Period (e.g., 2026-W10)', + snapshot_date date not null, + account_id varchar(255) null, + account_name varchar(255) null, + opportunity_name varchar(255) null, + forecast_type varchar(255) null, + forecast_amount decimal(18, 2) null, + forecast_amount_source varchar(64) null, + opportunity_stage varchar(255) null, + expected_closing_date varchar(255) null, + baseline_forecast_type varchar(255) null, + baseline_forecast_amount decimal(18, 2) null, + baseline_forecast_amount_source varchar(64) null, + baseline_opportunity_stage varchar(255) null, + baseline_expected_closing_date varchar(255) null, + baseline_frozen_at datetime null, + crm_forecast_type varchar(255) null, + crm_forecast_amount decimal(18, 2) null, + crm_forecast_amount_source varchar(64) null, + crm_opportunity_stage varchar(255) null, + crm_expected_closing_date varchar(255) null, + ai_commit_1st varchar(32) null, + ai_stage_1st varchar(255) null, + ai_expected_closing_date_1st varchar(255) null, + ai_evaluated_1st_at datetime null, + ai_commit_2nd varchar(32) null, + ai_stage_2nd varchar(255) null, + ai_expected_closing_date_2nd varchar(255) null, + ai_evaluated_2nd_at datetime null, + ai_commit varchar(32) null comment 'Latest AI commit assessment (Commit/NotCommit)', + ai_stage varchar(255) null comment 'Latest AI stage assessment', + ai_expected_closing_date varchar(255) null comment 'Latest AI expected closing date', + ai_evaluated_at datetime null comment 'Timestamp of latest AI evaluation', + ai_eval_source varchar(10) null comment 'Source of AI eval: 1st or 2nd', + stage_stay int null comment 'Days in current stage (from crm_opportunity_stage_stay_bucket)', + expected_closing_quarter varchar(50) null, + close_date date null, + is_closed tinyint(1) null, + customer_type varchar(255) null, + was_changed_to_commit tinyint(1) null, + was_modified tinyint(1) null, + last_modified_by varchar(255) null, + last_modified_by_id varchar(255) null, + modification_count int default 0 null, + initial_edit_modification_count int null, + meeting_edit_modification_count int null, + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', + update_time datetime default CURRENT_TIMESTAMP not null comment '更新时间', + opp_create_time datetime null comment '商机创建时间(来源CRM)', + baseline_expected_closing_quarter varchar(50) null, + crm_expected_closing_quarter varchar(50) null, + crm_opportunity_type varchar(255) null comment 'CRM original opportunity type', + expected_closing_month varchar(50) null comment '标准化预计成交月(如FY26M02)', + baseline_expected_closing_month varchar(50) null comment '冻结基线预计成交月(如FY26M02)', + crm_expected_closing_month varchar(50) null comment 'CRM原始预计成交月标准化值(如FY26M02)', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + constraint idx_opp_period + unique (opportunity_id, snapshot_period) +) + comment '复盘商机快照表'; + +create index idx_ai_commit + on `autoflow-demo`.crm_review_opp_branch_snapshot (ai_commit); + +create index idx_owner_period + on `autoflow-demo`.crm_review_opp_branch_snapshot (owner_id, snapshot_period); + +create index idx_snapshot_period + on `autoflow-demo`.crm_review_opp_branch_snapshot (snapshot_period); + +create index idx_stage_stay + on `autoflow-demo`.crm_review_opp_branch_snapshot (stage_stay); + +create index idx_was_changed + on `autoflow-demo`.crm_review_opp_branch_snapshot (was_changed_to_commit); + +create table `autoflow-demo`.crm_review_opp_branch_snapshot_cache +( + id int auto_increment + primary key, + unique_id varchar(255) not null comment 'Unique record ID', + opportunity_id varchar(255) not null, + owner_id varchar(255) null comment 'Owner crm_user_id', + owner_name varchar(255) null, + owner_department_id varchar(255) null, + owner_department_name varchar(255) null, + snapshot_period varchar(32) not null comment 'Period (e.g., 2026-W10)', + snapshot_date date not null, + account_id varchar(255) null, + account_name varchar(255) null, + opportunity_name varchar(255) null, + forecast_type varchar(255) null, + forecast_amount decimal(18, 2) null, + forecast_amount_source varchar(64) null, + opportunity_stage varchar(255) null, + expected_closing_date varchar(255) null, + baseline_forecast_type varchar(255) null, + baseline_forecast_amount decimal(18, 2) null, + baseline_forecast_amount_source varchar(64) null, + baseline_opportunity_stage varchar(255) null, + baseline_expected_closing_date varchar(255) null, + baseline_expected_closing_quarter varchar(50) null, + baseline_frozen_at datetime null, + crm_forecast_type varchar(255) null, + crm_forecast_amount decimal(18, 2) null, + crm_forecast_amount_source varchar(64) null, + crm_opportunity_stage varchar(255) null, + crm_expected_closing_date varchar(255) null, + crm_expected_closing_quarter varchar(50) null, + ai_commit_1st varchar(32) null, + ai_stage_1st varchar(255) null, + ai_expected_closing_date_1st varchar(255) null, + ai_evaluated_1st_at datetime null, + ai_commit_2nd varchar(32) null, + ai_stage_2nd varchar(255) null, + ai_expected_closing_date_2nd varchar(255) null, + ai_evaluated_2nd_at datetime null, + ai_commit varchar(32) null comment 'Latest AI commit assessment (Commit/NotCommit)', + ai_stage varchar(255) null comment 'Latest AI stage assessment', + ai_expected_closing_date varchar(255) null comment 'Latest AI expected closing date', + ai_evaluated_at datetime null comment 'Timestamp of latest AI evaluation', + ai_eval_source varchar(10) null comment 'Source of AI eval: 1st or 2nd', + stage_stay int null comment 'Days in current stage (from crm_opportunity_stage_stay_bucket)', + expected_closing_quarter varchar(50) null, + close_date date null, + is_closed tinyint(1) null, + customer_type varchar(255) null, + was_changed_to_commit tinyint(1) null, + was_modified tinyint(1) null, + last_modified_by varchar(255) null, + last_modified_by_id varchar(255) null, + modification_count int default 0 null, + initial_edit_modification_count int null, + meeting_edit_modification_count int null, + opp_create_time datetime null comment '商机创建时间(来源CRM)', + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', + update_time datetime default CURRENT_TIMESTAMP not null comment '更新时间', + crm_opportunity_type varchar(255) null comment 'CRM original opportunity type', + expected_closing_month varchar(50) null comment '标准化预计成交月(如FY26M02)', + baseline_expected_closing_month varchar(50) null comment '冻结基线预计成交月(如FY26M02)', + crm_expected_closing_month varchar(50) null comment 'CRM原始预计成交月标准化值(如FY26M02)', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + constraint idx_opp_period_cache + unique (opportunity_id, snapshot_period) +) + comment '复盘商机快照缓存表(T1初始化时同步生成,由第三方服务负责后续同步)'; + +create index idx_ai_commit_cache + on `autoflow-demo`.crm_review_opp_branch_snapshot_cache (ai_commit); + +create index idx_owner_period_cache + on `autoflow-demo`.crm_review_opp_branch_snapshot_cache (owner_id, snapshot_period); + +create index idx_snapshot_period_cache + on `autoflow-demo`.crm_review_opp_branch_snapshot_cache (snapshot_period); + +create index idx_stage_stay_cache + on `autoflow-demo`.crm_review_opp_branch_snapshot_cache (stage_stay); + +create index idx_was_changed_cache + on `autoflow-demo`.crm_review_opp_branch_snapshot_cache (was_changed_to_commit); + +create table `autoflow-demo`.crm_review_opp_comment +( + id bigint auto_increment + primary key, + unique_id varchar(255) not null comment 'Stable comment UUID', + session_id varchar(255) not null comment 'FK → crm_review_session.unique_id', + opportunity_id varchar(255) not null comment 'CRM opportunity ID', + content text not null comment 'Comment body text', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + target_type varchar(64) null comment 'RiskProgressType value: RISK | PROGRESS | OPP_SUMMARY | OPP_REQS_INSIGHT; NULL = general opp comment', + target_id varchar(255) null comment 'CRMReviewOppRiskProgress.unique_id of the anchored entity', + parent_id varchar(255) null comment 'CRMReviewOppComment.unique_id of parent comment; NULL = top-level', + is_deleted tinyint(1) default 0 not null comment 'Soft-delete flag; content is blanked on delete', + is_edited tinyint(1) default 0 not null comment 'Set to True on first edit; UI shows "(edited)" badge', + submitted_by varchar(255) not null comment 'CRM user ID of the submitter', + submitted_by_name varchar(255) not null comment 'Display name at submit time', + constraint uk_opp_comment_unique_id + unique (unique_id) +) + comment '复盘商机评论表(含回复树与目标锚定)'; + +create index idx_opp_comment_parent + on `autoflow-demo`.crm_review_opp_comment (parent_id); + +create index idx_opp_comment_session_opp + on `autoflow-demo`.crm_review_opp_comment (session_id, opportunity_id); + +create index idx_opp_comment_submitter + on `autoflow-demo`.crm_review_opp_comment (submitted_by); + +create index idx_opp_comment_target + on `autoflow-demo`.crm_review_opp_comment (target_type, target_id); + +create table `autoflow-demo`.crm_review_opp_risk_progress +( + id bigint auto_increment + primary key, + unique_id varchar(255) not null, + session_id varchar(255) not null, + scope_type varchar(32) not null, + scope_id varchar(255) null, + department_id varchar(255) null, + snapshot_id varchar(255) null, + opportunity_id varchar(255) null, + owner_id varchar(255) null, + record_type varchar(32) not null, + type_code varchar(64) not null, + type_name varchar(128) not null, + category varchar(64) null, + level varchar(32) null, + severity varchar(16) null, + source varchar(128) null, + metric_name varchar(64) null, + ai_assessment varchar(255) null, + sales_assessment varchar(255) null, + judgment_rule text null, + gap_description text null, + detail_description text null, + solution text null, + evidence json null, + financial_impact decimal(18, 2) null, + previous_value decimal(18, 2) null, + current_value decimal(18, 2) null, + rate_of_change decimal(8, 4) null, + status varchar(32) null, + detected_at datetime default CURRENT_TIMESTAMP not null, + resolved_at datetime null, + resolved_by varchar(255) null, + resolution_type varchar(32) null, + resolution_note text null, + calc_phase varchar(16) not null, + snapshot_period varchar(32) not null, + metadata json null, + created_at datetime default CURRENT_TIMESTAMP not null, + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP, + created_by varchar(255) null, + updated_by varchar(255) null, + summary text null, + parent_id varchar(255) null comment '父风险记录的 unique_id,NULL 表示根级别风险', + part_key varchar(64) null comment '在父卡片内的逻辑分区标识,如 commit_risk / upside_fill / pipeline', + display_order smallint null comment '在父卡片内的渲染顺序', + constraint uk_risk_part + unique (parent_id, part_key), + constraint uk_session_scope_type_period + unique (session_id, scope_type, scope_id, type_code, snapshot_period, calc_phase) +) + comment '风险与进展追踪表'; + +create index idx_department + on `autoflow-demo`.crm_review_opp_risk_progress (department_id); + +create index idx_detected_at + on `autoflow-demo`.crm_review_opp_risk_progress (detected_at); + +create index idx_opportunity + on `autoflow-demo`.crm_review_opp_risk_progress (opportunity_id); + +create index idx_owner + on `autoflow-demo`.crm_review_opp_risk_progress (owner_id); + +create index idx_parent_id + on `autoflow-demo`.crm_review_opp_risk_progress (parent_id); + +create index idx_record_type + on `autoflow-demo`.crm_review_opp_risk_progress (record_type); + +create index idx_session_scope + on `autoflow-demo`.crm_review_opp_risk_progress (session_id, scope_type, scope_id); + +create index idx_snapshot_period + on `autoflow-demo`.crm_review_opp_risk_progress (snapshot_period); + +create index idx_status + on `autoflow-demo`.crm_review_opp_risk_progress (status); + +create index idx_type_code + on `autoflow-demo`.crm_review_opp_risk_progress (type_code); + +create table `autoflow-demo`.crm_review_progress_category +( + id bigint auto_increment + primary key, + unique_id varchar(255) not null, + code varchar(64) not null, + name_zh varchar(128) not null, + name_en varchar(128) null, + category_group varchar(64) null, + default_level varchar(32) null, + detection_source varchar(64) null, + detection_rules json null, + is_active tinyint(1) null, + sort_order int null, + created_at datetime default CURRENT_TIMESTAMP not null, + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP, + constraint code + unique (code) +) + comment '进展类别配置表'; + +create index idx_is_active + on `autoflow-demo`.crm_review_progress_category (is_active); + +create table `autoflow-demo`.crm_review_progress_threshold +( + id bigint auto_increment + primary key, + unique_id varchar(255) not null, + scope_type varchar(32) not null comment '范围类型:department/company', + scope_id varchar(255) not null comment '范围ID:部门ID或company', + progress_code varchar(64) not null comment '进展编码,例如 MAJOR_NEW_ORDER', + threshold_value decimal(18, 2) not null comment '阈值金额', + description text null comment '阈值说明', + is_active tinyint(1) default 1 null comment '是否启用', + created_at datetime default CURRENT_TIMESTAMP not null, + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP, + constraint uk_scope_progress_code + unique (scope_type, scope_id, progress_code) +) + comment '商机进展阈值配置表'; + +create index idx_progress_code_active + on `autoflow-demo`.crm_review_progress_threshold (progress_code, is_active); + +create index idx_scope_type_scope_id + on `autoflow-demo`.crm_review_progress_threshold (scope_type, scope_id); + +create table `autoflow-demo`.crm_review_risk_aggregation +( + id bigint auto_increment + primary key, + unique_id varchar(255) not null, + session_id varchar(255) not null, + scope_type varchar(32) not null, + scope_id varchar(255) not null, + scope_name varchar(255) null, + snapshot_period varchar(32) not null, + calc_phase varchar(16) not null, + total_risks int null, + total_progress int null, + critical_risks int null, + high_risks int null, + medium_risks int null, + low_risks int null, + open_risks int null, + resolved_risks int null, + total_risk_amount decimal(18, 2) null, + total_progress_amount decimal(18, 2) null, + risk_breakdown json null, + progress_breakdown json null, + previous_period_risks int null, + risk_trend varchar(16) null, + computed_at datetime default CURRENT_TIMESTAMP not null, + created_at datetime default CURRENT_TIMESTAMP not null, + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP, + constraint uk_session_scope_period + unique (session_id, scope_type, scope_id, snapshot_period, calc_phase) +) + comment '风险聚合汇总表'; + +create index idx_computed_at + on `autoflow-demo`.crm_review_risk_aggregation (computed_at); + +create index idx_period_phase + on `autoflow-demo`.crm_review_risk_aggregation (snapshot_period, calc_phase); + +create index idx_session_scope + on `autoflow-demo`.crm_review_risk_aggregation (session_id, scope_type, scope_id); + +create table `autoflow-demo`.crm_review_risk_category +( + id bigint auto_increment + primary key, + unique_id varchar(255) not null, + code varchar(64) not null, + name_zh varchar(128) not null, + name_en varchar(128) null, + category_group varchar(64) null, + default_level varchar(32) null, + default_severity varchar(16) null, + detection_source varchar(64) null, + detection_rules text null, + auto_resolve tinyint(1) null, + requires_acknowledgment tinyint(1) null, + is_active tinyint(1) null, + sort_order int null, + created_at datetime default CURRENT_TIMESTAMP not null, + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP, + solution text null, + constraint code + unique (code) +) + comment '风险类别配置表'; + +create index idx_category_group + on `autoflow-demo`.crm_review_risk_category (category_group); + +create index idx_is_active + on `autoflow-demo`.crm_review_risk_category (is_active); + +create table `autoflow-demo`.crm_review_risk_opportunity_relation +( + id bigint auto_increment + primary key, + unique_id varchar(255) not null, + risk_unique_id varchar(255) not null comment '关联 crm_review_opp_risk_progress.unique_id', + type_name varchar(128) null comment '冗余的风险类型名称,用于加速查询', + session_id varchar(255) not null, + snapshot_period varchar(32) not null, + calc_phase varchar(16) not null, + opportunity_id varchar(255) not null, + owner_id varchar(255) null, + department_id varchar(255) null, + relation_reason text null, + relation_rank int null, + relation_weight decimal(8, 4) null, + metadata json null, + created_at datetime default CURRENT_TIMESTAMP not null, + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP, + constraint uk_risk_opp_relation + unique (risk_unique_id, opportunity_id) +) + comment '风险与商机关联关系表'; + +create index idx_opportunity_id + on `autoflow-demo`.crm_review_risk_opportunity_relation (opportunity_id); + +create index idx_risk_unique_id + on `autoflow-demo`.crm_review_risk_opportunity_relation (risk_unique_id); + +create index idx_session_period_phase + on `autoflow-demo`.crm_review_risk_opportunity_relation (session_id, snapshot_period, calc_phase); + +create table `autoflow-demo`.crm_review_session +( + id int auto_increment + primary key, + unique_id varchar(255) not null comment 'Unique session identifier (UUID)', + session_name varchar(255) null comment 'Display name', + department_id varchar(255) not null comment 'FK → crm_department.unique_id', + department_name varchar(255) null comment 'Department name', + review_type varchar(64) not null comment 'Review type', + period_type varchar(32) not null comment 'weekly/monthly/quarterly', + period varchar (32) not null comment 'Period identifier (e.g., 2026-W10)', + fiscal_year varchar(16) null comment 'Fiscal year', + stage varchar(32) not null comment 'initial_edit/first_calculating/first_calc_ready/lead_review/second_calculating/completed. Note: FCST eval starts async at T1 during initial_edit (background optimization)', + review_phase varchar(32) null comment 'not_started/edit/closed - controls if attendees can edit', + t1_time datetime not null comment 'T1: Session launch', + t2_time datetime not null comment 'T2: First calc', + t3_time datetime not null comment 'T3: Open to lead', + t4_time datetime not null comment 'T4: Second calc', + initial_window_open_time datetime null comment 'When initial edit window opened', + initial_window_close_time datetime null comment 'When initial edit window closed', + first_calc_start_time datetime null, + first_calc_end_time datetime null, + first_calc_execution_id varchar(255) null, + meeting_opened_by varchar(255) null, + meeting_opened_by_id varchar(255) null, + meeting_opened_at datetime null, + meeting_closed_at datetime null, + meeting_open_count int null, + meeting_total_duration_minutes int null, + second_calc_start_time datetime null, + second_calc_end_time datetime null, + second_calc_execution_id varchar(255) null, + launched_by varchar(255) null, + launched_by_id varchar(255) null, + plan_id varchar(255) null, + report_date date not null, + report_week_of_year int null, + report_month_of_year int null, + report_quarter_of_year int null, + report_year int not null, + period_start date not null comment 'Start date of the review period', + period_end date not null comment 'End date of the review period', + report_fy_quarter varchar(10) null comment 'Report fiscal year quarter for performance queries', + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', + update_time datetime default CURRENT_TIMESTAMP not null comment '更新时间', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间' +) + comment '复盘会话表'; + +create index idx_department_id + on `autoflow-demo`.crm_review_session (department_id); + +create index idx_report_fy_quarter + on `autoflow-demo`.crm_review_session (report_fy_quarter); + +create index idx_report_year_week + on `autoflow-demo`.crm_review_session (report_year, report_week_of_year); + +create index idx_review_phase + on `autoflow-demo`.crm_review_session (review_phase); + +create index idx_stage + on `autoflow-demo`.crm_review_session (stage); + +create index idx_t1_time + on `autoflow-demo`.crm_review_session (t1_time); + +create index idx_t2_time + on `autoflow-demo`.crm_review_session (t2_time); + +create index idx_t3_time + on `autoflow-demo`.crm_review_session (t3_time); + +create index idx_t4_time + on `autoflow-demo`.crm_review_session (t4_time); + +create index idx_unique_id + on `autoflow-demo`.crm_review_session (unique_id); + +create table `autoflow-demo`.crm_sales_activities +( + id int auto_increment + primary key, + unique_id varchar(255) not null comment '唯一性ID(必填)', + category varchar(50) null comment '活动类别(如update/callhigh/其他)', + data_source varchar(100) null comment '数据来源(URL/飞书/CRM/Chatbot/等)', + record_date date not null comment '记录日期(YYYY-MM-DD)', + location varchar(255) null comment '活动地点', + communication_medium varchar(255) null comment '活动形式及沟通方式(如:线上会议/线下会议/电话/邮件/拜访/演示/提案等)', + internal_participants text null comment '内部参与者(JSON格式)', + external_participants text null comment '外部参与者即客户(JSON格式)', + key_stakeholders text null comment '关键干系人', + account_id varchar(255) null comment '关联的客户ID', + account_name varchar(255) null comment '关联的客户名称', + opportunity_id varchar(255) null comment '关联的商机ID', + opportunity_name varchar(255) null comment '关联的商机名称', + linked_account_ids text null comment 'Mandatory: 关联的客户ID列表(JSON格式)', + linked_opportunity_ids text null comment 'Mandatory: 关联的商机ID列表(JSON格式)', + owner_id varchar(255) null comment '负责人ID', + owner_name varchar(255) null comment '负责人姓名', + summary varchar(500) not null comment '活动摘要', + detailed_notes text null comment '详细记录', + next_steps text null comment '下一步行动计划', + blockers text null comment '当前障碍或挑战,即要解决的问题', + core_biz_info text null comment '核心业务信息', + deal_probability_change varchar(50) null comment '成单概率变化(上升/下降/不变)', + customer_sentiment varchar(50) null comment '客户态度(积极/中性/消极)', + correlation_id varchar(255) null comment '关联ID', + creator varchar(255) null comment '创建人', + creator_id varchar(255) null comment '创建人唯一性ID', + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', + last_modifier varchar(255) null comment '最后修改人', + last_modified_time datetime default CURRENT_TIMESTAMP not null comment '最后修改时间', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间' +) + comment '销售活动记录表'; + +create index idx_account_id + on `autoflow-demo`.crm_sales_activities (account_id); + +create index idx_activity_type + on `autoflow-demo`.crm_sales_activities (communication_medium); + +create index idx_correlation_id + on `autoflow-demo`.crm_sales_activities (correlation_id); + +create index idx_opportunity_id + on `autoflow-demo`.crm_sales_activities (opportunity_id); + +create index idx_record_date + on `autoflow-demo`.crm_sales_activities (record_date); + +create table `autoflow-demo`.crm_sales_records +( + id bigint auto_increment comment '主键ID(自增序列)' + primary key, + unique_id varchar(255) null comment '唯一性ID(必填)', + related_api_names varchar(1024) null comment '关联业务对象', + lock_rule varchar(1024) null comment '锁定规则', + active_record_type varchar(255) null comment '跟进类型', + active_record_content text null comment '记录内容', + origin_source varchar(255) null comment '数据来源', + lock_user varchar(1024) null comment '加锁人', + extend_obj_data_id varchar(255) null comment '扩展字段在mt_data中的记录ID', + is_deleted tinyint(1) null comment 'is_deleted', + life_status_before_invalid varchar(255) null comment '作废前生命状态', + owner_department varchar(255) null comment '负责人主属部门', + out_owner varchar(1024) null comment '外部负责人', + owner varchar(1024) null comment '负责人', + lock_status varchar(255) null comment '锁定状态', + last_modified_time datetime null comment '最后修改时间', + create_time datetime null comment '创建时间', + life_status varchar(255) null comment '生命状态', + related_object_data varchar(1024) null comment '关联业务数据', + last_modified_by varchar(1024) null comment '最后修改人', + out_tenant_id varchar(255) null comment '外部企业', + version decimal(18, 2) null comment 'version', + created_by varchar(1024) null comment '创建人', + relevant_team varchar(1024) null comment '相关团队', + record_type varchar(255) null comment '业务类型', + related_object varchar(1024) null comment '关联业务模块', + field_zzD04__c text null comment '跟进记录内容', + data_own_department varchar(1024) null comment '归属部门', + name varchar(255) null comment '记录ID', + order_by decimal(18, 2) null comment 'order_by', + opportunity_id varchar(255) null comment '商机ID', + next_action_plan text null comment '下一步行动计划', + visiting_personnel varchar(255) null comment '拜访人员', + delete_flag tinyint(1) null comment '删除标识(0-正常,1-已删除)', + extra json null comment '扩展内容' +) + comment '销售记录表'; + +create table `autoflow-demo`.crm_sentinel_events +( + id int auto_increment + primary key, + event_id varchar(255) not null comment 'Public event ID', + check_name varchar(100) not null comment 'Check name e.g. stale_task', + severity varchar(20) not null comment 'INFO/WARNING/CRITICAL', + status varchar(20) default 'OPEN' not null comment 'OPEN/RESOLVED/SUPPRESSED', + subject_type varchar(100) not null comment 'task_execution/work_item/celery_queue/db_session', + subject_id varchar(255) not null comment 'Subject identifier', + message text not null comment 'Human-readable description', + detail json null comment 'Structured payload', + resolved_at datetime null comment 'When finding was resolved', + created_at datetime default CURRENT_TIMESTAMP not null comment 'Create time', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment 'Update time', + constraint idx_sentinel_event_id + unique (event_id) +) + comment 'Sentinel health monitor events'; + +create index idx_sentinel_check_status + on `autoflow-demo`.crm_sentinel_events (check_name, status); + +create index idx_sentinel_open_lookup + on `autoflow-demo`.crm_sentinel_events (check_name, subject_id, status); + +create index idx_sentinel_severity_status_created + on `autoflow-demo`.crm_sentinel_events (severity, status, created_at); + +create index idx_sentinel_subject + on `autoflow-demo`.crm_sentinel_events (subject_type, subject_id); + +create table `autoflow-demo`.crm_sentinel_schedule_log +( + id int auto_increment + primary key, + log_id varchar(255) not null comment 'Public log ID', + plan_id varchar(255) not null comment 'Workflow plan ID', + execution_id varchar(255) not null comment 'Expected task execution ID', + triggered_at datetime not null comment 'When trigger succeeded', + trigger_source varchar(50) default 'manual' not null comment 'cronicle/manual', + verified_at datetime null comment 'When submission check completed', + status varchar(20) default 'PENDING' not null comment 'PENDING/VERIFIED/MISSING', + created_at datetime default CURRENT_TIMESTAMP not null comment 'Create time', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment 'Update time', + constraint idx_sentinel_schedule_log_id + unique (log_id) +) + comment 'Sentinel scheduled trigger audit log'; + +create index idx_sentinel_schedule_execution + on `autoflow-demo`.crm_sentinel_schedule_log (execution_id); + +create index idx_sentinel_schedule_plan_status + on `autoflow-demo`.crm_sentinel_schedule_log (plan_id, status); + +create table `autoflow-demo`.crm_stage +( + id bigint auto_increment comment '主键ID(自增序列)' + primary key, + workflow_id varchar(255) null comment '阶段推进器版本号', + workflow_name varchar(255) null comment '流程名称', + accumulate_time decimal(18, 2) null comment '任务历史停留时长', + life_status_before_invalid varchar(255) null comment '作废前生命状态', + activity_id varchar(255) null comment '节点定义id', + state varchar(255) null comment '任务状态', + candidate_ids text null comment '待处理人', + total_spent_time varchar(512) null comment '任务停留总时长', + timeout_time varchar(512) null comment '超时时长', + create_time timestamp null comment '创建时间', + stage_id varchar(255) null comment '所属阶段', + link_app_type decimal(18, 2) null comment '外部业务类型', + link_app_id varchar(255) null comment '外部所属业务', + version decimal(18, 2) null comment 'version', + created_by json null comment '创建人', + relevant_team json null comment '相关团队', + start_time timestamp null comment '任务开始时间', + is_time_out tinyint(1) null comment '是否超时', + data_own_department json null comment '归属部门', + object_api_name varchar(255) null comment '关联对象', + object_describe_id varchar(255) null comment 'object_describe_id', + name varchar(255) null comment '名称', + _id varchar(255) null comment '_id', + remind_latency decimal(18, 2) null comment '允许停留时长', + object_record_type varchar(255) null comment '对象业务类型', + object_data_id varchar(255) null comment '关联数据', + origin_source varchar(255) null comment '数据来源', + is_deleted tinyint(1) null comment 'is_deleted', + recent_enter_time timestamp null comment '最近进入任务时间', + out_owner json null comment '外部负责人', + owner json null comment '负责人', + actual_duration decimal(18, 2) null comment '耗时(仅工作时间)', + last_modified_time timestamp null comment '最后修改时间', + processor_ids json null comment '已执行人', + life_status varchar(255) null comment '生命状态', + end_time timestamp null comment '任务结束时间', + last_modified_by json null comment '最后修改人', + out_tenant_id varchar(255) null comment '外部企业', + record_type varchar(255) null comment '业务类型', + related_object json null comment '所属对象', + workflow_instance_id varchar(255) null comment '所属阶段实例', + current_candidate_ids text null comment '当前待处理人', + read_employee json null comment '已读人员', + order_by decimal(18, 2) null comment 'order_by', + source_workflow_id varchar(255) null comment '流程的apiName', + stage_field_api_name varchar(255) null comment '对象字段', + delete_flag tinyint(1) null comment '删除标识(0-正常,1-已删除)', + extra json null comment '扩展内容' +) + comment '阶段表'; + +create table `autoflow-demo`.crm_sync_status +( + table_name varchar(100) not null comment '表名' + primary key, + last_sync_time datetime null comment '最后同步时间', + sync_type enum ('full', 'incremental') null comment '同步类型', + total_records int null comment '总记录数', + sync_status enum ('success', 'failed', 'running') null comment '同步状态', + error_message text null comment '错误信息', + created_at datetime default CURRENT_TIMESTAMP null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '更新时间' +) + comment 'CRM同步状态表'; + +create table `autoflow-demo`.crm_system_configurations +( + id int auto_increment + primary key, + config_type varchar(255) not null comment '配置类型(如CommunicationCategory/VisitStatus/UserRoles等)', + config_key varchar(255) not null comment '配置键', + config_value varchar(255) not null comment '配置值', + is_active tinyint(1) not null comment '是否启用', + description text null comment '配置描述', + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', + update_time datetime default CURRENT_TIMESTAMP not null comment '更新时间', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间' +) + comment '系统配置表'; + +create index idx_config_key + on `autoflow-demo`.crm_system_configurations (config_key); + +create index idx_config_type + on `autoflow-demo`.crm_system_configurations (config_type); + +create index idx_config_type_key + on `autoflow-demo`.crm_system_configurations (config_type, config_key); + +create table `autoflow-demo`.crm_todo_merge_events +( + id int auto_increment + primary key, + unique_id varchar(255) not null comment '唯一性ID', + job_id varchar(255) null comment '合并任务ID', + survivor_todo_id varchar(255) not null comment '保留的待办唯一ID', + merged_todo_id varchar(255) null comment '被合并并软删除的待办唯一ID', + incoming_source varchar(50) null comment '新待办来源', + survivor_source varchar(50) null comment '保留待办来源', + decision varchar(100) not null comment '合并决策', + merge_action varchar(100) null comment 'LLM合并动作', + duplicate_reason text null comment '重复判断原因', + llm_decision_json json null comment 'LLM原始决策', + validated_decision_json json null comment '校验后的决策', + raw_candidate_json json null comment '新待办候选内容', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间' +) + comment '待办合并审计表'; + +create index idx_todo_merge_events_decision + on `autoflow-demo`.crm_todo_merge_events (decision); + +create index idx_todo_merge_events_job + on `autoflow-demo`.crm_todo_merge_events (job_id); + +create index idx_todo_merge_events_merged + on `autoflow-demo`.crm_todo_merge_events (merged_todo_id); + +create index idx_todo_merge_events_survivor + on `autoflow-demo`.crm_todo_merge_events (survivor_todo_id); + +create table `autoflow-demo`.crm_todo_merge_jobs +( + id int auto_increment + primary key, + job_id varchar(255) not null comment '合并任务ID', + status varchar(50) default 'PENDING' not null comment '任务状态', + trigger_source varchar(100) null comment '触发来源', + scope_key varchar(512) null comment '合并范围键', + new_todo_ids_json json not null comment '新建待办ID列表', + candidate_todo_ids_json json null comment '候选待办ID列表', + attempt_count int default 0 not null comment '尝试次数', + last_error text null comment '最近错误', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + started_at datetime null comment '开始时间', + completed_at datetime null comment '完成时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + constraint job_id + unique (job_id) +) + comment '待办语义合并任务表'; + +create index idx_todo_merge_jobs_scope + on `autoflow-demo`.crm_todo_merge_jobs (scope_key); + +create index idx_todo_merge_jobs_status + on `autoflow-demo`.crm_todo_merge_jobs (status); + +create table `autoflow-demo`.crm_todo_metrics_facts +( + id char(32) not null + primary key, + anchor varchar(20) not null, + grain varchar(10) not null, + period_start date not null, + period_end date not null, + hour_of_day int default 0 not null, + subject_type varchar(20) not null, + subject_id varchar(100) not null, + data_source varchar(100) default '' not null, + metric varchar(50) not null, + value_int int default 0 not null, + created_at datetime default CURRENT_TIMESTAMP null, + updated_at datetime default CURRENT_TIMESTAMP null, + constraint ux_crm_todo_metrics_facts + unique (anchor, grain, period_start, period_end, hour_of_day, subject_type, subject_id, data_source, metric) +); + +create index idx_todo_company_week_anchor_metric_ds + on `autoflow-demo`.crm_todo_metrics_facts (anchor, grain, subject_type, subject_id, metric, data_source, + period_start); + +create index ix_crm_todo_metrics_facts_anchor_grain_period_metric_ds + on `autoflow-demo`.crm_todo_metrics_facts (anchor, grain, period_start, period_end, metric, data_source); + +create index ix_crm_todo_metrics_facts_subject_period_metric + on `autoflow-demo`.crm_todo_metrics_facts (subject_type, subject_id, period_start, metric); + +create table `autoflow-demo`.crm_todos +( + id int auto_increment + primary key, + unique_id varchar(255) not null comment '唯一性ID(必填)', + title varchar(255) not null comment '待办事项标题', + description text null comment '详细描述', + status varchar(50) null comment '状态(待处理/进行中/已完成/已取消)系统状态', + priority varchar(50) null comment '优先级(高/中/低)', + start_date date null comment '开始日期', + due_date date null comment '截止日期', + reminder_date date null comment '提醒日期', + owner_status varchar(50) null comment '负责人状态(待处理/进行中/已完成/已取消)', + ai_status varchar(50) null comment 'AI建议状态(待处理/进行中/已完成/已取消)', + ai_note text null comment 'AI建议备注', + eval_time datetime null comment '评估时间', + owner_id varchar(255) null comment '负责人唯一性ID', + owner_name varchar(255) null comment '负责人姓名', + opportunity_id varchar(255) null comment '关联的商机唯一ID', + opportunity_name varchar(255) null comment '关联的商机名称', + opportunity_stage varchar(255) null comment '关联的商机阶段', + account_id varchar(255) null comment '关联的客户唯一ID', + account_name varchar(255) null comment '关联的客户名称', + department varchar(255) null comment '部门', + department_id varchar(255) null comment '部门唯一性ID', + internal_participants text null comment '内部参与者(JSON格式)', + external_participants text null comment '外部参与者即客户(JSON格式)', + linked_account_ids text null comment 'Mandatory: 关联的客户ID列表(JSON格式)', + linked_opportunity_ids text null comment 'Mandatory: 关联的商机ID列表(JSON格式)', + todo_type varchar(50) null comment '待办类型(跟进/会议/电话/邮件/其他)', + category varchar(50) null comment '分类(销售/客户服务/内部协调等)', + tags varchar(255) null comment '标签(逗号分隔)', + todo_suggestion text null comment '待办建议', + suggested_material text null comment '建议材料', + playbook_item_ref varchar(255) null comment '销售手册项目引用,格式:playbook_{stage}_{idx},如playbook_Qualification_0,多个引用用逗号分隔', + completion_date datetime null comment '完成日期', + completion_note text null comment '完成说明', + user_update_time datetime null comment '用户更新时间(用户更新状态、完成说明或截止日期时的时间戳)', + data_source varchar(50) null comment '数据来源(Review/Playbook/Meeting/Chatbot/CRM/等)', + creator varchar(255) null comment '创建人', + creator_id varchar(255) null comment '创建人唯一性ID', + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', + last_modifier varchar(255) null comment '最后修改人', + update_time datetime default CURRENT_TIMESTAMP not null comment '最后修改时间', + is_deleted tinyint(1) default 0 null comment '是否删除', + delete_time datetime null comment '删除时间', + correlation_id varchar(255) null comment '关联ID', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间' +) + comment '待办事项表'; + +create index idx_crm_todos_account_id + on `autoflow-demo`.crm_todos (account_id, is_deleted); + +create index idx_crm_todos_opportunity_id + on `autoflow-demo`.crm_todos (opportunity_id, is_deleted); + +create index idx_crm_todos_overdue + on `autoflow-demo`.crm_todos (ai_status, due_date, is_deleted); + +create index idx_crm_todos_owner_id + on `autoflow-demo`.crm_todos (owner_id, is_deleted); + +create table `autoflow-demo`.crm_todos_weekly_metrics +( + id char(32) not null + primary key, + week_start date not null, + week_end date not null, + assignee_id varchar(100) not null, + department_id varchar(100) not null, + metric varchar(50) not null, + data_source varchar(100) default '' not null, + value int default 0 not null, + created_at datetime default CURRENT_TIMESTAMP null, + updated_at datetime default CURRENT_TIMESTAMP null, + constraint ux_crm_todos_weekly_metrics + unique (week_start, week_end, assignee_id, department_id, metric, data_source) +); + +create index ix_week_start_week_end_dept_id_metric_data_source + on `autoflow-demo`.crm_todos_weekly_metrics (week_start, week_end, department_id, metric, data_source); + +create index ix_week_start_week_end_metric_data_source + on `autoflow-demo`.crm_todos_weekly_metrics (week_start, week_end, metric, data_source); + +create table `autoflow-demo`.crm_tracked_field_snapshots +( + id int auto_increment + primary key, + unique_id varchar(255) not null comment '唯一性ID(必填)', + source_table varchar(255) null comment '源数据表名', + source_id int null comment '源数据记录ID', + source_unique_id varchar(255) null comment '源数据记录唯一性ID', + source_field_name varchar(255) null comment '源数据字段名称', + last_processed_content text null comment '最后处理内容', + last_processed_hash varchar(255) null comment '最后处理哈希值', + last_processed_time datetime null comment '最后处理时间', + delta_content text null comment '增量内容', + flag varchar(255) null comment '标志位,标记该数据被处理的任务', + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', + update_time datetime default CURRENT_TIMESTAMP not null comment '更新时间', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间' +) + comment '跟踪字段快照表'; + +create index idx_unique_id + on `autoflow-demo`.crm_tracked_field_snapshots (unique_id); + +create table `autoflow-demo`.crm_user +( + unique_id varchar(64) null, + user_name varchar(255) null, + department varchar(255) null, + role varchar(255) null, + created_time datetime null, + updated_time datetime null, + sf_raw json null, + extra json null, + manager_id varchar(255) null comment '上级管理者ID', + region_name varchar(255) null comment '所属区域名称', + role_type varchar(50) null comment '角色类型(管理/成员)', + id int auto_increment comment '主键ID' + primary key, + department_id varchar(255) null comment '部门ID(关联 crm_department.unique_id)', + delete_flag tinyint(1) null comment '删除标识(0-正常,1-已删除)', + client_id varchar(64) null comment '客户/租户ID', + email varchar(255) null comment '邮箱', + phone varchar(50) null comment '电话号码', + constraint uq_crm_user_unique_id + unique (unique_id) +) + comment 'CRM 用户表'; + +create table `autoflow-demo`.crm_visit_metrics_facts +( + id char(32) not null + primary key, + anchor varchar(20) not null, + grain varchar(10) not null, + period_start date not null, + period_end date not null, + subject_type varchar(20) not null, + subject_id varchar(100) not null, + department_id varchar(100) default '' not null, + department_name varchar(255) default '' not null, + metric varchar(50) not null, + weekday_iso int default 0 not null, + value_int int default 0 not null, + created_at datetime default CURRENT_TIMESTAMP null, + updated_at datetime default CURRENT_TIMESTAMP null, + constraint ux_crm_visit_metrics_facts + unique (anchor, grain, period_start, period_end, subject_type, subject_id, department_id, metric, weekday_iso) +); + +create index idx_visit_company_week_anchor_metric + on `autoflow-demo`.crm_visit_metrics_facts (anchor, grain, subject_type, subject_id, metric, weekday_iso, + period_start); + +create index ix_crm_visit_metrics_facts_anchor_grain_period_metric + on `autoflow-demo`.crm_visit_metrics_facts (anchor, grain, period_start, period_end, metric); + +create index ix_crm_visit_metrics_facts_dept_period_metric + on `autoflow-demo`.crm_visit_metrics_facts (department_id, period_start, period_end, metric); + +create index ix_crm_visit_metrics_facts_subject_period + on `autoflow-demo`.crm_visit_metrics_facts (subject_type, subject_id, period_start, period_end); + +create table `autoflow-demo`.crm_weekly_followup_entity_summary +( + id char(32) not null + primary key, + week_start date not null, + week_end date not null, + department_id varchar(100) null, + department_name varchar(255) not null, + entity_type varchar(50) not null, + entity_id varchar(255) not null, + account_id varchar(255) null, + account_name varchar(255) null, + opportunity_id varchar(255) null, + opportunity_name varchar(255) null, + partner_id varchar(255) null, + partner_name varchar(255) null, + owner_user_id varchar(64) null, + owner_name varchar(255) null, + progress text null, + risks text null, + evidence_record_ids text null, + comments json null, + created_at datetime default CURRENT_TIMESTAMP not null, + updated_at datetime default CURRENT_TIMESTAMP not null, + constraint ux_crm_weekly_followup_entity + unique (week_start, week_end, department_name, entity_type, entity_id) +); + +create index idx_weekly_followup_entity_dept + on `autoflow-demo`.crm_weekly_followup_entity_summary (department_name); + +create index idx_weekly_followup_entity_dept_id + on `autoflow-demo`.crm_weekly_followup_entity_summary (department_id); + +create index idx_weekly_followup_entity_entity + on `autoflow-demo`.crm_weekly_followup_entity_summary (entity_type, entity_id); + +create index idx_weekly_followup_entity_owner + on `autoflow-demo`.crm_weekly_followup_entity_summary (owner_user_id); + +create index idx_weekly_followup_entity_week + on `autoflow-demo`.crm_weekly_followup_entity_summary (week_start, week_end); + +create table `autoflow-demo`.crm_weekly_followup_leader_engagement +( + id char(32) not null + primary key, + summary_id char(32) not null, + week_start date not null, + week_end date not null, + department_id varchar(100) default '' not null, + department_name varchar(255) default '' not null, + leader_user_id varchar(64) not null, + reviewed_at datetime null, + commented_at datetime null, + created_at datetime default CURRENT_TIMESTAMP null, + updated_at datetime default CURRENT_TIMESTAMP null, + constraint ux_weekly_followup_leader_engagement + unique (summary_id, leader_user_id) +); + +create index idx_weekly_followup_leader_engagement_leader_reviewed + on `autoflow-demo`.crm_weekly_followup_leader_engagement (leader_user_id, reviewed_at); + +create index idx_weekly_followup_leader_engagement_summary + on `autoflow-demo`.crm_weekly_followup_leader_engagement (summary_id); + +create index idx_weekly_followup_leader_engagement_week_dept + on `autoflow-demo`.crm_weekly_followup_leader_engagement (week_start, week_end, department_name); + +create index idx_weekly_followup_leader_engagement_week_dept_id + on `autoflow-demo`.crm_weekly_followup_leader_engagement (week_start, week_end, department_id); + +create table `autoflow-demo`.crm_weekly_followup_summary +( + id char(32) not null + primary key, + week_start date not null, + week_end date not null, + summary_type varchar(50) not null, + department_id varchar(100) default '' not null, + department_name varchar(255) default '' not null, + title varchar(255) default '' not null, + summary_content text null, + created_at datetime default CURRENT_TIMESTAMP not null, + updated_at datetime default CURRENT_TIMESTAMP not null, + constraint ux_crm_weekly_followup_summary + unique (week_start, week_end, summary_type, department_name) +); + +create index idx_weekly_followup_summary_dept_id + on `autoflow-demo`.crm_weekly_followup_summary (department_id); + +create index idx_weekly_followup_summary_type_dept + on `autoflow-demo`.crm_weekly_followup_summary (summary_type, department_name); + +create index idx_weekly_followup_summary_week + on `autoflow-demo`.crm_weekly_followup_summary (week_start, week_end); + +create table `autoflow-demo`.crm_writeback_logs +( + id bigint auto_increment comment '主键ID' + primary key, + writeback_type varchar(50) not null comment '回写类型:VISIT_RECORD', + unique_id varchar(100) not null comment '来源拜访记录ID(原始数据表的主键)', + external_id varchar(100) null comment 'CRM对象记录ID(回写成功后获得)', + status varchar(20) not null comment '状态:SUCCESS, FAILED', + request_data text null comment '请求数据JSON', + response_data text null comment '响应数据JSON', + error_message text null comment '错误信息', + execution_time int null comment '执行时间(毫秒)', + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间' +) + comment 'CRM数据回写日志表'; + +create index idx_create_time + on `autoflow-demo`.crm_writeback_logs (create_time); + +create index idx_external_id + on `autoflow-demo`.crm_writeback_logs (external_id); + +create index idx_status + on `autoflow-demo`.crm_writeback_logs (status); + +create index idx_type_status_time + on `autoflow-demo`.crm_writeback_logs (writeback_type, status, create_time); + +create index idx_unique_status + on `autoflow-demo`.crm_writeback_logs (unique_id, status); + +create table `autoflow-demo`.department_mirror +( + id int auto_increment + primary key, + create_time datetime default CURRENT_TIMESTAMP null, + update_time datetime default CURRENT_TIMESTAMP null, + unique_id varchar(100) not null, + department_name varchar(255) not null, + parent_id varchar(100) null, + path varchar(500) null, + is_active tinyint(1) default 1 not null, + description varchar(500) null, + constraint ix_department_mirror_unique_id + unique (unique_id), + constraint unique_id + unique (unique_id) +); + +create index ix_department_mirror_parent_id + on `autoflow-demo`.department_mirror (parent_id); + +create index ix_department_mirror_path + on `autoflow-demo`.department_mirror (path); + +create table `autoflow-demo`.diagnostic_playbook +( + id int auto_increment + primary key, + plan_id varchar(64) not null comment '执行计划ID', + report_id varchar(64) null comment '报告ID', + execution_id varchar(255) not null comment '执行ID, naming convention: plan__', + handbook_id varchar(64) not null comment '手册ID', + name varchar(255) not null comment '手册名称', + version varchar(255) not null comment '手册版本', + status varchar(255) not null comment '手册状态: active(生效中), draft(草稿), archived(已归档), deprecated(已废弃)', + type varchar(255) not null comment '手册类型', + sequence int not null comment '销售阶段顺序,用于确定阶段的先后顺序,从1开始', + sales_stage varchar(255) null comment '销售阶段', + sales_key_activities text null comment '销售关键动作', + sales_deliverables text null comment '交付成果', + sales_exit_criteria text null comment '阶段转化标准', + sales_key_info text null comment '关键获取信息(CRM必填项)', + sales_outcomes text null comment '销售阶段任务', + customer_behavior_purchase text null comment '客户采购行为', + customer_behavior_supporting text null comment '客户支持行为', + sales_alerts text null comment '预警', + fcst_eval_checklist text null comment 'FCST评估清单', + fcst_eval_guidance text null comment 'FCST评估指引', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + stage_category varchar(64) null comment '阶段语义分类: open/closed_won/closed_lost/cancelled', + stage_attributes json null comment '阶段行为属性覆盖(JSON)' +) + comment '诊断Playbook表'; + +create index idx_diagnostic_playbook_stage_category + on `autoflow-demo`.diagnostic_playbook (handbook_id, stage_category); + +create index idx_diagnostic_playbook_stage_lookup + on `autoflow-demo`.diagnostic_playbook (handbook_id, status, sales_stage); + +create table `autoflow-demo`.embedding_models +( + created_at datetime default CURRENT_TIMESTAMP null, + updated_at datetime default CURRENT_TIMESTAMP null, + id int auto_increment + primary key, + name varchar(64) not null, + provider varchar(32) not null, + model varchar(256) not null, + config json null, + credentials blob null, + is_default tinyint(1) not null, + vector_dimension int not null +); + +create table `autoflow-demo`.entities +( + name varchar(512) not null, + description text null, + meta json null, + entity_type enum ('original', 'synopsis') not null, + synopsis_info json null, + id int auto_increment + primary key, + description_vec vector(1536) null comment 'hnsw(distance=cosine)', + meta_vec vector(1536) null comment 'hnsw(distance=cosine)', + graph_type enum ('general', 'playbook', 'crm') default 'general' not null +); + +create index idx_entity_graph_type + on `autoflow-demo`.entities (graph_type); + +create index idx_entity_type + on `autoflow-demo`.entities (entity_type); + +create table `autoflow-demo`.entities_1 +( + id int auto_increment + primary key, + name varchar(512) not null, + description text null, + meta json null, + entity_type enum ('original', 'synopsis') not null, + synopsis_info json null, + description_vec vector(1024) not null, + meta_vec vector(1024) not null, + graph_type enum ('general', 'playbook', 'crm') default 'general' not null +); + +create index idx_entity_name + on `autoflow-demo`.entities_1 (name); + +create index idx_entity_type + on `autoflow-demo`.entities_1 (entity_type); + +create index vec_idx_description_vec + on `autoflow-demo`.entities_1 (description_vec); + +create index vec_idx_meta_vec + on `autoflow-demo`.entities_1 (meta_vec); + +create table `autoflow-demo`.entities_2 +( + id int auto_increment + primary key, + name varchar(512) not null, + description text null, + meta json null, + entity_type enum ('original', 'synopsis') not null, + synopsis_info json null, + description_vec vector(1024) not null, + meta_vec vector(1024) not null, + graph_type enum ('general', 'playbook', 'crm') default 'general' not null +); + +create index idx_entity_name + on `autoflow-demo`.entities_2 (name); + +create index idx_entity_type + on `autoflow-demo`.entities_2 (entity_type); + +create index vec_idx_description_vec + on `autoflow-demo`.entities_2 (description_vec); + +create index vec_idx_meta_vec + on `autoflow-demo`.entities_2 (meta_vec); + +create table `autoflow-demo`.feishu_billing_usage_report +( + id char(32) not null + primary key, + trace_id varchar(220) not null, + ai_module_key varchar(128) not null, + operator varchar(128) not null, + review_detail text null, + status varchar(20) not null, + last_api_code int null, + last_message text null, + attempts int not null, + last_exception_type varchar(200) null, + created_at datetime default CURRENT_TIMESTAMP null, + updated_at datetime default CURRENT_TIMESTAMP null, + constraint ux_feishu_billing_usage_report_trace + unique (trace_id) +); + +create index idx_feishu_billing_usage_module_created + on `autoflow-demo`.feishu_billing_usage_report (ai_module_key, created_at); + +create index idx_feishu_billing_usage_status_created + on `autoflow-demo`.feishu_billing_usage_report (status, created_at); + +create table `autoflow-demo`.llms +( + created_at datetime default CURRENT_TIMESTAMP null, + updated_at datetime default CURRENT_TIMESTAMP null, + id int auto_increment + primary key, + name varchar(64) not null, + provider varchar(32) not null, + model varchar(256) not null, + config json null, + credentials blob null, + is_default tinyint(1) not null +); + +create table `autoflow-demo`.local_contacts +( + id int auto_increment comment '主键ID(自增)' + primary key, + unique_id varchar(255) not null comment '唯一性ID(必填)', + name varchar(255) not null comment '联系人姓名(必填)', + customer_id varchar(255) not null comment '客户ID(关联crm_accounts.unique_id,必填)', + customer_name varchar(255) not null comment '客户名称(必填)', + position varchar(255) not null comment '联系人职位(必填)', + gender varchar(10) null comment '性别', + mobile varchar(255) null comment '手机', + phone varchar(255) null comment '电话', + email varchar(255) null comment '邮件', + wechat varchar(255) null comment '微信', + address varchar(512) null comment '联系地址', + key_decision_maker tinyint(1) null comment '是否为关键决策人', + source varchar(255) null comment '来源', + remarks text null comment '备注', + delete_flag tinyint(1) null comment '删除标识', + created_at datetime default CURRENT_TIMESTAMP null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP null comment '更新时间', + created_by char(32) null comment '创建人ID', + updated_by char(32) null comment '最后修改人ID', + crm_unique_id varchar(255) null comment 'CRM系统唯一ID(回写后填充)', + synced_to_crm tinyint(1) null comment '是否已同步到CRM', + synced_at datetime null comment '同步到CRM的时间', + department varchar(255) null comment '部门', + direct_superior varchar(255) null comment '直属上级', + status varchar(255) null comment '状态', + business_relationship varchar(255) null comment '商务关系', + constraint idx_local_contacts_unique_id + unique (unique_id) +); + +create index idx_local_contacts_customer_id + on `autoflow-demo`.local_contacts (customer_id); + +create index idx_local_contacts_customer_name + on `autoflow-demo`.local_contacts (customer_name); + +create index idx_local_contacts_delete_flag + on `autoflow-demo`.local_contacts (delete_flag); + +create index idx_local_contacts_name + on `autoflow-demo`.local_contacts (name); + +create table `autoflow-demo`.oauth_alembic_version +( + version_num varchar(32) not null + primary key +); + +create table `autoflow-demo`.relationships +( + description text null, + meta json null, + weight int not null, + source_entity_id int not null, + target_entity_id int not null, + last_modified_at datetime null, + id int auto_increment + primary key, + description_vec vector(1536) null comment 'hnsw(distance=cosine)', + chunk_id char(32) null, + document_id int null, + graph_type enum ('general', 'playbook', 'crm') default 'general' not null, + constraint fk_1 + foreign key (source_entity_id) references `autoflow-demo`.entities (id), + constraint fk_2 + foreign key (target_entity_id) references `autoflow-demo`.entities (id) +); + +create index idx_relationship_graph_type + on `autoflow-demo`.relationships (graph_type); + +create table `autoflow-demo`.relationships_1 +( + id int auto_increment + primary key, + description text null, + meta json null, + weight int not null, + source_entity_id int not null, + target_entity_id int not null, + last_modified_at datetime null, + document_id int null, + chunk_id char(32) null, + description_vec vector(1024) not null, + graph_type enum ('general', 'playbook', 'crm') default 'general' not null, + constraint fk_1 + foreign key (source_entity_id) references `autoflow-demo`.entities_1 (id), + constraint fk_2 + foreign key (target_entity_id) references `autoflow-demo`.entities_1 (id) +); + +create index idx_relationship_chunk_id + on `autoflow-demo`.relationships_1 (chunk_id); + +create index idx_relationship_document_id + on `autoflow-demo`.relationships_1 (document_id); + +create index idx_relationship_graph_chunk + on `autoflow-demo`.relationships_1 (graph_type, chunk_id); + +create index idx_relationship_graph_doc + on `autoflow-demo`.relationships_1 (graph_type, document_id); + +create index idx_relationship_graph_type + on `autoflow-demo`.relationships_1 (graph_type); + +create index vec_idx_description_vec + on `autoflow-demo`.relationships_1 (description_vec); + +create table `autoflow-demo`.relationships_2 +( + id int auto_increment + primary key, + description text null, + meta json null, + weight int not null, + source_entity_id int not null, + target_entity_id int not null, + last_modified_at datetime null, + document_id int null, + chunk_id char(32) null, + description_vec vector(1024) not null, + graph_type enum ('general', 'playbook', 'crm') default 'general' not null, + constraint fk_1 + foreign key (source_entity_id) references `autoflow-demo`.entities_2 (id), + constraint fk_2 + foreign key (target_entity_id) references `autoflow-demo`.entities_2 (id) +); + +create index idx_relationship_chunk_id + on `autoflow-demo`.relationships_2 (chunk_id); + +create index idx_relationship_document_id + on `autoflow-demo`.relationships_2 (document_id); + +create index idx_relationship_graph_chunk + on `autoflow-demo`.relationships_2 (graph_type, chunk_id); + +create index idx_relationship_graph_doc + on `autoflow-demo`.relationships_2 (graph_type, document_id); + +create index idx_relationship_graph_type + on `autoflow-demo`.relationships_2 (graph_type); + +create index vec_idx_description_vec + on `autoflow-demo`.relationships_2 (description_vec); + +create table `autoflow-demo`.reranker_models +( + created_at datetime default CURRENT_TIMESTAMP null, + updated_at datetime default CURRENT_TIMESTAMP null, + name varchar(64) not null, + provider varchar(32) not null, + model varchar(256) not null, + top_n int not null, + config json null, + is_default tinyint(1) not null, + id int auto_increment + primary key, + credentials blob null +); + +create table `autoflow-demo`.chat_engines +( + created_at datetime default CURRENT_TIMESTAMP null, + updated_at datetime default CURRENT_TIMESTAMP null, + id int auto_increment + primary key, + name varchar(256) not null, + engine_options json null, + is_default tinyint(1) not null, + deleted_at datetime null, + llm_id int null, + fast_llm_id int null, + reranker_id int null, + is_public tinyint(1) not null, + constraint fk_1 + foreign key (fast_llm_id) references `autoflow-demo`.llms (id), + constraint fk_2 + foreign key (llm_id) references `autoflow-demo`.llms (id), + constraint fk_3 + foreign key (reranker_id) references `autoflow-demo`.reranker_models (id) +); + +create table `autoflow-demo`.semantic_cache +( + id int auto_increment + primary key, + query text null, + query_vec vector(1536) null comment 'hnsw(distance=cosine)', + value text null, + value_vec vector(1536) null comment 'hnsw(distance=cosine)', + meta json null, + created_at datetime default CURRENT_TIMESTAMP null, + updated_at datetime default CURRENT_TIMESTAMP null +); + +create table `autoflow-demo`.site_settings +( + created_at datetime(6) default CURRENT_TIMESTAMP(6) null, + updated_at datetime(6) default CURRENT_TIMESTAMP(6) null on update CURRENT_TIMESTAMP(6), + id int auto_increment + primary key, + name varchar(256) not null, + data_type varchar(256) not null, + value json null, + constraint name + unique (name) +); + +create table `autoflow-demo`.staff_action_logs +( + id int auto_increment + primary key, + action varchar(255) not null, + action_time datetime default CURRENT_TIMESTAMP null, + target_type varchar(255) not null, + target_id int not null, + `before` json null, + after json null +); + +create table `autoflow-demo`.user +( + id bigint auto_increment comment 'db主键id' + primary key, + uid varchar(255) null comment '为用户生成的uid', + user_id varchar(255) null comment '用户自定义/企业飞书内id', + role varchar(255) null comment '用户角色', + name varchar(255) null comment '用户姓名', + en_name varchar(255) null comment '用户英文名', + avatar_url varchar(255) null comment '用户头像URL', + email varchar(255) null comment '用户邮箱', + mobile varchar(20) null comment '用户手机号', + password varchar(255) null comment '用户密码', + email_verified datetime null comment '邮箱验证时间', + corporation_id varchar(255) null comment '企业ID', + open_id varchar(255) null comment '开放ID', + union_id varchar(255) null comment '统一ID', + enterprise_email varchar(255) null comment '企业邮箱', + tenant_key varchar(255) null comment '租户密钥', + employee_no varchar(255) null comment '员工编号', + creator varchar(255) null comment '创建者', + create_time datetime default CURRENT_TIMESTAMP null comment '创建时间', + updater varchar(255) null comment '更新者', + update_time datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '最后更新时间', + version int default 1 null comment '数据版本', + delete_flag tinyint(1) default 0 null comment '删除标识, 1已删除', + channel varchar(255) null comment '登录渠道', + ask_user_id varchar(255) null comment 'ask服务的email', + ask_id varchar(255) null comment 'ask服务的id', + fxiaoke_id varchar(255) null comment 'fxiaoke用户id', + extra_info json null comment '扩展信息' +); + +create index idx_delete_flag + on `autoflow-demo`.user (delete_flag); + +create table `autoflow-demo`.user_department_relation +( + id int auto_increment + primary key, + create_time datetime default CURRENT_TIMESTAMP null, + update_time datetime default CURRENT_TIMESTAMP null, + user_id char(36) null, + crm_user_id varchar(100) not null, + department_id varchar(100) not null, + is_primary tinyint(1) default 0 not null, + is_leader tinyint(1) default 0 not null, + title varchar(100) null, + user_name varchar(100) null, + is_active tinyint(1) default 1 not null +); + +create index ix_user_department_relation_crm_user_id + on `autoflow-demo`.user_department_relation (crm_user_id); + +create index ix_user_department_relation_department_id + on `autoflow-demo`.user_department_relation (department_id); + +create index ix_user_department_relation_is_active + on `autoflow-demo`.user_department_relation (is_active); + +create index ix_user_department_relation_is_leader + on `autoflow-demo`.user_department_relation (is_leader); + +create index ix_user_department_relation_is_primary + on `autoflow-demo`.user_department_relation (is_primary); + +create index ix_user_department_relation_user_id + on `autoflow-demo`.user_department_relation (user_id); + +create table `autoflow-demo`.user_reporting_relation +( + id int auto_increment + primary key, + from_user_id varchar(100) not null comment '上级用户ID(CRM用户ID),表示 from_user_id 是 to_user_id 的上级', + to_user_id varchar(100) not null comment '下级用户ID(CRM用户ID),表示 to_user_id 是 from_user_id 的下级', + level int default 1 not null comment '层级(1=直接上级/下级,2=间接上级/下级,以此类推)', + is_active tinyint(1) default 1 not null comment '关系是否有效', + create_time datetime default CURRENT_TIMESTAMP null, + update_time datetime default CURRENT_TIMESTAMP null, + constraint uq_user_reporting_relation + unique (from_user_id, to_user_id, level) +); + +create index ix_user_reporting_relation_from_user_active + on `autoflow-demo`.user_reporting_relation (from_user_id, is_active); + +create index ix_user_reporting_relation_from_user_id + on `autoflow-demo`.user_reporting_relation (from_user_id); + +create index ix_user_reporting_relation_from_user_level + on `autoflow-demo`.user_reporting_relation (from_user_id, level, is_active); + +create index ix_user_reporting_relation_is_active + on `autoflow-demo`.user_reporting_relation (is_active); + +create index ix_user_reporting_relation_level + on `autoflow-demo`.user_reporting_relation (level); + +create index ix_user_reporting_relation_to_user_active + on `autoflow-demo`.user_reporting_relation (to_user_id, is_active); + +create index ix_user_reporting_relation_to_user_id + on `autoflow-demo`.user_reporting_relation (to_user_id); + +create index ix_user_reporting_relation_to_user_level + on `autoflow-demo`.user_reporting_relation (to_user_id, level, is_active); + +create table `autoflow-demo`.users +( + id char(32) not null + primary key, + email varchar(255) not null, + hashed_password varchar(255) not null, + is_active tinyint(1) not null, + is_superuser tinyint(1) not null, + is_verified tinyint(1) not null, + created_at datetime default CURRENT_TIMESTAMP null, + updated_at datetime default CURRENT_TIMESTAMP null, + constraint ix_users_email + unique (email) +); + +create table `autoflow-demo`.api_keys +( + created_at datetime default CURRENT_TIMESTAMP null, + updated_at datetime default CURRENT_TIMESTAMP null, + id int auto_increment + primary key, + description varchar(100) not null, + hashed_secret varchar(255) not null, + api_key_display varchar(100) not null, + is_active tinyint(1) not null, + user_id char(32) not null, + constraint hashed_secret + unique (hashed_secret), + constraint fk_1 + foreign key (user_id) references `autoflow-demo`.users (id) +); + +create table `autoflow-demo`.chats +( + created_at datetime default CURRENT_TIMESTAMP null, + updated_at datetime default CURRENT_TIMESTAMP null, + id char(32) not null + primary key, + title varchar(256) not null, + engine_id int null, + engine_options json null, + deleted_at datetime null, + user_id char(32) null, + browser_id varchar(50) null, + origin varchar(256) null, + visibility int not null, + chat_type enum ('default', 'client_visit_guide', 'review_session') default 'default' not null, + constraint fk_1 + foreign key (engine_id) references `autoflow-demo`.chat_engines (id), + constraint fk_2 + foreign key (user_id) references `autoflow-demo`.users (id) +); + +create table `autoflow-demo`.chat_messages +( + created_at datetime default CURRENT_TIMESTAMP null, + updated_at datetime default CURRENT_TIMESTAMP null, + id int auto_increment + primary key, + ordinal int not null, + role varchar(64) not null, + content text null, + error text null, + sources json null, + trace_url varchar(512) null, + finished_at datetime null, + chat_id char(32) not null, + user_id char(32) null, + graph_data json null, + post_verification_result_url varchar(512) null, + meta json null, + is_best_answer tinyint(1) default 0 not null, + constraint fk_1 + foreign key (chat_id) references `autoflow-demo`.chats (id), + constraint fk_2 + foreign key (user_id) references `autoflow-demo`.users (id) +); + +create index ix_chat_message_is_best_answer + on `autoflow-demo`.chat_messages (is_best_answer); + +create index ix_chats_id + on `autoflow-demo`.chats (id); + +create table `autoflow-demo`.crm_sales_visit_records +( + id int auto_increment + primary key, + account_name varchar(255) null, + account_id varchar(255) null, + opportunity_name varchar(255) null, + opportunity_id varchar(255) null, + partner_name varchar(255) null, + customer_lead_source varchar(255) null, + visit_object_category varchar(255) null, + contact_position varchar(255) null, + contact_name varchar(255) null, + contact_id varchar(255) null comment '联系人ID(关联local_contacts或crm_contacts的unique_id)', + recorder varchar(255) null, + collaborative_participants text null, + visit_communication_date date null, + counterpart_location varchar(255) null, + visit_communication_method varchar(255) null, + communication_duration varchar(255) null, + expectation_achieved varchar(255) null, + followup_record text null, + followup_quality_level_zh varchar(100) null, + followup_quality_reason_zh text null, + next_steps text null, + next_steps_quality_level_zh varchar(100) null, + next_steps_quality_reason_zh text null, + attachment longtext null, + parent_record varchar(255) null, + remarks text null, + last_modified_time datetime null, + record_id varchar(100) null, + is_first_visit tinyint(1) null, + recorder_id char(32) null, + visit_type varchar(20) null, + visit_url text null, + is_call_high tinyint(1) null, + subject varchar(50) null, + followup_content text null, + followup_record_zh text null, + next_steps_zh text null, + followup_record_en text null, + followup_quality_level_en varchar(100) null, + followup_quality_reason_en text null, + next_steps_en text null, + next_steps_quality_level_en varchar(100) null, + next_steps_quality_reason_en text null, + partner_id varchar(255) null, + visit_start_time varchar(19) null, + visit_end_time varchar(19) null, + record_type varchar(50) null, + visit_purpose varchar(255) null, + latitude decimal(10, 7) null comment '纬度,范围 -90 到 90', + longitude decimal(11, 7) null comment '经度,范围 -180 到 180', + comments json null comment '评论列表(人工可编辑,JSON数组)', + contacts json null comment '联系人列表(支持多个联系人,JSON数组)', + recorder_department_id varchar(100) null comment '记录人部门ID(快照)', + recorder_department_name varchar(255) null comment '记录人部门名称(快照)', + assessment_flag varchar(10) null, + assessment_description text null, + card_push_status varchar(32) null, + external_collaboration_partner_name varchar(255) null, + external_collaboration_partner_id varchar(255) null, + constraint fk_recorder_id + foreign key (recorder_id) references `autoflow-demo`.users (id) +); + +create index idx_account_name + on `autoflow-demo`.crm_sales_visit_records (account_name); + +create index idx_card_push_status + on `autoflow-demo`.crm_sales_visit_records (card_push_status); + +create index idx_contact_id + on `autoflow-demo`.crm_sales_visit_records (contact_id); + +create index idx_is_first_visit + on `autoflow-demo`.crm_sales_visit_records (is_first_visit); + +create index idx_recorder + on `autoflow-demo`.crm_sales_visit_records (recorder); + +create index idx_subject + on `autoflow-demo`.crm_sales_visit_records (subject); + +create index idx_visit_date + on `autoflow-demo`.crm_sales_visit_records (visit_communication_date); + +create index idx_visit_record_account_id + on `autoflow-demo`.crm_sales_visit_records (account_id); + +create index idx_visit_record_last_modified_time + on `autoflow-demo`.crm_sales_visit_records (last_modified_time); + +create index idx_visit_record_partner_name + on `autoflow-demo`.crm_sales_visit_records (partner_name); + +create index idx_visit_record_recorder_date + on `autoflow-demo`.crm_sales_visit_records (recorder_id, visit_communication_date); + +create index idx_visit_record_recorder_department_id + on `autoflow-demo`.crm_sales_visit_records (recorder_department_id); + +create index idx_visit_record_recorder_id + on `autoflow-demo`.crm_sales_visit_records (recorder_id); + +create index idx_visit_type + on `autoflow-demo`.crm_sales_visit_records (visit_type); + +create table `autoflow-demo`.data_sources +( + created_at datetime default CURRENT_TIMESTAMP null, + updated_at datetime default CURRENT_TIMESTAMP null, + id int auto_increment + primary key, + name varchar(256) not null, + description varchar(512) not null, + data_source_type varchar(256) not null, + config json null, + build_kg_index tinyint(1) not null, + user_id char(32) null, + llm_id int null, + deleted_at datetime null, + constraint fk_1 + foreign key (user_id) references `autoflow-demo`.users (id), + constraint fk_2 + foreign key (llm_id) references `autoflow-demo`.llms (id) +); + +create table `autoflow-demo`.document_contents +( + id int auto_increment comment '自增主键ID' + primary key, + user_id char(32) not null comment '用户ID', + visit_record_id varchar(128) null comment '关联的拜访记录ID', + document_type varchar(50) not null comment '文档类型: feishu_doc, feishu_minute, file', + source_url text not null comment '原文档URL', + raw_content mediumtext not null comment '原始文档内容', + title varchar(500) null comment '文档标题', + file_size int null comment '文件大小(字节)', + created_at datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updated_at datetime default CURRENT_TIMESTAMP not null comment '更新时间', + meeting_summary mediumtext null, + summary_status varchar(20) null, + qa_pairs json null comment '从文档内容中抽取的问答对列表', + qa_extract_status varchar(20) null comment '问答对抽取状态: success, failed', + risk_info mediumtext null comment '从文档内容中提取的风险信息', + risk_extract_status varchar(20) null comment '风险信息提取状态: success, failed', + constraint fk_document_contents_user_id + foreign key (user_id) references `autoflow-demo`.users (id) +); + +create table `autoflow-demo`.customer_documents +( + id int auto_increment comment '自增主键ID' + primary key, + file_category varchar(255) not null comment '文件类别,如ABP、CallHigh等', + account_name varchar(255) not null comment '客户名称', + account_id varchar(255) not null comment '客户ID', + document_url text not null comment '文档链接', + document_type varchar(255) null comment '文档类型', + document_title varchar(500) null comment '文档标题', + uploader_id char(32) not null comment '上传者ID', + uploader_name varchar(255) not null comment '上传者姓名', + created_at datetime not null comment '创建时间', + updated_at datetime not null comment '更新时间', + document_content_id int null comment '关联的文档内容ID', + constraint fk_customer_documents_document_content_id + foreign key (document_content_id) references `autoflow-demo`.document_contents (id), + constraint fk_2 + foreign key (document_content_id) references `autoflow-demo`.document_contents (id), + constraint fk_customer_documents_uploader_id + foreign key (uploader_id) references `autoflow-demo`.users (id), + constraint fk_1 + foreign key (uploader_id) references `autoflow-demo`.users (id) +); + +create index idx_created_at + on `autoflow-demo`.document_contents (created_at); + +create index idx_document_type + on `autoflow-demo`.document_contents (document_type); + +create index idx_qa_extract_status + on `autoflow-demo`.document_contents (qa_extract_status); + +create index idx_risk_extract_status + on `autoflow-demo`.document_contents (risk_extract_status); + +create index idx_summary_status + on `autoflow-demo`.document_contents (summary_status); + +create index idx_user_id + on `autoflow-demo`.document_contents (user_id); + +create index idx_user_type + on `autoflow-demo`.document_contents (user_id, document_type); + +create index idx_visit_record_id + on `autoflow-demo`.document_contents (visit_record_id); + +create table `autoflow-demo`.evaluation_datasets +( + created_at datetime default CURRENT_TIMESTAMP null, + updated_at datetime default CURRENT_TIMESTAMP null, + id int auto_increment + primary key, + name varchar(255) not null, + user_id char(32) null, + constraint fk_1 + foreign key (user_id) references `autoflow-demo`.users (id) +); + +create table `autoflow-demo`.evaluation_dataset_items +( + created_at datetime default CURRENT_TIMESTAMP null, + updated_at datetime default CURRENT_TIMESTAMP null, + id int auto_increment + primary key, + query text null, + reference text null, + retrieved_contexts json null, + extra json null, + evaluation_dataset_id int null, + constraint fk_1 + foreign key (evaluation_dataset_id) references `autoflow-demo`.evaluation_datasets (id) +); + +create table `autoflow-demo`.evaluation_tasks +( + created_at datetime default CURRENT_TIMESTAMP null, + updated_at datetime default CURRENT_TIMESTAMP null, + id int auto_increment + primary key, + name varchar(255) not null, + user_id char(32) null, + dataset_id int null, + constraint fk_1 + foreign key (user_id) references `autoflow-demo`.users (id) +); + +create table `autoflow-demo`.evaluation_task_items +( + created_at datetime default CURRENT_TIMESTAMP null, + updated_at datetime default CURRENT_TIMESTAMP null, + id int auto_increment + primary key, + chat_engine varchar(255) not null, + status varchar(32) not null, + query text null, + reference text null, + response text null, + retrieved_contexts json null, + extra json null, + error_msg text null, + factual_correctness float null, + semantic_similarity float null, + evaluation_task_id int null, + constraint fk_1 + foreign key (evaluation_task_id) references `autoflow-demo`.evaluation_tasks (id) +); + +create table `autoflow-demo`.feedbacks +( + created_at datetime default CURRENT_TIMESTAMP null, + updated_at datetime default CURRENT_TIMESTAMP null, + feedback_type enum ('LIKE', 'DISLIKE') not null, + comment varchar(500) not null, + id int auto_increment + primary key, + chat_id char(32) not null, + chat_message_id int not null, + user_id char(32) null, + origin varchar(256) null, + constraint fk_1 + foreign key (chat_id) references `autoflow-demo`.chats (id), + constraint fk_2 + foreign key (chat_message_id) references `autoflow-demo`.chat_messages (id), + constraint fk_3 + foreign key (user_id) references `autoflow-demo`.users (id) +); + +create table `autoflow-demo`.knowledge_bases +( + id int auto_increment + primary key, + name varchar(255) not null, + description mediumtext null, + index_methods json null, + llm_id int null, + embedding_model_id int null, + documents_total int not null, + data_sources_total int not null, + created_by char(32) null, + created_at datetime default CURRENT_TIMESTAMP null, + updated_by char(32) null, + updated_at datetime default CURRENT_TIMESTAMP null, + deleted_by char(32) null, + deleted_at datetime null, + chunking_config json null, + constraint fk_1 + foreign key (created_by) references `autoflow-demo`.users (id), + constraint fk_2 + foreign key (deleted_by) references `autoflow-demo`.users (id), + constraint fk_3 + foreign key (embedding_model_id) references `autoflow-demo`.embedding_models (id), + constraint fk_4 + foreign key (llm_id) references `autoflow-demo`.llms (id), + constraint fk_5 + foreign key (updated_by) references `autoflow-demo`.users (id) +); + +create table `autoflow-demo`.knowledge_base_datasources +( + knowledge_base_id int not null, + data_source_id int not null, + primary key (knowledge_base_id, data_source_id), + constraint fk_1 + foreign key (data_source_id) references `autoflow-demo`.data_sources (id), + constraint fk_2 + foreign key (knowledge_base_id) references `autoflow-demo`.knowledge_bases (id) +); + +create table `autoflow-demo`.oauth_accounts +( + uid char(36) not null comment '主键ID' + primary key, + user_id char(32) not null comment '用户ID,外键关联users.id', + provider varchar(50) not null comment 'OAuth提供商:feishu, dingtalk, wecom, github, google等', + open_id varchar(255) null comment '开放ID', + union_id varchar(255) null comment '统一ID', + user_id_in_platform varchar(255) null comment '钉钉/飞书内部用户ID', + password varchar(100) null comment '用户密码,适用于系统内账号密码注册', + tenant_key varchar(255) null comment '租户密钥', + corporation_id bigint null comment '企业ID', + create_time datetime default CURRENT_TIMESTAMP null comment '创建时间', + update_time datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '更新时间', + constraint uq_oauth_user + unique (user_id, provider, open_id, user_id_in_platform), + constraint fk_oauth_user_id + foreign key (user_id) references `autoflow-demo`.users (id) +); + +create index idx_oauth_open_id + on `autoflow-demo`.oauth_accounts (open_id); + +create index idx_oauth_provider + on `autoflow-demo`.oauth_accounts (provider); + +create index idx_oauth_union_id + on `autoflow-demo`.oauth_accounts (union_id); + +create index idx_oauth_user_provider + on `autoflow-demo`.oauth_accounts (user_id, provider); + +create index ix_oauth_user_id_in_platform + on `autoflow-demo`.oauth_accounts (user_id_in_platform); + +create table `autoflow-demo`.recommend_questions +( + created_at datetime default CURRENT_TIMESTAMP null, + updated_at datetime default CURRENT_TIMESTAMP null, + id int auto_increment + primary key, + questions json null, + chat_message_id int not null, + constraint fk_1 + foreign key (chat_message_id) references `autoflow-demo`.chat_messages (id) +); + +create index ix_recommend_questions_chat_message_id + on `autoflow-demo`.recommend_questions (chat_message_id); + +create table `autoflow-demo`.uploads +( + created_at datetime default CURRENT_TIMESTAMP null, + updated_at datetime default CURRENT_TIMESTAMP null, + id int auto_increment + primary key, + name varchar(255) not null, + size int not null, + path varchar(255) not null, + mime_type varchar(128) not null, + user_id char(32) null, + meta json null, + category varchar(100) as (null), + constraint fk_1 + foreign key (user_id) references `autoflow-demo`.users (id) +); + +create table `autoflow-demo`.documents +( + created_at datetime default CURRENT_TIMESTAMP null, + updated_at datetime default CURRENT_TIMESTAMP null, + id int auto_increment + primary key, + hash varchar(32) not null, + name varchar(256) not null, + content mediumtext null, + mime_type varchar(128) not null, + source_uri varchar(512) not null, + meta json null, + last_modified_at datetime null, + index_status enum ('NOT_STARTED', 'PENDING', 'RUNNING', 'COMPLETED', 'FAILED') not null, + index_result text null, + data_source_id int null, + knowledge_base_id int null, + file_id int null, + constraint fk_d_on_data_source_id + foreign key (data_source_id) references `autoflow-demo`.data_sources (id), + constraint fk_d_on_knowledge_base_id + foreign key (knowledge_base_id) references `autoflow-demo`.knowledge_bases (id), + constraint fk_documents_on_file_id + foreign key (file_id) references `autoflow-demo`.uploads (id) +); + +create table `autoflow-demo`.chunks +( + created_at datetime default CURRENT_TIMESTAMP null, + updated_at datetime default CURRENT_TIMESTAMP null, + id char(32) not null + primary key, + hash varchar(64) not null, + text text null, + meta json null, + embedding vector(1536) null comment 'hnsw(distance=cosine)', + document_id int null, + relations json null, + source_uri varchar(512) null, + index_status enum ('NOT_STARTED', 'PENDING', 'RUNNING', 'COMPLETED', 'FAILED') not null, + index_result text null, + playbook_index_status enum ('NOT_STARTED', 'PENDING', 'RUNNING', 'COMPLETED', 'FAILED') not null, + playbook_index_result text null, + crm_index_status enum ('NOT_STARTED', 'PENDING', 'RUNNING', 'COMPLETED', 'FAILED') not null, + crm_index_result text null, + constraint fk_1 + foreign key (document_id) references `autoflow-demo`.documents (id) +); + +create index ix_chunks_id + on `autoflow-demo`.chunks (id); + +create table `autoflow-demo`.chunks_1 +( + created_at datetime default CURRENT_TIMESTAMP null, + updated_at datetime default CURRENT_TIMESTAMP null, + id char(32) not null + primary key, + hash varchar(64) not null, + text text null, + meta json null, + embedding vector(1024) not null, + document_id int null, + relations json null, + source_uri varchar(512) null, + index_status enum ('NOT_STARTED', 'PENDING', 'RUNNING', 'COMPLETED', 'FAILED') not null, + index_result text null, + playbook_index_status enum ('NOT_STARTED', 'PENDING', 'RUNNING', 'COMPLETED', 'FAILED') not null, + playbook_index_result text null, + crm_index_status enum ('NOT_STARTED', 'PENDING', 'RUNNING', 'COMPLETED', 'FAILED') not null, + crm_index_result text null, + constraint fk_1 + foreign key (document_id) references `autoflow-demo`.documents (id) +); + +create index ix_chunks_1_id + on `autoflow-demo`.chunks_1 (id); + +create index vec_idx_embedding + on `autoflow-demo`.chunks_1 (embedding); + +create table `autoflow-demo`.chunks_2 +( + created_at datetime default CURRENT_TIMESTAMP null, + updated_at datetime default CURRENT_TIMESTAMP null, + id char(32) not null + primary key, + hash varchar(64) not null, + text text null, + meta json null, + embedding vector(1024) not null, + document_id int null, + relations json null, + source_uri varchar(512) null, + index_status enum ('NOT_STARTED', 'PENDING', 'RUNNING', 'COMPLETED', 'FAILED') not null, + index_result text null, + playbook_index_status enum ('NOT_STARTED', 'PENDING', 'RUNNING', 'COMPLETED', 'FAILED') not null, + playbook_index_result text null, + crm_index_status enum ('NOT_STARTED', 'PENDING', 'RUNNING', 'COMPLETED', 'FAILED') not null, + crm_index_result text null, + constraint fk_1 + foreign key (document_id) references `autoflow-demo`.documents (id) +); + +create index ix_chunks_2_id + on `autoflow-demo`.chunks_2 (id); + +create index vec_idx_embedding + on `autoflow-demo`.chunks_2 (embedding); + +create index ix_documents_file_id + on `autoflow-demo`.documents (file_id); + +create table `autoflow-demo`.file_permissions +( + id int auto_increment + primary key, + file_id int not null, + user_id char(32) null, + permission_type enum ('read', 'owner') default 'read' not null, + granted_by char(32) not null, + granted_at datetime default CURRENT_TIMESTAMP not null, + expires_at datetime null, + constraint fk_1 + foreign key (file_id) references `autoflow-demo`.uploads (id), + constraint fk_2 + foreign key (granted_by) references `autoflow-demo`.users (id), + constraint fk_3 + foreign key (user_id) references `autoflow-demo`.users (id) +); + +create index ix_file_permissions_file_id + on `autoflow-demo`.file_permissions (file_id); + +create index ix_file_permissions_file_id_user_id + on `autoflow-demo`.file_permissions (file_id, user_id); + +create index ix_file_permissions_user_id + on `autoflow-demo`.file_permissions (user_id); + +create index ix_uploads_category + on `autoflow-demo`.uploads (category); + +create table `autoflow-demo`.user_profiles +( + id int auto_increment + primary key, + user_id char(32) null, + oauth_user_id char(36) null, + feishu_open_id varchar(255) null, + name varchar(255) null, + department varchar(255) null, + position varchar(255) null, + direct_manager_id char(36) null, + direct_manager_name varchar(255) null, + is_active tinyint(1) not null, + create_time datetime null, + update_time datetime null, + platform varchar(50) null, + open_id varchar(255) null, + notification_tags varchar(1000) null, + role varchar(100) null, + en_name varchar(100) null, + avatar_url text null, + email varchar(255) null, + phone varchar(50) null, + crm_user_id varchar(100) null, + extra json null, + constraint fk_1 + foreign key (user_id) references `autoflow-demo`.users (id) +); + +create index idx_user_profiles_department_is_active + on `autoflow-demo`.user_profiles (department, is_active); + +create index idx_user_profiles_direct_manager_id_is_active + on `autoflow-demo`.user_profiles (direct_manager_id, is_active); + +create index ix_user_profiles_oauth_user_id + on `autoflow-demo`.user_profiles (oauth_user_id); + +create index ix_user_profiles_open_id + on `autoflow-demo`.user_profiles (open_id); + +create index ix_user_profiles_platform + on `autoflow-demo`.user_profiles (platform); + +create index ix_user_profiles_user_id + on `autoflow-demo`.user_profiles (user_id); + +create table `autoflow-demo`.user_sessions +( + token varchar(43) not null + primary key, + created_at datetime default CURRENT_TIMESTAMP null, + user_id char(32) not null, + constraint fk_1 + foreign key (user_id) references `autoflow-demo`.users (id) +); + +create table `autoflow-demo`.user_sessions_archive_20260522 +( + token varchar(43) not null + primary key, + created_at datetime default CURRENT_TIMESTAMP null, + user_id char(32) not null, + constraint fk_1 + foreign key (user_id) references `autoflow-demo`.users (id) +); + +create index ix_users_id + on `autoflow-demo`.users (id); + diff --git a/fix_errors.sql b/fix_errors.sql new file mode 100644 index 0000000..6300a1a --- /dev/null +++ b/fix_errors.sql @@ -0,0 +1,7 @@ +-- 1. Drop foreign key constraints that prevent data insertion since the parent 'users' table is not part of the replication +ALTER TABLE `demo`.`crm_sales_visit_records` DROP FOREIGN KEY `fk_recorder_id`; +ALTER TABLE `demo`.`user_profiles` DROP FOREIGN KEY `fk_1`; + +-- 2. Drop the generated column 'biz_key' in 'crm_acv_targets' and recreate it as a standard VARCHAR column so Sling can import data into it +ALTER TABLE `demo`.`crm_acv_targets` DROP COLUMN `biz_key`; +ALTER TABLE `demo`.`crm_acv_targets` ADD COLUMN `biz_key` VARCHAR(16) NULL COMMENT '业务主键(如FY26Q1,全年为FY26)'; diff --git a/sync.sh b/sync.sh index d0e0446..e865e3c 100644 --- a/sync.sh +++ b/sync.sh @@ -1,6 +1,6 @@ -sling run -r sync_aptselldemo.yaml +sling run -r sync_aptselldemo_homelab.yaml sling run -r sync_demo_local.yaml -sling run -r sync_demo.yaml \ No newline at end of file +sling run -r sync_demo_homelab.yaml \ No newline at end of file