# Docker 环境项目打标卡住后端实施记录

## 背景

- 现象：Docker 部署后的后端中，项目打标任务会长时间停留在“打标中”。
- 样本项目：`90337`
- 排查目标：确认任务卡住的真实根因，并按最短路径修复。

## 已定位问题

### 1. 打标规则 SQL 在 MySQL 8 / Docker 环境触发排序规则冲突

- 规则：`LARGE_PURCHASE_TRANSACTION`
- 异常：`Illegal mix of collations (utf8mb4_0900_ai_ci) and (utf8mb4_general_ci)`
- 影响：任务在规则执行阶段直接失败。

### 2. 失败落库时错误信息过长，导致任务状态无法更新

- 表：`ccdi_bank_tag_task`
- 字段：`error_message`
- 异常：`Data too long for column 'error_message'`
- 影响：
  - 任务本应更新为 `FAILED`，但更新再次失败
  - 项目状态没有从 `打标中` 回退
  - 前端看到的就是“打标一直卡住”

## 本次改动范围

- `ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankTagAnalysisMapper.xml`
  - 为 `LARGE_PURCHASE_TRANSACTION` 相关 join 显式补齐统一排序规则。
- `sql/migration/2026-04-20-fix-bank-tag-task-error-message-longtext.sql`
  - 将 `ccdi_bank_tag_task` 表统一到 `utf8mb4_general_ci`，并把 `error_message` 调整为 `LONGTEXT`。
- `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiBankTagServiceImpl.java`
  - 调整任务失败错误信息拼装逻辑，保留完整根因，不再按 2000 截断。
- `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiBankTagServiceImplTest.java`
  - 新增错误信息裁剪测试。
- `ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiBankTagAnalysisMapperXmlTest.java`
  - 新增 SQL 排序规则约束测试。

## 验证

- 运行新增测试，先确认失败，再完成修复后确认通过。
- 修复后检查项目 `90337` 的任务状态是否能正确进入失败态或完成态，不再停留在 `RUNNING`。

## 实际执行结果

- 已执行数据库脚本：
  - `sql/migration/2026-04-20-fix-bank-tag-task-error-message-longtext.sql`
- 已重新打包并重启 Docker 后端容器。
- 已手工复位历史卡死任务：
  - `ccdi_bank_tag_task.id = 76`
- 已重新触发项目 `90337` 打标。
- 最新验证结果：
  - `ccdi_bank_tag_task.id = 79`
  - `status = SUCCESS`
  - `success_rule_count = 35`
  - `hit_count = 132`
  - 项目 `90337` 状态已回到 `1 = 已完成`

## 结论

- “打标卡住”并非任务一直运行，而是：
  1. 采购相关规则 SQL 因排序规则冲突失败
  2. 失败异常写入 `ccdi_bank_tag_task.error_message` 时又因字段长度不足再次失败
- 本次已按数据库方案改为 `LONGTEXT`，并将采购链路所有相关 join 显式统一为 `utf8mb4_general_ci`。
