/
YakuninAV
/
Convertors
Обзор
Документация
Войти
/
YakuninAV
/
Convertors
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
python/pir_distr.py
92 строки
6 KB
YakuninAV
begin with gitflick
31 июл 2026, 15:21
31 июл 2026, 15:21
1dc0fc6
Код
Авторство
О чём код?
import json # модуль для работы с таблицей DISTR базы ПИР # таблица DISTR имеет следующцю структуру # DISTR_ID - УИД :: автогенерация # DISTR_TYPE - тип разблюдовки (Р или С) всегда будет Р :: в настоящее время не используется # KOD - код разблюдовки :: однозначно позволяет определить CAPTION (уникальный код) # SUB_KOD - № подраздела :: неизвестный науке зверь # CAPTION - Наименование раздела разблюдовки # SRC_CODE - Код из эксельной таблицы (строка 3) :: ## этот код позволяет найти CAPTION в источнике # CAP - Первые 10 символов CAPTION :: используется для сортировки по наименованию # KOD_SYNONYM - Кода раздела - синонима (одинаковые, по существу, разделы) :: чёрте-что # KOD_COLLAPSE - Кода раздела, в который этот раздел нужно превратить. Этот раздел УНИЧТОЖИТЬ. :: ## этот код будет использован при выгрузке расценок в ТС # SUBLEVEL - автовычисляемое # FORBIDDEN - Запрещено для удаления (зарезервировано) :: не используется при добавлении # Created - Дата создания раздела :: автогенерация # Modified - Дата последнего изменения раздела :: не используется при добавлении # Comment - Коментарий """ При загрузке из Excel используются реквизиты : 1) код разблюдовки (KOD) \n код представляет собой последовательность символов вида: \n code[.code]* \n где code == [А-Яа-я][_|-]?[0-9]* \n символ "." создаёт иерархию разблюдовок. Код разблюдовки каждого уровня должен быть представлен в таблице DISTR, например для кода "код1.код2.код3" в таблице должны быть представлены коды "код1" и "код1.код2" (по-видимому, присутствие в таблице кода "код2" крайне желательно, так-как он также представлен на листе Excel \n 2) название разблюдовки (CAPTION) \n 2.1) Первые 10 символов могут использоваться для ограничения выборки из таблицы для сравнения наименований Эти символы получаются удалением всех не буквенно-цифровых в CAPTION и приведением их к нижнему регистру \n 3) дополнительно может использоваться альтернативный код разблюдовки (KOD_COLLAPSE) \n """ def add_row_to_node(tree, row): """ Функция добавляет строку с кодом разблюдовки в дерево Дерево представляет собой иерархический словарь node = {subcode, subtree, row} subcode - субкод: часть кода между точками. Для 0 уровня тождественна коду subtree - ветка для субкодов следующего уровня или None для если ниже ничего нет rows - информация из БД """ code = row[2] # код разблюдовки ls = code.split('.') # список субкодов i = 0 s = ls[i] dc = tree i += 1 if s in dc: # субкод найден на уровне if i == len(ls): # просмотр завершён возвращаем узел return dc[s] else: # субкод не найден if i == len(ls): # просмотр завершён оранизуем новую ветку pass else: pass def load_distr(conn): """ Функция загружает в память таблицу "distr" в виде иерархицеской структуры Каждый элемент структуры имеет вид: \n node :: {code, name, alias} """ cursor = conn.cursor() cursor.execute('select SUBLEVEL, CAP, KOD, CAPTION, KOD_COLLAPSE from distr order by KOD, SUBLEVEL') sb = -1 cd = "" dict_cap = dict() # словарь в качестве ключей используется CAP, для каждого ключа составляется список строк list_cap = list() # список строк с одинаковым CAP dict_code = dict() # дерево кодов разблюдовок for row in cursor.fetchall(): cp = row[1] if cp in dict_cap: dict_cap[cp].append(row) else: list_cap.append(dict_cap) dict_cap = {cp: [row]} # здесь процедура вешающая строку в узел дерева ls = row[2].split('.') dc = dict() i = 0 while True: if i == len(ls): break i += 1 f = open(r'd:\DataBasis\Data\Pir\distr.json', "wt", encoding="utf-8") #print(json.dumps(list_cap, ensure_ascii=False, indent=4), file=f) print(list_cap, file=f) f.close() return list_cap