vault backup: 2026-02-05 19:07:21
This commit is contained in:
@@ -0,0 +1,16 @@
|
||||
|
||||
| id | name | custom | required | placeholder | type | label | sort_id | renderData (json) | on_edit | destination_table |
|
||||
| --- | ------------------ | ------ | -------- | -------------- | -------- | ----------------------- | ------- | -------------------------------------------------------------------------- | ---------- | ----------------- |
|
||||
| 1 | sample_name_doc | 0 | 1 | Введите… | text | Наим. ОИ для документов | | | | |
|
||||
| 2 | sample_name_lab | … | 1 | | text | Наим. ОИ для лаб. | | | | |
|
||||
| 3 | tn_ved | … | 1 | Введите ТН ВЭД | text | ТН ВЭД | | | | sample_details |
|
||||
| 4 | probe_quantity | … | 1 | | number | Кол-во проб | | | setProbesQ | sample_details |
|
||||
| 5 | manufacturer | … | 1 | | select | Изготовитель | | {<br>“table” : “contragents”,<br>“group” : 4<br>} | | sample_details |
|
||||
| 6 | manufacture_date | | 1 | | date | Дата изготовления | | | | sample_details |
|
||||
| 7 | storage_conditions | | 0 | | text | Условия хранения | | | | sample_details |
|
||||
| 8 | package | | 0 | | text | Упаковка | | | | sample_details |
|
||||
| | | | | | | | | | | |
|
||||
| 9 | sampling_by | | | | select | Отбор осуществляется | | { “options”:<br>[<br>“1” : “Заказчиком”,<br>“2” : “Исполнителем”<br>]<br>} | | |
|
||||
| 10 | trials_in_OA_range | | | | checkbox | | | | | |
|
||||
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
| id | containing_pages | object_type_id | trials_type | pgo | dyn_control_id |
|
||||
| --- | ----------------------------- | -------------- | ----------- | ---- | -------------- |
|
||||
| int | string | int | int | int | int |
|
||||
| 1 | ['“deals”] | 1 (продукция) | null | null | 1 |
|
||||
| 2 | | null | null | null | 2 |
|
||||
| 3 | | 1 (продукция) | null | null | 3 |
|
||||
| 4 | | null | null | null | 4 |
|
||||
| 5 | | | null | null | 5 |
|
||||
| 6 | | | null | null | 6 |
|
||||
| 7 | | | null | null | 7 |
|
||||
| 8 | [“request”, “sample_details”] | 1 | 1 | 1 | 3 |
|
||||
| 9 | | | null | 1 | 9 |
|
||||
| 10 | | | null | 1 | 10 |
|
||||
| 11 | | | null | 1 | 11 |
|
||||
| 12 | | | null | 1 | 12 |
|
||||
| 13 | | | null | 1 | 13 |
|
||||
| 14 | | | null | 1 | 14 |
|
||||
| 15 | | | | 1 | |
|
||||
@@ -0,0 +1,12 @@
|
||||
| id | pgo_group (fiz) | object_group_id | atmosperical_group_id |
|
||||
| --- | --------------- | --------------- | --------------------- |
|
||||
| 1 | 1 | 1 | null |
|
||||
| 2 | 1 | 2 | null |
|
||||
| 3 | 1 | 3 | null |
|
||||
| 4 | 1 | 4 | null |
|
||||
| 5 | 1 | 5 | null |
|
||||
| 6 | 1 | 6 | null |
|
||||
| 7 | 1 | 7 | null |
|
||||
| 8 | 2 | null | 1 |
|
||||
| | …. | | |
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
|
||||
|
||||
- прописать в таблице “распределение данных” внутренние названия всех полей
|
||||
- собрать миграцию данных опциональных полей для ПГО1 (таблица field_optionals)
|
||||
- собрать миграцию данных ПГО1 для “пищевой продукции/биологических материалов”,
|
||||
- доработать и протестировать API-запрос к бэку для возврата опциональных полей
|
||||
- Фронтенд:
|
||||
- сделать скрытыми все поля с лейблами кроме обязательных согласно таблице “распределение данных” (hidden). Возможно, придётся делать блоки поля с лейблом для удобства скрытия.
|
||||
- сделать тег типа у каждого поля/лейбла – “основное”, “опциональное”, “пользовательское”
|
||||
- Функционал показа для новой заявки:
|
||||
- запрос при каждом изменении селектов “Тип ОИ” и “Группа ОИ” к API fields/optional, передавая group_id и object_type
|
||||
- *доработка под тариф в будущем*
|
||||
- после ответа от API отображать полученный список полей (меняем статус видимости)
|
||||
- Функционал показа существующей заявки:
|
||||
- Массив опциональных полей сразу же запрашивается на этапе формирования данных для фронта для каждой заявки (так мы сможем просто включать поля в БД после доработок)
|
||||
- Все данные опциональных полей перемещаются в поле details сущностей согласно таблице “распределение данных” (на данном этапе либо к request, либо к incoming_object). Это очень простой json массив \[поле => значение\]
|
||||
- Поля включаются так же, как и в новой заявке
|
||||
- Следовательно все данные должны затянуться автоматически из массивов details и показаться в полях
|
||||
- Параллельная подготовка бэкенда для распределения и отдачи данных из массивов details + доработка миграций, чтобы переместить динамические данные в details
|
||||
- Подготовка бэкенда к функционалу сохранения динамических полей БЕЗ ВАЛИДАЦИИ (прототип мягкого сохранения)
|
||||
- Фронтенд+бэкенд — обеспечение мягкого сохранения без валидации всех данных в правильные распределённые таблицы и details
|
||||
- Система валидации динамических полей.
|
||||
- Поля из обязательной валидации выпиливаются в опциональную.
|
||||
- Прописываются правила валидации в БД полей через миграции (правила/сообщения)
|
||||
- Движок валидации (принимаем список динамических полей и валидируем)
|
||||
- Здесь каким-то образом надо обеспечить обратную связь с фронтом для подсветки неверных полей + сообщений
|
||||
- Тестирование в комплексе
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"nodes":[
|
||||
{"id":"eaf8029d981c7fde","x":-360,"y":-120,"width":250,"height":100,"type":"text","text":"Динамические поля\n\\[\\[object types], \\[gpos\\]]"},
|
||||
{"id":"fdf86c47886dc7a7","x":120,"y":-80,"width":250,"height":60,"type":"text","text":"Группы ОИ"},
|
||||
{"id":"346bf02d73932212","x":443,"y":-84,"width":250,"height":60,"type":"text","text":"Классификатор продукции"},
|
||||
{"id":"a4a06647b44fa5ac","type":"text","text":"Атмосферные объекты","x":443,"y":20,"width":250,"height":60},
|
||||
{"id":"a440405c2d30e2c8","type":"text","text":"Рабоч","x":443,"y":120,"width":250,"height":60}
|
||||
],
|
||||
"edges":[]
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"nodes":[
|
||||
{"id":"63bc932b6e788337","x":-751,"y":-349,"width":431,"height":1549,"type":"group","label":"Типы и хранение данных"},
|
||||
{"id":"90e63a87b404a8ea","x":-220,"y":-349,"width":520,"height":1089,"color":"4","type":"group","label":"Ориентировочный workflow для MVP"},
|
||||
{"id":"82c92d6f3a02a4a6","x":360,"y":-349,"width":520,"height":1089,"color":"6","type":"group","label":"workflow пользовательских полей"},
|
||||
{"id":"65173e51537acb80","x":-731,"y":-329,"width":391,"height":309,"color":"1","type":"text","text":"**Массив обязательных полей.**\nСюда попадают поля, которые не прописаны в БД, не имеют свойств и работают как сейчас.\n\n- Показываются всегда\n- Валидируются в обычном режиме\n- Сохраняются в обычном режиме в поля таблицы заявки/основания\n- Возможен перенос в массивы данных для удобства хранения/добавления"},
|
||||
{"id":"815f80b062c9109e","x":-731,"y":0,"width":391,"height":620,"color":"4","type":"text","text":"**Массив опциональных полей**\nМногие поля из текущей конфигурации должны перейти в категорию “опциональных”.\n- Поля созданы нами\n- Свойства каждого поля хранятся в БД -\n\t- наименование поля\n\t- внутреннее наименование для синхронизации с фронтедом\n\t- родительская сущность\n\t- привязка к тарифам\n\t- привязка к типу ОИ\n\t- привязка к типу исследований\n\t- привязка к ПГО / ФИЗ\n\t- свойства валидации Laravel Request\n\t\t- при сохранении\n\t\t- при отправке на согласование\n\t\t- текст ошибки для пользователя\n\t- доступность в документах\n\t\t- макрос/код в документах\n\t\t\t- внутренний код / наименование\n\t"},
|
||||
{"id":"bb17e362d8091d58","x":-731,"y":640,"width":391,"height":540,"color":"6","type":"text","text":"**Массив пользовательских полей**\nНе входят в MVP.\nПоля, которые могут создавать и пользователи.\nВключают в себя всё вышеперечисленное, но хранятся ОТДЕЛЬНО и рендерятся на фронте отдельным модулем, потому имеют дополнительные свойства:\n- тип поля (текст, мульти/селект, число, файл, массив)\n- некий движок-конструктор получения данных для селектов\n- индекс отображения/положения в интерфейсе\n- связанное/зависимое поле для валидации\n- привязка к конкретной вкладке на фронте\n- упрощённая валидация (тип поступивших данных/обязательность)\n- данные хранятся в json родительской сущности."},
|
||||
{"id":"40b4c7cf09561259","x":-200,"y":-329,"width":480,"height":309,"type":"text","text":"**Инициализация фронтенда**\n\nНа фронтенде прописаны ВСЕ поля - и обязательные и необязательные. Так же прописано их положение в интерфейсе.\nСо связями и всем прочим. Таким образом мы сильно разгружаемся и ускоряемся.\nПо-умолчанию **все** опциональные поля скрыты."},
|
||||
{"id":"367f62a87583684f","type":"text","text":"**При сохранении черновика**\n\n- на бэкенд летят все данные и все ОПЦИОНАЛЬНЫЕ поля фильтруются сохраняются в отдельные json-ы (в зависимости от родительской сущности)\n- Проходит мягкая валидация (для сохранения)\n\n**При отправке на согласование**\n\n- Происходит сохранение, но со сменой статуса и с другой валидацией каждого поля.","x":-200,"y":400,"width":480,"height":300},
|
||||
{"id":"62eb2ec107a95275","x":-200,"y":20,"width":480,"height":340,"type":"text","text":"**Для новой заявки**\n- при выборе всех нужных опций с сервера запрашивается **список доступных опциональных полей** для данной конфигурации. Просто перечисление того, что включать.\n\n**Для существующей заявки**\n- сразу при загрузке теми же модулями определяются настройки и прилетает уже готовый массив с разрешёнными полями (отдельно от данных). Поля включаются на фронте и в них заносятся данные."},
|
||||
{"id":"4bddbcfea022b3d9","type":"text","text":"**Инициализация фронтенда**\n\nЗдесь нам нужно внедрить **движок рендеринга динамических полей**.\nГрузим фронтенд + запрашиваем массив динамических полей для рендеринга.\nРендерим все обязятельные поля + скрытые опциональные + динамические","x":380,"y":-329,"width":480,"height":309},
|
||||
{"id":"17c527dd91cc0731","type":"text","text":"**При сохранении черновика**\n\n- Работаем так же, как и в MVP, но сохраняем динамические поля в отдельный массив сущности с простейшей валидацией (чтобы не накидали мусора)\n\n**При отправке на согласование**\n\n- Работаем так же, как и в MVP, но сохраняем динамические поля в отдельный массив сущности с защитой от мусора + с нормальной валидацией (тип/обязательность).","x":380,"y":400,"width":480,"height":300},
|
||||
{"id":"dfbf582f578a1414","type":"text","text":"**Для новой заявки**\n- Работаем так же, как и в MVP, но отображаем пользовательские пустые поля.\n\n**Для существующей заявки**\n- Работаем так же, как и в MVP, отображаем пользовательские пустые поля и загружаем в них данные из отдельного массива json сущности.","x":380,"y":20,"width":480,"height":340}
|
||||
],
|
||||
"edges":[
|
||||
{"id":"4fc76ce9d4e61348","fromNode":"40b4c7cf09561259","fromSide":"bottom","toNode":"62eb2ec107a95275","toSide":"top"},
|
||||
{"id":"a3b32f54a016fdba","fromNode":"62eb2ec107a95275","fromSide":"bottom","toNode":"367f62a87583684f","toSide":"top"},
|
||||
{"id":"bf3b6cbb4d2b7d51","fromNode":"4bddbcfea022b3d9","fromSide":"bottom","toNode":"dfbf582f578a1414","toSide":"top"},
|
||||
{"id":"88cf47bf897d2ba9","fromNode":"dfbf582f578a1414","fromSide":"bottom","toNode":"17c527dd91cc0731","toSide":"top"}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"nodes":[
|
||||
{"id":"471fc15ab64b3b4b","type":"group","x":-1586,"y":-280,"width":2966,"height":1140,"color":"4","label":"Загрузка полей и данных"},
|
||||
{"id":"1bdc3fd8f4fc131a","type":"group","x":-1586,"y":-1483,"width":2966,"height":1103,"color":"5","label":"Структура данных"},
|
||||
{"id":"730071c06b433cd8","type":"group","x":-1220,"y":920,"width":2220,"height":420,"color":"6","label":"Сохранение"},
|
||||
{"id":"9eb9ce3354acd504","type":"group","x":-802,"y":1440,"width":1382,"height":280,"color":"3","label":"TODO:"},
|
||||
{"id":"ae68b7d5dfd17b3e","type":"text","text":"Участвующие в динамическом распределении данных таблицы sample_details, requests и т.д. **ОБЯЗАНЫ** привязку к текущему incoming_object и иметь поле dynamic_data, в котором будут храниться данные, сохранённые из динамических полей","x":-765,"y":-560,"width":565,"height":140},
|
||||
{"id":"2219c7c391038f10","type":"text","text":"### Инициация\n\nКрасные поля в таблице “Распределение данных” и поля, **которые ни от чего не зависят** - грузятся в форму на фронте и сохраняются в свои соответствующие таблицы (поля с заказчиком, основание, договор, контактные лица, менеджер и тд) - они общие для всех и их лучше обрабатывать как нормальные данные.\n\nПосле выбора ТИПА ОИ, ТИПА ИСПЫТАНИЙ, ГРУППЫ ОИ (в окне Заявки или Образца) начинается подгрузка динамических полей.","x":-1520,"y":-260,"width":600,"height":463},
|
||||
{"id":"78a47b6bae2c6690","type":"text","text":"### Определение динамических полей\n\nИз группы ОИ получается PGO (пакет группы испытаний (бывший ФИЗ)) из таблицы pgo_to_groups\nВыполняется выборка dyn_controls_id из таблицы **modules_to_dyn_controls** согласно выбранным object_type, trials_type, pgo и модуля (page), запрашивающего данные.\nПо каждому элементу массива dyn_controls_id выполняется выборка из таблицы dynamic_controls_table c сортировкой по sort_id.","x":-800,"y":-260,"width":600,"height":463},
|
||||
{"id":"4c9e712b802ea35e","type":"text","text":"### Подгрузка сохранённых данных\n\nЭту процедуру можно выполнять в предыдущем цикле обработки каждого поля\nСобираются все уникальные значения destination_table у текущих выбранных полей\nДелается выборка по таблицам destination_table по id открытого документа или destination_table.incoming_object.id\nУ выбранных объектов получаются json-массивы сохранённых данных из поля dynamic_data\nКаждое динамическое поле проверяется на соответствие и присутствие в сохранённых данных.\nЕсли данные присутствуют - динамическому полю добавляется поле “value” со значением из документа.\nТаким образом можно собирать данные, присвоенные в совершенно разных динамических полях заявки/документов. Пример сохранённых данных показан ниже","x":600,"y":-260,"width":600,"height":463},
|
||||
{"id":"d3bed003864f4b06","type":"text","text":"### Форматирование динамических полей\n\nКаждый элемент поля проходит проверку и подготавливается для отправки на фронтэнд.\nПроверяется каждое поле renderData и если есть ключ table, то делается выборка из соответствующей таблицы с параметрами и поле трансформируется в options с готовыми данными.\n\nКаждому полю на фронте присваивается свойство dynamic_control_id, чтобы обработать его данные при сохранении","x":-80,"y":-260,"width":600,"height":463},
|
||||
{"id":"36f032eaa8b89a57","type":"text","text":"### Содержание поля dynamic_data у таблиц с данными динамических полей.\n\n```json\n[\n\t{\n\t\t\"id\": \"3\",\n\t\t\"name: \"tn_ved\",\n\t\t\"value\" : \"3022 4433\"\n\t},\n\t{\n\t\t\"id\": \"7\",\n\t\t\"name: \"storage_conditions\",\n\t\t\"value\" : \"Пакет целлофановый\"\n\t},\n\t{\n\t\t\"id\": \"9\",\n\t\t\"name: \"trials_in_OA_range\",\n\t\t\"value\" : true\n\t},\n]\n```","x":-400,"y":283,"width":535,"height":517},
|
||||
{"id":"4aefb6d2d59c1c9a","type":"file","file":"WORK & PROJECTS/Mol/Планы и диаграммы/Заказы/Динамические поля/modules_to_dyn_controls.md","x":-960,"y":-1309,"width":760,"height":669},
|
||||
{"id":"330a5e6e96216ba6","type":"file","file":"WORK & PROJECTS/Mol/Планы и диаграммы/Заказы/Динамические поля/pgo_to_groups.md","x":-1500,"y":-1206,"width":400,"height":464},
|
||||
{"id":"68b998893332eba2","type":"text","text":"trials_type\n1 - Лабораторные\n2 - Выездные","x":-560,"y":-1440,"width":250,"height":103},
|
||||
{"id":"3c06fbe8ba52b772","type":"text","text":"### Отправка данных на backend\n\nС фронтенда прилетают данные полей со свойством dynamic_control_id и value","x":-1120,"y":940,"width":600,"height":380},
|
||||
{"id":"2f8ebcf398e207de","type":"text","text":"### Формирование и сохранение массива данных\n\nДелается выборка полей id, name, destination_table из таблицы dynamic_control_id из массива всех полученных dynamic_control_id\n\nСобирается несколько массивов dynamic_data с группировкой по destination_table\nПроходя по каждой записи destination_table выбирается объект для записи из таблицы по текущему incoming_object_id (прилетает с фронтенда или создаётся при первичном сохранении).\nТекущий массив данных сохраняется в поле dynamic_data в таблицу destination_table","x":340,"y":940,"width":600,"height":380},
|
||||
{"id":"a936e40ca6c658a7","type":"text","text":"### Валидация динамических полей\n\nTODO!","x":-384,"y":940,"width":609,"height":380},
|
||||
{"id":"625877f2c5a88673","type":"text","text":"Продумать полностью формат хранения динамических контролов и подгружаемых данных","x":-782,"y":1460,"width":1342,"height":50},
|
||||
{"id":"2ec086ec8e32925e","type":"text","text":"Сформировать первичные данные таблиц pgo_to_groups, dynamic_controls_table и modules_to_dyn_controls, необходимые для отображения/сохранения данных по текущим данным. Для начала вручную. Можно задуматься о ТЗ редактора :)","x":-782,"y":1510,"width":1342,"height":70},
|
||||
{"id":"ddb16308453a51d9","type":"text","text":"Продумать поддержку зависимости от объектов, глубже incoming_object (Испытания/протоколы)","x":-779,"y":1580,"width":1339,"height":60},
|
||||
{"id":"e968c77fea8190c3","type":"text","text":"Валидация полей","x":-779,"y":1640,"width":1339,"height":60},
|
||||
{"id":"b630f9de672de8d5","type":"file","file":"WORK & PROJECTS/Mol/Планы и диаграммы/Заказы/Динамические поля/dynamic_controls_table.md","x":-40,"y":-1349,"width":1360,"height":749}
|
||||
],
|
||||
"edges":[
|
||||
{"id":"15a75fcef9b6166b","fromNode":"4aefb6d2d59c1c9a","fromSide":"right","toNode":"b630f9de672de8d5","toSide":"left"},
|
||||
{"id":"ef85aa37ebd26a2a","fromNode":"330a5e6e96216ba6","fromSide":"right","toNode":"4aefb6d2d59c1c9a","toSide":"left"},
|
||||
{"id":"4b3eb7d74e747c79","fromNode":"2219c7c391038f10","fromSide":"right","toNode":"78a47b6bae2c6690","toSide":"left"},
|
||||
{"id":"d9451be02d13baec","fromNode":"78a47b6bae2c6690","fromSide":"right","toNode":"d3bed003864f4b06","toSide":"left"},
|
||||
{"id":"1cabf9437f0fdd76","fromNode":"d3bed003864f4b06","fromSide":"right","toNode":"4c9e712b802ea35e","toSide":"left"},
|
||||
{"id":"dd879e7b5dca46fd","fromNode":"3c06fbe8ba52b772","fromSide":"right","toNode":"a936e40ca6c658a7","toSide":"left"},
|
||||
{"id":"fa6b923d8a4f2053","fromNode":"a936e40ca6c658a7","fromSide":"right","toNode":"2f8ebcf398e207de","toSide":"left"}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user