Python自动化办公(系统维护及开发任务状态自动推送)

Python自动化办公,

1.需求分析

  • 系统维护及开发人员的工作一般都会比较繁杂,领导们喜欢实时掌控项目的进度,但是领导们很多时候是不会自己主动去查看及分析项目进度数据的,干活的牛马们也没空整天日报,周报,月报,季报,年报…
  • 活又有了,又该想想怎么干,需求的核心是实现自动整理数据,数据图表化后自动推送,本公司工程软件部的所有任务分配都是在工程管理系统上排定,任务的详细进度及达成数据需要自行导出分析,这个部分很不符合我们的自动化宗旨,我们就从这部分需求下手,任务执行及达成状况自动推送到相关人员,领导也可实时掌控工作任务状况.

2.实现逻辑

需求有了,我们看看具体的实施逻辑

  • 首先,所有的项目开发及维护分配任务是已经有了的(会要求所有需求都登记在内部开发的工程管理系统需求处理模块),我们只需要获取所有工作任务并按要求分析整理好并图表化,此部分数据我们直接去工程管理系统数据库查表获取(推荐还是通过接口获取)
  • 其次,我们解析并整理任务数据,此部分数据图表展示按自身实际需求去处理
  • 再次,我们以企业微信消息推送方式推送数据信息
  • 最后,我们制订任务计划,让所有的信息按要求每天推送

效果演示

  • 自动企微推送(没有可以邮件推送)
    在这里插入图片描述
  • 推送的详细数据报告及图表(用html网页编写,数据按自己需求即可,此处仅做案例展示)
    在这里插入图片描述

