提交 8e3f59a3 authored 作者: 王鹏飞's avatar 王鹏飞

feat: 新增数据迁移脚本以统一阶段附件字段并优化流式响应头

上级 4b7d3d0c
-- 阶段附件字段数据迁移(MySQL 8+)
--
-- 背景:各阶段附件字段统一成了 attachment_file_url,其中两个阶段是「两列合并成一列」:
-- project_initiations : application_file_url + argument_file_url → attachment_file_url(合并)
-- project_procurements: winning_notice_file_url + bid_archive_file_url → attachment_file_url(合并)
-- project_contracts : archive_file_url → attachment_file_url(改名)
-- project_acceptances : acceptance_report_url → attachment_file_url(改名)
-- project_list / project_deliveries 原本没有附件字段,只新增,不涉及本文件
--
-- 前置:先执行 fix_project_stage_attachments.sql(它负责 ADD COLUMN attachment_file_url)。
-- 只跑那个的话新列全是 NULL,页面上附件会「消失」——数据还在旧列里,只是没人读。
--
-- 本文件只做数据搬运,不删任何列。旧列原样保留,出问题可以从旧列重来。
-- 幂等:每条 UPDATE 都带「attachment_file_url 为空」条件,重复执行不会重复写入。
--
-- ⚠️ 如果下面的诊断查询报 Unknown column,说明这个库是从最新版 001_init_dms_schema.sql
-- 新建的(没有旧列),本文件不需要执行。诊断在最前面,任何列缺失都会在任何写入之前报错退出。
-- ── 第 1 步:诊断。先跑这一条,看清楚要迁移多少行 ──────────────────────────
SELECT
(SELECT COUNT(*) FROM project_initiations
WHERE attachment_file_url IS NULL
AND (COALESCE(application_file_url, '') > '' OR COALESCE(argument_file_url, '') > '')) AS initiation_待迁移,
(SELECT COUNT(*) FROM project_procurements
WHERE attachment_file_url IS NULL
AND (COALESCE(winning_notice_file_url, '') > '' OR COALESCE(bid_archive_file_url, '') > '')) AS procurement_待迁移,
(SELECT COUNT(*) FROM project_contracts
WHERE attachment_file_url IS NULL AND COALESCE(archive_file_url, '') > '') AS contract_待迁移,
(SELECT COUNT(*) FROM project_acceptances
WHERE attachment_file_url IS NULL AND COALESCE(acceptance_report_url, '') > '') AS acceptance_待迁移;
-- ── 第 2 步:改名(一列 → 一列,直接复制)──────────────────────────────────
UPDATE project_contracts
SET attachment_file_url = archive_file_url
WHERE attachment_file_url IS NULL
AND COALESCE(archive_file_url, '') > '';
UPDATE project_acceptances
SET attachment_file_url = acceptance_report_url
WHERE attachment_file_url IS NULL
AND COALESCE(acceptance_report_url, '') > '';
-- ── 第 3 步:合并(两列 → 一列,拼成一个 JSON 数组)────────────────────────
-- 两个旧列各存一份文件列表,合并成一个数组。
-- 用 JSON_VALID 过滤:格式不合法的值不参与合并,否则整条语句会因一条脏数据报错中断。
-- 建议先肉眼看一下值:SELECT id, application_file_url, argument_file_url FROM project_initiations
-- WHERE COALESCE(application_file_url,'') > '' OR COALESCE(argument_file_url,'') > '' LIMIT 10;
UPDATE project_initiations
SET attachment_file_url = JSON_MERGE_PRESERVE(
IF(JSON_VALID(application_file_url), application_file_url, JSON_ARRAY()),
IF(JSON_VALID(argument_file_url), argument_file_url, JSON_ARRAY())
)
WHERE attachment_file_url IS NULL
AND (COALESCE(application_file_url, '') > '' OR COALESCE(argument_file_url, '') > '');
UPDATE project_procurements
SET attachment_file_url = JSON_MERGE_PRESERVE(
IF(JSON_VALID(winning_notice_file_url), winning_notice_file_url, JSON_ARRAY()),
IF(JSON_VALID(bid_archive_file_url), bid_archive_file_url, JSON_ARRAY())
)
WHERE attachment_file_url IS NULL
AND (COALESCE(winning_notice_file_url, '') > '' OR COALESCE(bid_archive_file_url, '') > '');
-- ── 第 4 步:核对。四个数应全为 0(和第 1 步同一个查询)─────────────────────
SELECT
(SELECT COUNT(*) FROM project_initiations
WHERE attachment_file_url IS NULL
AND (COALESCE(application_file_url, '') > '' OR COALESCE(argument_file_url, '') > '')) AS initiation_待迁移,
(SELECT COUNT(*) FROM project_procurements
WHERE attachment_file_url IS NULL
AND (COALESCE(winning_notice_file_url, '') > '' OR COALESCE(bid_archive_file_url, '') > '')) AS procurement_待迁移,
(SELECT COUNT(*) FROM project_contracts
WHERE attachment_file_url IS NULL AND COALESCE(archive_file_url, '') > '') AS contract_待迁移,
(SELECT COUNT(*) FROM project_acceptances
WHERE attachment_file_url IS NULL AND COALESCE(acceptance_report_url, '') > '') AS acceptance_待迁移;
......@@ -260,6 +260,9 @@ export const streamChatCompletion = async ({ mapping, path, body, reply, signal,
'content-type': response.headers.get('content-type') || 'text/event-stream; charset=utf-8',
'cache-control': 'no-cache',
connection: 'keep-alive',
// nginx / ingress 默认 proxy_buffering on,会把 SSE 攒满缓冲区再一起吐,
// 表现就是「看着像流式、其实是分批到」。这个头让 nginx 对本响应关闭缓冲。
'x-accel-buffering': 'no',
'x-request-id': reply.request.id,
})
......
Markdown 格式
0% 或
您添加了 0 人 到此讨论。请谨慎行事。
请先完成此评论的编辑!
请 注册 或者 后发表评论