EP06 · 讲义

Genesis2000 Python 脚本实战 · 第6集 JobClasses——料号信息获取

本集学什么

这集讲业务封装的第一站。学完你能独立写出「取料号参数」的脚本:查 ERP 数据、读 Genesis 本体、做防呆检查。 三千五百行不用全背。先看它的四个类和设计手法,再巡览几个最有代表性的业务方法,最后看错误处理和接口边界。

回顾:核心四层已收官

前五集走完了核心四层。业务模块不是空中楼阁——它调用的每个查询、每条命令,都是四层里讲过的。 这一集开始看业务层怎么在四层之上建起来:把「料号是什么」这个问题,从三个来源统一回答。

四个类一张图

JobClasses 里有四个类。my_value 是总入口,负责从 ERP 和中心库收集料号参数;cam_value 从 Genesis 料号本体取数据。 main_cam_job_info 封装单步几何信息;fool_value 做防呆检查。四类分工,覆盖「料号是什么」的全部来源:外部系统、Genesis 本体、防呆规则。

组合注入:与继承的对比(完整源码)

self.Sql  = AskMiMySqlServer(...)   # 中心库
self._sql = AskPortSqlServer(...)  # ERP 库
self._gui = MainGui()               # 弹窗
self._do  = Main()                  # Genesis 命令
注意它的设计:不同于核心四层的继承,JobClasses 用的是组合——构造器里把数据库、界面、命令服务逐个注入,存成属性。 继承是「我是它」,组合是「我拥有它们」。业务类需要的服务多,组合更灵活——这是选择继承还是组合时的一个好参照。

中文键的核心状态

self._dict = {
  '阻焊颜色': ..., '板材TG': ...,
  '锣边尺寸': ...,
}
my_value 的内部有个核心数据结构:一个全中文键的字典,装着这个料号的关键参数。 阻焊颜色、板材特性、锣边尺寸——业务概念直接当字典键。这也是包的一贯风格:贴近业务的人,就能读懂数据。

厂区自动识别(完整流程)

先看一个巧妙的封装:厂别识别。一个料号属于哪个厂,先查 ERP;查不到就弹输入框让操作员确认;多厂别时读存档文件。 人工选过一次就写回存档,下次同一料号直接命中。查询、交互、记忆三段式,把「业务规则」也封装进了代码。

ERP 参数一次取齐

my_value 的核心价值是把散落的 ERP 数据聚合成一次调用。比如取板边参数:一条 SQL 列出三十多个字段名变体,再按分支归一成统一的中文键。 不封装的话,每个脚本都要复制这一百五十行、手工对齐字段变体。封装后一行调用拿全——这就是「为什么要有这个包」最直接的答案。

叠构解析:从文本到结构

再看叠构解析。ERP 里的叠构数据存在一段文本字段里,方法用正则把它拆成八项结构化属性:对层、站别、面次、蚀刻类型、基铜厚、锣板尺寸、压合次序。 文本里的特殊写法也要处理,比如保护片的命名规则。原本每个脚本要自己写三百行正则,现在一次调用搞定。

阻抗:三套库取最新

阻抗数据存在三套库里,版本很多。封装的处理是:三套都查,每个按版本号取最新。 数据源越多,调用方越不该关心细节——哪个库、哪一版最新,方法内部全部处理掉,调用方只拿结果。

层名正则库

_get_tool_attribute 值得单独看:一百多行、三十多条正则,把任意 Genesis 层名归类为信号层、钻孔层、防焊层、文字层等。 它把「老师傅脑子里的层名规则」外化成代码。新手写脚本不再需要背层名——调这个方法就行。规则变了,也只改这一个地方。

拼板重建:多条命令打包成业务语义

copy_entity(...)       # 复制料号
skip_next_pre_hook     # 跳过钩子
check_inout(...)      # 检出检入
sr_tab_change(...)    # 逐条重建拼板
cam_value 面向 Genesis 本体。看 _get_fip_step:为了重建镜像翻转后的拼板,底层要复制料号、跳过钩子、检出检入、逐条改拼板条目——八条以上的裸命令。 封装后,调用方只关心业务语义「重建这个 step 的拼板」。裸命令的细节,一行都不需要知道。

反面对照:重复的裸命令

也要看封装没做完的地方。清理拼板的两条命令,在 cam_value 和 main_cam_job_info 里各自重复实现了一遍——纯字符串拼接,序号手工拼。 这正是「应该抽成公共方法」的典型案例。读自己的老代码时发现这种重复,就是重构的机会。

防呆检查

fool_value 做防呆:不同厂区的层命名规则不同,方法内置三套层名字典,自动检测有没有混用。 发现异常就写检查文件、弹窗提醒。防呆逻辑单独成类,业务规则一目了然——哪些规则在防哪些错,读这个类就知道。

错误处理模式(完整代码)

try: ...查库...
except BaseException as e:
  warningbox(mess=f"未成功获取X,请与MI确认...<br>{e}")
  return
错误处理也形成了固定模式:数据库查询包一层保护,失败就弹警告框,写明失败内容,然后返回。 这个模式在文件里出现约四十处。好处是任务不会默默挂掉——操作员能立刻看到哪里失败、为什么失败。

历史痕迹:备份后缀与注释旧实现

三千五百行里,历史痕迹很明显:方法名带日期后缀的备份版本,大段被注释的旧实现。 这种「新版本上线、旧版本留档」的迭代方式很务实:出了问题能回看旧逻辑。当然,备份会累积——定期清理是另一门功课。

公开接口与私有方法

get_process_pro / get_panel_info_pro / get_basic_info
命名也有规矩:下划线开头的 _get 方法是内部细节,不带下划线的 get 方法是对外接口。 对外就三个:取工艺流程、取拼板信息、取基础信息。调用方只认这三个入口,内部八十多个方法随便迭代——这就是封装边界。

使用案例巡览

a = my_value()                  # 参数收集总入口
a.get_panel_info_pro(job)       # 拼板参数一次取齐
a.get_process_pro(job)          # 工艺流程结构化
最后看真实用法。实例化 my_value 注入全部服务,然后一行取拼板参数、一行取工艺流程。 下一集看 GuiClasses——这些业务方法失败时的弹窗、人工确认的输入框,都是它提供的。

小结与预告

这一集我们看到:业务层的封装,价值不在语法,在于把 ERP 数据、层名规则、命令流程,变成一行行的业务接口。 下一集看 GuiClasses——脚本怎么和操作员打交道:弹窗、输入框、多选下拉,这些交互是怎么封装的。
零壹AI工作室出品 · 《用 Python 驱动 Genesis2000》免费公开课 · www.binwindai.com