unis_crm/sql/upgrade_dashboard_analytics...

150 lines
6.0 KiB
MySQL
Raw Normal View History

2026-05-20 02:01:28 +00:00
begin;
set search_path to public;
-- 经营分析卡片历史展示配置修正脚本
-- 说明:
-- 1. 归一化旧版 chartPreset 中文值,统一转成当前内部预设值。
-- 2. 为老的 pie/ring/funnel 卡片补齐 showDataLabels=true避免升级后标签丢失。
-- 3. 对非堆叠 line/bar 卡片,如果误存 dataLabelMode=total则回退为 value。
-- 4. 对 display_text_config 为空、非法 JSON、或非对象结构的卡片按安全对象配置修正。
-- 5. 可重复执行。
do $$
declare
rec record;
parsed_config jsonb;
next_config jsonb;
preset_text text;
normalized_preset text;
parse_failed boolean;
begin
if to_regclass('public.dashboard_analytics_card_config') is null then
raise notice 'skip upgrade_dashboard_analytics_card_display_config_pg17: table dashboard_analytics_card_config does not exist';
return;
end if;
for rec in
select
id,
lower(coalesce(render_type, '')) as render_type,
display_text_config
from dashboard_analytics_card_config
loop
parse_failed := false;
parsed_config := '{}'::jsonb;
begin
if rec.display_text_config is null or btrim(rec.display_text_config) = '' then
parsed_config := '{}'::jsonb;
else
parsed_config := rec.display_text_config::jsonb;
if jsonb_typeof(parsed_config) <> 'object' then
parsed_config := '{}'::jsonb;
parse_failed := true;
end if;
end if;
exception
when others then
parsed_config := '{}'::jsonb;
parse_failed := true;
end;
next_config := parsed_config;
preset_text := nullif(btrim(coalesce(parsed_config ->> 'chartPreset', '')), '');
normalized_preset := case preset_text
when '基础折线图' then 'line-basic'
when '平滑曲线图' then 'line-smooth'
when '面积折线图' then 'line-area'
when '阶梯折线图(起点)' then 'line-step-start'
when '阶梯折线图(中点)' then 'line-step-middle'
when '阶梯折线图(终点)' then 'line-step-end'
when '堆叠折线图' then 'line-stacked'
when '堆积折线图' then 'line-stacked'
when '折线图' then 'line-basic'
when '平滑折线图' then 'line-smooth'
when '面积图' then 'line-area'
when '基础柱状图' then 'bar-basic'
when '柱状图' then 'bar-basic'
when '横向柱状图' then 'bar-horizontal'
when '条形图' then 'bar-horizontal'
when '堆叠柱状图' then 'bar-stacked'
when '堆积柱状图' then 'bar-stacked'
when '横向堆叠柱状图' then 'bar-horizontal-stacked'
when '横向堆积柱状图' then 'bar-horizontal-stacked'
when '堆积条形图' then 'bar-horizontal-stacked'
when '瀑布图' then 'bar-waterfall'
when '动态排序柱状图(单帧)' then 'bar-race'
when '动态排序柱状图(时间帧)' then 'bar-race-timeline'
when '基础饼图' then 'pie-basic'
when '饼图' then 'pie-basic'
when '圆环图' then 'pie-doughnut'
when '环形图' then case rec.render_type
when 'ring' then 'ring-basic'
else 'pie-doughnut'
end
when '南丁格尔玫瑰图' then 'pie-rose'
when '玫瑰图' then case rec.render_type
when 'ring' then 'ring-rose'
else 'pie-rose'
end
when '嵌套饼图' then 'pie-nested'
when '基础圆环图' then 'ring-basic'
when '玫瑰圆环图' then 'ring-rose'
when '嵌套圆环图' then 'ring-nested'
when '基础漏斗图' then 'funnel-basic'
when '漏斗图' then 'funnel-basic'
when '对比漏斗图' then 'funnel-contrast'
when '多系列漏斗图' then 'funnel-multiple'
else preset_text
end;
if normalized_preset is distinct from preset_text and normalized_preset is not null then
next_config := jsonb_set(next_config, '{chartPreset}', to_jsonb(normalized_preset), true);
end if;
if jsonb_typeof(next_config -> 'showDataLabels') = 'string' then
if lower(coalesce(next_config ->> 'showDataLabels', '')) in ('true', '1', 'yes', 'y', 'on', '') then
next_config := jsonb_set(next_config, '{showDataLabels}', 'true'::jsonb, true);
elsif lower(coalesce(next_config ->> 'showDataLabels', '')) in ('false', '0', 'no', 'n', 'off', '') then
next_config := jsonb_set(next_config, '{showDataLabels}', 'false'::jsonb, true);
end if;
end if;
if jsonb_typeof(next_config -> 'showLegend') = 'string' then
if lower(coalesce(next_config ->> 'showLegend', '')) in ('true', '1', 'yes', 'y', 'on', '') then
next_config := jsonb_set(next_config, '{showLegend}', 'true'::jsonb, true);
elsif lower(coalesce(next_config ->> 'showLegend', '')) in ('false', '0', 'no', 'n', 'off', '') then
next_config := jsonb_set(next_config, '{showLegend}', 'false'::jsonb, true);
end if;
end if;
if rec.render_type in ('pie', 'ring', 'funnel') and not (next_config ? 'showDataLabels') then
next_config := jsonb_set(next_config, '{showDataLabels}', 'true'::jsonb, true);
end if;
if coalesce(next_config ->> 'dataLabelMode', '') = '只显示总数' then
next_config := jsonb_set(next_config, '{dataLabelMode}', to_jsonb('total'::text), true);
elsif coalesce(next_config ->> 'dataLabelMode', '') = '显示每段数值' then
next_config := jsonb_set(next_config, '{dataLabelMode}', to_jsonb('value'::text), true);
end if;
if rec.render_type in ('line', 'bar')
and coalesce(next_config ->> 'dataLabelMode', '') = 'total'
and position('stacked' in coalesce(next_config ->> 'chartPreset', '')) = 0 then
next_config := jsonb_set(next_config, '{dataLabelMode}', to_jsonb('value'::text), true);
end if;
if parse_failed or next_config is distinct from parsed_config then
update dashboard_analytics_card_config
set display_text_config = next_config::text,
updated_at = now()
where id = rec.id;
end if;
end loop;
end
$$;
commit;