Example #1
0
def load_lines():
    """Загрузка линий"""
    for conclusion in JointConclusion.objects.all():
        conclusion.delete()
    for welding_joint in WeldingJoint.objects.all():
        welding_joint.delete()
    for joint in Joint.objects.all():
        joint.delete()
    for line in Line.objects.all():
        line.delete()
    for titul in Titul.objects.all():
        titul.delete()

    subject = Subject.objects.all().first()
    titul = Titul.objects.create(name='У920', subject=subject)

    wb = open_wb('more_lines.xlsx')
    sheet = wb['Линии']

    rows = sheet.rows
    for row in rows:
        value = row[2].value
        if not value:
            continue
        value = '%s' % value
        value = value.strip()
        line = Line.objects.filter(name=value, titul=titul).first()
        if not line:
            #logger.info('[ERROR]: line not found %s' % value)
            Line.objects.create(name=value, titul=titul)
Example #2
0
def load_titul():
    cur_titul = Titul.objects.filter(name='У920').first()
    if not cur_titul:
        logger.info('[ERROR]: titul У920 not found')
        return
    i = 0
    wb = open_wb('920.xlsx')
    sheet = wb.active
    rows = sheet.rows
    for row in rows:
        if i < 2:
            i += 1
            continue
        cell_values = [cell.value for cell in row]
        line_str = cell_values[0].strip()
        joint_str = '%s' % cell_values[1]
        joint_str = joint_str.strip()
        stigma = None
        if cell_values[2]:
            stigma = cell_values[2].strip()
        material = cell_values[3].strip()
        diameter = '%s' % cell_values[4]
        diameter = diameter.strip().replace(',', '.')
        side_thickness = '%s' % cell_values[5]
        side_thickness = side_thickness.strip().replace(',', '.')
        welding_date = '%s' % cell_values[6]
        welding_date = welding_date.strip()
        if welding_date.endswith('/20'):
            welding_date = '%s2020' % welding_date[:-2]
        welding_date = str_to_date(welding_date)
        welding_type = cell_values[7].strip()
        conn_view = cell_values[8].strip()
        el1 = cell_values[9].strip()
        el2 = cell_values[10].strip()

        line = Line.objects.filter(name=line_str).first()
        if line:
            joint = Joint.objects.filter(name=joint_str, line=line).first()
            if not joint:
                joint = Joint(
                    line=line,
                    name=joint_str,
                )
            joint.diameter = diameter
            joint.side_thickness = side_thickness
            joint.welding_date = welding_date
            joint.material = search_choice(replace_eng2rus(material.upper()),
                                           MATERIALS)
            joint.welding_type = search_choice(
                replace_eng2rus(welding_type.upper()), WELDING_TYPES)
            joint.welding_conn_view = search_choice(
                replace_eng2rus(conn_view.upper()),
                Joint.welding_conn_view_choices)
            joint.join_type_from = search_choice(replace_eng2rus(el1.lower()),
                                                 JOIN_TYPES)
            joint.join_type_to = search_choice(replace_eng2rus(el2.lower()),
                                               JOIN_TYPES)
            joint.save()
        else:
            print('линия не найдена %s стык %s' % (line_str, joint_str))
Example #3
0
def promocode_by_email(request):
    """Промокод по емайлу из эксель файла
       :param request: HttpRequest
    """
    context = {}

    method = request.GET
    if request.method == 'POST':
        method = request.POST
    search_email = check_email(method.get('email'))
    if not search_email:
        return JsonResponse(context, safe=False)

    wb = open_wb('promocodes.xlsx')
    sheet = wb.active

    i, row = search_header(sheet.rows, symbols='email')
    icode = None
    iemail = None
    j = 0
    for cell in row:
        if cell.value == 'code':
            icode = j
        elif cell.value == 'email':
            iemail = j
        j += 1
    for row in sheet.rows:
        code = row[icode].value
        email = row[iemail].value
        if not code and not email:
            break
        if email == search_email:
            context['code'] = code

    return JsonResponse(context, safe=False)
