美文网首页
【RPA案例分享】企业SRM系统填报——(二)流程分析及模块设计

【RPA案例分享】企业SRM系统填报——(二)流程分析及模块设计

作者: yuryqwer | 来源:发表于2019-12-22 21:59 被阅读0次

【RPA案例分享】企业SRM系统填报——(一)业务流程文档

模块结构

在上一篇中,我们看到需求较为复杂,但总体的操作分为以下四个部分:SRM系统操作(B/S架构)、表格处理、发送邮件通知、PDF文件内容获取。另外,从流程的角度,又可以分为以下两个部分:SRM系统填报流程以及获取填报结果流程。

我们可以根据四个操作设计四个模块。再设计一个主模块,其中定义两个流程(finish_erp和download_pdf),并将处理逻辑写在这个主模块中,作为整个RPA机器人运行的入口。


模块结构

PDF文件内容获取

对于这种非扫描件的PDF,我们使用pdfminer进行文本的提取

from io import StringIO
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfinterp import PDFResourceManager, process_pdf

def read_pdf(pdf):
    """
    读取pdf文件,获取所有内容
    其中参数pdf为以二进制方式打开pdf的文件流
    """
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, laparams=laparams)
    process_pdf(rsrcmgr, device, pdf)
    device.close()
    content = retstr.getvalue()
    retstr.close()
    return str(content)

提取出所有文本后,要找到我们需要的出入库单号字段,该字段是由FMIX开头,后五位大写字母或数字,最后12位全为数字组成的,我们使用正则表达式进行提取


import re

def re_match(text):
    """
    编写正则表达式,匹配pdf内容中我们需要的出入库单号字段
    """
    # 匹配规则:前四位FMIX,后五位大写字母或数字,最后12位全为数字
    pattern = re.compile(r'[F][M][I][X][A-Z0-9]{5}[0-9]{12}')
    return re.findall(pattern, text)[0]

完整的parse_pdf.py文件:

import re
from io import StringIO
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
 
 
def read_pdf(pdf):
    """
    读取pdf文件,获取所有内容
    其中参数pdf为以二进制方式打开pdf的文件流
    """
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, laparams=laparams)
    process_pdf(rsrcmgr, device, pdf)
    device.close()
    content = retstr.getvalue()
    retstr.close()
    return str(content)
 
def re_match(text):
    """
    编写正则表达式,匹配pdf内容中我们需要的出入库单号字段
    """
    # 匹配规则:前四位FMIX,后五位大写字母或数字,最后12位全为数字
    pattern = re.compile(r'[F][M][I][X][A-Z0-9]{5}[0-9]{12}')
    return re.findall(pattern, text)[0]
 
if __name__ == '__main__':
    with open('ShipNote.pdf', "rb") as my_pdf:
        print(re_match(read_pdf(my_pdf)))

发送邮件通知

我们通过SMTP协议进行邮件的发送,需要用到python自带的emailsmtplib两个模块,前者用来构造邮件,后者用来发送邮件。用法请参考SMTP发送邮件

由流程文档可知一共有两种类型的邮件:分别是异常提醒和业务处理完成提醒,前者需要添加《ERP处理表》作为附件,后者直接将出货单号作为正文即可。

我们使用开通了SMTP服务的QQ邮箱作为发件人,将邮箱密码、发件邮箱、收件人、主题、正文、附件作为参数编写函数如下:

import smtplib
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.header import Header

def send_email(mail_pass, sender, receivers, subject, text, file_path=None):
    # 第三方 SMTP 服务
    mail_host = "smtp.qq.com"  # 设置服务器

    # 创建一个邮件实例
    message = MIMEMultipart()
    message['From'] = Header("RPA机器人", 'utf-8')
    message['To'] = Header("业务人员", 'utf-8')
    message['Subject'] = Header(subject, 'utf-8')

    # 邮件正文内容
    message.attach(MIMEText(text, 'plain', 'utf-8'))

    # 构造附件
    if file_path:
        file = MIMEApplication(
            open(file_path, 'rb').read())
        file.add_header('Content-Disposition',
                        'attachment',
                        filename=Header("ERP处理表.xls", "utf-8").encode())
        message.attach(file)

    try:
        smtpObj = smtplib.SMTP()
        smtpObj.connect(mail_host, 25)  # 25为 SMTP 端口号
        smtpObj.login(sender, mail_pass)
        smtpObj.sendmail(sender, receivers, message.as_string())
        print("邮件发送成功")
    except smtplib.SMTPException as e:
        print(e)

相关文章

网友评论

      本文标题:【RPA案例分享】企业SRM系统填报——(二)流程分析及模块设计

      本文链接:https://www.haomeiwen.com/subject/mikanctx.html