用 AI 解析采购订单,从上传到自动生成 Draft 订单全流程实战


网罗开发 (小红书、快手、视频号同名)

大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验 。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员

👋 大家好,我是展菲!

📱 全网搜索"展菲",即可纵览我在各大平台的知识足迹。

📣 公众号"Swift社区",每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。

💬 微信端添加好友"fzhanfei",与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。

📅 最新动态:2025 年 3 月 17 日

快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!

文章目录

    • 摘要
    • 引言
    • 功能实现总览
    • 后端接口设计与代码实现
      • [文件上传接口(Node.js 示例)](#文件上传接口(Node.js 示例))
      • [AI 解析任务模拟(Python 脚本)](#AI 解析任务模拟(Python 脚本))
    • [前端页面逻辑(Vue 示例)](#前端页面逻辑(Vue 示例))
    • 应用场景举例
      • [场景 1:客户上传多个订单 PDF](#场景 1:客户上传多个订单 PDF)
      • [场景 2:图片订单识别失败](#场景 2:图片订单识别失败)
      • [场景 3:系统长时间未提交草稿订单](#场景 3:系统长时间未提交草稿订单)
    • [QA 常见问题答疑](#QA 常见问题答疑)
    • 总结

摘要

很多企业都面临一个老问题:客户发来的采购订单格式千奇百怪,有的是 PDF,有的是 Excel,甚至有拍照的图片。人工录入这些订单,不仅耗时费力,还容易出错。那有没有一种方法能自动读取这些订单内容,然后直接在系统中生成一份草稿订单供业务员补充?

当然有。本文就带你一步步搭建一个完整的 AI 驱动订单解析流程,从文件上传、AI 解析、自动建单,到草稿状态的后续处理。用简单的 Python 脚本、Node 服务和一点前端页面,就能实现一个企业内部非常实用的自动化能力。

引言

我们以前在做客户订单录入时,经常会遇到这样的问题:

  • 一堆 PDF 或图片文件,内容布局五花八门
  • 业务员需要逐行复制粘贴,一不小心就抄错
  • 有时候订单多,一等就是一两个小时才能录完

为了解决这些问题,我们设计了一个新的流程:

  1. 客户下单 → 上传原始订单(PDF、Excel、图片)
  2. 系统调用 AI 模型自动识别其中的信息
  3. 自动生成草稿订单,业务员只需稍加确认和补充
  4. 确认无误后提交进入正式审批流程

整套流程下来,既保留了人工可控性,也大大减少了重复性劳动。

功能实现总览

这个功能的核心步骤如下:

  1. 用户选择客户公司后,系统显示"Upload PO"按钮
  2. 上传支持多个文件格式(PDF/Excel/Image)
  3. 上传后系统将文件送入 AI 解析任务
  4. 解析完成后,自动将结构化数据写入订单草稿表
  5. 草稿订单显示在前端 Draft Tab,供用户继续补充并提交

我们会通过一个简单的前端+Node.js 后端+Python 解析脚本来实现这个功能,方便大家快速上手。

后端接口设计与代码实现

文件上传接口(Node.js 示例)

js 复制代码
// routes/upload.js
const express = require('express')
const multer = require('multer')
const path = require('path')
const { v4: uuidv4 } = require('uuid')
const { parsePO } = require('../services/aiParser')

const router = express.Router()
const upload = multer({ dest: 'uploads/' })

router.post('/upload-po', upload.array('files'), async (req, res) => {
  const customerId = req.headers['customer-id']
  if (!customerId) return res.status(400).json({ message: 'Missing customer-id' })

  const taskId = uuidv4()
  const files = req.files

  // 模拟异步解析任务
  files.forEach((file) => {
    parsePO(file.path, taskId, customerId)
  })

  res.json({ taskId, fileCount: files.length })
})

module.exports = router

AI 解析任务模拟(Python 脚本)

python 复制代码
# ai_parser.py
import json
import random
from pathlib import Path

def parse_order(file_path):
    # 模拟 AI 解析逻辑
    return {
        "orderId": str(random.randint(10000, 99999)),
        "status": "DRAFT",
        "type": "AI",
        "sourceFile": file_path,
        "confidenceScore": round(random.uniform(0.7, 0.99), 2),
        "fields": {
            "productName": "Example Widget",
            "quantity": 100,
            "unitPrice": 19.99,
            "currency": "USD"
        }
    }

def save_result(result, task_id):
    Path(f'tasks/{task_id}').mkdir(parents=True, exist_ok=True)
    with open(f'tasks/{task_id}/result.json', 'w') as f:
        json.dump(result, f, indent=2)

# 测试运行
if __name__ == "__main__":
    file_path = 'uploads/sample_order.pdf'
    task_id = 'abc123'
    result = parse_order(file_path)
    save_result(result, task_id)

实际项目中可以替换成 Azure OCR + OpenAI function calling 的组合,或调用成熟的文档解析 API(如 Mindee、Veryfi)

前端页面逻辑(Vue 示例)

html 复制代码
<!-- UploadPo.vue -->
<template>
  <div>
    <button v-if="selectedCustomerId" @click="openUpload">Upload PO</button>
    <input type="file" ref="fileInput" multiple @change="handleUpload" hidden />
  </div>
</template>

<script setup>
import axios from 'axios'
import { ref } from 'vue'

const selectedCustomerId = 'customer-001'
const fileInput = ref(null)

const openUpload = () => {
  fileInput.value.click()
}

const handleUpload = async (e) => {
  const files = e.target.files
  const formData = new FormData()
  Array.from(files).forEach((file) => {
    formData.append('files', file)
  })

  const res = await axios.post('/api/upload-po', formData, {
    headers: { 'customer-id': selectedCustomerId }
  })

  console.log('Upload success, taskId:', res.data.taskId)
}
</script>

应用场景举例

场景 1:客户上传多个订单 PDF

客户上传 3 份订单,系统后台异步解析,大约 15 秒后草稿订单出现在 Draft 页面,业务员查看后补充了"交货日期"和"联系人",点击提交后进入正常流程。

场景 2:图片订单识别失败

客户拍照上传手写订单,AI 模型置信度仅有 0.6,系统提示"请确认识别字段是否正确",业务员发现产品数量识别错误,手动修改后继续提交。

场景 3:系统长时间未提交草稿订单

解析生成的草稿订单,7 天内未提交,系统后台任务将其状态改为"Archived",并在用户首页发送提醒通知,提示重新上传或处理。

QA 常见问题答疑

Q: 上传大文件是否有限制?

A: 是的,建议后端设置最大上传大小,比如 10MB,防止系统负载过高。

Q: 多文件是否顺序处理?

A: 不一定。解析是异步的,每个文件任务独立进行,可以并发处理加快整体速度。

Q: 如何判断解析失败?

A: 后端会记录任务状态,如解析失败会返回 failed 状态,并保留失败原因,前端可以通过 /api/po-parse-result?taskId=xxx 获取状态。

Q: 能支持多种语言订单吗?

A: 如果用的是 Azure OCR 或支持多语言的模型,是没问题的。但建议明确业务语言范围,避免误判。

总结

整个流程打通后,我们成功地把"AI 文档解析"和"订单业务系统"结合在了一起。用户不再需要逐条录入数据,而是通过上传+确认的方式,高效完成整个下单流程。

这种方式特别适合电商、零售、B2B 交易等企业后台系统,节省了大量人工成本,也减少了人为录入的错误。

后续可以拓展的方向包括:

  • 接入 ChatGPT 或 Function Calling,增强自然语言理解能力
  • 引入 RAG 模型,对订单内容做更深入的上下文理解
  • 支持更多格式的文档如扫描件、复杂表格

如果你也在做类似的流程优化,不妨尝试引入这个轻量级的 AI 能力。

相关推荐
qq_31400983几秒前
Dify版本升级实操
人工智能·aigc·开源软件
Hao想睡觉7 分钟前
CNN卷积神经网络之VggNet和GoogleNet经典网络模型(四)
网络·人工智能·cnn
我不是小upper13 分钟前
anaconda、conda、pip、pytorch、torch、tensorflow到底是什么?它们之间有何联系与区别?
人工智能·pytorch·深度学习·conda·tensorflow·pip
智汇云校乐乐老师36 分钟前
产教融合 AI赋能 创新引领 | 第十七届高校教育发展高峰论坛在利川成功举办!
人工智能·高峰论坛·讯方技术
热河暖男40 分钟前
Spring Boot AI 极速入门:解锁智能应用开发
java·人工智能·spring boot·ai编程
SugarPPig43 分钟前
(一)LoRA微调BERT:为何在单分类任务中表现优异,而在多分类任务中效果不佳?
人工智能·分类·bert
zzywxc7871 小时前
在处理大数据列表渲染时,React 虚拟列表是提升性能的关键技术,但在实际实现中常遇到渲染抖动和滚动定位偏移等问题。
前端·javascript·人工智能·深度学习·react.js·重构·ecmascript
oscar9991 小时前
在线免费的AI文本转语音工具TTSMaker介绍
人工智能·语音
zhongqu_3dnest1 小时前
VR 三维重建:开启沉浸式体验新时代
人工智能·计算机视觉