productdb.json: Единый источник достоверных данных о продуктах
В этой статье объясняется, как productdb служит единым источником достоверных данных для всей информации о продуктах, определяя компоненты, характеристики, правила совместимости и спецификации (BOM) в одном централизованном файле.
Проблема: Разрозненные данные о продуктах
Данные о продуктах могут быть разбросаны по нескольким системам:
-
Система управления запасами: Стоимость деталей и уровни запасов
-
ERP-система: Спецификации (BOM) и производственные данные
-
Веб-сайт: Описания продуктов и технические характеристики
-
Бухгалтерия: Правила ценообразования и калькуляции затрат
Когда данные разрознены, возникают несоответствия:
-
На сайте указано 16 ГБ ОЗУ, а в ERP — 8 ГБ
-
В ценообразовании используются устаревшие данные о себестоимости
-
Спецификации (BOM) не синхронизированы с реальными продуктами
-
Характеристики не соответствуют действительности
Нам нужен единый источник достоверных данных, на который будут ссылаться все системы.
Решение: productdb.json
productdb.json — это файл в формате JSON, который определяет каждый компонент, его характеристики, правила совместимости и составные части. Все системы загружают этот файл при запуске.
Этот файл находится под контролем версий в Git, что гарантирует отслеживание и проверяемость всех изменений.
Структура файла
Файл организован по категориям компонентов:
{
"Chassis": { ... },
"Board": { ... },
# ... (детали реализации опущены)
Каждая категория содержит компоненты с их свойствами.
Определение компонента
Каждый компонент имеет несколько свойств:
Базовые свойства
class: Класс компонента для сопоставления совместимости
"class": "THIN_MINI_ITX"
internal: Внутреннее название для учета запасов и производства
"internal": "Chassis, Treo"
external: Клиентское название для сайта и маркетинга
"external": "Thinvent® Treo Mini PC"
weight: Физический вес в граммах
"weight": 590
Правила совместимости (allows)
Поле allows определяет, какие компоненты могут использоваться вместе:
"allows": {
"Board": [
{"class": "THIN_MINI_ITX"}
# ... (детали реализации опущены)
Это означает:
-
Board: Совместимы только платы класса
THIN_MINI_ITX -
Flash: Совместимы только накопители класса
m.2_SATA -
Accessories: Все аксессуары совместимы
Совместимость может быть указана через:
На основе класса (динамически):
{"class": "THIN_MINI_ITX"}
На основе ID детали (явно):
["N100", "N150", "i5-1335U"]
Спецификация (BOM, constituents)
Поле constituents определяет, из каких частей состоит этот компонент:
"constituents": [
{
"Category": "Custom",
# ... (детали реализации опущены)
Это позволяет:
-
Расчет себестоимости: Суммировать стоимость всех составляющих
-
Производство: Генерировать списки комплектующих для сборки
-
Учет запасов: Отслеживать использование компонентов
Предоставление характеристик (provides)
Поле provides определяет характеристики, которые вносит этот компонент:
"provides": {
"Operating Temperature": "0°C ~ 40°C",
"Operating Humidity": "20% ~ 80% RH, non condensing",
# ... (детали реализации опущены)
Эти характеристики агрегируются по всем компонентам в артикуле (SKU), чтобы создать полную спецификацию продукта.
Пример: Корпус Treo
{
"Treo": {
"class": "THIN_MINI_ITX",
# ... (детали реализации опущены)
Пример: Плата N100
{
"N100": {
"class": "THIN_MINI_ITX",
# ... (детали реализации опущены)
Загрузка productdb.json
Файл загружается при запуске приложения:
import json
with open(PRODUCTDB_JSON_PATH, "r", encoding="utf-8") as productdb_file:
productdb = json.load(productdb_file)
Это создает словарь в памяти:
productdb = {
"Chassis": {
"Treo": { ... },
# ... (детали реализации опущены)
Весь код ссылается на этот словарь для получения данных о продуктах.
Доступ к данным компонентов
Получение компонента по категории и ID
chassis = productdb["Chassis"]["Treo"]
board = productdb["Board"]["N100"]
ram = productdb["RAM"]["8"]
Получение клиентского названия
name = productdb["Board"]["N100"]["external"]
# Результат: "Intel® N100 Processor"
Получение характеристик
features = productdb["Board"]["N100"]["provides"]
# Результат: {"Generation": "12th", "Series": "N", ...}
Получение состава
constituents = productdb["Chassis"]["Treo"]["constituents"]
# Результат: [{"Category": "Custom", "PartID": "base_treo", "qty": 1}, ...]
Валидация артикулов (SKU)
Мы используем productdb.json для проверки артикулов:
def check_sku(sku:str) -> bool:
parts = sku.split("-")
mapped_parts = map_parts_to_fields(parts)
# ... (детали реализации опущены)
Подробности см. в Структура артикула (SKU).
Агрегация характеристик
Мы агрегируем характеристики всех компонентов в артикуле:
def get_product_features(sku: str) -> dict:
partids = sku.split("-")
features = {}
# ... (детали реализации опущены)
Пример:
SKU: Treo-N100-8-256-2H-W6-11P
Характеристики:
- Form Factor: Mini PC (от Treo)
- Generation: 12th (от N100)
- Series: N (от N100)
- Cores: 4 (от N100)
- Main Memory: 8 (от 8)
- SSD Storage: 256 (от 256)
- HDMI: 2 (от 2H)
- Operating System: Windows 11 Pro (от 11P)
Подробности см. в Извлечение характеристик.
Расчет себестоимости
Мы рассчитываем себестоимость артикула, суммируя затраты на составные части:
def calculate_cost(item: dict, partid: str) -> tuple:
if "constituents" in item:
# Составной элемент: суммируем затраты на составляющие
# ... (детали реализации опущены)
Этот рекурсивный расчет обрабатывает вложенные составляющие.
Составные элементы
Некоторые компоненты являются составными (сделанными из других компонентов):
Пример: Комплект клавиатура + мышь
{
"KM": {
"internal": "Keyboard + Mouse",
# ... (детали реализации опущены)
Это позволяет:
-
Генерация BOM: Перечислить все необходимые компоненты
-
Расчет себестоимости: Суммировать стоимость клавиатуры + мыши + адаптера
-
Отслеживание запасов: Отслеживать использование компонентов
Обновление productdb.json
Ручное редактирование
Файл редактируется вручную в текстовом редакторе или IDE. Изменения фиксируются в Git:
git add PATH_TO_FILE/productdb.json
git commit -m "Add new N150 board configuration"
git push
Валидация
После редактирования проверьте синтаксис JSON:
python -m json.tool PATH_TO_FILE/productdb.json > /dev/null
Это проверяет наличие синтаксических ошибок.
Развертывание
После отправки в Git файл развертывается в рабочей среде
Приложение перезагружает файл при перезапуске.
Интеграция с другими системами
Веб-сайт
Веб-сайт использует productdb.json для:
-
Генерации страниц продуктов
-
Отображения технических характеристик
-
Фильтрации продуктов по характеристикам
-
Генерации сравнительных таблиц
ERP
ERP-система использует productdb.json для:
-
Валидации артикулов (SKU)
-
Генерации спецификаций (BOM)
-
Расчета себестоимости
-
Отслеживания запасов
Бухгалтерия
Бухгалтерия использует productdb.json для:
-
Расчета себестоимости продуктов
-
Генерации счетов-фактур
-
Отслеживания себестоимости проданных товаров (COGS)
SEO-пайплайн
SEO-пайплайн использует productdb.json для:
-
Извлечения характеристик для сопоставления фраз
-
Генерации фильтров для извлечения фильтров
-
Сопоставления запросов с продуктами по характеристикам
Подробности см. в Обзор SEO-пайплайна.
Преимущества единого источника достоверных данных
1. Согласованность
Все системы используют одни и те же данные. Никаких расхождений.
2. Удобство поддержки
Обновите один раз — изменения распространятся везде. Не нужно обновлять несколько систем.
3. Аудируемость
Все изменения отслеживаются в Git. Легко увидеть, кто, что и когда изменил.
4. Тестируемость
Изменения можно протестировать в промежуточной среде перед развертыванием в рабочей.
5. Простота
Один файл для понимания. Никаких сложных схем баз данных или API.
6. Производительность
Словарь в памяти обеспечивает поиск за O(1). Не нужны запросы к базе данных.
7. Переносимость
JSON удобочитаем и не зависит от языка. Легко разбирается на любом языке.
Ограничения
1. Ручное редактирование
Изменения требуют ручного редактирования и коммитов в Git. Нет веб-интерфейса для нетехнических пользователей.
2. Требуется перезапуск
Приложение должно перезапускаться для загрузки изменений. Нет горячей перезагрузки.
3. Нет валидации
Синтаксис JSON проверяется, но семантическая валидация (например, "существует ли эта деталь?") не выполняется автоматически.
4. Параллелизм
Одновременное редактирование несколькими людьми может вызвать конфликты слияния.
Ссылки
Технические концепции
-
JSON - Википедия
-
Единый источник достоверных данных - Википедия
-
Спецификация (BOM) - Википедия
Связанные статьи
-
Структура артикула (SKU) - Архитектура артикулов через дефис
-
Извлечение характеристик - Как извлекаются характеристики
-
Сопоставление фраз с фильтрами - Использование характеристик для фильтров
-
Обзор SEO-пайплайна - Полная архитектура пайплайна
Резюме
productdb.json — это единый источник достоверных данных для всей информации о продуктах:
Структура:
-
Организован по категориям компонентов (Chassis, Board, RAM и т.д.)
-
Каждый компонент имеет свойства (class, internal, external, weight)
-
Правила совместимости (allows)
-
Спецификация (constituents)
-
Предоставление характеристик (provides)
Преимущества:
-
Согласованность во всех системах
-
Удобство поддержки (обновить один раз)
-
Аудируемость (отслеживание в Git)
-
Тестируемость (развертывание в промежуточной среде)
-
Простота (один файл)
-
Производительность (поиск в памяти за O(1))
-
Переносимость (формат JSON)
Варианты использования:
-
Валидация артикулов (SKU)
-
Агрегация характеристик
-
Расчет себестоимости
-
Генерация спецификаций (BOM)
-
Страницы продуктов на сайте
-
Извлечение характеристик для SEO-пайплайна
Этот централизованный подход гарантирует, что все системы ссылаются на одни и те же данные о продуктах, устраняя несоответствия и упрощая поддержку.