def analyze_conclusion(path: str, titul: str):
    """Разбираем ибучее заключение из эксель файла
       :param path: путь до эксельки заключения
       :param titul: экземпляр Titul
    """
    if not path.endswith('.xlsx'):
        #logger.info('NOT XLSX file %s' % path)
        return
    wb = open_wb(path)
    sheet = None
    # ВИК есть всегда - ищем его,
    # по нему получим линию и мб еще что-то
    for item in wb:
        if item.title == 'ВИК':
            sheet = item
            #analyze_vik(sheet, titul, path)
            #exit()
    for item in wb:
        if item.title == 'РК':
            sheet = item
            analyze_rk(sheet, titul, path)
def more_lines_helper(path: str):
    """Загрузка дополнительных узлов в дополнительным линиям
       :param path: путь до эксельки
    """
    subject = Subject.objects.all().first()
    wb = open_wb(path)
    sheet = wb.active
    rows = sheet.rows
    cur_titul = None
    for row in rows:
        cell_values = [cell.value for cell in row]
        # 1 - линия
        # 2 - стык
        # 3 - диаметр х тощина стенки
        # 4 - дата сварки
        # 5 - клеймо
        # 6 - вид сварного соединения
        # 7 - тип сварки
        # 12 - статус (новый/готов)
        digit = row[0].value
        if not digit:
            continue
        digit = str(digit)
        if 'Титул ' in digit:
            titul_str = digit.split('Титул ')[1]
            titul_str = titul_str.split(' ')[0]
            titul_str = titul_str.split('.')[0]
            titul = Titul.objects.filter(name=titul_str).first()
            if not titul:
                logger.info('[ERROR]: titul not found %s' % titul_str)
                cur_titul = Titul.objects.create(name=titul_str,
                                                 subject=subject)
            else:
                cur_titul = titul
            #logger.info('TITUL %s' % cur_titul.name)

        diameter = side_thickness = date = stigma = welding_conn_view = welding_type = None
        joint_str = row[2].value
        size = row[3].value
        if size and ('х' in size or 'ъ' in size):
            size = str(size).strip()
            if 'ъ' in size:
                diameter, side_thickness = size.split('ъ')
            elif 'х' in size:
                diameter, side_thickness = size.split('х')
            elif 'x' in size:
                diameter, side_thickness = size.split('x')
            diameter = diameter.strip().replace(',', '.')
            side_thickness = side_thickness.strip().replace(',', '.')
            if '/' in side_thickness:
                side_thickness = side_thickness.split('/')[0]

        if row[4].value:
            date = str_to_date(str(row[4].value))
        if row[5].value:
            stigma = str(row[5].value).strip()
            try:
                stigma = replace_rus2eng(stigma)
            except Exception as e:
                print('[ERROR]: %s' % e)
                stigma = None
        if row[6].value:
            welding_conn_view_str = replace_eng2rus(row[6].value)
            welding_conn_view = get_choice(
                welding_conn_view_str, WeldingJoint.welding_conn_view_choices)
        if row[7].value:
            welding_type = row[7].value.replace('+', ' - ')
            welding_type = replace_eng2rus(welding_type)
            welding_type = welding_type.replace('  ', ' ')
            welding_type = get_choice(welding_type, WELDING_TYPES)

        line_str = row[1].value
        if not line_str or not 'Линия ' in line_str:
            #print(digit, line_str)
            continue
        line_str = line_str.split('Линия ')[1]
        line_str = line_str.strip()
        try:
            line_str = replace_rus2eng(line_str)
        except Exception:
            print('Русские буквы даже после всех замен %s, стык %s' %
                  (line_str, joint_str))
            continue
        analogs = Line.objects.filter(name__startswith=line_str,
                                      titul=cur_titul)
        for item in analogs:
            if item.name.split('-')[0] == line_str:
                analogs = [item]
                break
        repair = None
        state = 1
        state_str = row[12].value
        if state_str:
            if 'готов' in state_str:
                state = 3
            elif 'ремонт' in state_str:
                repair = 1
            #print(state_str)
        if not analogs:
            print('Линия не найдена %s в титуле %s, стык %s' %
                  (line_str, cur_titul.name, joint_str))
            continue
        elif len(analogs) > 1:
            print(
                'Найдено больше 1 линии по "%s", это %s в титуле %s, стык %s' %
                (line_str, [item.name
                            for item in analogs], cur_titul.name, joint_str))
            pass
        else:
            line = analogs[0]
            #print('line %s' % line.name)
            #print(diameter, side_thickness, date, stigma, welding_conn_view, welding_type)
            joint = get_object(row, 2, Joint, {'line': line})

            welding_joint_obj = {
                'joint': joint,
                'diameter': diameter,
                'side_thickness': side_thickness,
                'request_control_date': date,
                'welding_conn_view': welding_conn_view,
                'welding_type': welding_type,
                'state': state,
                'repair': repair,
            }
            #print(welding_joint_obj)
            # Ищем аналог
            analog = get_welding_joint_analog(joint, welding_joint_obj)
            if analog:
                continue

            welding_joint = WeldingJoint.objects.create(**welding_joint_obj)
            print(' --- добавлен в титул %s линию %s стык %s' %
                  (cur_titul.name, line.name, joint.name))
            if not stigma:
                continue
            welder = Welder.objects.filter(stigma__icontains=stigma).first()
            if not welder:
                ###print('welder not found %s' % stigma)
                continue
            JointWelder.objects.create(welding_joint=welding_joint,
                                       welder=welder,
                                       position=1)
