# 操作留痕(Codex) - 时间:2025-11-01 19:35(UTC+8) - 动作:修改 Dockerfile 创建应用用户命令 - 位置:Dockerfile(运行阶段“创建应用用户和目录”) - 变更:将原使用 addgroup/adduser 的写法替换为兼容 Debian/Ubuntu 与 Alpine 的健壮分支逻辑(优先使用 `groupadd/useradd`,回退到 `addgroup/adduser` 并按是否支持 `--gid` 区分参数)。 - 目的:修复构建阶段报错“Option g is ambiguous (gecos, gid, group)”,避免不同基础镜像工具链参数差异导致失败。 - 工具:apply_patch(补丁写入) - 结果:补丁应用成功,建议以 `docker build --no-cache` 重新构建验证。 - 时间:2025-11-01 19:40(UTC+8) - 动作:修复部署脚本 archive-manager.sh 镜像检查逻辑 - 位置:archive-manager.sh(deploy_app 函数) - 变更:新增 `image_exists` 检查,通过 `docker image inspect` 判断本地镜像是否存在;若不存在,`deploy` 流程自动调用 `build_image` 进行构建,避免 `docker compose up` 因尝试拉取远端镜像而失败(镜像找不到)。 - 目的:解决部署时报“镜像找不到”的问题,提升一键部署体验。 - 工具:apply_patch(补丁写入) - 结果:补丁应用成功,可通过 `./archive-manager.sh deploy <目录>` 直接部署,首次会自动构建镜像。 - 时间:2025-11-18 17:43(UTC+8) - 动作:按环境调整日志输出配置 - 位置:src/main/resources/logback-spring.xml - 变更:新增 springProfile 分支,开发环境仅输出控制台,生产环境写入与 Dockerfile 一致的 `/app/logs` 并保留分级 RollingFileAppender。 - 目的:满足开发环境不落盘、生产环境落盘且目录对齐容器目录的需求。 - 工具:apply_patch(重写配置文件) - 结果:配置已更新,可通过启动 dev/prod Profile 验证控制台与落盘行为。 - 时间:2025-11-18 17:46(UTC+8) - 动作:修复 logback 配置解析错误 - 位置:src/main/resources/logback-spring.xml - 变更:将 springProfile 条件中的逻辑与符号转义为 `&`,解决 XML 解析报错(“实体名称必须紧跟在 & 后面”)。 - 目的:确保 logback-spring.xml 能被 Spring Boot 正常加载。 - 工具:apply_patch(补丁写入) - 结果:配置已更正,可再次启动验证。 - 时间:2025-11-18 18:00(UTC+8) - 动作:调整 OperatorTable 读取数据源方式 - 位置:src/main/java/com/point/strategy/table/OperatorTable.java - 变更:不再从固定 application.properties 读取数据源,改为注入 Spring Environment,通过激活的 profile 动态获取 `spring.datasource.*`,并在未配置时抛出明确异常;保持现有静态方法接口,内部连接创建随当前 yml 生效。 - 目的:保证建表 DDL 能使用当前激活配置的数据库连接,解决 dev/prod yml 下无法建表的问题。 - 工具:apply_patch(补丁写入) - 结果:已更新,可在激活对应 profile 后尝试新增门类触发表创建。 - 时间:2025-11-20 09:45(UTC+8) - 动作:定位 productSalesDocking 方法 - 工具:shell(rg -n "productSalesDocking" src/main/java/com/point/strategy/oaDocking/controller/ArchivesUploadController.java) - 输出:找到方法起始行 1136,确认分析范围 - 时间:2025-11-20 09:45(UTC+8) - 动作:查看方法周边 1100-1400 行 - 工具:shell(sed -n '1100,1400p' src/main/java/com/point/strategy/oaDocking/controller/ArchivesUploadController.java) - 输出:截取方法上半段,记录日志与统计逻辑 - 时间:2025-11-20 09:46(UTC+8) - 动作:扩展读取 1170-1900 行 - 工具:shell(sed -n '1170,1900p' src/main/java/com/point/strategy/oaDocking/controller/ArchivesUploadController.java) - 输出:获取循环处理逻辑但输出较大被截断 - 时间:2025-11-20 09:46(UTC+8) - 动作:聚焦 1500-1700 行 - 工具:shell(sed -n '1500,1700p' src/main/java/com/point/strategy/oaDocking/controller/ArchivesUploadController.java) - 输出:查看 100 列组装逻辑 - 时间:2025-11-20 09:47(UTC+8) - 动作:尝试用 python 截取完整方法 - 工具:shell(python - <<'PY' ...) - 输出:命令失败,提示 python: command not found - 时间:2025-11-20 09:47(UTC+8) - 动作:使用 python3 重试提取方法 - 工具:shell(python3 - <<'PY' ...) - 输出:成功导出方法文本,但因输出限制被截断 - 时间:2025-11-20 09:48(UTC+8) - 动作:定位 LIMIT 10 语句行号 - 工具:shell(rg -n "LIMIT 10" src/main/java/com/point/strategy/oaDocking/controller/ArchivesUploadController.java) - 输出:确认 1230/1232 行存在 LIMIT 10 - 时间:2025-11-20 09:49(UTC+8) - 动作:查看 LIMIT 相关代码行号 - 工具:shell(nl -ba src/main/java/com/point/strategy/oaDocking/controller/ArchivesUploadController.java | sed -n '1205,1245p') - 输出:确认 totalPending 统计与 LIMIT 10 取数位于 1206-1233 行 - 时间:2025-11-20 09:52(UTC+8) - 动作:移除 productSalesDocking 中的 LIMIT 10 限制 - 工具:apply_patch(编辑 src/main/java/com/point/strategy/oaDocking/controller/ArchivesUploadController.java) - 输出:删掉取数 SQL 的 LIMIT 10,保留 biz_date 过滤与排序,确保一次性读取全部数据 - 时间:2025-11-20 09:42(UTC+8) - 动作:检查 .claude 目录 - 工具:shell(ls .claude) - 输出:目录不存在,返回 "ls: .claude: No such file or directory" - 时间:2025-11-20 09:43(UTC+8) - 动作:列出仓库根目录文件 - 工具:shell(ls) - 输出:记录仓库根目录下的主要文件和目录 - 时间:2025-11-20 09:44(UTC+8) - 动作:查看 operations-log.md 内容 - 工具:shell(cat operations-log.md) - 输出:阅读历史留痕,确认记录格式 - 时间:2025-11-20 09:44(UTC+8) - 动作:查询当前系统时间 - 工具:shell(date '+%Y-%m-%d %H:%M:%S %Z') - 输出:2025-11-20 09:44:48 CST - 时间:2025-11-24 14:47(UTC+8) - 动作:确认 .claude 目录是否存在 - 工具:shell(ls .claude) - 输出:目录不存在,命令返回 “No such file or directory” - 时间:2025-11-24 14:48(UTC+8) - 动作:阅读 AnjuanAndJuanneiController.java 源码 - 工具:shell(sed -n '1,960p' src/main/java/com/point/strategy/originBatchUpload/AnjuanAndJuanneiController.java) - 输出:获取 uploadSimpleFilesAnjuan 及相关上传实现用于 OOM 分析 - 时间:2025-11-24 14:49(UTC+8) - 动作:查阅 PdfFileHelper.image2Pdf 实现 - 工具:shell(sed -n '520,620p' src/main/java/com/point/strategy/common/PdfFileHelper.java) - 输出:确认图片转 PDF 逻辑使用 ImageIO.read + iText Image 双重加载 - 时间:2025-11-24 14:50(UTC+8) - 动作:查询当前系统时间 - 工具:shell(date '+%Y-%m-%d %H:%M:%S %Z') - 输出:2025-11-24 14:50:02 CST - 时间:2025-11-24 14:55(UTC+8) - 动作:为传统案卷上传OCR处理增加线程池限流 - 位置:src/main/java/com/point/strategy/originBatchUpload/AnjuanAndJuanneiController.java - 变更:新增受控线程池替代每文件新建线程,限制并发与队列,避免多文件同时触发大量OCR线程造成内存峰值。 - 工具:apply_patch - 结果:代码已更新 - 时间:2025-11-24 14:56(UTC+8) - 动作:优化图片转PDF内存占用 - 位置:src/main/java/com/point/strategy/common/PdfFileHelper.java - 变更:移除 ImageIO 双重加载大图,直接用 iText Image 尺寸设置页面,减少一次内存占用。 - 工具:apply_patch - 结果:代码已更新 - 时间:2025-11-24 14:59(UTC+8) - 动作:对上传接口增加并发限流(每次最多3个文件) - 位置:src/main/java/com/point/strategy/originBatchUpload/AnjuanAndJuanneiController.java - 变更:新增 Semaphore,保证全局并行处理文件数不超过3;同时将 OCR 线程池调为 1~3 线程并缩短队列,匹配限流策略。 - 工具:apply_patch - 结果:代码已更新