147 lines
5.4 KiB
Python
147 lines
5.4 KiB
Python
import os
|
||
import pandas as pd
|
||
from openpyxl import load_workbook
|
||
import pyautogui
|
||
import time
|
||
import subprocess
|
||
|
||
SOURCE_TABLE = r'13. ВВОД в ПКЗО/Исходные данные для программы/Исходная таблица.xlsx'
|
||
MIF_FOLDER = r'13. ВВОД в ПКЗО/Исходные данные для программы/все миф/'
|
||
RESULT_TABLE = r'13. ВВОД в ПКЗО/Итоговая таблица пример.xlsx'
|
||
|
||
ERRORS = {
|
||
'нет миф': 'НЕТ МИФ',
|
||
'площадь': 'площадь',
|
||
'нет кн': 'НЕТ КН',
|
||
'нет выписки': 'НЕТ ВЫПИСКИ',
|
||
'вид он': 'ВИД ОН',
|
||
'тип': 'ТИП',
|
||
}
|
||
|
||
class DataLoader:
|
||
def __init__(self, source_table, mif_folder):
|
||
self.source_table = source_table
|
||
self.mif_folder = mif_folder
|
||
self.df = pd.read_excel(self.source_table)
|
||
|
||
def find_mif_file(self, kn):
|
||
kn_variants = [
|
||
kn.replace(':', ' '),
|
||
kn.replace(':', '_'),
|
||
kn.replace(':', ''),
|
||
]
|
||
for name in os.listdir(self.mif_folder):
|
||
for variant in kn_variants:
|
||
if variant in name and name.lower().endswith('.mif'):
|
||
return os.path.join(self.mif_folder, name)
|
||
return None
|
||
|
||
def get_mif_area(self, mif_path):
|
||
# Заглушка: возвращает None
|
||
return None
|
||
|
||
def make_comment(self, row):
|
||
doc = str(row['Реквизиты и наименование документов - обоснование опр.границ']).strip()
|
||
if not doc.endswith('.'):
|
||
doc += '.'
|
||
comment = doc + ' ' + str(row['Пояснения по границам']).strip()
|
||
return comment
|
||
|
||
def check_pkzo(self, kn, vid_on, type_on):
|
||
# Заглушка: всегда возвращает True
|
||
return True, True, True, True
|
||
|
||
class PKZOAutomator:
|
||
def __init__(self, pkzo_path=None):
|
||
self.pkzo_path = pkzo_path or r'C:\Program Files\PKZO\pkzo.exe'
|
||
|
||
def start_pkzo(self):
|
||
if os.path.exists(self.pkzo_path):
|
||
subprocess.Popen(self.pkzo_path)
|
||
time.sleep(10)
|
||
else:
|
||
print('ПКЗО не найден, запустите вручную.')
|
||
|
||
def automate_object(self, row, mif_path, comment):
|
||
time.sleep(2)
|
||
pyautogui.hotkey('ctrl', 'f')
|
||
time.sleep(0.5)
|
||
pyautogui.typewrite(str(row['КН']))
|
||
pyautogui.press('enter')
|
||
time.sleep(1)
|
||
pyautogui.rightClick()
|
||
time.sleep(0.5)
|
||
pyautogui.typewrite(['down', 'down', 'enter'])
|
||
time.sleep(0.5)
|
||
pyautogui.typewrite(mif_path)
|
||
pyautogui.press('enter')
|
||
time.sleep(1)
|
||
pyautogui.rightClick()
|
||
time.sleep(0.5)
|
||
pyautogui.typewrite(['down', 'enter'])
|
||
time.sleep(0.5)
|
||
if str(row['Тип']).strip().lower() == 'уточнение':
|
||
pyautogui.typewrite('уточняемый')
|
||
else:
|
||
pyautogui.typewrite('исправляемый')
|
||
pyautogui.press('enter')
|
||
time.sleep(1)
|
||
pyautogui.doubleClick()
|
||
time.sleep(0.5)
|
||
pyautogui.typewrite(['tab', 'tab'])
|
||
pyautogui.typewrite(comment)
|
||
pyautogui.press('enter')
|
||
time.sleep(1)
|
||
|
||
def main():
|
||
loader = DataLoader(SOURCE_TABLE, MIF_FOLDER)
|
||
automator = PKZOAutomator()
|
||
automator.start_pkzo()
|
||
results = []
|
||
for idx, row in loader.df.iterrows():
|
||
kn = str(row['КН']).strip()
|
||
vid_on = str(row['Вид ОН']).strip()
|
||
s_table = row['S определенная, кв.м.']
|
||
type_on = str(row['Тип']).strip().lower()
|
||
errors = []
|
||
result = 'загружено'
|
||
mif_path = loader.find_mif_file(kn)
|
||
if not mif_path:
|
||
result = 'не загружено'
|
||
errors.append(ERRORS['нет миф'])
|
||
else:
|
||
if vid_on == 'ЗУ':
|
||
s_mif = loader.get_mif_area(mif_path)
|
||
if s_mif is not None and round(s_mif) != round(s_table):
|
||
result = 'не загружено'
|
||
errors.append(ERRORS['площадь'])
|
||
pkzo_kn, pkzo_vyp, pkzo_vid, pkzo_type = loader.check_pkzo(kn, vid_on, type_on)
|
||
if not pkzo_kn:
|
||
result = 'не загружено'
|
||
errors.append(ERRORS['нет кн'])
|
||
if not pkzo_vyp:
|
||
result = 'не загружено'
|
||
errors.append(ERRORS['нет выписки'])
|
||
if not pkzo_vid:
|
||
result = 'не загружено'
|
||
errors.append(ERRORS['вид он'])
|
||
if not pkzo_type:
|
||
result = 'не загружено'
|
||
errors.append(ERRORS['тип'])
|
||
if result == 'загружено' and not errors:
|
||
comment = loader.make_comment(row)
|
||
automator.automate_object(row, mif_path, comment)
|
||
comment = loader.make_comment(row)
|
||
results.append({
|
||
**row,
|
||
'Результат загрузки': result,
|
||
'Причина незагрузки': ', '.join(errors),
|
||
'Площадь по МИФ': None,
|
||
'Пояснения': comment,
|
||
})
|
||
result_df = pd.DataFrame(results)
|
||
result_df.to_excel(RESULT_TABLE, index=False)
|
||
|
||
if __name__ == '__main__':
|
||
main()
|