← 所有项目

PROJECT CASE STUDY / DESKTOP · AUTOMATION

阶段性交付 · 手工版已交付,OCR 为独立原型

工程费用智能统计助手

围绕真实工程费用整理,交付五列手工录入、凭证图片关联与内嵌图片 Excel;OCR 辅助核对保留为独立原型。

MANUAL-FIRST · EVIDENCE LINKS · EMBEDDED EXCEL

01 / PROJECT OVERVIEW

让问题、实现与交付连成一条线

这次交付的核心不是“自动识别一切”,而是让零散的工程费用可录入、可保存、可对照凭证,并形成离开原软件也能查看的 Excel。

业务场景
装修工程材料与费用整理
当前交付
五列手工录入 Windows 版
技术探索
独立 OCR 辅助核对原型
设计重点
金额正确、保存可靠、凭证可携带
源码核验

以手工录入交付入口 manual_app.py 为主,另核对 OCR 原型 app.py。两条链路的能力分开陈述;不读取真实工程数据。

02 / BACKGROUND

项目背景

父亲从事装修工程承包,施工期间通过微信群保存材料采购的文字和图片。工程结束时,这些信息需要整理成费用明细和 Excel。

项目先探索了 OCR 与规则提取,也形成了以手工录入为主的独立交付入口。本案例将“实际交付的手工版”和“OCR 原型”分开,避免把两个入口合成一个不存在的自动化产品。

THE PROBLEM

解决的问题

记录既有文字又有凭证图片,整理时不仅要输入金额,还要留住来源。相同金额不一定是重复费用;未写明年份的日期也不能由软件替使用者猜测。

03 / MY ROLE

个人职责

根据父亲的工程材料记录需求开发工具,整理字段、复用已有思路并完善核对与导出流程。

  • 根据工程费用整理需求确定表格字段和人工操作流程。
  • 在 AI 辅助下迭代保存、校验、图片关联与导出,关注误操作和失败时的输入保留。
  • 复用此前项目的输入—核对—输出思路,但按费用业务重新组织数据和交付方式。

项目在 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

技术选择,要能解释用途

Python + PySide6
五列表格、Tab 粘贴、Ctrl+S、延迟自动保存和图片操作。
SQLite + Decimal
按工程组织数据,金额校验后以整数分保存;事务控制批量写入。
openpyxl
五列费用明细、SUM 合计、数字格式和工作簿内部来源链接。
Pillow
验证并保留来源图片,计算 Excel 图片显示尺寸与行高。
PaddleOCR / PP-OCRv5
仅用于另一条 OCR 原型链路;手工版打包入口明确排除 OCR 依赖。

05 / SYSTEM ARCHITECTURE

系统架构

当前交付版:费用行与图片证据分开组织ARCHITECTURE / SCHEMATIC
  1. 01手工输入
    • manual_app.py / PySide6
    • 序号、费用项目、金额、日期、备注
    • 文字粘贴 / 文件与剪贴板图片
  2. 02本地存储与关联
    • ManualStore → SQLite
    • Decimal → 整数分
    • 费用行 ↔ 多张来源图片
  3. 03Excel 交付
    • manual_export.py
    • 五列明细 + 首图缩略图
    • 来源页嵌入全部关联原图
  4. 04独立探索链路
    • app.py / OCR 原型
    • PaddleOCR → 规则解析 → 人工确认
    • 未接入手工交付版

手工交付入口没有自动 OCR、材料分类或数量×单价校验。OCR 原型的字段、重复提示与导出方式另有实现,不混作同一条已完成工作流。

业务处理流程

从输入到输出的业务流程SCHEMATIC
  1. 01人工整理费用文字
  2. 02五列录入并关联来源图
  3. 03金额校验 / 草稿保存
  4. 04导出前完整性检查
  5. 05内嵌图片的 Excel 文件

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

已实现

可携带的 Excel

五列明细中嵌入首图缩略图,来源页内嵌全部关联原图;工作簿内部链接便于查看。金额、日期居中,行高考虑文字与图片。

manual_export.py:44–104

已实现

工程隔离与迁移

读写受工程 ID 限制。旧记录迁移使用标记防止重复迁入或删除后复活;备份包含本地数据库和原图。

manual_store.py:6–34 · expense_core.py:177–187

OCR 原型

OCR、分类与重复提示

另一个原型可粘贴文字、依次识别批量图片,按关键词分类并提示疑似重复;需要人工核对,未接入当前手工交付版。

app.py:111–185 · expense_core.py:15–47,132–150

未实现

数量 / 单位 / 单价校验

手工表没有独立数量、单位和单价字段。原型 quantity 仍是组合字符串,自动解析的 unit_price 为 None;未实现数量×单价一致性校验。

expense_core.py:45–47 · manual_app.py:33

07 / TECHNICAL CHALLENGES

技术难点:把业务例外放进设计

真实可用的费用工具需要先保证输入、保存和证据链。面对含糊的原始材料,保留人工判断比宣称全自动更重要。

08 / SOLUTIONS

解决方案

01

不能让金额输入悄悄变成错误

遇到的问题

直接使用浮点数或接受任意字符串,会让金额含义与保存结果产生偏差。

代码中的解决方式

cents 使用 Decimal 校验精度和范围,再转换为整数分。save_grid 先准备整批有效行,再在事务中保存,错误附带行号。

