← 所有项目

PROJECT CASE STUDY / DESKTOP · OCR

已交付使用

液化气配送智能统计助手

从微信群聊天截图到订单明细,把 OCR、业务解析与人工核对连接为一个 Windows 工作流。

LOCAL OCR · HUMAN REVIEW · RELIABLE EXPORT

01 / PROJECT OVERVIEW

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

把“识别出文字”与“得到可信统计”分开:先解析订单证据,再让使用者核对无法确定的信息,最后才生成正式报表。

业务场景
微信群订单与配送回复
交付形态
Windows 本地桌面工具
当前阶段
已交付使用并完成操作教学
设计重点
不确定信息留给人工判断
源码核验

以本地 Windows 交付版代码为依据。当前图像布局面向电脑版微信浅色截图;本轮不运行 OCR 或读取真实订单。

02 / BACKGROUND

项目背景

母亲所在单位通过微信群记录订单和配送完成回复。人工统计需要反复查找编号、匹配配送人和瓶数,再汇总为 Excel。

工具保留了原有群聊流程,使用者选择截图和统计日期,在本地整理信息。它没有自动读取微信聊天库,也不要求配送人员改用另一套系统。

THE PROBLEM

解决的问题

聊天截图中的昵称、时间分隔、气泡和编号简写使信息难以直接汇总。OCR 文本中即使出现了订单号,也不能据此确认订单已送达、归谁配送或实际瓶数。

03 / MY ROLE

个人职责

围绕母亲所在单位的配送统计需求,参与工具设计、开发、异常核对流程与 Windows 软件交付。

  • 整理订单与完成回复的匹配规则,区分明确证据、候选信息和冲突。
  • 在 AI 辅助下迭代桌面核对流程,让补录、修改、删除与独立冲突处理可以被使用者理解。
  • 关注 Excel 最终交付、版本归档和本地软件打包,并保留真实使用者交付的验收边界。

项目在 AI 辅助下完成迭代。这里展示实际参与的需求、业务判断、实现与验收,不把辅助生成等同于独立精通。

MY DECISIONS / 个人贡献与取舍

我的取舍:让不确定性可以核对,再交付统计结果

母亲所在液化气配送企业用微信群记录订单与完成回复。改变整套日常工作方式会增加操作负担,所以工具以本地导入截图为入口。我参与整理编号、配送人、瓶数和完成回复之间的规则,并在 AI 辅助下推进解析、核对界面和 Excel 交付。

OCR 得到文字和位置,不等于得到订单事实。简写编号需要结合消息内前缀,一条回复可能展开多个订单;昵称只是候选,无法确认身份时不能凭订单文字猜配送员。瓶数证据不一致、多人回复或缺号需要独立处理。

OrderBook.conflicts 分开收集人员与瓶数冲突;候选保留来源,confirm 先调用 validation,问题未处理不确认。操作流程是导入 → 识别/解析 → 逐项核对原图、补录或修改 → 处理冲突 → 确认 → 导出“配送明细”和“配送员汇总”。人工审核是正常步骤,不是软件出错后的临时补救。

本地软件已交付使用,并向实际使用者做过操作教学,这是本人提供的交付事实。它不等于安装器已在所有电脑上验收,也不等于 OCR 准确率经过测量。当前仍应使用授权样本检查漏单、冲突和导出,不宣传百分之百自动识别。

依据:matching.py:21–55;order_book.py:218–258,263–280;既有 message_rules、Excel 审计;交付与操作教学依据本轮本人提供说明。

04 / TECH STACK

技术选择,要能解释用途

Python + PySide6
桌面表格、对话框、拖放与后台 OCR 工作线程。
PaddleOCR + PP-OCRv5
本地 mobile 检测与中文识别模型,使用 CPU;方向分类与去畸变未启用。
Pillow + 布局规则
处理中文图片路径与长图,按桌面浅色气泡布局筛选消息。
openpyxl
生成两张工作表,排序、筛选、冻结窗格并回读校验。

05 / SYSTEM ARCHITECTURE

系统架构

本地截图到订单簿,再到正式报表ARCHITECTURE / SCHEMATIC
  1. 01输入与识别
    • 本地 PNG / JPG / JPEG
    • PySide6 → DesktopWorker
    • PaddleLocalOCR / TiledOCR
  2. 02消息结构化
    • DesktopLight 气泡边界
    • OCR 框组合与多单展开
    • ScanPipeline → Record
  3. 03规则与人工复核
    • OrderBook 合并订单证据
    • 人员 / 瓶数独立冲突
    • 原图对照、修正、确认
  4. 04输出与保留
    • OrderGate 导出门禁
    • openpyxl → 两表 / 回读
    • 按工作群与日期归档

模型与文件处理在本地。ROI 用于布局筛选,OCR 仍读取整张输入图;原图定位是会话信息,不能当作永久证据附件库。

