bs_statistics.py 2.77 KB
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))
        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)
                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)