unis_crm/sql/20260827.sql

284 lines
15 KiB
PL/PgSQL
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

-- =====================================================================
-- 2026-08-27 CRM 升级 - PostgreSQL 17
-- =====================================================================
-- 背景:
-- 1) 旧版库archive/init_pg17.sql + 各增量升级脚本)中以下三个表的
-- biz_type CHECK 约束缺少 'crm' 值,而 CRM 拓展功能会写入
-- biz_type = 'crm'(日报反写 CRM 拜访记录、CRM 拓展新增拜访记录、
-- 外勤打卡关联 CRM 拓展、日报消息关联 CRM 拓展),会被旧约束拒绝。
-- 2) CRM 拓展主表 crm_crm_expansion 与多联系人子表
-- crm_crm_expansion_contact 的建表脚本在项目 SQL 中缺失,本次补齐,
-- 结构以当前库实际定义为准(含主键、外键、索引,无触发器/注释,
-- 子表无外键约束,与现有库保持一致)。
-- 3) 新增 crm_oms_dict_mappingCRM 与 OMS 字典码值映射表,用于商机
-- 推送 OMS / OMS 导入回传时的字典码值转换。
-- 说明init_full_pg17.sql全新初始化已包含正确约束本脚本用于
-- 旧库增量升级。对新库执行同样安全幂等create if not exists、
-- drop constraint if exists
begin;
set search_path to public;
-- 1) crm_expansion_followup跟进/拜访记录表,需支持 sales/channel/crm
alter table crm_expansion_followup
drop constraint if exists crm_expansion_followup_biz_type_check;
alter table crm_expansion_followup
add constraint crm_expansion_followup_biz_type_check
check (biz_type in ('sales', 'channel', 'crm'));
-- 2) work_checkin外勤打卡可关联 sales/channel/opportunity/crm
alter table work_checkin
drop constraint if exists work_checkin_biz_type_check;
alter table work_checkin
add constraint work_checkin_biz_type_check
check (biz_type is null or biz_type in ('sales', 'channel', 'opportunity', 'crm'));
-- 3) work_report_message日报消息可关联 sales/channel/opportunity/crm
alter table work_report_message
drop constraint if exists work_report_message_biz_type_check;
alter table work_report_message
add constraint work_report_message_biz_type_check
check (biz_type is null or biz_type in ('sales', 'channel', 'opportunity', 'crm'));
-- 4) CRM 拓展主表(结构与当前库实际定义一致)
create table if not exists crm_crm_expansion (
id bigint generated by default as identity primary key,
end_user varchar(200) not null,
office_name varchar(200) not null,
industry_attr varchar(200),
extension_type varchar(50) not null,
purchase_date date,
warranty_expiry date,
online_status varchar(50) not null,
contact_name varchar(100),
contact_phone varchar(50),
contact_title varchar(100),
supplier_id bigint,
h3c_contact_id bigint,
has_expansion_opportunity varchar(10),
owner_user_id bigint not null,
remark text,
created_at timestamptz not null default now(),
updated_at timestamptz not null default now(),
constraint fk_crm_crm_expansion_supplier
foreign key (supplier_id) references crm_channel_expansion(id),
constraint fk_crm_crm_expansion_h3c_contact
foreign key (h3c_contact_id) references crm_sales_expansion(id)
);
create index if not exists idx_crm_crm_expansion_owner
on crm_crm_expansion (owner_user_id);
create index if not exists idx_crm_crm_expansion_supplier
on crm_crm_expansion (supplier_id);
-- 5) CRM 拓展多联系人子表(结构与当前库实际定义一致)
create table if not exists crm_crm_expansion_contact (
id bigint generated by default as identity primary key,
crm_expansion_id bigint not null,
contact_name varchar(255),
contact_mobile varchar(64),
contact_title varchar(128),
sort_order integer not null default 0,
created_at timestamptz not null default now(),
updated_at timestamptz not null default now()
);
create index if not exists idx_crm_expansion_contact_expansion
on crm_crm_expansion_contact (crm_expansion_id);
-- 5.5) CRM 拓展主表新增字段:软件点数 / 扩容时间 / 扩容规模
-- 软件点数:整数;扩容时间:日期(与采购时间/过保时间一致用 date
-- 扩容规模:文本。
alter table crm_crm_expansion
add column if not exists software_points int;
alter table crm_crm_expansion
add column if not exists expansion_time date;
alter table crm_crm_expansion
add column if not exists expansion_scale varchar(100);
comment on column crm_crm_expansion.software_points is '软件点数';
comment on column crm_crm_expansion.expansion_time is '扩容时间';
comment on column crm_crm_expansion.expansion_scale is '扩容规模';
-- 5.6) CRM 拓展主表新增字段:进货商名称 / 新华三对接人名称
-- 需求:进货商、新华三对接人在下拉里没有想选的人时,可直接手动输入文字保存。
-- 因此除保留 supplier_id / h3c_contact_id 关联外,新增名称冗余字段:
-- - 下拉选中时:存 id并冗余存名称supplier_name / h3c_contact_name
-- - 手动输入时supplier_id / h3c_contact_id 置空,名称存文本
-- 列表/详情展示以名称字段优先,历史仅有 id 的旧数据回退用 JOIN 关联名称。
alter table crm_crm_expansion
add column if not exists supplier_name varchar(255);
alter table crm_crm_expansion
add column if not exists h3c_contact_name varchar(255);
comment on column crm_crm_expansion.supplier_name is '进货商名称(下拉选中冗余存名;手动输入时存文字)';
comment on column crm_crm_expansion.h3c_contact_name is '新华三对接人名称(下拉选中冗余存名;手动输入时存文字)';
-- 5.7) CRM 拓展主表新增字段:是否有维保项目机会
-- 使用系统字典 sys_is1是 / 0否
alter table crm_crm_expansion
add column if not exists has_maintenance_opportunity varchar(10);
comment on column crm_crm_expansion.has_maintenance_opportunity is '是否有维保项目机会(系统是否字典 sys_is1是 / 0否';
-- 6) CRM 与 OMS 字典码值映射表:用于商机推送 OMS / OMS 导入回传时做字典码值转换
create table if not exists crm_oms_dict_mapping (
id bigint generated by default as identity primary key,
dict_type varchar(50) not null,
crm_value varchar(100) not null,
crm_label varchar(200),
oms_value varchar(100) not null,
oms_label varchar(200),
remark varchar(500),
status smallint not null default 1,
is_default boolean not null default false,
created_at timestamptz not null default now(),
updated_at timestamptz not null default now(),
constraint uk_crm_oms_dict_mapping unique (dict_type, crm_value, oms_value)
);
comment on table crm_oms_dict_mapping is 'CRM与OMS字典码值映射表';
comment on column crm_oms_dict_mapping.dict_type is '字典类型(如 opportunity_stage 商机阶段、opportunity_type 商机类型)';
comment on column crm_oms_dict_mapping.crm_value is 'CRM侧字典码值item_value';
comment on column crm_oms_dict_mapping.crm_label is 'CRM侧字典标签冗余便于核对';
comment on column crm_oms_dict_mapping.oms_value is 'OMS侧码值';
comment on column crm_oms_dict_mapping.oms_label is 'OMS侧标签冗余便于核对';
comment on column crm_oms_dict_mapping.remark is '备注';
comment on column crm_oms_dict_mapping.status is '状态1 启用 0 停用';
comment on column crm_oms_dict_mapping.is_default is '是否为默认映射true 是 false 否用于CRM推OMS时的默认匹配';
comment on column crm_oms_dict_mapping.created_at is '创建时间';
comment on column crm_oms_dict_mapping.updated_at is '更新时间';
-- 7) 初始化数据项目阶段sj_xmjd映射
insert into crm_oms_dict_mapping (dict_type, crm_value, crm_label, oms_value, oms_label, is_default)
values
('sj_xmjd', 'S0', 'S0-配置报价', 'S0', 'S0-配置报价', true),
('sj_xmjd', 'S1', 'S1-深化设计', 'S1', 'S1-标前引导', true),
('sj_xmjd', 'S1', 'S1-深化设计', 'S2', 'S2-招投标签', false),
('sj_xmjd', 'S2', 'S2-招投标签', 'S3', 'S3-招投标签期', true),
('sj_xmjd', 'S3', 'S3-中标未下单', 'S4A', 'S4A-中标未签(总包)', false),
('sj_xmjd', 'S3', 'S3-中标未下单', 'S4B', 'S4B-中标未签(省代)', false),
('sj_xmjd', 'S3', 'S3-中标未下单', 'S4C', 'S4C-中标未签(汇智)', true),
('sj_xmjd', 'S4', 'S4-下单未签单', 'S5', 'S5-订单合同签订期', true),
('sj_xmjd', 'S5', 'S5-已签单', 'S6', 'S6-订单合同已生效', true),
('sj_xmjd', 'S5', 'S5-已签单', 'S7A', 'S7A-订单部分发货', false),
('sj_xmjd', 'S5', 'S5-已签单', 'S7B', 'S7B-订单全部发货', false),
('sj_xmjd', 'S5', 'S5-已签单', 'S8', 'S8-已签收', false),
('sj_xmjd', 'L', 'L-已丢单', 'L', 'L-已丢单', true)
on conflict (dict_type, crm_value, oms_value) do nothing;
-- 8) 渠道拓展覆盖地市:改为从表存储(便于后期统计)
-- 覆盖关系存 crm_channel_expansion_coverage每行一个覆盖项省/市)。
-- 主表原有的 coverage_province / coverage_city 两列已废弃,
-- 历史数据迁移到从表后删除,查询/写入均改为读写从表,避免冗余与不一致。
create table if not exists crm_channel_expansion_coverage (
id bigserial primary key,
channel_id bigint not null references crm_channel_expansion(id) on delete cascade,
province varchar(100),
city varchar(100)
);
comment on table crm_channel_expansion_coverage is '渠道拓展覆盖地市明细(每行一个覆盖项)';
comment on column crm_channel_expansion_coverage.province is '覆盖省份cnarea 一级区域名称city 为空表示全省)';
comment on column crm_channel_expansion_coverage.city is '覆盖市/区/县cnarea 二级区域名称)';
create index if not exists idx_cec_channel_id on crm_channel_expansion_coverage(channel_id);
create index if not exists idx_cec_province on crm_channel_expansion_coverage(province);
create index if not exists idx_cec_city on crm_channel_expansion_coverage(city);
-- ---------------------------------------------------------------------
-- 9.5) 销售人员拓展所属区域:改为从表存储(参考渠道拓展"覆盖地市"结构)
-- 所属区域为多选下拉,每个选中项存为一行(省/市),
-- 关联 crm_sales_expansion(id)on delete cascade。
-- ---------------------------------------------------------------------
create table if not exists crm_sales_expansion_coverage (
id bigserial primary key,
sales_expansion_id bigint not null references crm_sales_expansion(id) on delete cascade,
province varchar(100),
city varchar(100)
);
comment on table crm_sales_expansion_coverage is '销售人员拓展所属区域明细(每行一个区域项)';
comment on column crm_sales_expansion_coverage.province is '所属省份cnarea 一级区域名称city 为空表示全省)';
comment on column crm_sales_expansion_coverage.city is '所属市/区/县cnarea 二级区域名称)';
create index if not exists idx_csec_sales_expansion_id on crm_sales_expansion_coverage(sales_expansion_id);
create index if not exists idx_csec_province on crm_sales_expansion_coverage(province);
create index if not exists idx_csec_city on crm_sales_expansion_coverage(city);
-- ---------------------------------------------------------------------
-- 9) work_checkin.id 序列同步(打卡主键改为 identity 自动生成)
-- 背景:历史版本 insertCheckIn 使用 max(id)+1 显式主键identity 序列
-- 从未推进;且历史遗留存在 work_checkin_id_seq / _seq1 双序列。
-- 现 insertCheckIn 已改为由 identity 自动生成主键,需将 identity 实际
-- 绑定的序列同步到表内 max(id),避免后续插入主键冲突。
-- 使用 pg_get_serial_sequence 动态解析实际序列,避免对错序列。
-- 幂等:重复执行结果一致,可安全用于任意环境。
-- ---------------------------------------------------------------------
do $$
declare
seq_name text;
begin
select pg_get_serial_sequence('work_checkin', 'id') into seq_name;
if seq_name is not null then
execute format('select setval(%L, coalesce((select max(id) from work_checkin), 0) + 1, false)', seq_name);
raise notice 'work_checkin.id 序列 % 已同步', seq_name;
else
raise notice '未找到 work_checkin.id 的 identity 序列';
end if;
end $$;
-- ---------------------------------------------------------------------
-- 10) 渠道拓展新增字段:注册资金
-- 需求:渠道拓展页面新增「注册资金」字段,必填,前端位置在「人员规模」
-- 字段之后。单位与年度营业额一致万元numeric(18,2)。
-- 幂等add column if not exists可安全用于任意环境。
-- ---------------------------------------------------------------------
alter table crm_channel_expansion
add column if not exists registered_capital numeric(18, 2);
comment on column crm_channel_expansion.registered_capital is '注册资金(万元)';
-- ---------------------------------------------------------------------
-- 11) 渠道拓展联系人新增字段:工作职责 / 生日 / 是否加企业微信 / 特别说明
-- 需求:渠道联系人固定 6 行,工作职责不可编辑,固定为
-- 销售负责人、技术负责人、商务负责人、宣传负责人、
-- 订单通知接单人、汇智日常联络人。
-- 除生日选填外,其余联系人字段均必填(至少完整填写一行)。
-- 是否加企业微信使用系统「是否」字典sys_is是(1) / 否(0)。
-- 工作职责为固定 6 项:销售负责人 / 技术负责人 / 商务负责人 /
-- 宣传负责人 / 订单通知接单人 / 汇智日常联络人。
-- 幂等add column if not exists可安全用于任意环境。
-- ---------------------------------------------------------------------
alter table crm_channel_expansion_contact
add column if not exists duty varchar(50);
alter table crm_channel_expansion_contact
add column if not exists birthday date;
alter table crm_channel_expansion_contact
add column if not exists wecom_added varchar(100);
alter table crm_channel_expansion_contact
add column if not exists special_note text;
comment on column crm_channel_expansion_contact.duty is '工作职责固定6项之一销售负责人/技术负责人/商务负责人/宣传负责人/订单通知接单人/汇智日常联络人)';
comment on column crm_channel_expansion_contact.birthday is '生日';
comment on column crm_channel_expansion_contact.wecom_added is '是否加企业微信(系统是否字典 sys_is1是 / 0否';
comment on column crm_channel_expansion_contact.special_note is '特别说明';
commit;