代码依据 expense_core.py:cents · manual_store.py:ManualStore.save_grid

02

用户正在编辑时,保存还没拿到新值

遇到的问题

Qt 的活动编辑器和表格数据不是始终同步;保存失败也不能把界面清空。

代码中的解决方式

手工界面在 Ctrl+S 等操作时提交活动编辑器,变更后延迟保存。错误反馈与输入保留有专门的 UI 测试场景。

代码依据 manual_app.py:88–114 · tests/test_manual_ui.py

03

Excel 离开软件后仍要看得懂

遇到的问题

只写外部图片路径,转发 Excel 后可能找不到凭证;大图又会影响排版。

代码中的解决方式

把首图缩略图和全部来源图嵌入同一工作簿,并创建内部链接;按文本和图像估算行高,保留数值金额与文本序号。

代码依据 manual_export.py:export_manual

实现边界:原生 Excel/WPS 逐项视觉验收仍待补充,不把合成结构测试写成跨软件全面验收。

04

同价不是重复,识别结果也不是事实

遇到的问题

不同费用可能同金额,日期也可能缺少年份。强行去重或补日期可能抹掉真实支出。

代码中的解决方式

手工版允许同价不同记录,不自动补年份。OCR 原型只提示疑似重复,需人工选择同笔合并或不同笔;两条链路分开交付。

代码依据 tests/test_manual.py:test_same_amount_not_blocked · expense_core.py:duplicates / resolve

实现边界:手工版不做自动材料名称归一化、分类或语义去重。

SOURCE EXCERPT

代码节选:从实现看取舍

这是手工保存复用的金额校验函数。它把金额处理落实为明确的输入约束,而不是依靠浮点数或界面格式来保证正确性。

金额先校验,再转换为整数分expense_core.py:9–14 · cents
def 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

开发过程

按现有实现与版本资料整理阶段,不推断未经确认的具体开发日期。

  1. 01

    围绕原始记录设计字段

    先明确需要交付的费用明细和凭证对应关系,保留不确定的日期原文,不推断缺失年份。

  2. 02

    探索 OCR,再明确手工交付边界

    保留文字/图像解析原型,同时提供可直接编辑、核对和导出的手工版入口,不把原型包装成已集成能力。

  3. 03

    打磨输入与最终文件

    完善活动编辑器提交、自动保存、失败保护、多图关联、迁移和内嵌图片 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_blocked
  • 活动编辑器与失败保护

    Ctrl+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;没有工地数量、节省金额或长期效果的实测结论。

  • 以 manual_app.py 为入口的手工录入 Windows 程序与使用说明。
  • 按工程组织的费用记录、原图关联与备份能力。
  • 五列明细和内嵌来源图片的 Excel 文件。
  • 独立 OCR 原型与对应代码,明确不作为手工版已集成功能宣传。

11 / FUTURE IMPROVEMENTS

未来规划

以下是后续改进方向,不是已完成能力。

  • 规划将 OCR 原型整理成可选“生成草稿”入口,先评估错误与回退再考虑集成。
  • 规划按实际需求新增独立数量、单位、单价字段和数量×单价一致性提示。
  • 规划改进材料名称归一化及分类规则,避免把自由文本视作标准材料库。
  • 规划在干净 Windows 和原生 Excel/WPS 中补充打开、公式重算、排版和打印验收。

PROJECT GALLERY

项目截图与输出示例

工程费用手动录入助手空表界面
使用者提供的真实界面截图;未展示业务明细,不作为业务成效证明。打开原图 ↗

真实手工版界面展示五列费用表、当前工程、来源图片区、保存/备份和 Excel 导出。空白金额不构成工程成果数据;数量、单价与 OCR 自动提取不属于这张界面的已交付功能。

已展示使用者提供的真实界面。脱敏报表和更多业务场景待补充;不以空数据截图证明识别准确率、运营规模或完整验收。

查看 V1.1 项目补充说明

项目背景 · 工程结束前,先把记录整理好

父亲从事装修工程承包,施工中通过微信群记录每日购买的材料、数量、费用,信息同时包含文字和图片。工程结束后,需要整理为费用明细与 Excel 汇总。

工具的目标是把分散记录转化为可以核对的结构化工程费用数据。

核心功能 · 手工交付与原型边界

  • 手工交付版:序号、费用支出项目、金额、日期、备注五列录入。
  • 支持图片关联、金额校验、保存与 Excel 内嵌来源图片。
  • 数量、单位、单价不属于当前手工表独立字段,尚无数量×单价校验。
  • OCR、规则分类与疑似重复提示属于独立原型,未接入手工交付版。

复用经验,重新理解业务

项目沿用了配送工具中输入、核对与输出的技术思路;当前手工版针对费用与来源图片重新设计结构,OCR 原型单独保留。

以真实材料记录测试流程、逐步完善异常处理,比直接照搬已有项目更重要。

完成状态与展示边界

2026 年 11 月初,项目已完成。这里不展示未经测量的工地数量、节省金额或长期业务效果。

真实界面、脱敏材料示例与版本说明待补充。当前不使用生成图像模拟软件运行截图。

我学到的事情

可复用的不只是代码,也包括输入、核对、输出的流程思路。新的业务仍需要重新确认字段、异常和使用者的操作方式。