EP06 · 讲义
Genesis2000 Python 脚本实战 · 第6集 JobClasses——料号信息获取
本集学什么
这集讲业务封装的第一站。学完你能独立写出「取料号参数」的脚本:查 ERP 数据、读 Genesis 本体、做防呆检查。 三千五百行不用全背。先看它的四个类和设计手法,再巡览几个最有代表性的业务方法,最后看错误处理和接口边界。
回顾:核心四层已收官
前五集走完了核心四层。业务模块不是空中楼阁——它调用的每个查询、每条命令,都是四层里讲过的。 这一集开始看业务层怎么在四层之上建起来:把「料号是什么」这个问题,从三个来源统一回答。
四个类一张图
- my_value 参数收集总入口
- cam_value Genesis 本体取数
- main_cam_job_info 拼板几何
- fool_value 防呆检查
- 外部系统 + 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;查不到就弹输入框让操作员确认;多厂别时读存档文件。 人工选过一次就写回存档,下次同一料号直接命中。查询、交互、记忆三段式,把「业务规则」也封装进了代码。
ERP 参数一次取齐
- 一条 SQL 列出 30+ 字段名变体
- 36 分支归一成中文键
- 按层重建字典
- 二次查询合并锣边尺寸
- 否则每个脚本都要复制 150 行、手工对齐字段变体
my_value 的核心价值是把散落的 ERP 数据聚合成一次调用。比如取板边参数:一条 SQL 列出三十多个字段名变体,再按分支归一成统一的中文键。 不封装的话,每个脚本都要复制这一百五十行、手工对齐字段变体。封装后一行调用拿全——这就是「为什么要有这个包」最直接的答案。
叠构解析:从文本到结构
- SEG_DES 文本 → 正则解析 → 8 项结构化属性
- 对层/站别/面次/蚀刻类型/基铜厚/锣板尺寸/压合次序
- 原本每个脚本要自己写 300 行正则
再看叠构解析。ERP 里的叠构数据存在一段文本字段里,方法用正则把它拆成八项结构化属性:对层、站别、面次、蚀刻类型、基铜厚、锣板尺寸、压合次序。 文本里的特殊写法也要处理,比如保护片的命名规则。原本每个脚本要自己写三百行正则,现在一次调用搞定。
阻抗:三套库取最新
- 三套都查,每个按版本号取最新
- 调用方只拿结果不关心细节
阻抗数据存在三套库里,版本很多。封装的处理是:三套都查,每个按版本号取最新。 数据源越多,调用方越不该关心细节——哪个库、哪一版最新,方法内部全部处理掉,调用方只拿结果。
层名正则库
- gtl/gbl 外层
- drl 钻孔
- sm 防焊
- sk 文字
- CAM 受控层清单
- 30+ 条正则:老师傅的层名规则外化成代码
- 规则变了只改这一个地方
_get_tool_attribute 值得单独看:一百多行、三十多条正则,把任意 Genesis 层名归类为信号层、钻孔层、防焊层、文字层等。 它把「老师傅脑子里的层名规则」外化成代码。新手写脚本不再需要背层名——调这个方法就行。规则变了,也只改这一个地方。
拼板重建:多条命令打包成业务语义
copy_entity(...) # 复制料号
skip_next_pre_hook # 跳过钩子
check_inout(...) # 检出检入
sr_tab_change(...) # 逐条重建拼板
- 8+ 条裸命令 → 一个业务方法
- 调用方只关心「重建这个 step 的拼板」
cam_value 面向 Genesis 本体。看 _get_fip_step:为了重建镜像翻转后的拼板,底层要复制料号、跳过钩子、检出检入、逐条改拼板条目——八条以上的裸命令。 封装后,调用方只关心业务语义「重建这个 step 的拼板」。裸命令的细节,一行都不需要知道。
反面对照:重复的裸命令
- 同一段清拼板命令在两个类里重复实现
- 字符串拼接 + 序号手工拼
- 「应该抽成公共方法」的典型案例
- 发现重复就是重构的机会
也要看封装没做完的地方。清理拼板的两条命令,在 cam_value 和 main_cam_job_info 里各自重复实现了一遍——纯字符串拼接,序号手工拼。 这正是「应该抽成公共方法」的典型案例。读自己的老代码时发现这种重复,就是重构的机会。
防呆检查
- 不同厂区的层名字典比对
- 混用检测
- 写 OK/NG 文件 + 弹窗
fool_value 做防呆:不同厂区的层命名规则不同,方法内置三套层名字典,自动检测有没有混用。 发现异常就写检查文件、弹窗提醒。防呆逻辑单独成类,业务规则一目了然——哪些规则在防哪些错,读这个类就知道。
错误处理模式(完整代码)
try: ...查库...
except BaseException as e:
warningbox(mess=f"未成功获取X,请与MI确认...<br>{e}") return
- 文件里出现约 40 处
- 任务不会默默挂掉,哪里失败立刻看到
错误处理也形成了固定模式:数据库查询包一层保护,失败就弹警告框,写明失败内容,然后返回。 这个模式在文件里出现约四十处。好处是任务不会默默挂掉——操作员能立刻看到哪里失败、为什么失败。
历史痕迹:备份后缀与注释旧实现
- 新版本上线、旧版本留档——出了问题能回看
- 备份会累积,定期清理是另一门功课
三千五百行里,历史痕迹很明显:方法名带日期后缀的备份版本,大段被注释的旧实现。 这种「新版本上线、旧版本留档」的迭代方式很务实:出了问题能回看旧逻辑。当然,备份会累积——定期清理是另一门功课。
公开接口与私有方法
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) # 工艺流程结构化
- 摘自包内 docstring「使用例子」原文
- 下一集:GuiClasses 界面交互
最后看真实用法。实例化 my_value 注入全部服务,然后一行取拼板参数、一行取工艺流程。 下一集看 GuiClasses——这些业务方法失败时的弹窗、人工确认的输入框,都是它提供的。
小结与预告
这一集我们看到:业务层的封装,价值不在语法,在于把 ERP 数据、层名规则、命令流程,变成一行行的业务接口。 下一集看 GuiClasses——脚本怎么和操作员打交道:弹窗、输入框、多选下拉,这些交互是怎么封装的。
零壹AI工作室出品 · 《用 Python 驱动 Genesis2000》免费公开课 · www.binwindai.com