已实现
五列录入与保存
序号、费用支出项目、金额、日期、备注。支持 Tab 分隔粘贴、600ms 延迟保存、Ctrl+S 提交活动编辑器;失败时保留输入。
manual_app.py:33,46,88–152PROJECT CASE STUDY / DESKTOP · AUTOMATION
阶段性交付 · 手工版已交付,OCR 为独立原型
围绕真实工程费用整理,交付五列手工录入、凭证图片关联与内嵌图片 Excel;OCR 辅助核对保留为独立原型。
MANUAL-FIRST · EVIDENCE LINKS · EMBEDDED EXCEL
01 / PROJECT OVERVIEW
这次交付的核心不是“自动识别一切”,而是让零散的工程费用可录入、可保存、可对照凭证,并形成离开原软件也能查看的 Excel。
02 / BACKGROUND
父亲从事装修工程承包,施工期间通过微信群保存材料采购的文字和图片。工程结束时,这些信息需要整理成费用明细和 Excel。
项目先探索了 OCR 与规则提取,也形成了以手工录入为主的独立交付入口。本案例将“实际交付的手工版”和“OCR 原型”分开,避免把两个入口合成一个不存在的自动化产品。
THE PROBLEM
记录既有文字又有凭证图片,整理时不仅要输入金额,还要留住来源。相同金额不一定是重复费用;未写明年份的日期也不能由软件替使用者猜测。
03 / MY ROLE
根据父亲的工程材料记录需求开发工具,整理字段、复用已有思路并完善核对与导出流程。
项目在 AI 辅助下完成迭代。这里展示实际参与的需求、业务判断、实现与验收,不把辅助生成等同于独立精通。
MY DECISIONS / 个人贡献与取舍
父亲的工程材料记录散落在微信群文字和图片中。最终需要的不是一段识别文本,而是一份能说明费用从哪里来的清单。我围绕录入、保存、凭证关联和 Excel 输出整理需求,把交付范围优先放在可检查的人工流程上。
已交付手工版是序号、费用支出项目、金额、日期、备注五列,不具备独立的数量、单位和单价字段。金额经 Decimal 校验后转为整数分存储,费用读取带工程 ID,图片与费用关联,导出可内嵌来源图片。材料名称归一、数量×单价核对和自动分类不能写成手工版既有能力。
另有 OCR 辅助核对原型,探索图片文字、规则解析、分类和疑似重复提示。ManualEntry 打包入口明确排除 PaddleOCR,说明手工交付程序不依赖该原型。未来若整合,应先生成可编辑草稿并评估错误回退,再决定是否进入实际交付。
这次实践使我更重视标准化输入和来源可追踪。复用的是输入—核对—输出的思路;是否直接复用了哪一个模块、哪一版源码,仍需补齐版本对比,不把相似结构当成已经证明的代码复用。
依据:manual_store.py:6–34;expense_core.py:9–14;ManualEntry.spec:3;现有 manual_exporter 与原型审计。
04 / TECH STACK
05 / SYSTEM ARCHITECTURE
手工交付入口没有自动 OCR、材料分类或数量×单价校验。OCR 原型的字段、重复提示与导出方式另有实现,不混作同一条已完成工作流。
06 / CORE FEATURES
已实现
序号、费用支出项目、金额、日期、备注。支持 Tab 分隔粘贴、600ms 延迟保存、Ctrl+S 提交活动编辑器;失败时保留输入。
manual_app.py:33,46,88–152已实现
使用 Decimal 校验并保存整数分,拒绝非正数和超出两位小数等错误。允许未填金额暂存,正式导出再检查完整性。日期按原字符串保留,不宣传日期有效性校验。
expense_core.py:9–14 · manual_store.py:30–45已实现
选中费用行后可粘贴截图、多选文件或拖入图片。保存原图并通过关联记录绑定;移除关联不会删除原图。
manual_app.py:131–159 · manual_store.py:47–63已实现
五列明细中嵌入首图缩略图,来源页内嵌全部关联原图;工作簿内部链接便于查看。金额、日期居中,行高考虑文字与图片。
manual_export.py:44–104已实现
读写受工程 ID 限制。旧记录迁移使用标记防止重复迁入或删除后复活;备份包含本地数据库和原图。
manual_store.py:6–34 · expense_core.py:177–187OCR 原型
另一个原型可粘贴文字、依次识别批量图片,按关键词分类并提示疑似重复;需要人工核对,未接入当前手工交付版。
app.py:111–185 · expense_core.py:15–47,132–150未实现
手工表没有独立数量、单位和单价字段。原型 quantity 仍是组合字符串,自动解析的 unit_price 为 None;未实现数量×单价一致性校验。
expense_core.py:45–47 · manual_app.py:3307 / TECHNICAL CHALLENGES
真实可用的费用工具需要先保证输入、保存和证据链。面对含糊的原始材料,保留人工判断比宣称全自动更重要。
08 / SOLUTIONS
直接使用浮点数或接受任意字符串,会让金额含义与保存结果产生偏差。
cents 使用 Decimal 校验精度和范围,再转换为整数分。save_grid 先准备整批有效行,再在事务中保存,错误附带行号。
代码依据 expense_core.py:cents · manual_store.py:ManualStore.save_grid
Qt 的活动编辑器和表格数据不是始终同步;保存失败也不能把界面清空。
手工界面在 Ctrl+S 等操作时提交活动编辑器,变更后延迟保存。错误反馈与输入保留有专门的 UI 测试场景。
代码依据 manual_app.py:88–114 · tests/test_manual_ui.py
只写外部图片路径,转发 Excel 后可能找不到凭证;大图又会影响排版。
把首图缩略图和全部来源图嵌入同一工作簿,并创建内部链接;按文本和图像估算行高,保留数值金额与文本序号。
代码依据 manual_export.py:export_manual
实现边界:原生 Excel/WPS 逐项视觉验收仍待补充,不把合成结构测试写成跨软件全面验收。
不同费用可能同金额,日期也可能缺少年份。强行去重或补日期可能抹掉真实支出。
手工版允许同价不同记录,不自动补年份。OCR 原型只提示疑似重复,需人工选择同笔合并或不同笔;两条链路分开交付。
代码依据 tests/test_manual.py:test_same_amount_not_blocked · expense_core.py:duplicates / resolve
实现边界:手工版不做自动材料名称归一化、分类或语义去重。
SOURCE EXCERPT
这是手工保存复用的金额校验函数。它把金额处理落实为明确的输入约束,而不是依靠浮点数或界面格式来保证正确性。
expense_core.py:9–14 · centsdef cents(value):
try: d=Decimal(str(value).replace(',',''))
except InvalidOperation: raise ValueError('金额格式无效')
if not d.is_finite() or d<=0 or d>Decimal('999999999.99') or d*100!=(d*100).to_integral_value():
raise ValueError('金额必须为正数,最多两位小数,且小于十亿元')
return int(d*100)来自已核验的本地源码节选;为便于阅读保留原有实现片段,不是完整可运行模块。
DEVELOPMENT PROCESS
按现有实现与版本资料整理阶段,不推断未经确认的具体开发日期。
先明确需要交付的费用明细和凭证对应关系,保留不确定的日期原文,不推断缺失年份。
保留文字/图像解析原型,同时提供可直接编辑、核对和导出的手工版入口,不把原型包装成已集成能力。
完善活动编辑器提交、自动保存、失败保护、多图关联、迁移和内嵌图片 Excel 的结构与排版。
09 / TESTING & VALIDATION
当前仓库有手工存储、界面、导出、排版和原型规则等测试定义。历史报告同时记录了剪贴板复核及原生 Excel/WPS 尚未验收的限制。
重开能读回保存值,日期原文保留;跨工程修改被拒绝。
tests/test_manual.py:test_save_and_reopen / test_isolation非法金额不改变旧数据;草稿可暂存,但正式导出缺项会被拦截。
tests/test_manual.py:test_invalid_amount_rolls_back / test_draft_allowed_export_blockedCtrl+S 读到编辑中的新值;自动保存和失败后输入保留有对应场景。
tests/test_manual_ui.py:test_ctrl_s_commits_active_editor / test_failed_save_keeps_input_and_previous_data合成图片检查费用行关联、来源页、xlsx 媒体结构及行高/居中偏移。
tests/test_manual.py:test_images_embedded_and_associated · tests/test_manual_layout.py重复迁移与删除后不复活;模拟导出错误不留下被误认为成品的文件。
tests/test_manual.py:test_deleted_legacy_not_resurrected / test_failed_export_leaves_no_final_file以上为业务项目源码中的验证设计与测试依据。本轮验证的是作品集网站,没有重新运行这些业务项目的完整测试,也没有对线上系统做操作。
10 / RESULTS
已完成工程费用手工录入桌面版,另保留 OCR 辅助核对原型。可交付的价值是可编辑的五列费用数据、来源图片关联和自包含 Excel;没有工地数量、节省金额或长期效果的实测结论。
11 / FUTURE IMPROVEMENTS
以下是后续改进方向,不是已完成能力。
PROJECT GALLERY

真实手工版界面展示五列费用表、当前工程、来源图片区、保存/备份和 Excel 导出。空白金额不构成工程成果数据;数量、单价与 OCR 自动提取不属于这张界面的已交付功能。
已展示使用者提供的真实界面。脱敏报表和更多业务场景待补充;不以空数据截图证明识别准确率、运营规模或完整验收。
父亲从事装修工程承包,施工中通过微信群记录每日购买的材料、数量、费用,信息同时包含文字和图片。工程结束后,需要整理为费用明细与 Excel 汇总。
工具的目标是把分散记录转化为可以核对的结构化工程费用数据。
项目沿用了配送工具中输入、核对与输出的技术思路;当前手工版针对费用与来源图片重新设计结构,OCR 原型单独保留。
以真实材料记录测试流程、逐步完善异常处理,比直接照搬已有项目更重要。
2026 年 11 月初,项目已完成。这里不展示未经测量的工地数量、节省金额或长期业务效果。
真实界面、脱敏材料示例与版本说明待补充。当前不使用生成图像模拟软件运行截图。
可复用的不只是代码,也包括输入、核对、输出的流程思路。新的业务仍需要重新确认字段、异常和使用者的操作方式。