3.代码实现

  • 一些参数信息我们用标准的JSON
    {
    "图表存储位置": "/Linux存放生成的图表图片目录/end_img",
    "win系统图表存储位置": "S:\\Windows存放生成的图表图片目录\\end_img",
    "html缓存位置": "Linux存放生成的html文件路径/html_cache",
    "win系统html缓存位置": "P:\\Windows存放生成的html文件路径\\工程管理系统缓存"
    }
    
  • 首先获取我们的工程管理数据库需求数据(推荐使用接口获取)
    # 获取全部需求信息数据
    def _get_base_data(self):
        """
        获取全部需求信息数据
        :return: 基础信息数据字典列表
        """
        _where = ""
        if self.sys in ["工程软件组CAM系统"]:
            _where = ("WHERE (SELECT TypeValue AS _VALUE FROM requirement_1_type WHERE ParentId IS NULL AND "
                      "Id=requirement_0_main.RequireSoftware) in ('Incam', 'Genesis')")
        elif self.sys in ["工程软件组MI系统"]:
            _where = ("WHERE (SELECT TypeValue AS _VALUE FROM requirement_1_type WHERE ParentId IS NULL AND "
                      "Id=requirement_0_main.RequireSoftware) in ('Inplan', '物料')")
        elif self.sys in ["工程数据组工程管理系统"]:
            _where = ("WHERE (SELECT TypeValue AS _VALUE FROM requirement_1_type WHERE ParentId IS NULL AND "
                      "Id=requirement_0_main.RequireSoftware) in ('工程管理系统')")
        elif self.sys in ["工程数据组LOT卡系统"]:
            _where = ("WHERE (SELECT TypeValue AS _VALUE FROM requirement_1_type WHERE ParentId IS NULL AND "
                      "Id=requirement_0_main.RequireSoftware) in ('LOT卡')")
        elif self.sys in ["工程软件部联络函"]:
            _where = ("WHERE (SELECT TypeValue AS _VALUE FROM requirement_1_type WHERE ParentId IS NULL AND "
                      "Id=requirement_0_main.RequireSoftware) in ('联络函')")
        elif self.sys in ["日常维护&其他"]:
            _where = ("WHERE (SELECT TypeValue AS _VALUE FROM requirement_1_type WHERE ParentId IS NULL AND "
                      "Id=requirement_0_main.RequireSoftware) not in "
                      "('Incam', 'Genesis', 'Inplan', '物料', '工程管理系统', 'LOT卡', '联络函')")
    
        _sql = f"""
                SELECT 
                    (SELECT DicName 
                     FROM sys_dictionarylist 
                     WHERE Dic_ID=(SELECT Dic_ID FROM sys_dictionary WHERE DicNo='Site') 
                           AND 
                           DicValue=requirement_0_main.Site) AS 基地,
                    (SELECT TypeValue AS _VALUE 
                     FROM requirement_1_type 
                     WHERE ParentId IS NULL AND Id=requirement_0_main.RequireSoftware) AS 需求软件,
                    (SELECT TypeValue AS _VALUE 
                     FROM requirement_1_type 
                     WHERE ParentId IS NOT NULL AND Id=requirement_0_main.RequireType) AS 需求类别,
                    (SELECT DicName 
                     FROM sys_dictionarylist 
                     WHERE Dic_ID=(SELECT Dic_ID FROM sys_dictionary WHERE DicNo='RequireStatus') 
                           AND 
                           DicValue=requirement_0_main.RequireStatus) AS 需求状态,
                    JobName AS 参考料号,
                    Topic AS 主题,
                    Detail AS 详细描述,
                    (SELECT UserTrueName FROM sys_user WHERE User_Id = requirement_0_main.Register) AS 登记人,
                    RegisterDate AS 登记时间,
                    (SELECT UserTrueName FROM sys_user WHERE User_Id = requirement_0_main.RequireAudit) AS 需求审核人,
                    RequireAuditTime AS 需求审核时间,
                    (SELECT UserTrueName FROM sys_user WHERE User_Id = requirement_0_main.DevAuditor) AS 开发审核人,
                    DevAuditorTime AS 开发审核时间,
                    PlannedCompletionTime AS 计划完成时间,
                    ActualCompletionTime AS 实际完成时间,
                    ActualCompletionTime AS 实际完成时间,
                    (SELECT UserTrueName FROM sys_user WHERE User_Id = requirement_0_main.TestPerson) AS 测试人,
                    TestTime AS 测试时间,
                    (SELECT DicName 
                     FROM sys_dictionarylist 
                     WHERE Dic_ID=(SELECT Dic_ID FROM sys_dictionary WHERE DicNo='TestResult') 
                           AND DicValue=requirement_0_main.TestResult) AS 测试结果,
                    TestRemark AS 测试意见,
                    TestBackTimes AS 退回次数
                FROM requirement_0_main
                {_where}
                """
        _data = self.sql.exec_query(_sql)
        return _data
    
    
  • 整理数据生成图表(根据需求产生需要的数据及图表)
      # 统计各基地需求信息
      def _get_reviewed_info(self, _site):
          """
          统计各基地需求信息
          :return:
          """
          _dict = {}
          _num = 0
          for i in self.data:
              if _site in ["湖南", "广东", "泰国&台湾", "全部"]:
                  if i["基地"] == _site:
                      _num += 1
                      if i["需求状态"] not in _dict.keys():
                          _dict[i["需求状态"]] = 0
                      _dict[i["需求状态"]] += 1
              else:
                  _num += 1
                  if i["需求状态"] not in _dict.keys():
                      _dict[i["需求状态"]] = 0
                  _dict[i["需求状态"]] += 1
    
          _str = _site
          if _site in ["全部"]:
              _str = "其他"
          if _site not in ["湖南", "广东", "泰国&台湾", "全部"]:
              _str = ""
    
          # 中文标签
          plt.rcParams['font.sans-serif'] = ['STKaiti']  # 指定默认字体
          plt.rcParams['axes.unicode_minus'] = False  # 解决负号'-'显示为方块的问题
    
          # 创建图像
          # 组合标签和数据,并根据数据排序
          data = sorted(zip(_dict.keys(), _dict.values()), key=lambda x: x[1], reverse=True)
    
          if len(data) == 0:
              return
    
          labels, sizes = zip(*data)
          labels = tuple([i.split(",")[0] + ",\n" + i.split(",")[1] if "," in i else i for i in list(labels)])
    
          # 获取所有颜色
          _colors = list(colors.TABLEAU_COLORS.values())
    
          plt.figure(figsize=(12, 6))  # 设置图像大小为8x6
          plt.bar(labels, sizes, width=0.3, color=_colors, edgecolor='black')
          plt.title(f'{_str}需求汇总({time.strftime("%Y-%m-%d", time.localtime())})', fontsize=16)  # 添加标题
          plt.xlabel(f'{_str}总需求汇总数量:{_num}', fontsize=14)  # 添加x轴标签
          plt.ylabel('数量', fontsize=12)  # 添加y轴标签
          plt.xticks(fontsize=10)  # 设置x轴刻度标签字体大小
          plt.yticks(fontsize=10)  # 设置y轴刻度标签字体大小
    
          # 添加数据标签
          for i, v in enumerate(sizes):
              plt.text(i, v + 1, str(v), ha='center', fontsize=10)
    
          plt.tight_layout()  # 自动调整布局
          plt.savefig(f'{self.img_path}/{_str}成本管理中心需求汇总.png')
          self.img_list.append(f'{self.img_path}/{_str}成本管理中心需求汇总.png')
          # plt.show()
    
  • 信息推送(邮件推送及企业微信推送)
        # 企微推送
    def _send_wechat_message(self):
        """
        推送信息
        :return:
        """
        img_data_list = []
        for i in self.img_list:
            with open(i, 'rb') as f:
                img_data_list.append(f'<img src="data:image/png;base64,%s" alt="Embedded Image">' %
                                     base64.b64encode(f.read()).decode('utf-8'))
    
        _h = "\n".join(img_data_list)
        html_text = """
                    <html>
                    <head>
                        <style>
                            .timestamp {
                                font-size: 24px;
                            }
                            .container {
                                margin: 20px;
                                display: flex;
                                flex-wrap: wrap;
                                justify-content: space-between;
                            }
    
                            .container img {
                                margin: 20px;
                                max-width: 46%%;
                                margin-bottom: 4%%;
                                border-radius: 10px;
                                object-fit: cover;
                                object-position: center;
                            }
                            body {
                                margin: 10px;
                                background-color: #170044;
                                color: #FFF;
                            }
                        </style>
                    </head>
    
                    <body>
                        <h2 style="text-align: center;font-size: 30px;margin-left: 20px; margin-right: 20px;">
                        所有基地&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
                        &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
                        &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp;
                        成本管理中心需求汇总(%s)&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
                        &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
                        &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp;%s</h2>
                        <div class="container">
                            %s
                        </div>
                    </body>
                    </html>
                """ % (self.sys, time.strftime("%Y-%m-%d", time.localtime()), _h)
    
        self.html_file = f"{self.html_path}\\{self.sys}-{time.strftime('%Y-%m-%d', time.localtime())}.html"
        with open(self.html_file, "w") as f:
            f.write(html_text)
    
        _wc = WeChatMessage()
        _dict = _wc.get_users_id()
    
        _users_id = [list(i.values())[0] for i in _dict["工程软件部"] + _dict["工程数据组"]]
        # _users_id = [list(i.values())[0] for i in _dict["工程软件部"]]
        if self.sys == "工程软件组CAM系统":
            _users_id = [list(i.values())[0] for i in _dict["工程软件组"]
                         if list(i.keys())[0] in ["张三", "田甜", "姚胜兰"]]
        elif self.sys == "工程软件组MI系统":
            _users_id = [list(i.values())[0] for i in _dict["工程软件组"]
                         if list(i.keys())[0] in ["罗秀青", "吴贤宗", "朱奇敏", "许定红"]]
        elif self.sys == "工程数据组工程管理系统":
            _users_id = [list(i.values())[0] for i in _dict["工程数据组"]]
        elif self.sys == "工程数据组LOT卡系统":
            _users_id = [list(i.values())[0] for i in _dict["工程数据组"]]
    
        # # 测试用
        # _users_id = [list(i.values())[0] for i in _dict["工程软件组"]
        #              if list(i.keys())[0] in ["张三"]]
    
        locale.setlocale(locale.LC_ALL, 'zh_CN.UTF-8')
        _wc.send_text_card_message(to_users=_users_id,
                                   agent_id=1000039,
                                   file_url=self.html_file,
                                   _title=f'成本管理中心{self.sys}需求汇总-'
                                          f'{time.strftime("%Y年%m月%d日", time.localtime())}')
    
    # 发送邮件
    def _send_mail(self):
        """
        发送邮件
        :return:
        """
        img_data_list = []
        for i in self.img_list:
            with open(i, 'rb') as f:
                img_data_list.append(f'<img src="data:image/png;base64,%s" alt="Embedded Image">' %
                                     base64.b64encode(f.read()).decode('utf-8'))
    
        _h = "\n".join(img_data_list)
        html_text = """
                    <html>
                    <head>
                        <style>
                            .timestamp {
                                font-size: 24px;
                            }
                            .container {
                                margin: 20px;
                                display: flex;
                                flex-wrap: wrap;
                                justify-content: space-between;
                            }
                        
                            .container img {
                                margin: 20px;
                                max-width: 46%%;
                                margin-bottom: 4%%;
                                border-radius: 10px;
                                object-fit: cover;
                                object-position: center;
                            }
                            body {
                                margin: 10px;
                                background-color: #170044;
                                color: #FFF;
                            }
                        </style>
                    </head>
                    
                    <body>
                        <h2 style="text-align: center;font-size: 30px;margin-left: 20px; margin-right: 20px;">
                        所有基地&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
                        &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
                        &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp;
                        成本管理中心需求汇总&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
                        &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
                        &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp;%s</h2>
                        <div class="container">
                            %s
                        </div>
                    </body>
                    </html>
                """ % (time.strftime("%Y-%m-%d", time.localtime()), _h)
    
        _to_list = ["pe_software@askpcb.com",
                    "shenglan.yao@askpcb.com",
                    "zhangliang@askpcb.com",
                    "xiuqing.luo@askpcb.com"
                    ]
    
        try:
            SM = sendMail.MailMain("益阳210服务器(系统需求汇总分析.py)",
                                   "sysinfo@askpcb.com",
                                   _to_list,
                                   f"{html_text}",
                                   f"成本管理中心需求汇总")
            SM.SendMail(text_type="html")
            print('邮件发送成功!')
        except BaseException as e:
            print(f'邮件发送失败!错误详情:{e}')
    
  • 完成代码
    #!/usr/bin/env py3k
    
    import re
    import sys
    import os
    import random
    import time
    import locale
    import base64
    import platform
    import matplotlib.pyplot as plt
    from matplotlib import colors
    
    
    if platform.system() == 'Windows':
        sys.path.append("S:\\site_data\\scripts\\py3_package")
    else:
        sys.path.append("/incam/server/site_data/scripts/py3_package")
    from SqlClasses import AskMiMySqlServer
    from GuiClasses import *
    from ApiClasses import *
    import sendMail
    
    # 开发日志
    _header = {
        '脚本名称': '系统需求汇总分析程式',
        '开发人员': 'Twei Tang',
        '开发时间': '2023年11月21日',
        '版本信息': 'A.1.1',
        '联系方式': (
            '邮箱地址<>',
            '微信号码<358143105>',
            '手机号码<13627441202>'
        ),
        '开发信息': (
            '无'
        ),
        '修改信息': (
            '历史版本(A.1.0),首次开发测试,暂无版本变更信息',
            '当前版本(A.1.1),添加台湾&泰国需求汇总数据,修改工程管理中心为成本管理中心,2024/5/15,周三,唐伟'
        ),
        '沟通记录': (
            '无'
        )
    }
    
    
    class DoMain:
        def __init__(self):
            self.app = QApplication(sys.argv)
            self.gui = MainGui()
            self.sql = AskMiMySqlServer(_port=3360, db="epms")  # 字典形式返回数据
            self.sys = "所有系统"
            if len(sys.argv) > 1:
                if sys.argv[1] in ["CAM系统"]:
                    self.sys = "工程软件组CAM系统"
                elif sys.argv[1] in ["MI系统"]:
                    self.sys = "工程软件组MI系统"
                elif sys.argv[1] in ["管理系统"]:
                    self.sys = "工程数据组工程管理系统"
                elif sys.argv[1] in ["LOT系统"]:
                    self.sys = "工程数据组LOT卡系统"
                elif sys.argv[1] in ["联络函"]:
                    self.sys = "工程软件部联络函"
                else:
                    self.sys = "日常维护&其他"
            self.data = self._get_base_data()
    
            if platform.system() == 'Windows':
                self.m_json = self.gui.GetConFigMethods("S:\\site_data\\scripts\\py3_package\\config\\公共制作\\系统需求汇总配置文档.json")
                self.img_path = self.m_json["win系统图表存储位置"]
                self.html_path = self.m_json["win系统html缓存位置"]
            else:
                self.m_json = self.gui.GetConFigMethods(self.gui.config_path + "/公共制作/系统需求汇总配置文档.json")
                self.img_path = self.m_json["图表存储位置"]
                self.html_path = self.m_json["html缓存位置"]
    
            self.img_list = []
    
        # 获取全部需求信息数据
        def _get_base_data(self):
            """
            获取全部需求信息数据
            :return: 基础信息数据字典列表
            """
            _where = ""
            if self.sys in ["工程软件组CAM系统"]:
                _where = ("WHERE (SELECT TypeValue AS _VALUE FROM requirement_1_type WHERE ParentId IS NULL AND "
                          "Id=requirement_0_main.RequireSoftware) in ('Incam', 'Genesis')")
            elif self.sys in ["工程软件组MI系统"]:
                _where = ("WHERE (SELECT TypeValue AS _VALUE FROM requirement_1_type WHERE ParentId IS NULL AND "
                          "Id=requirement_0_main.RequireSoftware) in ('Inplan', '物料')")
            elif self.sys in ["工程数据组工程管理系统"]:
                _where = ("WHERE (SELECT TypeValue AS _VALUE FROM requirement_1_type WHERE ParentId IS NULL AND "
                          "Id=requirement_0_main.RequireSoftware) in ('工程管理系统')")
            elif self.sys in ["工程数据组LOT卡系统"]:
                _where = ("WHERE (SELECT TypeValue AS _VALUE FROM requirement_1_type WHERE ParentId IS NULL AND "
                          "Id=requirement_0_main.RequireSoftware) in ('LOT卡')")
            elif self.sys in ["工程软件部联络函"]:
                _where = ("WHERE (SELECT TypeValue AS _VALUE FROM requirement_1_type WHERE ParentId IS NULL AND "
                          "Id=requirement_0_main.RequireSoftware) in ('联络函')")
            elif self.sys in ["日常维护&其他"]:
                _where = ("WHERE (SELECT TypeValue AS _VALUE FROM requirement_1_type WHERE ParentId IS NULL AND "
                          "Id=requirement_0_main.RequireSoftware) not in "
                          "('Incam', 'Genesis', 'Inplan', '物料', '工程管理系统', 'LOT卡', '联络函')")
    
            _sql = f"""
                    SELECT 
                        (SELECT DicName 
                         FROM sys_dictionarylist 
                         WHERE Dic_ID=(SELECT Dic_ID FROM sys_dictionary WHERE DicNo='Site') 
                               AND 
                               DicValue=requirement_0_main.Site) AS 基地,
                        (SELECT TypeValue AS _VALUE 
                         FROM requirement_1_type 
                         WHERE ParentId IS NULL AND Id=requirement_0_main.RequireSoftware) AS 需求软件,
                        (SELECT TypeValue AS _VALUE 
                         FROM requirement_1_type 
                         WHERE ParentId IS NOT NULL AND Id=requirement_0_main.RequireType) AS 需求类别,
                        (SELECT DicName 
                         FROM sys_dictionarylist 
                         WHERE Dic_ID=(SELECT Dic_ID FROM sys_dictionary WHERE DicNo='RequireStatus') 
                               AND 
                               DicValue=requirement_0_main.RequireStatus) AS 需求状态,
                        JobName AS 参考料号,
                        Topic AS 主题,
                        Detail AS 详细描述,
                        (SELECT UserTrueName FROM sys_user WHERE User_Id = requirement_0_main.Register) AS 登记人,
                        RegisterDate AS 登记时间,
                        (SELECT UserTrueName FROM sys_user WHERE User_Id = requirement_0_main.RequireAudit) AS 需求审核人,
                        RequireAuditTime AS 需求审核时间,
                        (SELECT UserTrueName FROM sys_user WHERE User_Id = requirement_0_main.DevAuditor) AS 开发审核人,
                        DevAuditorTime AS 开发审核时间,
                        PlannedCompletionTime AS 计划完成时间,
                        ActualCompletionTime AS 实际完成时间,
                        ActualCompletionTime AS 实际完成时间,
                        (SELECT UserTrueName FROM sys_user WHERE User_Id = requirement_0_main.TestPerson) AS 测试人,
                        TestTime AS 测试时间,
                        (SELECT DicName 
                         FROM sys_dictionarylist 
                         WHERE Dic_ID=(SELECT Dic_ID FROM sys_dictionary WHERE DicNo='TestResult') 
                               AND DicValue=requirement_0_main.TestResult) AS 测试结果,
                        TestRemark AS 测试意见,
                        TestBackTimes AS 退回次数
                    FROM requirement_0_main
                    {_where}
                    """
            _data = self.sql.exec_query(_sql)
            return _data
    
        # 统计各基地需求信息
        def _get_reviewed_info(self, _site):
            """
            统计各基地需求信息
            :return:
            """
            _dict = {}
            _num = 0
            for i in self.data:
                if _site in ["湖南", "广东", "泰国&台湾", "全部"]:
                    if i["基地"] == _site:
                        _num += 1
                        if i["需求状态"] not in _dict.keys():
                            _dict[i["需求状态"]] = 0
                        _dict[i["需求状态"]] += 1
                else:
                    _num += 1
                    if i["需求状态"] not in _dict.keys():
                        _dict[i["需求状态"]] = 0
                    _dict[i["需求状态"]] += 1
    
            _str = _site
            if _site in ["全部"]:
                _str = "其他"
            if _site not in ["湖南", "广东", "泰国&台湾", "全部"]:
                _str = ""
    
            # 中文标签
            plt.rcParams['font.sans-serif'] = ['STKaiti']  # 指定默认字体
            plt.rcParams['axes.unicode_minus'] = False  # 解决负号'-'显示为方块的问题
    
            # 创建图像
            # 组合标签和数据,并根据数据排序
            data = sorted(zip(_dict.keys(), _dict.values()), key=lambda x: x[1], reverse=True)
    
            if len(data) == 0:
                return
    
            labels, sizes = zip(*data)
            labels = tuple([i.split(",")[0] + ",\n" + i.split(",")[1] if "," in i else i for i in list(labels)])
    
            # 获取所有颜色
            _colors = list(colors.TABLEAU_COLORS.values())
    
            plt.figure(figsize=(12, 6))  # 设置图像大小为8x6
            plt.bar(labels, sizes, width=0.3, color=_colors, edgecolor='black')
            plt.title(f'{_str}需求汇总({time.strftime("%Y-%m-%d", time.localtime())})', fontsize=16)  # 添加标题
            plt.xlabel(f'{_str}总需求汇总数量:{_num}', fontsize=14)  # 添加x轴标签
            plt.ylabel('数量', fontsize=12)  # 添加y轴标签
            plt.xticks(fontsize=10)  # 设置x轴刻度标签字体大小
            plt.yticks(fontsize=10)  # 设置y轴刻度标签字体大小
    
            # 添加数据标签
            for i, v in enumerate(sizes):
                plt.text(i, v + 1, str(v), ha='center', fontsize=10)
    
            plt.tight_layout()  # 自动调整布局
            plt.savefig(f'{self.img_path}/{_str}成本管理中心需求汇总.png')
            self.img_list.append(f'{self.img_path}/{_str}成本管理中心需求汇总.png')
            # plt.show()
    
        def _send_wechat_message(self):
            """
            推送信息
            :return:
            """
            img_data_list = []
            for i in self.img_list:
                with open(i, 'rb') as f:
                    img_data_list.append(f'<img src="data:image/png;base64,%s" alt="Embedded Image">' %
                                         base64.b64encode(f.read()).decode('utf-8'))
    
            _h = "\n".join(img_data_list)
            html_text = """
                        <html>
                        <head>
                            <style>
                                .timestamp {
                                    font-size: 24px;
                                }
                                .container {
                                    margin: 20px;
                                    display: flex;
                                    flex-wrap: wrap;
                                    justify-content: space-between;
                                }
    
                                .container img {
                                    margin: 20px;
                                    max-width: 46%%;
                                    margin-bottom: 4%%;
                                    border-radius: 10px;
                                    object-fit: cover;
                                    object-position: center;
                                }
                                body {
                                    margin: 10px;
                                    background-color: #170044;
                                    color: #FFF;
                                }
                            </style>
                        </head>
    
                        <body>
                            <h2 style="text-align: center;font-size: 30px;margin-left: 20px; margin-right: 20px;">
                            所有基地&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
                            &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
                            &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp;
                            成本管理中心需求汇总(%s)&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
                            &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
                            &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp;%s</h2>
                            <div class="container">
                                %s
                            </div>
                        </body>
                        </html>
                    """ % (self.sys, time.strftime("%Y-%m-%d", time.localtime()), _h)
    
            self.html_file = f"{self.html_path}\\{self.sys}-{time.strftime('%Y-%m-%d', time.localtime())}.html"
            with open(self.html_file, "w") as f:
                f.write(html_text)
    
            _wc = WeChatMessage()
            _dict = _wc.get_users_id()
    
            _users_id = [list(i.values())[0] for i in _dict["工程软件部"] + _dict["工程数据组"]]
            # _users_id = [list(i.values())[0] for i in _dict["工程软件部"]]
            if self.sys == "工程软件组CAM系统":
                _users_id = [list(i.values())[0] for i in _dict["工程软件组"]
                             if list(i.keys())[0] in ["张三", "田四", "姚老五"]]
            elif self.sys == "工程软件组MI系统":
                _users_id = [list(i.values())[0] for i in _dict["工程软件组"]
                             if list(i.keys())[0] in ["罗八", "吴九", "朱十一", "许大麻"]]
            elif self.sys == "工程数据组工程管理系统":
                _users_id = [list(i.values())[0] for i in _dict["工程数据组"]]
            elif self.sys == "工程数据组LOT卡系统":
                _users_id = [list(i.values())[0] for i in _dict["工程数据组"]]
    
            # # 测试用
            # _users_id = [list(i.values())[0] for i in _dict["工程软件组"]
            #              if list(i.keys())[0] in ["唐伟"]]
    
            locale.setlocale(locale.LC_ALL, 'zh_CN.UTF-8')
            _wc.send_text_card_message(to_users=_users_id,
                                       agent_id=1000039,
                                       file_url=self.html_file,
                                       _title=f'成本管理中心{self.sys}需求汇总-'
                                              f'{time.strftime("%Y年%m月%d日", time.localtime())}')
    
        # 发送邮件
        def _send_mail(self):
            """
            发送邮件
            :return:
            """
            img_data_list = []
            for i in self.img_list:
                with open(i, 'rb') as f:
                    img_data_list.append(f'<img src="data:image/png;base64,%s" alt="Embedded Image">' %
                                         base64.b64encode(f.read()).decode('utf-8'))
    
            _h = "\n".join(img_data_list)
            html_text = """
                        <html>
                        <head>
                            <style>
                                .timestamp {
                                    font-size: 24px;
                                }
                                .container {
                                    margin: 20px;
                                    display: flex;
                                    flex-wrap: wrap;
                                    justify-content: space-between;
                                }
                            
                                .container img {
                                    margin: 20px;
                                    max-width: 46%%;
                                    margin-bottom: 4%%;
                                    border-radius: 10px;
                                    object-fit: cover;
                                    object-position: center;
                                }
                                body {
                                    margin: 10px;
                                    background-color: #170044;
                                    color: #FFF;
                                }
                            </style>
                        </head>
                        
                        <body>
                            <h2 style="text-align: center;font-size: 30px;margin-left: 20px; margin-right: 20px;">
                            所有基地&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
                            &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
                            &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp;
                            成本管理中心需求汇总&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
                            &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
                            &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp;%s</h2>
                            <div class="container">
                                %s
                            </div>
                        </body>
                        </html>
                    """ % (time.strftime("%Y-%m-%d", time.localtime()), _h)
    
            _to_list = ["张三@henxing.com",
                        "姚老五@henxing.com",
                        "赵二@henxing.com",
                        "罗八@henxing.com"
                        ]
    
            try:
                SM = sendMail.MailMain("XXX服务器(系统需求汇总分析.py)",
                                       "你的邮箱服务器账号",
                                       _to_list,
                                       f"{html_text}",
                                       f"成本管理中心需求汇总")
                SM.SendMail(text_type="html")
                print('邮件发送成功!')
            except BaseException as e:
                print(f'邮件发送失败!错误详情:{e}')
    
    
    if __name__ == "__main__":
        _do = DoMain()
        _do._get_reviewed_info(_site="湖南")
        _do._get_reviewed_info(_site="广东")
        _do._get_reviewed_info(_site="泰国&台湾")
        _do._get_reviewed_info(_site="全部")
        _do._get_reviewed_info(_site="所有")
        # _do._send_mail()
        _do._send_wechat_message()
        sys.exit()
    

4.自动执行

  • Windows自动任务计划
    • 1.打开开始菜单搜索"任务计划程序"单击打开
      在这里插入图片描述
    • 2.打开任务计划配置主界面后单击"创建任务"
      在这里插入图片描述
    • 3.分别按下图配置你的自动任务
      常规
      在这里插入图片描述
      触发器
      在这里插入图片描述
      在弹出的编辑窗口配置触发器,完成后单击确定
      在这里插入图片描述
      操作
      在这里插入图片描述
      在弹出的编辑窗口配置操作,完成后单击确定
      在这里插入图片描述
      条件
      如图设置条件
      在这里插入图片描述
      设置
      如图设置
      在这里插入图片描述
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一阵寒风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值