用 AI 解析采购订单,从上传到自动生成 Draft 订单全流程实战
大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。
图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG
我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。
展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
📣 公众号“Swift社区”,每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
💬 微信端添加好友“fzhanfei”,与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。
📅 最新动态:2025 年 3 月 17 日
快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!
文章目录
- 摘要
- 引言
- 功能实现总览
- 后端接口设计与代码实现
- 文件上传接口(Node.js 示例)
- AI 解析任务模拟(Python 脚本)
- 前端页面逻辑(Vue 示例)
- 应用场景举例
- 场景 1:客户上传多个订单 PDF
- 场景 2:图片订单识别失败
- 场景 3:系统长时间未提交草稿订单
- QA 常见问题答疑
- 总结
摘要
很多企业都面临一个老问题:客户发来的采购订单格式千奇百怪,有的是 PDF,有的是 Excel,甚至有拍照的图片。人工录入这些订单,不仅耗时费力,还容易出错。那有没有一种方法能自动读取这些订单内容,然后直接在系统中生成一份草稿订单供业务员补充?
当然有。本文就带你一步步搭建一个完整的 AI 驱动订单解析流程,从文件上传、AI 解析、自动建单,到草稿状态的后续处理。用简单的 Python 脚本、Node 服务和一点前端页面,就能实现一个企业内部非常实用的自动化能力。
引言
我们以前在做客户订单录入时,经常会遇到这样的问题:
- 一堆 PDF 或图片文件,内容布局五花八门
- 业务员需要逐行复制粘贴,一不小心就抄错
- 有时候订单多,一等就是一两个小时才能录完
为了解决这些问题,我们设计了一个新的流程:
- 客户下单 → 上传原始订单(PDF、Excel、图片)
- 系统调用 AI 模型自动识别其中的信息
- 自动生成草稿订单,业务员只需稍加确认和补充
- 确认无误后提交进入正式审批流程
整套流程下来,既保留了人工可控性,也大大减少了重复性劳动。
功能实现总览
这个功能的核心步骤如下:
- 用户选择客户公司后,系统显示“Upload PO”按钮
- 上传支持多个文件格式(PDF/Excel/Image)
- 上传后系统将文件送入 AI 解析任务
- 解析完成后,自动将结构化数据写入订单草稿表
- 草稿订单显示在前端 Draft Tab,供用户继续补充并提交
我们会通过一个简单的前端+Node.js 后端+Python 解析脚本来实现这个功能,方便大家快速上手。
后端接口设计与代码实现
文件上传接口(Node.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 脚本)
# ai_parser.py
import json
import random
from pathlib import Pathdef 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 示例)
<!-- 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.filesconst 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 能力。