业务处理流程

从输入到输出的业务流程SCHEMATIC
  1. 01选择截图与统计日期
  2. 02OCR 与气泡结构化
  3. 03订单合并 / 缺号检查
  4. 04人工处理人员和瓶数
  5. 05通过门禁后导出 Excel

06 / CORE FEATURES

核心功能

已实现

批量输入与长图处理

支持文件选择和拖放。长图分段并还原坐标,以重叠区归属避免重复框;不宣称自动去噪、手写专用识别或任意布局通用。

desktop_app.py:406–444 · ocr_tiling.py:9–37

已实现

编号展开与多条记录

按已知明确前缀展开简写和连续区间;倒序、过大范围或语义不明确时留待核对,多单回复不把整句瓶数复制到每单。

message_rules.py:6–44

已实现

人员与瓶数独立处理

人员候选取自完成回复,冲突分别记录处理状态。选择配送员不会消除瓶数冲突,新证据可触发重新确认。

order_book.py:236–245 · sender_evidence.py:15

已实现

人工核对与增改删

可对照关联消息原图、补录遗漏、改号和删除错误单。删除标记避免重新导入时复活;原图在重启后可能需要重新导入。

desktop_app.py:303–364,522–533 · order_book.py:185

已实现

正式 / 草稿导出

正式输出被缺号、未确认单、人员/瓶数冲突与待关联修正拦截。草稿保留待处理状态,汇总只计已确认送达记录。

order_export.py:35 · order_book.py:272–290

已实现

两表与历史版本

实际工作表为“配送明细”和“配送员汇总”。明细按数字编号排序,汇总按瓶数排序,带筛选/冻结;保存后回读,按群和日期保留历史版本。

order_export.py:46–106 · report_archive.py:12

07 / TECHNICAL CHALLENGES

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

难点不在于调用一次模型,而在于把有误差的文字、含糊的业务回复和可靠的最终统计衔接起来。

08 / SOLUTIONS

解决方案

01

识别坐标与聊天消息对不上

遇到的问题

长截图会分段识别;零散文字也可能看起来像订单。

代码中的解决方式

TiledOCR 还原原图坐标并划分重叠归属,随后结合浅色气泡轮廓与 OCR 框筛选消息,而不是见到数字就记单。

代码依据 ocr_tiling.py:TiledOCR · desktop_layout.py:detect_desktop_light

实现边界:仅支持已校准的电脑版浅色布局,不是训练出的通用聊天理解模型。

02

简写与一条消息中的多单

遇到的问题

完成回复可能包含一个前缀和多个尾号,模糊横线又可能导致误解。

代码中的解决方式

completion_orders 处理已知语法并展开区间;expand_messages 逐单生成记录,对多单数量保持保守,无法确定的内容进入 review。

代码依据 message_rules.py:completion_orders / expand_messages

03

处理了人员,却掩盖了数量错误

遇到的问题

同一订单可能有多个完成回复,选择一个人并不意味着瓶数也正确。

代码中的解决方式

sender_reviewed 与 quantity_reviewed 分别控制冲突状态。conflicts 独立检查人员集合与数量集合,人工修改后仍按对应维度重新核验。

代码依据 order_book.py:conflicts · tests/test_conflict_workflow.py

04

自动化输出看似成功,实际还有漏单

遇到的问题

仅检查识别到的订单无法发现所有遗漏;输出文件也可能不可写。

代码中的解决方式

订单簿检查内部缺号,可由使用者指定首尾范围。OrderGate 阻止未处理问题进入正式报表,保存后回读核对表结构与汇总。

代码依据 order_book.py:issues · order_export.py:OrderGate / inspect_report

实现边界:默认只能发现已见编号范围内的缺号;不能推断当天完整业务总量。

SOURCE EXCERPT

代码节选:从实现看取舍

这个函数体现了一个产品判断:处理了某一种冲突,不应自动抹去另一种冲突。

人员和瓶数分别保留核对状态order_book.py:236–245 · OrderBook.conflicts
    def conflicts(self,row):
        issues=[]
        done=[e for e in row.evidence if e[0]=='delivered']
        names={e[2] for e in done if e[2]};nicks={e[3] for e in done if e[3]}
        if not row.sender_reviewed and (len(names)>1 or (len(nicks)>1 and not (all(e[2] for e in done) and len(names)==1))):
            issues.append('配送员冲突:请查看完成回复并选择实际配送员')
        quantities={e[1] for e in row.evidence if e[0] in ('original','delivered') and e[1] is not None}
        if not row.quantity_reviewed and len(quantities)>1:
            issues.append('瓶数冲突:请核对原始订单与完成回复的实际瓶数')
        return issues

