前言
本人现在对易飞ERP的使用可以说是比较深入了,尤其是生产的模块。而且易飞在工单、领料那块需要做的单据有些多而且复杂(这个主要是我公司在ERP的应用比较复杂),所以有些功能上需要开发相应的外挂来让ERP自动处理一些数据,减轻人员的工作量。
有一些ERP功能是可以直接生成相关的数据写入到数据库就可以实现了,但是有一些却需要系统来处理,比如一些批次处理任务(毕竟易飞是闭源的,不知道处理逻辑,当然也可以数据追踪慢慢摸)。所以对于这些的没办法直接写数据,所以只能通过派班任务来间接让ERP自动执行任务。
本文只作抛砖引玉,不协助实际处理。如侵必删!
分析
由此图可以看出这个批次处理的所有参数,下面看数据库里的信息。
有研究过易飞派班任务的朋友都知道,JOBQUEUE中的JOBOPTION信息是经过了‘加密’的,信息被转成了16进制保存,但是通过进制转换缺无法还原为原本的文本信息。
其实信息并非做了特殊的加密处理,只是开发人员在此添加了一些识别符。下面我用数据查看工具来对JOBOPTION分析。
这是数据库中显示的信息,难以从JOBOPTION中看出管理的东西来。
但是用16进制来查看,就可以看出一些端倪。
我这里以队列信息中的来源编号作为一个例子:
这样就可以看出,来源编号是直接记录在JOBOPTION中的。
经过我的分析:
1.每两个字节记录一个字符,比如0x3200 对应的就是数字2,
2.0x0800 作为每个信息段的分隔符,
3.每个0x0800 0000 后的两个字节,记录的是紧接一段的字符长度的16进制信息。
这样我们就可以抽取基本的信息然后做相应信息段的替换就可以达到以外挂的方式提交ERP派班任务。
基本代码
因为本文主旨是抛砖引玉,所以不提供派班任务的相关代码。但是提供字符串转16进制的代码,我是使用Python编写的,用兴趣朋友们可以自行转换成相应语言的代码。
以下是字符串转16进制的,支持中英文传入
def __str_to_hex(self, s):
returnStr = ''
for c in s:
strTmp = hex(ord(c)).replace('0x', '').upper()
if len(strTmp) == 2:
strTmp2 = strTmp + '00'
else:
strTmp2 = strTmp[2:4] + strTmp[0:2]
returnStr += strTmp2
return returnStr
以下是获取字符串长度并且转16进制的
def __int_to_hex(self, i):
returnStr = ''
strTmp = str(hex(i)).replace('0x', '').rjust(2, '0').upper()
if len(strTmp) == 2:
strTmp2 = strTmp + '00'
else:
strTmp2 = strTmp[2:4] + strTmp[0:2]
returnStr += strTmp2
return returnStr
其实代码都差不多,只是多了一些字符操作