def analyze_daily_report_weldings():
    """Заполнение базы уникальными значениями из эксельки"""
    company = Company.objects.create(
        name='ООО "Транспромстрой"',
        customer='ООО "ИНК"',
        location='г. Усть-Кут',
        contractor='ООО "Транспромстрой"',
        fitter='ООО "Транспромстрой"',
        code='ТПС',
    )
    subject = Subject.objects.create(
        name='Усть-Кутская газофракционирующая установка',
        code='ГФУ',
        company=company,
    )

    wb = open_wb(daily_report_weldings)

    sheet = None
    for item in wb:
        if item.title in ('Отчет по стыкам ГФУ', ):
            sheet = item
    if not sheet:
        logger.info('[ERROR]: sheet not found')
        return

    rows = sheet.rows
    i, header = search_header(rows)
    if header is None:
        logger.info('[ERROR]: header not found')

    workshifts = []
    control_types = []
    conn_types_views = []
    welding_types = []
    categories = []
    control_results = []
    materials = []
    join_types = []

    for row in rows:  # Продолжаем обход по генератору
        cell_values = [cell.value for cell in row]
        if not any(cell_values):
            logger.info('EOF reached')
            break

        # Титул это i+1 ячейка
        titul = get_object(row, i + 1, Titul, {'subject': subject})
        if not titul:
            continue

        diameter = row[i + 7].value if row[i + 7].value else None
        if diameter:
            diameter = str(diameter).replace(',', '.')
            try:
                diameter = float(diameter)
            except ValueError:
                diameter = None
                logger.info('[ERROR]: diameter %s' % diameter)

        side_thickness = row[i + 8].value if row[i + 8].value else None
        if side_thickness:
            side_thickness = str(side_thickness).replace(',', '.')
            try:
                side_thickness = float(side_thickness)
            except ValueError:
                side_thickness = None
                logger.info('[ERROR]: side_thickness %s' % side_thickness)

        # Линия это i+2 ячейка
        line = get_object(row, i + 2, Line, {'titul': titul})
        if not line:
            #logger.info('line is empty {}'.format(row))
            continue

        # № стыка это i+3 ячейка
        joint = None
        joint_str = row[i + 3].value
        if line and joint_str:
            joint_str = '%s' % joint_str
            joint_str = joint_str.strip()
            if '*' in joint_str:
                continue
            joint = Joint.objects.filter(name=joint_str, line=line).first()
            if not joint:
                joint = Joint.objects.create(name=joint_str, line=line)

        # материал (сталь) это i+9 ячейка
        material_str = accumulate_data(row, i + 9, materials)

        # свариваемые элементы это i+10 ячейка
        #join_type = get_object(row, i+10, JoinType, {'line': line})
        join_type = accumulate_data(row, i + 10, join_types)

        # смена это i+12 ячейка
        workshift_str = accumulate_data(row, i + 12, workshifts)

        # Сварщик
        welders = []
        stigma = row[i + 14].value  # клеймо сварщика это i+14 ячейка
        if stigma:
            stigma_arr = stigma.split('+')
            for stigma in stigma_arr:
                stigma = '%s' % stigma
                stigma = stigma.strip()
                welder = Welder.objects.filter(stigma=stigma).first()
                if welder:
                    welders.append(welder)

        # контроль это i+17 ячейка
        control_type_str = accumulate_data(row, i + 17, control_types)

        # вид сварного соединения это i+18 ячейка
        conn_type_view_str = accumulate_data(row, i + 18, conn_types_views)

        # тип сварки это i+19 ячейка
        welding_type_str = accumulate_data(row, i + 19, welding_types)

        # категория это i+20 ячейка
        category_str = accumulate_data(row, i + 20, categories)

        # результат контроля это i+22 ячейка
        control_result_str = accumulate_data(row, i + 22, control_results)

        repair = 1 if row[i + 4].value else None
        if row[i + 5].value:
            repair = 2

        welding_date = row[i + 11].value if row[i + 11].value else None
        if welding_date:
            welding_date = str_to_date(str(welding_date))

        request_number = row[i + 15].value if row[i + 15].value else None

        request_control_date = row[i + 16].value if row[i + 16].value else None
        if request_control_date:
            request_control_date = str_to_date(str(request_control_date))

        notice = row[i + 23].value if row[i + 23].value else None

        dinc = row[i + 24].value if row[i + 24].value else None
        if dinc:
            dinc = str(dinc).replace(',', '.')
            try:
                dinc = float(dinc)
            except ValueError:
                dinc = None
                logger.info('[ERROR]: dinc %s' % dinc)

        workshift = get_choice(workshift_str, WeldingJoint.workshift_choices)

        control_type = get_choice(control_type_str,
                                  WeldingJoint.control_choices)

        welding_conn_view = get_choice(conn_type_view_str,
                                       WeldingJoint.welding_conn_view_choices)

        welding_type = get_choice(welding_type_str, WELDING_TYPES)

        category = get_choice(category_str, WeldingJoint.category_choices)

        control_result = get_choice(control_result_str, CONCLUSION_STATES)

        material = get_choice(material_str, MATERIALS)

        join_type_from = None
        join_type_to = None
        if join_type:
            join_type_arr = join_type.split('/')
            if len(join_type_arr) == 2:
                for item in JOIN_TYPES:
                    if item[1][:-1] in join_type_arr[0]:
                        join_type_from = item[0]
                    if item[1][:-1] in join_type_arr[1]:
                        join_type_to = item[0]
        #print(join_type_from, join_type_to, join_type)

        state = 1
        if repair:
            state = 4

        welding_joint_obj = {
            'joint': joint,
            'repair': repair,
            'material': material,
            'welding_date': welding_date,
            'workshift': workshift,
            'request_number': request_number,
            'request_control_date': request_control_date,
            'control_type': control_type,
            'welding_conn_view': welding_conn_view,
            'welding_type': welding_type,
            'category': category,
            'control_result': control_result,
            'notice': notice,
            'join_type_from': join_type_from,
            'join_type_to': join_type_to,
            'diameter': diameter,
            'side_thickness': side_thickness,
            'state': state,
        }

        # Ищем аналог
        analog = get_welding_joint_analog(joint, welding_joint_obj)
        if analog:
            continue

        welding_joint = WeldingJoint.objects.create(**welding_joint_obj)
        for w, welder in enumerate(welders):
            JointWelder.objects.create(
                **{
                    'welding_joint': welding_joint,
                    'welder': welder,
                    'position': w + 1,
                })
    logger.info('Workshifts: %s' % workshifts)
    logger.info('ControlTypes: %s' % control_types)
    logger.info('ConnTypesViews: %s' % conn_types_views)
    logger.info('WeldingTypes: %s' % welding_types)
    logger.info('Categories: %s' % categories)
    logger.info('ControlResults: %s' % control_results)
    #logger.info('WeldingJoints: %s' % welding_joints)
    logger.info('JoinTypes: %s' % join_types)
