Тип Cubux.Product
Описание структуры продукта. Возможны дополнительные затраты, которые должны обрабатываться вместе, как целая древовидная структура.
Объект со следующими полями:
Поле | Тип | Описание |
---|---|---|
hash PK |
md5 |
Хеш продукта (см. далее) |
ver (только чтение) |
uint16 |
Версия (см. далее) |
category_uuid |
uuid , NULL |
Категория доходов Cubux.SelfCategory , которой изначально соответствует данный продукт или услуга |
specification_uuid |
uuid , NULL |
Тех.карта Cubux.Specification , описывающая собственный состав продукта (без дополнительных затрат) |
Дополнительные затраты
Cubux.ProductAddCategory
— категорияCubux.ProductAddMaterial
— материалCubux.ProductAddProduct
— иной продуктCubux.ProductAddSpecification
— тех.карта
Хеш продукта
Хеш продукта представляет собой MD5 хеш от всех важных данных самого продукта и его непосредственных дочерних дополнительных затрат. Хеш вычисляется следующим образом (вспомогательное форматирование описано ниже):
- Если в продукте нет дополнительных затрат, то нет необходимости вообще использовать данную структуру для описания продукта.
- Создать новый пустой массив
S
для строковых данных. - Если
category_uuid
не NULL, то добавить вS
строку видаc:UUID
, гдеUUID
— UUID изcategory_uuid
. - Если
specification_uuid
не NULL, то добавить вS
строку видаs:UUID
, гдеUUID
— UUID изspecification_uuid
. - Для каждой непосредственно дочерней дополнительной затраты категории
Cubux.ProductAddCategory
добавить вS
строку вида+c:C*Q
, гдеC
— UUID из поляcategory_uuid
, аQ
— представление количества из поляquantity
. - Для каждой непосредственно дочерней дополнительной затраты материала
Cubux.ProductAddMaterial
добавить вS
строку вида+m:M*Q:U
, гдеM
— UUID из поляmaterial_uuid
,Q
— представление количества из поляquantity
, аU
— UUID из поляunit_uuid
. - Для каждой непосредственно дочерней дополнительной затраты продукта
Cubux.ProductAddProduct
добавить вS
строку вида+p:H*Q
, гдеH
— хеш из поляproduct_hash
, аQ
— представление количества из поляquantity
. Если полеsource
не пустое, то добавить в строку:src=S
, гдеS
— значение поляsource
. Т.е. в итоге получится строка либо+p:H*Q
при пустомsource
, либо+p:H*Q:src=S
в противном случае. - Для каждой непосредственно дочерней дополнительной затраты тех.карты
Cubux.ProductAddSpecification
добавить вS
строку вида+s:S*Q
, гдеS
— UUID из поляspecification_uuid
, аQ
— представление количества из поляquantity
. - Отсортировать массив
S
. - Конкатенировать все элементы массива
S
через разделитель;
и вычислить хеш MD5 от полученной строки.
Форматирование данных
При вычислении хеша по алгоритму, описанному выше, необходимо дополнительно форматировать следующие типы данных перед вставкой.
-
uuid
— шестнадцатеричное представление в нижнем регистре с дефисами (всего 36 знаков); -
хеш продукта — шестнадцатеричное представление в нижнем регистре (32 знака);
-
количество — число с точкой в качестве разделителя дробной части, без лишних лидирующих нулей в целочисленной части, без завершающих нулей в дробной части, до 10 знаков включительно в дробной части. Если дробная часть с точностью до 10 знаков равна нулю, то десятичная точка и дробная часть отсутствуют. Например:
число представление 0 0
9 9
120 120
2.75 2.75
1/3 0.3333333333
2/3 0.6666666667
6333333.4 6333333.4
(не6333333.4000000004
, которое может получиться из-за превышения количества значащих цифр числа с плавающей точкой двойной точности)
Версия продукта
Версия продукта зависит от данных в продукте и в его непосредственно дочерних доп. затратах. В клиенте должна быть строго заложена максимальная версия продуктов, с которыми он умеет работать. Когда клиент встречает продукт с более старшей версией, чем максимальная известная ему версия, следует прервать синхронизацию во избежание потерь и повреждений данных и сообщить пользователю, что данные не могут быть обработаны — необходимо обновить клиент на новую версию.
Для лучшего обеспечения обратной совместимости сервер пытается выбрать минимальную возможную версию согласно истории изменений.
История версий
3
(2021-03-25) В доб.затраты продукта добавлено полеsource
. Если поле не пустое, то версия поднимается до3
, иначе при пустом поле — обратная совместимость.2
(2020-01-20) Добавлена доп.затрата в виде категории.1
(2020-Q4) Начальная разработка.
Пример
Продукт со следующими данными:
{
"product": [
{
"hash": "<...>",
"ver": 1,
"category_uuid": "2f2ccc87-9972-4d80-9e71-b681005b41e8",
"specification_uuid": null
}
],
"product_add_material": [
{
"parent_product_hash": "<...>",
"material_uuid": "81536d94-8695-4ab2-b795-37427ae347fe",
"unit_uuid": "d3f5ef2d-5600-4bc4-99a1-f39f12060828",
"quantity": "1000.0000000000"
},
{
"parent_product_hash": "<...>",
"material_uuid": "82de8e09-a092-4821-a5a9-485e5914f8eb",
"unit_uuid": "b652d292-7f4f-4ce3-b48b-72d86f0d9801",
"quantity": "2.7500000000"
}
],
"product_add_product": [
{
"parent_product_hash": "<...>",
"product_hash": "43165dec5b61d2bf2fba5fa42bbb5d16",
"quantity": "1.0000000000"
}
],
"product_add_specification": [
{
"parent_product_hash": "<...>",
"specification_uuid": "d3dab4a1-aec4-4b5c-a0fc-d078c1b3bcb9",
"quantity": "2.0000000000"
}
]
}
При вычислении хеша будет иметь следующий промежуточный массив с данными:
[
"c:2f2ccc87-9972-4d80-9e71-b681005b41e8",
"+m:82de8e09-a092-4821-a5a9-485e5914f8eb*2.75:b652d292-7f4f-4ce3-b48b-72d86f0d9801",
"+m:81536d94-8695-4ab2-b795-37427ae347fe*1000:d3f5ef2d-5600-4bc4-99a1-f39f12060828",
"+p:43165dec5b61d2bf2fba5fa42bbb5d16*1",
"+s:d3dab4a1-aec4-4b5c-a0fc-d078c1b3bcb9*2"
]
После сортировки и конкатенации получим следующую строку (переносы добавлены для читабельности):
+m:81536d94-8695-4ab2-b795-37427ae347fe*1000:d3f5ef2d-5600-4bc4-99a1-f39f12060828;
+m:82de8e09-a092-4821-a5a9-485e5914f8eb*2.75:b652d292-7f4f-4ce3-b48b-72d86f0d9801;
+p:43165dec5b61d2bf2fba5fa42bbb5d16*1;
+s:d3dab4a1-aec4-4b5c-a0fc-d078c1b3bcb9*2;
c:2f2ccc87-9972-4d80-9e71-b681005b41e8
Итого, MD5 хеш получившейся строки (без переносов, которые было добавлены для читабельности) будет:
7934ddf8d830a549feb06812cbaa8c73