настройка поиска

This commit is contained in:
mirzakaev_tf 2023-06-19 10:57:52 +05:00
parent 6169d25988
commit 6b086a4408
18 changed files with 317 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

View File

@ -0,0 +1,317 @@
# Настройка архива вложенных документов
## Общее описание
Настройка архива вложенных документов необходима для работы аналитической формы [Архив вложенных документов](https://ecm-user-manuals.readthedocs.io/ru/latest/User manuals/%D0%A1%D0%AD%D0%94/%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0 %D1%81%D0%BE %D0%B2%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8/%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0 %D1%81%D0%BE %D0%B2%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8/#%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D1%8B%D0%B9_%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82) и происходит в несколько этапов:
* В документ «Справочники поисковой системы» заносятся поля для фильтра, по которым будут собираться вложения.
* В справочник «Итоговые выборки поисковой системы» добавить документ с выборкой из некоторой таблицы для документа или группы документов, если их сущности извлекаются одинаково.
* В документе "Настройка документа" на вкладке "Контекстный поиск" заполнить несколько полей.
* Обновить страницу (клавиша F5), чтобы изменения вступили в силу.
## Справочники поисковой системы
Чтобы открыть документ «Справочники поисковой системы», необходимо в меню в папке "Администрирование", подпапке "Документооборот", подпапке "Поисковая система" выбрать пункт «Справочники поисковой системы».
![Меню](./media/CustomFTSFiltersMenu.png)
Откроется документ "Справочники FTS". В нём необходимо заполнить таблицу "Фильтры".
![Справочники FTS](./media/CustomFTSFiltersForm.png){: .zoom}
Id | Name | Description
---|------|------------
Contractor | Контрагент |
Contract | Договор |
SignatoryUser | Работник |
Project | Проект |
Initiator | Инициатор |
CUser | Создатель документа |
Curator | Куратор |
StageUser | Участник маршрута |
EmpowermentSubject | Полномочия |
Существует строго определённый набор значений поля "Id", приведённый в [таблице ниже](#таблица). Соответствующее им поле "Name" заполняется произвольно. В справочнике «Итоговые выборки поисковой системы» этим значениям будут поставлены в соответствие поля в таблицах, по которым будет осуществляться поиск и фильтрация документов с вложениями.
## Итоговые выборки поисковой системы
Чтобы открыть справочник «Итоговые выборки поисковой системы», необходимо в меню в папке "Администрирование", подпапке "Документооборот", подпапке "Поисковая система" выбрать пункт «Итоговые выборки поисковой системы».
![Меню](./media/ResultFTSMenu.png)
Откроется реестр "Итоги FTS".
![Итоги FTS](./media/ResultFTSRegistry.png){: .zoom}
Значения этого справочника будут предлагаться для выбора в документе ["Настройка документа"](../Настройка документов/Настройка документов.md). Для создания нового документа необходимо нажать на кнопку "Создать" на верхней панели инструментов.
![Кнопка "Создать"](./media/create.png)
В поле "Выборка" необходимо ввести обозначение для документа или группы документов, если их сущности извлекаются одинаково, которое будет использоваться в качестве одного из значений в настройках документов. В поле "Примечание" можно внести пояснения, например, к каким именно документам относится выборка.
![Пример заполнения полей "Выборка" и "Примечание"](./media/ResultFTSHeader.png)
Под полем "Выборка" необходимо прописать результирующий селект, который в процессе расчета будет выполнять система. Структура селекта для всех выборок должна быть одинаковой, они будут объединяться с помощью оператора ```UNION```. Выборка состоит из следующих полей:
* ```DocCode``` - уникальный код документа, используемый в системе; как правило ```VCode```.
* ```DocType``` - тип документа; как правило ```TypeName```.
* ```DocDate``` - дата документа; свойство, которое указывается в *Настройке документа* и передаётся в качестве параметра; указывается ```:DateProperty```.
* ```DocNumber``` - номер документа; свойство, которое указывается в *Настройке документа* и передаётся в качестве параметра; указывается ```:NumberProperty```.
* ```ContractorId``` - уникальный код контрагента, используемый в системе.
* ```ContractId``` - уникальный код договора, используемый в системе.
* ```AddContractId``` - уникальный код дополнительного документа к договору, используемый в системе.
* ```ProjectId``` - уникальный код проекта, используемый в системе.
В зависимости от подключаемых документов будут меняться таблица, стоящая после оператора ```FROM```, и присваиваемые значения установленных в селекте полей. Если для них есть соответствующие им поля в таблице, их необходимо присвоить. Например, полю ```ContractId``` должен соответствовать код договора, который есть в таблице ```dbo.DocflowDocument``` под названием ```Contract```. Если такого поля в таблице нет, необходимо присвоить значение ```null```. Например, в таблице ```dbo.DocflowDocument``` не указывается код дополнительного документа к договору, поэтому значению ```AddContractId``` присваивется ```null```.
**В левую часть указывается скрипт:**
```sql
SELECT t."VCode" AS "DocCode"
, t."TypeName" AS "DocType"
, :DateProperty AS "DocDate"
, :NumberProperty AS "DocNumber"
, t."Contractor" AS "ContractorId"
, t."VCode" AS "ContractId"
, NULL::bigint AS "AddContractId"
, t."Projects" AS "ProjectId"
FROM contract."Contract" as t
WHERE t."COrg" = _orgidparam
```
**В правую часть:**
```sql
SELECT t."VCode" AS "DocCode"
, t."TypeName" AS "DocType"
, :DateProperty AS "DocDate"
, :NumberProperty AS "DocNumber"
, NULL::text AS "DocName"
, t."SubjectOfContract" AS "DocTheme"
, NULL::text AS "DocDefinition"
:ItemSelect
FROM contract."Contract" as t
:ItemFrom
WHERE (t."COrg" = _orgidparam)
:ItemWhere
```
В таблицу справа "Фильтры" необходимо занести значения из *Справочника поисковой системы*, по которым будет осуществляться фильтр, и SQL-скрипт кусок кода, который будет подставлен в предложение WHERE результирующего селекта. Значение, сравниваемое с ```an.Value```, будет совпадать со значением в столбце ```ID``` таблицы "Фильтр". Значение, сравниваемое с ```an.Value```, будет совпадать с полем таблицы, которое присваивается одному из полей селекта.
<!-- ![Пример документа "Итог FTS"](./media/ResultFTSForm.png){: .zoom} -->
| Код | Наименование | SQLScript |
|----------------|------------------------|--------------------------------------------------------------------------------------------------|
| Contractor | Контрагент | and exists(<br> select 1 from "tmp_anFilters_for_documentSearch" as an where an."id" = 'Contractor' and an."value" = cast(t."Contractor" as character varying)) |
| Contract | Договор | and exists(<br> select 1 from "tmp_anFilters_for_documentSearch" as an where an."id" = 'Contract' and an."value" = cast(t."VCode" as character varying)) |
| Project | Проект | and exists(<br> select 1 from "tmp_anFilters_for_documentSearch" as an where an."id" = 'Project' and an."value" = cast(t."Project" as character varying)) |
| Curator | Куратор | and(<br> exists(<br> select 1<br> from "tmp_anFilters_for_documentSearch" as an<br> join rp."RP_Worker" w ON t."Manager" = w."VCode"<br> JOIN rp."RP_Person" AS p ON w."IdPerson" = p."VCode"<br> JOIN rp."RP_PersonContact" AS pc on p."VCode" = pc."Pcode"<br> where an."id" = 'Curator'<br> and pc."IdTypeContact" = 6<br> and pc."Code" = an."value"<br> )) |
| StageUser | Участник маршрута | and exists(<br> select 1 from "tmp_anFilters_for_documentSearch" as an<br> join comdoc."Route" as r on r."DocCode" = t."VCode" and r."DocType" = t."TypeName"<br> join comdoc."RouteStage" as s on s."PCode" = r."VCode"<br> join comdoc."StageItem" as i on i."PCode" = s."VCode"<br> where an."id" = 'StageUser'<br> and r."RouteStatus" NOT IN (4)<br> and i."StageUser" = an."value"<br>) |
| CUser | Создатель документа | and exists(<br> select 1 from "tmp_anFilters_for_documentSearch" as an where an."id" = 'CUser' and an."value" = cast(t."CUser" as character varying)) |
| Initiator | Инициатор | and(<br> exists(<br> select 1<br> from "tmp_anFilters_for_documentSearch" as an<br> join comdoc."Route" as r on r."DocCode" = t."VCode" and r."DocType" = t."TypeName"<br> where an."id" = 'Initiator'<br> and r."Initiator" = an."value")) |
## Настройка документов
После заполнения справочника «Итоговые выборки поисковой системы» необходимо перейти в реестр "Настройка документов". В документе необходимо заполнить поля typeNameProperty, dateProperty и numberProperty соответствующими им наименованиями полей таблицы: типа документа, даты документа и номера документа. Также необходимо в поле "Итоги" выбрать одно из значений справочника «Итоговые выборки поисковой системы». После заполнения этих полей необходимо поставить галочку в поле FTS2 и обновить страницу, чтобы изменения вступили в силу.
![Настройка](media/DocflowDocumentForm.png)
## Примеры настраиваемых выборок
### Настраиваемая выборка для кадрового электронного документооборота
| Код | Наименование | SQLScript |
|--------------------|------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| CUser | Создатель документа | and exists( select 1 from "tmp_anFilters_for_documentSearch" as an where an."id" = 'CUser' and an."value" = cast(t."CUser" as character varying)) |
| Initiator | Инициатор | and( <br> exists( <br> select 1 <br> from "tmp_anFilters_for_documentSearch" as an <br> join comdoc."Route" as r on r."DocCode" = t."VCode" and r."DocType" = t."TypeName" <br> where an."id" = 'Initiator' <br> and r."Initiator" = an."value" <br> )) |
| StageUser | Участник маршрута | and <br> exists( <br> select 1 <br> from "tmp_anFilters_for_documentSearch" as an <br> join comdoc."Route" as r on r."DocCode" = t."VCode" and r."DocType" = t."TypeName" <br> join comdoc."RouteStage" as s on s."PCode" = r."VCode" <br> join comdoc."StageItem" as i on i."PCode" = s."VCode" <br> where an."id" = 'StageUser' <br> and r."RouteStatus" NOT IN (4) <br> and i."StageUser" = an."value" <br> ) |
| SignatoryUser | Работник | and( <br> exists( <br> select 1 <br> from "tmp_anFilters_for_documentSearch" as an <br> join comdoc."Route" as r on r."DocCode" = t."VCode" and r."DocType" = t."TypeName" <br> where an."id" = 'SignatoryUser' <br> and r."DocType" = 'EmployeeStatement' <br> and r."Initiator" = an."value" <br> ) or exists( <br> select 1 <br> from "tmp_anFilters_for_documentSearch" as an <br> join comdoc."Route" as r on r."DocCode" = t."VCode" and r."DocType" = t."TypeName" <br> join comdoc."RouteStage" as s on s."PCode" = r."VCode" <br> join comdoc."StageItem" as i on i."PCode" = s."VCode" <br> where an."id" = 'SignatoryUser' <br> and r."DocType" = 'LND' <br> AND r."RouteStatus" NOT IN(4) <br> AND s."IsMarked" IS NOT true <br> AND COALESCE(i."DocumentAction", 0) IN (20, 30) <br> and i."StageUser" = an."value" <br> ) or exists( <br> select 1 <br> from "tmp_anFilters_for_documentSearch" as an <br> join comdoc."ReadListItem" as r on r."DocCode" = t."VCode" and r."DocType" = t."TypeName" <br> where an."id" = 'SignatoryUser' <br> and r."DocType" = 'LND' <br> and r."DocflowUser" = an."value" <br> ) or exists( <br> select 1 <br> from "tmp_anFilters_for_documentSearch" as an <br> join dfd."EmpowermentWorkerDetail" as ewd on ewd."PCode" = t."VCode" <br> JOIN rp."RP_Person" AS p ON ewd."PersonId" = p."VCode" <br> JOIN rp."RP_PersonContact" AS pc on p."VCode" = pc."Pcode" <br> where an."id" = 'SignatoryUser' <br> and t."TypeName" = 'EmpowermentConstructor' <br> and pc."IdTypeContact" = 6 <br> and pc."Code" = an."value" <br> )) |
| EmpowermentSubject | Полномочия | and <br> exists( <br> select 1 <br> from "tmp_anFilters_for_documentSearch" as an <br> join dfd."EmpowermentSubjectDetail" as esd on esd."PCode" = t."VCode" <br> JOIN dfd."EmpowermentSubject" AS s ON esd."Subject" = s."VCode" <br> where an."id" = 'EmpowermentSubject' <br> and t."TypeName" = 'EmpowermentConstructor' <br> and s."VCode" = an."value"::bigint <br> ) <br> |
**В левую часть указывается скрипт:**
```sql
SELECT t."VCode" AS "DocCode"
, t."TypeName" AS "DocType"
, :DateProperty AS "DocDate"
, :NumberProperty AS "DocNumber"
, NULL::bigint AS "ContractorId"
, NULL::bigint AS "ContractId"
, NULL::bigint AS "AddContractId"
, NULL::bigint AS "ProjectId"
FROM dfd."UniversalDocument" as t
WHERE t."COrg" = _orgidparam
```
**В правую часть:**
```sql
SELECT t."VCode" AS "DocCode"
, t."TypeName" AS "DocType"
, :DateProperty AS "DocDate"
, :NumberProperty AS "DocNumber"
, NULL::text AS "DocName"
, NULL::text AS "DocTheme"
, NULL::text AS "DocDefinition"
FROM dfd."UniversalDocument" as t
WHERE t."COrg" = _orgidparam
```
### Настраиваемая выборка "Приложение"
| Код | Наименование | SQLScript |
|--------------|------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Contractor | Контрагент | and exists(<br> select 1 from "tmp_anFilters_for_documentSearch" as an where an."id" = 'Contractor' and an."value" = cast(t."Contractor" as character varying)<br>) |
| Contract | Договор | and exists(<br> select 1 from "tmp_anFilters_for_documentSearch" as an where an."id" = 'Contract' and an."value" = cast(t."Contract" as character varying)<br>) |
| CUser | Создатель документа | and exists(<br> select 1 from "tmp_anFilters_for_documentSearch" as an where an."id" = 'CUser' and an."value" = cast(t."CUser" as character varying)<br>) |
| Initiator | Инициатор | and(<br> exists(<br> select 1<br> from "tmp_anFilters_for_documentSearch" as an<br> join comdoc."Route" as r on r."DocCode" = t."VCode" and r."DocType" = t."TypeName"<br> where an."id" = 'Initiator'<br> and r."Initiator" = an."value"<br> )) |
| StageUser | Участник маршрута | and <br> exists(<br> select 1<br> from "tmp_anFilters_for_documentSearch" as an<br> join comdoc."Route" as r on r."DocCode" = t."VCode" and r."DocType" = t."TypeName"<br> join comdoc."RouteStage" as s on s."PCode" = r."VCode"<br> join comdoc."StageItem" as i on i."PCode" = s."VCode"<br> where an."id" = 'StageUser'<br> and r."RouteStatus" NOT IN (4)<br> and i."StageUser" = an."value"<br> ) |
**В левую часть указывается скрипт:**
```sql
SELECT t."VCode" AS "DocCode"
, t."TypeName" AS "DocType"
, :DateProperty AS "DocDate"
, :NumberProperty AS "DocNumber"
, t."Contractor" AS "ContractorId"
, t."Contract" AS "ContractId"
, t."VCode" AS "AddContractId"
, t."Projects" AS "ProjectId"
FROM contract."AdditionalContract" as t
WHERE t."COrg" = _orgidparam
```
**В правую часть:**
```sql
SELECT t."VCode" AS "DocCode"
, t."TypeName" AS "DocType"
, :DateProperty AS "DocDate"
, :NumberProperty AS "DocNumber"
, NULL::text AS "DocName"
, t."SubjectOfContract" AS "DocTheme"
, 'Содержание' AS "DocDefinition"
:ItemSelect
FROM contract."AdditionalContract" as t
:ItemFrom
WHERE t."COrg" = _orgidparam
:ItemWhere
```
### Настраиваемая выборка "Заявка на выпусе сертификата ЭП"
Код | Наименование | SQLScript
----|--------------|----------
SignatoryUser | Работник | "and exists(<br> select 1 from "tmp_anFilters_for_documentSearch" as an where an."id" = 'SignatoryUser' and an."value" = cast(t."DocflowUser" as character varying))"
**В левую часть указывается скрипт:**
```sql
SELECT t."VCode" AS "DocCode"
, t."TypeName" AS "DocType"
, :DateProperty AS "DocDate"
, :NumberProperty AS "DocNumber"
, NULL::bigint AS "ContractorId"
, NULL::bigint AS "ContractId"
, NULL::bigint AS "AddContractId"
, NULL::bigint AS "ProjectId"
FROM comdoc."ECPCertificateApplication" as t
WHERE t."COrg" = _orgidparam
```
**В правую часть:**
```sql
SELECT t."VCode" AS "DocCode"
, t."TypeName" AS "DocType"
, :DateProperty AS "DocDate"
, :NumberProperty AS "DocNumber"
, NULL::text AS "DocName"
, NULL::text AS "DocTheme"
, NULL::text AS "DocDefinition"
:ItemSelect
FROM comdoc."ECPCertificateApplication" as t
:ItemFrom
WHERE t."COrg" = _orgidparam
:ItemWhere
```
### Настраиваемая выборка "Канцелярия"
| Код | Наименование | SQLScript |
|--------------|------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Contractor | Контрагент | and exists(<br> select 1 from "tmp_anFilters_for_documentSearch" as an where an."id" = 'Contractor' and an."value" = cast(t."Contractor" as character varying)<br>) |
| Contract | Договор | and exists(<br> select 1 from "tmp_anFilters_for_documentSearch" as an where an."id" = 'Contract' and an."value" = cast(t."Contract" as character varying)<br>) |
| CUser | Создатель документа | and exists(<br> select 1 from "tmp_anFilters_for_documentSearch" as an where an."id" = 'CUser' and an."value" = cast(t."CUser" as character varying)<br>) |
| Initiator | Инициатор | and(<br> exists(<br> select 1<br> from "tmp_anFilters_for_documentSearch" as an<br> join comdoc."Route" as r on r."DocCode" = t."VCode" and r."DocType" = t."TypeName"<br> where an."id" = 'Initiator'<br> and r."Initiator" = an."value"<br> )) |
| StageUser | Участник маршрута | and <br> exists(<br> select 1<br> from "tmp_anFilters_for_documentSearch" as an<br> join comdoc."Route" as r on r."DocCode" = t."VCode" and r."DocType" = t."TypeName"<br> join comdoc."RouteStage" as s on s."PCode" = r."VCode"<br> join comdoc."StageItem" as i on i."PCode" = s."VCode"<br> where an."id" = 'StageUser'<br> and r."RouteStatus" NOT IN (4)<br> and i."StageUser" = an."value"<br> ) |
**В левую часть указывается скрипт:**
```sql
SELECT t."VCode" AS "DocCode"
, t."TypeName" AS "DocType"
, :DateProperty AS "DocDate"
, :NumberProperty AS "DocNumber"
, t."Contractor" AS "ContractorId"
, t."VCode" AS "ContractId"
, NULL::bigint AS "AddContractId"
, t."Projects" AS "ProjectId"
FROM dfd."DocflowDocument" as t
WHERE t."COrg" = _orgidparam
```
**В правую часть:**
```sql
SELECT t."VCode" AS "DocCode"
, t."TypeName" AS "DocType"
, :DateProperty AS "DocDate"
, :NumberProperty AS "DocNumber"
, NULL::text AS "DocName"
, NULL::text AS "DocTheme"
, NULL::text AS "DocDefinition"
FROM dfd."DocflowDocument" as t
WHERE t."COrg" = _orgidparam
```
## Автоматическое формирование отчета заявления с ЭП
На проекте возможно настроить автоматическое формирование отчета заявления с электронными подписями по завершению маршрута. Для этого в документе "Настройка учетной политики предприятия" нужно настроить константу **Интеграция с 1С с помощью сервиса ODATA** со значением 1
![Константа](media/constant.png){: .zoom}
По завершению маршрута в окно вложений заявления добавится печатная форма с ЭП. Архив с ЭП можно будет скачать по кнопке "Скачать архив с ЭП".
![Вложения](media/attachments.png){: .zoom}
Скачать архив с ЭП можно только когда в маршруте пройдены все этапы с действием "Подписан ЭП" и текущий этап
не требует подписания документа.
![Этапы](media/stages.png){: .zoom}
Архив скачается в папку "Загрузки" (Downloads).
![Загрузки](media/Downloads.png){: .zoom}
В архиве будут находиться: оригинал заявления, отчет по подписанию и файл с информацией о подписании данного документа по каждому сотруднику.
![Архив ЭП](media/arhiv.png){: .zoom}
## Настройка отчета без включения пропущенных этапов подписания
В проекте есть возможность не добавлять в отчет тех сотрудников, кто включен в маршрут через **ИЛИ** и **НЕ ПРОШЕЛ** этап подписания.
![Статус пропущен](media/skipped.png){: .zoom}
Для этого в документе "Настройка учетной политики предприятия" нужно настроить константу **Скрывать участников маршрута без действий** со значением 1.
![Константа2](media/constant2.png){: .zoom}
Результат сформированного отчета:
![Отчет маршрута](media/skippedPrint.png){: .zoom}