def analyze_welders():
    """Заполнение базы сварщиками из эксельки"""
    wb = open_wb(welders_xlsx)
    sheet = None
    for item in wb:
        if item.title in ('Актуальный список сварщиков', ):
            sheet = item
    if not sheet:
        logger.info('[ERROR]: sheet not found')
        return

    rows = sheet.rows
    i, header = search_header(rows)
    if header is None:
        logger.info('[ERROR]: header not found')

    holding_choices = []
    spent_length_choices = []

    prev_welder = None  # для объединенных ячеек
    prev_holding_value = None  # для объединенных ячеек
    prev_welding_type = None  # для объединенных ячеек
    for row in rows:  # Продолжаем обход по генератору
        cell_values = [cell.value for cell in row]
        if not any(cell_values):
            logger.info('EOF reached')
            break

        # Компания это i+23 ячейка
        company = None
        company_str = row[i + 23].value
        if company_str:
            company_str = str(company_str).strip()
            company = Company.objects.filter(name=company_str).first()
            if not company:
                company = Company.objects.create(name=company_str)

        # Примечание это i+24 ячейка
        notice = get_notice(row, i + 24)

        # Сварщик это i+3, клеймо i+4 ячейка
        welder = get_welder(row, i + 3, notice)
        if welder:
            prev_welder = welder
        else:
            welder = prev_welder

        # Гарантийные письма это i+1 ячейка
        letter_str = row[i + 1].value
        if letter_str:
            letter_str = str(letter_str).strip()
            letter = LetterOfGuarantee.objects.filter(name=letter_str).first()
            if not letter:
                letter = LetterOfGuarantee.objects.create(name=letter_str,
                                                          welder=welder)

        # Акт ВИК номер это i+5, дата это i+6 ячейка
        vik = get_vik(row, i + 5, welder)

        # УЗК/РК номер это i+7, дата это i+8 ячейка
        controlk = get_controlk(row, i + 7, welder)

        # Проведение КСС типоразмер это i+9, марка стали это i+10
        # ксс номер это i+11, ТТ/МК это i+13 ячейка
        holding_kss = get_holding_kss(row,
                                      i + 9,
                                      welder,
                                      holding_choices,
                                      spent_length_choices,
                                      holding_value=prev_holding_value,
                                      with_spent_len=False)
        if holding_kss:
            prev_holding_value = holding_kss.state

        # Мехиспытание номер это i+14, дата это i+15 ячейка
        mechtest = get_mechtest(row, i + 14, welder)

        # НАКС аттестат номер удостоверения это i+16,
        # способ сварки это i+17 ячейка, годен до это i+18
        # НГДО/СК это i+19, место удостоверения это i+20,
        # полугодовая отметка это i+21
        nax = get_nax(row, i + 16, welder, wrong_order=False)

        # Допускной лист номер это i+22
        admission_sheet = get_admission_sheet(row,
                                              i + 22,
                                              welder,
                                              with_date=False)