来自已核验的本地源码节选;为便于阅读保留原有实现片段,不是完整可运行模块。

DEVELOPMENT PROCESS

开发过程

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

  1. 01

    从群聊流程提取业务语法

    围绕订单与完成回复,整理编号、人员、瓶数和来源证据,保留原有工作习惯。

  2. 02

    连接识别、结构化与人工核对

    将模型输出接到布局与消息解析,再让冲突、缺号、补录和修正进入可操作的核对流程。

  3. 03

    把最终文件作为交付对象

    完善正式导出门禁、两表格式、保存回读与历史版本,继续处理本地软件安装和使用门槛。

09 / TESTING & VALIDATION

测试与验收

仓库测试覆盖解析、布局、冲突流程和导出结构;涉及 OCR 的假模型测试验证规则与坐标,不等于真实识别准确率。

  • 多单与区间语法

    已知前缀的多单回复按规则展开;倒序、歧义内容不自动通过。

    tests/test_business_messages.py
  • 双重冲突不能相互覆盖

    确认人员后瓶数冲突仍在;新证据要求重新处理相应维度。

    tests/test_conflict_workflow.py
  • 删除与重复导入

    删除错误记录后再次导入不复活;人工修正优先,新增证据仍需重新确认。

    tests/test_delete_history.py · tests/test_pending_preservation.py
  • 正式报表的门禁和结构

    存在未处理问题时拦截正式导出;两表排序、筛选、冻结及汇总一致。

    tests/test_order_export.py · tests/test_excel_polish.py
  • 保存失败不能显示成功

    备用路径保存并回读成功后才报告成功,失败保留可操作反馈。

    tests/test_conflict_gui.py

以上为业务项目源码中的验证设计与测试依据。本轮验证的是作品集网站,没有重新运行这些业务项目的完整测试,也没有对线上系统做操作。

10 / RESULTS

项目成果与最终交付

形成了本地 OCR、业务规则和人工核对结合的 Windows 工具,并交付实际使用者学习与试用。当前源码保留工作群隔离与历史报表;没有可公开的准确率、节省工时或跨机器全面验收结果。

  • 本地 Windows 操作界面与模型资源组织。
  • 带人工复核的订单簿及 Excel 两表输出。
  • 按工作群、日期和版本保留的历史报表。
  • 安装与试用说明;实际使用者无指导试用和独立干净机器验收仍待完善。

11 / FUTURE IMPROVEMENTS

未来规划

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

  • 规划用经授权的脱敏样本建立逐单准确率与漏单基准,再讨论可量化效果。
  • 规划在独立 Windows 电脑验证安装、升级、中文路径和实际使用者无指导操作。
  • 规划若拓展手机或深色截图,独立设计布局规则和回归样本。
  • 规划设计原图证据长期保存与授权策略,避免把临时定位当作永久追溯。

PROJECT GALLERY

项目截图与输出示例

液化气配送统计助手空订单界面
使用者提供的真实界面截图;未展示业务明细,不作为业务成效证明。打开原图 ↗

真实软件主界面展示截图导入、统计日期、订单核对状态、增改删与 Excel 出口。当前空表没有真实订单或客户信息;独立冲突核对界面和脱敏 Excel 成品尚未提供。

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

查看 V1.1 项目补充说明

项目背景 · 每天重复的人工统计

单位通过微信群记录订单,配送人员在群中回复完成情况。每天几十到上百条订单的业务场景,需要整理编号、人员和瓶数。

原流程是翻阅群聊、人工匹配订单与回复,再统计明细。工具将截图识别与结构化核对串联起来,帮助使用者完成这项工作。

核心功能 · 从图片走向结构化数据

  • 批量导入聊天截图,预处理后使用 PaddleOCR 提取文字。
  • 提取订单编号、配送人和瓶数,处理简写编号、连续编号区间和合并回复。
  • 输出订单明细及配送人员汇总,自动生成 Excel。
  • 使用 PySide6 提供 Windows 本地界面,结合本地文件管理完成交付。

识别只是流程的第一步

聊天截图包含昵称、时间分隔、气泡和多种编号写法。OCR 文本不能直接等同于准确业务记录。

结构化解析发现订单冲突、瓶数冲突和不确定内容后,交由使用者核对与修正;无法确定的编号、人员和瓶数不强行自动得出结论。

异常核对机制

  • 保留原始信息与解析结果的对应关系,便于人工对照。
  • 冲突记录与不确定内容进入核对流程。
  • 核对和数据修正之后再生成报表,避免把识别错误直接传播到汇总。

交付与收获

工具已交付使用,并向实际使用者完成操作教学。尚无经过测量的识别准确率或节省工时,不作量化效果承诺。

这个项目让我接触到 AI 识别、业务规则和人工校验如何协作,也让我开始关注本地软件的打包、文件组织和使用门槛。