news 2026/6/16 9:40:59

出口业务订单管理系统—— 搞定外贸接单

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
出口业务订单管理系统—— 搞定外贸接单

出口业务订单管理系统—— 搞定外贸接单

前言

这篇带你从零看懂一个紧扣外贸实际场景的出口订单管理系统,面向对象 + JSON持久化 + 状态机


一、基本版 6 大功能一览

序号功能出口业务关联技术要点
1出口客户管理国外买家档案增、查、列表
2出口产品管理HS 编码(报关必备)增、查、列表,含美元单价
3出口订单管理外贸合同核心含 FOB/CIF 贸易术语 + T/T L/C 付款方式
4订单状态追踪跟单流程5 阶段可视化进度条(▓●░)
5出口收汇管理收款对账登记收款,自动计算待收/已收
6JSON 持久化数据留存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 序列化的标准模式
  • 状态机的流程控制
  • 防御性输入验证
  • 紧扣出口业务的字段设计
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/16 9:40:13

自动翻料设备中的接近开关:让物料姿态切换更稳定

自动翻料设备常用于片状件、盒状件、小型工件的姿态调整。物料从一个方向翻转到另一个方向&#xff0c;看似只是机械动作&#xff0c;但如果翻转角度不到位&#xff0c;后续装配、检测或包装都会受到影响。接近开关在翻料设备中通常用于确认翻转臂、挡料板和接料平台的位置状态…

作者头像 李华
网站建设 2026/6/16 9:40:12

cfs调度类深入解刨——RDT科普篇

上一篇《cfs调度类深入解刨——cfs任务状态统计细节篇》讲述了kernel中cfs任务阻塞、睡眠等统计逻辑及作用。 本篇文章详细分析RDT的实现背景及设计方案。 RDT 设计方案 资源控制&#xff08;resctrl&#xff09;的用户界面 相关结构 系列文章列表 RDT 在Linux内核 4.10版本中…

作者头像 李华
网站建设 2026/6/16 9:38:58

AI持久化记忆中间件:构建具备跨会话认知能力的智能体

1. 项目概述&#xff1a;为什么AI应用突然需要“记住自己做过什么”最近在给一个智能客服系统做二次开发时&#xff0c;客户提了个让我愣住的需求&#xff1a;“能不能让机器人记得上周三帮张经理查过服务器日志&#xff0c;这次他一开口问‘上次那个日志’&#xff0c;就直接调…

作者头像 李华
网站建设 2026/6/16 9:38:55

MYD1蛋白详解

MYD1蛋白MYD1&#xff08;Myeloid Differentiation primary response protein 1&#xff09;是髓样分化初级应答基因编码的关键调控蛋白&#xff0c;属于MYD88家族成员。该蛋白由296个氨基酸组成&#xff0c;分子量约为33.8kDa&#xff0c;其基因定位于人类染色体3p21.3区域。从…

作者头像 李华
网站建设 2026/6/16 9:37:51

信用卡欺诈检测实战:不平衡数据处理与XGBoost可解释性

1. 项目概述&#xff1a;为什么信用卡欺诈检测是机器学习落地的“黄金练兵场” 如果你刚学完 Pandas 和 Scikit-learn&#xff0c;正发愁找不到一个既真实、又可控、还能立刻看到业务价值的实战项目——那信用卡欺诈检测就是你此刻最该打开的笔记本。它不是 Kaggle 上那种纯为…

作者头像 李华