def analyze_fired_welders():
    """Заполнение базы уволенными сварщиками из эксельки"""
    wb = open_wb(welders_xlsx)
    sheet = None
    for item in wb:
        if item.title in ('Уволенные сварщики-перев.в монт', ):
            sheet = item
    if not sheet:
        logger.info('[ERROR]: sheet not found')
        return

    rows = sheet.rows
    i, header = search_header(rows)
    if header is None:
        logger.info('[ERROR]: header not found')

    prev_welder = None  # для объединенных ячеек
    for row in rows:  # Продолжаем обход по генератору
        cell_values = [cell.value for cell in row]
        if not any(cell_values):
            logger.info('EOF reached')
            break

        # Примечание это i+18 ячейка
        notice = get_notice(row, i + 18)

        # Сварщик это i+1, клеймо i+2 ячейка
        welder = get_welder(row, i + 1, notice, fired=True)
        if welder:
            prev_welder = welder
        else:
            welder = prev_welder

        # Акт ВИК номер это i+3, дата это i+6 ячейка
        vik = get_vik(row, i + 3, welder)

        # УЗК/РК номер это i+5, дата это i+6 ячейка
        controlk = get_controlk(row, i + 5, welder)

        # Проведение КСС типоразмер это i+7, марка стали это i+8
        # ксс номер это i+10,
        # затрачиваемая длина 150мм*2 это i+9 ячейка
        holding_kss = get_holding_kss(row,
                                      i + 7,
                                      welder,
                                      holding_choices=None,
                                      spent_length_choices=None,
                                      holding_value=None,
                                      with_spent_len=True)

        # Мехиспытание номер это i+11, дата это i+12 ячейка
        mechtest = get_mechtest(row, i + 11, welder)

        # НАКС аттестат номер удостоверения это i+16,
        # способ сварки это i+17 ячейка, годен до это i+18
        # НГДО/СК это i+19, место удостоверения это i+20,
        # полугодовая отметка это i+21
        nax = get_nax(row, i + 15, welder, wrong_order=True)

        # Допускной лист номер это i+13
        admission_sheet = get_admission_sheet(row,
                                              i + 13,
                                              welder,
                                              with_date=True)