import re import os import ast import datetime from openpyxl import Workbook, load_workbook from django.core.management import BaseCommand from settings import conf from common.mixins import LoggerMixin from apps.doc.models import HILDoc, AFCDoc from apps.doc import consts class Command(BaseCommand, LoggerMixin): def __init__(self): super().__init__() self.sheet_name = '身份证' self.header = ('申请号', '身份证号', '民族', '时间戳') 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') # afc_excel_dir = os.path.join(conf.DATA_DIR, 'AFC', 'IdCard') # hil_excel_dir = os.path.join(conf.DATA_DIR, 'HIL', 'IdCard') afc_excel_dir = conf.IC_REPORT_AFC hil_excel_dir = conf.IC_REPORT_HIL if not os.path.exists(afc_excel_dir) or not os.path.exists(hil_excel_dir): print('excel_dir not exist') return log_path = os.path.join(conf.LOG_DIR, 'idcard.log.{0}'.format(date_str)) if not os.path.exists(log_path): print('log_path not exists') return afc_excel_path = os.path.join(afc_excel_dir, 'idcard_{0}.xlsx'.format(date_str)) hil_excel_path = os.path.join(hil_excel_dir, 'idcard_{0}.xlsx'.format(date_str)) if os.path.isfile(afc_excel_path): wb_afc = load_workbook(afc_excel_path) ws_afc = wb_afc.get_sheet_by_name(self.sheet_name) else: wb_afc = Workbook() ws_afc = wb_afc.create_sheet(self.sheet_name) ws_afc.append(self.header) wb_afc.remove(wb_afc.get_sheet_by_name('Sheet')) if os.path.isfile(hil_excel_path): wb_hil = load_workbook(hil_excel_path) ws_hil = wb_hil.get_sheet_by_name(self.sheet_name) else: wb_hil = Workbook() ws_hil = wb_hil.create_sheet(self.sheet_name) ws_hil.append(self.header) wb_hil.remove(wb_hil.get_sheet_by_name('Sheet')) with open(log_path, 'r', encoding='utf-8') as fp: for line in fp: search_obj = re.match(r'\[(.*)] \[task=(.*)] \[idcard=(.*)]', line) idcard_str = search_obj.group(3) idcard_list = ast.literal_eval(idcard_str) content_list = [] for idcard_dict in idcard_list: nation = idcard_dict.get('民族') if nation is None: continue # if idcard_dict.get('类别') == '1': # continue content_list.append((idcard_dict.get('公民身份号码'), nation)) if len(content_list) == 0: continue time_str = search_obj.group(1) task_str = search_obj.group(2) business_type, doc_id_str = task_str.split(consts.SPLIT_STR) doc_class = HILDoc if business_type == consts.HIL_PREFIX else AFCDoc application_id = doc_class.objects.filter(id=int(doc_id_str)).values_list('application_id', flat=True) if business_type == consts.HIL_PREFIX: for id_num, nation in content_list: ws_hil.append((application_id[0], id_num, nation, time_str)) else: for id_num, nation in content_list: ws_afc.append((application_id[0], id_num, nation, time_str)) wb_afc.save(afc_excel_path) wb_hil.save(hil_excel_path)