Перейти к содержимому

Разработчику: артикул из комбинации параметров

Частая задача модульного производства: цена назначается за уникальный артикул, а артикул — это уникальное сочетание параметров. Например:

  • корпус модуля (с полками и начинкой): артикул = модуль + размер модуля + цвет корпуса;
  • фасад: артикул = фрезеровка + размер + декор.

В этой статье — как реализовать это из custom.js. Базу читайте в «Основах кастомизации» и «Спецификации и артикулах».

Каждую позицию спецификации можно перехватить в хуке after_create_spec_item(type, obj, ctx, spec) и:

  1. собрать собственный артикул (spec.code) из параметров объекта;
  2. записать тот же ключ в spec.sum_key, чтобы одинаковые комбинации объединялись, а разные — считались отдельно;
  3. при необходимости подставить цену под этот артикул (например, из вашей таблицы или прайс-листа по артикулу).

Где взять параметры. Тип/размеры/материалы объекта лежат в obj.userData — в params (заданные значения) и computed (вычисленные). Поля ниже взяты из реального кода сцены; перед использованием залогируйте объект (console.log(obj.userData)), чтобы убедиться в наличии нужных полей в вашей версии.

Для корпуса релевантны позиции типа wall (материал корпуса) или module (модуль целиком). Полезные параметры:

  • модуль: obj.userData.params.spec.element_type, obj.userData.params.spec.id, вычисленные computed.code / computed.name;
  • размер: obj.userData.params.spec.size {x, y, z} (или размер выбранного варианта);
  • цвет/материал корпуса: у позиции wallmaterial.code / variant.code выбранного материала корпуса.

Пример — собрать артикул корпуса как «модуль + размер + цвет»:

document.addEventListener('PP_ready', function (e) {
const pp = e.detail.pp;
pp.events.cabinet.after_create_spec_item = function (type, obj, ctx, spec) {
if (type === 'wall') {
// параметры модуля-владельца
const mp = obj.userData?.params?.spec || {};
const moduleId = mp.element_type ? (mp.element_type + ':' + mp.id) : 'mod';
const size = mp.size || {};
const sizeKey = Math.round(size.x || 0) + 'x' + Math.round(size.z || 0);
// цвет/материал корпуса — из самой позиции
const colorCode = spec.material_code || spec.variant_code || 'mat';
// собственный уникальный артикул
spec.code = [moduleId, sizeKey, colorCode].join('-');
// развести/объединить позиции по этому ключу
spec.sum_key = spec.code;
// при необходимости — своя цена под этот артикул
// spec.price = myPriceTable[spec.code] || spec.price;
}
};
});

Так каждый уникальный набор «модуль + размер + цвет корпуса» станет отдельной строкой спецификации со своим артикулом; одинаковые наборы сложатся в одну позицию с суммарным количеством.

Для фасада перехватывайте тип facade. Полезные параметры (в obj.userData.computed):

  • фрезеровка (тип фасада): computed.type_ind — индекс/ключ типа фрезеровки (глухой/витрина/решётка/…);
  • размер: computed.size.x, computed.size.y;
  • декор: выбранный материал лицевой стороны — mat = pp.libs.decors.find_item(<id выбранного декора>), артикул декора = mat.code (в позиции он уже есть как spec.mat_code).

Пример:

pp.events.cabinet.after_create_spec_item = function (type, obj, ctx, spec) {
if (type === 'facade') {
const c = obj.userData?.computed || {};
const frez = c.type_ind != null ? String(c.type_ind) : 'frez';
const w = Math.round((c.size && c.size.x) || spec.size_x || 0);
const h = Math.round((c.size && c.size.y) || 0);
const decor = spec.mat_code || 'decor';
spec.code = [frez, w + 'x' + h, decor].join('-');
spec.sum_key = spec.code;
// spec.price = myFacadePrices[spec.code] || spec.price;
}
};

Уже есть штатный аналог для фасадов. В редакторе фасада есть вкладка «Точные размеры фасадов» — это встроенная «цена за комбинацию декор + тип фрезеровки + точный размер» с собственным артикулом, без кода. Если вам хватает фиксированных размеров — используйте её. Программный путь через after_create_spec_item нужен, когда правило сложнее или требуется единая логика для корпуса и фасада сразу.

Цену можно:

  • взять из вашей таблицы прямо в коде (как myPriceTable[spec.code] выше);
  • или вести в прайс-листе позиции с этими артикулами и подтягивать стандартным механизмом «цена по артикулу» — тогда достаточно, чтобы spec.code совпадал с артикулом в прайсе.

Второй путь удобнее: цены меняются в прайс-листе без правки кода.

  1. Добавьте на сцену модуль, поменяйте размер и цвет корпуса — убедитесь, что артикул в спецификации меняется.
  2. Проверьте, что одинаковые комбинации объединяются в одну строку, а разные — раздельны.
  3. Сформируйте PDF и Excel — артикулы и цены должны совпадать с экраном (данные общие).

Уникальный артикул из параметров собирается в хуке after_create_spec_item: читаете параметры объекта (obj.userData.params/computed), формируете spec.code и spec.sum_key из нужной комбинации (модуль+размер+цвет для корпуса; фрезеровка+размер+декор для фасада) и при желании задаёте spec.price. Для фасадов с фиксированными размерами есть штатная вкладка «Точные размеры фасадов». Цену удобно держать в прайс-листе и подтягивать по совпадению артикула.