import re import os import ast import json import datetime from openpyxl import Workbook from django.core.management import BaseCommand from settings import conf from common.mixins import LoggerMixin from apps.doc import consts from apps.doc.models import HILDoc, AFCDoc class Command(BaseCommand, LoggerMixin): def __init__(self): super().__init__() self.log_base = '[bs statistics]' def add_arguments(self, parser): parser.add_argument( '--date', default=datetime.date.today() - datetime.timedelta(days=1), dest='date', help='将要计算的日期,格式: 2018-01-01' ) def handle(self, *args, **kwargs): date = kwargs.get('date') if isinstance(date, str): if not re.match(r'\d{4}-\d{2}-\d{2}', date): print('date format error') return date_str = date else: date_str = date.strftime('%Y-%m-%d') excel_dir = os.path.join(conf.DATA_DIR, 'AFC', 'Logs') if not os.path.exists(excel_dir): print('excel dir not exists') return excel_path = os.path.join(excel_dir, 'bs_{0}.xlsx'.format(date_str)) # log_path = os.path.join(conf.LOG_DIR, 'bs.log.{0}'.format(date_str)) log_path = os.path.join(conf.LOG_DIR, 'bs_statistics.log.{0}'.format(date_str)) if not os.path.exists(log_path): print('log_path not exists') return summary_dict = {} with open(log_path, 'r', encoding='utf-8') as fp: for line in fp: # search_obj = re.search(r'task=(.*) merged_bs_summary=(.*)', line) search_obj = re.search(r'\[task=(.*)] \[bs_summary=(.*)]', line) task_str = search_obj.group(1) business_type, doc_id_str = task_str.split(consts.SPLIT_STR) doc_id = int(doc_id_str) doc_class = HILDoc if business_type == consts.HIL_PREFIX else AFCDoc application_id = doc_class.objects.filter(id=doc_id).values_list('application_id', flat=True) bs_summary_str = search_obj.group(2) new_bs_summary_str = re.sub(r'datetime.date\(\d+, \d+, \d+\)', 'None', bs_summary_str) bs_summary = ast.literal_eval(new_bs_summary_str) for value_dict in bs_summary.values(): classify = value_dict.get('classify') if classify is None: continue summary_dict.setdefault(classify, []).append(application_id[0]) wb = Workbook() wb.remove(wb.get_sheet_by_name('Sheet')) for classify, application_id_list in summary_dict.items(): sheet_name = consts.CLASSIFY_LIST[classify][0] ws = wb.create_sheet(sheet_name) for application_id in application_id_list: ws.append((application_id, None)) wb.save(excel_path)