出口业务订单管理系统—— 搞定外贸接单
出口业务订单管理系统—— 搞定外贸接单
前言
这篇带你从零看懂一个紧扣外贸实际场景的出口订单管理系统,面向对象 + JSON持久化 + 状态机
一、基本版 6 大功能一览
| 序号 | 功能 | 出口业务关联 | 技术要点 |
|---|---|---|---|
| 1 | 出口客户管理 | 国外买家档案 | 增、查、列表 |
| 2 | 出口产品管理 | HS 编码(报关必备) | 增、查、列表,含美元单价 |
| 3 | 出口订单管理 | 外贸合同核心 | 含 FOB/CIF 贸易术语 + T/T L/C 付款方式 |
| 4 | 订单状态追踪 | 跟单流程 | 5 阶段可视化进度条(▓●░) |
| 5 | 出口收汇管理 | 收款对账 | 登记收款,自动计算待收/已收 |
| 6 | JSON 持久化 | 数据留存 | to_dict / from_dict 序列化模式 |
二、核心架构 —— 三层分离
┌─────────────────────────────────────┐ │ main() 控制器 │ │ 登录 → 菜单 → 分发 → 循环 │ └──────┬──────────┬──────────┬─────────┘ │ │ │ ┌────▼───┐ ┌───▼────┐ ┌──▼──────┐ │Customer│ │Product │ │Order │ ← 数据模型层 (Model) │Manager │ │Manager │ │Manager │ └────┬───┘ └───┬────┘ └──┬──────┘ │ │ │ ┌────▼─────────▼─────────▼──────┐ │ JSON 文件持久化 │ ← 存储层 │ customers.json products.json│ │ orders.json payments.json│ └───────────────────────────────┘设计思想:数据模型(类)只管"是什么",Manager(管理类)管"怎么操作",main() 管"流程控制"。修改菜单不影响数据,改数据不影响菜单——这就是面向对象的"关注点分离"。
三、四个数据模型
3.1 Customer —— 出口客户
classCustomer:def__init__(self,cid,name,country,contact="",email=""):self.customer_id=cid# 编号self.name=name# 客户名称self.country=country# 所在国家(出口必需)self.contact=contact# 联系人self.email=email# 邮箱出口特色:country字段不是摆设——出口到不同国家涉及不同的关税政策、物流成本。
3.2 Product —— 出口产品(含 HS 编码)
classProduct:def__init__(self,pid,name,hs_code,unit,unit_price_usd):self.product_id=pid self.name=name self.hs_code=hs_code# 海关商品编码 ⭐self.unit=unit# 计量单位self.unit_price_usd=unit_price_usd# 美元单价出口特色:hs_code(Harmonized System Code)是出口报关的必备字段,每类产品有唯一的 8-10 位编码。这是本系统和普通进销存系统的本质区别。
3.3 Order —— 出口订单(核心模型)
classOrder:def__init__(self,oid,customer_name,product_name,quantity,unit_price,amount_usd,trade_term,payment_term,status="待确认"):self.trade_term=trade_term# FOB / CIF / CFR / EXWself.payment_term=payment_term# T/T / L/C / D/Pself.status=status# 状态(5阶段)self.history=[]# 状态变更记录出口特色:
trade_term:贸易术语决定谁付运费保险费——FOB(卖方送到船上)、CIF(卖方包运费保险费送到目的港)payment_term:T/T 是电汇(最常用),L/C 是信用证(金额大时用)history:记录每次状态变更的人和时间,可以追溯"谁在什么时候把订单从待发货改成了已发货"
3.4 Payment —— 出口收汇
classPayment:def__init__(self,pid,order_id,amount_usd,ptype="预付款"):self.payment_id=pid self.order_id=order_id# 关联哪个订单self.amount_usd=amount_usd# 收款金额(美元)self.ptype=ptype# 预付款 / 尾款 / 全额出口特色:出口贸易通常分两次收款——签约时收 30% 预付款,发货后收 70% 尾款。我们的系统用ptype区分这两种。
四、to_dict / from_dict —— 数据存取的标准模式
每个模型都实现了这两个方法,这是本系统的灵魂设计:
# 保存:对象 → 字典 → JSON文件defto_dict(self):returnself.__dict__.copy()# 读取:JSON文件 → 字典 → 对象@staticmethoddeffrom_dict(d):returnCustomer(d["customer_id"],d["name"],d.get("country",""),d.get("contact",""))为什么这么做?
| 对比 | 好处 |
|---|---|
| 不用 to_dict() | 每次存数据要手动拼字段,容易漏 |
| 不用 from_dict() | JSON 读出来是字典,操作起来不直观 |
| 用这套模式 | 存和取都是一行代码,将来换数据库只改这两个方法 |
五、5 阶段状态机 —— 订单只能按流程走
STATUS_LIST=["待确认","生产中","待发货","已发货","已完成"]defchange_status(self,new_status,operator="管理员"):ifnew_statusnotinSTATUS_LIST:returnFalse# 不合法的状态,拒绝self._log(new_status,operator)# 记录谁在什么时候改的self.status=new_statusreturnTrue状态进度条展示:
状态进度:[▓▓░░░] 流程节点:待确认 → 生产中 → 待发货 → 已发货 → 已完成 当前状态:生产中▓= 已完成阶段(已过"待确认",正在"生产中")●= 当前阶段░= 未完成阶段
一行代码搞定进度条:
bar="".join("▓"ifi<idxelse("●"ifi==idxelse"░")foriinrange(5))六、订单创建 —— 系统核心交互流程
defcreate(self):# 1. 选客户(先展示所有客户)self.cust_mgr.show()cid=input("客户编号:").strip()# 2. 选产品(先展示所有产品,含 HS 编码)self.prod_mgr.show()pid=input("产品编号:").strip()# 3. 输入数量qty=int(input(f"数量({prod.unit}):"))# 4. 贸易术语 + 付款方式(出口特有字段)trade=input("贸易术语(FOB/CIF/CFR/EXW):").upper()or"FOB"pay=input("付款方式(T/T/L/C/D/P):").upper()or"T/T"# 5. 生成订单号 + 保存oid=gen_id("ORD",self.data)self.data[oid]=Order(oid,cust.name,prod.name,qty,uprice,amount,trade,pay)self.save()交互设计巧思:
- 先展示后选择:不要求用户记住编号,降低操作门槛
- 默认值兜底:
or "FOB"直接回车就选默认值 - 防御性验证:get() 代替 [],客户不存在返回 None 而不是崩溃
七、JSON 持久化 —— 关程序数据不丢
defsave_json(filename,data):ensure_dir()withopen(os.path.join(DATA_DIR,filename),"w",encoding="utf-8")asf:json.dump(data,f,ensure_ascii=False,indent=2)ensure_ascii=False:中文客户名不会变成乱码indent=2:JSON 文件格式化,人工也能直接看懂ensure_dir():首次运行自动创建 data 文件夹
每次操作完立即调save(),确保关了程序再打开数据还在。
八、运行演示
# 直接运行,无需 pip install 任何东西python 出口订单管理系统.py账号:admin 密码:123456 ================================================== │ 1.客户管理 2.产品管理 3.创建订单 4.查询订单 │ │ 5.变更状态 6.订单列表 7.登记收款 8.收款记录 │ │ 0.退出 │ ==================================================十、总结
这个系统虽然只有 280 行,但麻雀虽小五脏俱全:
- 面向对象的三层架构
- JSON 序列化的标准模式
- 状态机的流程控制
- 防御性输入验证
- 紧扣出口业务的字段设计
