Дерево страниц

Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.
Свойства страницы
Статус

Статус
colourGreen
titleГОТОВО

Автор
Комментарий
панель

На этой странице:

Оглавление



Постановка задачи

Добавить в папку search настройку поиска и область поиска для нового произвольного модуля на базе ВнД

  • <module> - идентификатор модуля в нижнем регистре
  • <Module> - идентификатор модуля в регистре, соответствующем типе программы
  • <Модуль> - название модуля
Примечание

Пример написан таким образом, что можно брать приведенный код и заменять в нем значения: <module>, <Module>, <Модуль>.

Главное его внимательно вставлять в уже существующие схемы.

Инструмент

Палитра XML

Реализация

  1. Доработать конфигурацию настройки поиска

    Блок кода
    languagexml
    titleНастройка поиска
    collapsetrue
    <?xml version="1.0" encoding="UTF-8" ?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://www.springframework.org/schema/c"
           xmlns="http://www.springframework.org/schema/beans"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <!-- <Модуль> -->
        <bean id="newModuleSearcher" class="ru.intertrust.cm_sochi.srv.connector.sochi.search.SochiSolrSearcher">
            <constructor-arg name="cmAppSystemId" value="<Module>"/>
            <constructor-arg name="isNamed" value="true"/>
            <constructor-arg name="searchArea" value="<Module>"/>
            <constructor-arg name="targetCollectionName" value="(search)"/>
            <constructor-arg>
                <bean class="ru.intertrust.cm_sochi.srv.connector.sochi.search.InternalDocsSearchFilterCreator"/>
            </constructor-arg>
            <constructor-arg>
                <bean class="ru.intertrust.cmj.af.search.dp.docinfo.CustomModuleInfoExtractor" c:messageSource-ref="cmj_af_search_messageSource" c:ident="<Module>"/>
            </constructor-arg>
        </bean>
        <!-- Модуль end-->
    
        <!-- <Модуль> -->
        <!-- Иерархия билдеров областей поиска -->
        <bean id="rootScopeBuilder" class="ru.intertrust.cmj.af.search.ScopeTreeBuilder">
            <property name="childs">
                <list>
                    <!-- <Модуль> -->
                    <bean class="ru.intertrust.cmj.af.search.dp.CmDocTypesScopeBuilder">
                        <constructor-arg index="0" value="<module>"/>
                        <constructor-arg index="1" value="<Module>"/>
                        <constructor-arg index="2">
                            <list>
                                <ref bean="subject"/>
                            </list>
                        </constructor-arg>
                        <constructor-arg index="3">
                            <set>
                                <ref bean="rkkInternalBundle"/>
                                <ref bean="resolutionBundle"/>
                                <ref bean="reportBundle"/>
                                <ref bean="mainDocBundleForCustom"/>
                            </set>
                        </constructor-arg>
                        <constructor-arg index="4">
                            <list>
                                <ref bean="<Module>Searcher"/>
                            </list>
                        </constructor-arg>
                        <constructor-arg index="5">
                            <ref bean="cmSearchScopeCompositExBuilder"/>
                        </constructor-arg>
                    </bean>
                    <!-- <Модуль> end-->
                </list>
            </property>
        </bean>
    
        <!-- Иерархия билдеров простого поиска -->
        <bean id="rootScopeBuilderSimple" class="ru.intertrust.cmj.af.search.ScopeTreeBuilder">
            <property name="childs">
                <list>
                    <!-- <Модуль> -->
                    <bean class="ru.intertrust.cmj.af.search.dp.CmDocTypesScopeBuilder">
                        <constructor-arg index="0" value="<module>"/>
                        <constructor-arg index="1" value="<Module>"/>
                        <constructor-arg index="2">
                            <list>
                                <ref bean="subject"/>
                            </list>
                        </constructor-arg>
                        <constructor-arg index="3">
                            <set>
                                <ref bean="mainDocBundleSimple"/>
                            </set>
                        </constructor-arg>
                        <constructor-arg index="4">
                            <list>
                                <ref bean="<Module>Searcher"/>
                            </list>
                        </constructor-arg>
                        <constructor-arg index="5">
                            <ref bean="cmSearchScopeCompositExBuilder"/>
                        </constructor-arg>
                    </bean>
                    <!-- <Модуль> end-->
                </list>
            </property>
        </bean>
    
        <!-- Иерархия билдеров однострочного поиска. Однострочный поиск повторяет структуру расширенного поиска, но урезан по бандлам -->
        <bean id="oneLineRootScopeBuilder" class="ru.intertrust.cmj.af.search.ScopeTreeBuilder">
            <property name="childs">
                <list>
                    <!-- <Модуль> -->
                    <bean class="ru.intertrust.cmj.af.search.dp.CmDocTypesScopeBuilder">
                        <constructor-arg index="0" value="<module>"/>
                        <constructor-arg index="1" value="<Module>"/>
                        <constructor-arg index="2">
                            <list>
                                <ref bean="subject"/>
                            </list>
                        </constructor-arg>
                        <constructor-arg index="3">
                            <set>
                                <ref bean="mainDocBundleOneLine"/>
                            </set>
                        </constructor-arg>
                        <constructor-arg index="4">
                            <list>
                                <ref bean="<Module>Searcher"/>
                            </list>
                        </constructor-arg>
                        <constructor-arg index="5">
                            <ref bean="cmSearchScopeCompositExBuilder"/>
                        </constructor-arg>
                    </bean>
                    <!-- <Модуль> end-->
                </list>
            </property>
        </bean>
    
        <!-- Конфигурация параметров запроса (<Модуль>) -->
        <bean id="dominoRequestConfig<Module>" parent="dominoRequestConfigSuper">
            <!-- Отображение ID параметров запроса на поля notes документа -->
            <property name="nsFieldsByParamByBundleID">
                <map merge="true">
                    <entry key="rkk#regDate" value="outdate"/>
                    <entry key="rkk#addressees" value="To"/>
                    <entry key="rkk#signer" value="UserFrom"/>
                    <entry key="rkk#executor" value="Mast"/>
                    <entry key="resolution#regDate" value="outdate"/>
                    <entry key="mainDoc#regDate" value="outdate"/>
                    <entry key="mainDoc#signer" value="UserFrom"/>
                    <entry key="mainDoc#docDate" value="outdate"/>
                    <entry key="mainDoc#docDateSimple" value="outdate"/>
                    <entry key="report#regDate" value="outdate"/>
                </map>
            </property>
            <!-- Отображение ID бандла на имя формы notes документа -->
            <property name="formsByBundleID">
                <map merge="true">
                    <entry key="rkk" value="Input"/>
                    <entry key="mainDoc" value="Input"/>
                </map>
            </property>
        </bean>
    
    
        <!--Параметры сортировки результатов поиска (<Модуль>) -->
        <bean id="sortingParams<Module>Date" class="ru.intertrust.cmj.af.search.dp.docinfo.SortingParams">
            <property name="columnName" value="regDate"/>
            <property name="sortingFieldType" value="String"/>
            <property name="default" value="true"/>
            <property name="defaultSortingDirection" value="descendant"/>
            <property name="sortingDirections">
                <set>
                    <value>descendant</value>
                    <value>ascendant</value>
                </set>
            </property>
        </bean>
    
        <!-- Конфигурация отображения результатов поиска (<Модуль>) -->
        <bean id="moduleExtractorConfig<Module>" parent="moduleExtractorConfigSuper">
            <!-- Отображение формы документа на имя корневого типа -->
            <property name="rootTypesByBundleID">
                <map merge="true">
                    <entry key="rkk" value="rkk-search-result"/>
                </map>
            </property>
            <!-- Отображение имя формы notes документа на ID бандла -->
            <property name="bundleIDsByForm">
                <map merge="true">
                    <entry key="Input" value="rkk"/>
                </map>
            </property>
            <property name="nsFieldsByClTypeByBundleID">
                <map merge="true">
                    <entry key="rkk#regDate" value="outdate"/>
                    <entry key="rkk#to" value="S"/>
                    <entry key="rkk#from" value="S2"/>
                    <entry key="mainDoc#regDate" value="outdate"/>
                    <entry key="mainDoc#signer" value="S2"/>
                </map>
            </property>
            <property name="formulasByClTypeByBundleID">
                <map merge="true">
                    <entry key="rkk#hasAttachments" value="doc.getItemValueString('IsHasContent').trim() == '1'"/>
                    <entry key="rkk#id" value="ctx.getString('Links_DocReplID').trim() == '' ? '' : (ctx.getString('Links_DocReplID').trim() + ':' + ctx.getString('Links_DocUNID').trim())"/>
                </map>
            </property>
        </bean>
    </beans>
     
  2. Доработать область поиска

    Блок кода
    languagexml
    titleОбласть поиска
    collapsetrue
    <search-area name="<Module>">
        <!-- Исполнение -->
        <target-domain-object type="F_DP_ReportOutputRkk">
            <!-- Модуль -->
            <indexed-field name="Module">
                <doel>Module</doel>
            </indexed-field>
    
            <!<linked-domain- Дата регистрации -->
    object type="Tn_Field_String" nested="true">
    
                <indexed-field name="ReasonDeliv" language="regDate" search-by="substring">
                <doel>HierRoot.regDate</doel>
            </indexed-field>
    <script>if (ctx.get('cmjfield').equals('ReasonDeliv')){ ctx.get('value'); }</script>
                <!-- Автор отчета -->
    /indexed-field>
    
                <indexed-field name="ReasonCanc" language="Author" search-by="substring" language="">
                <doel>Author.orig_shortname</doel>
        <script>if    </indexed-field>
    (ctx.get('cmjfield').equals('ReasonCanc')){ ctx.get('value'); }</script>
                <!-- Дата исполнения -->
    /indexed-field>
    
                <indexed-field name="ReestrNum" language="" search-by="reportDatesubstring">
                 <doel>ExecDate</doel>
       <script>if (ctx.get('cmjfield').equals('ReestrNum')){ ctx.get('value'); }</script>
                </indexed-field>
    
            <!-- Текст отчета -->
            <indexed-field name="Srok" language="" search-by="reportTextsubstring">
                <doel>Text</doel>
        <script>if (ctx.get('cmjfield').equals('Srok')){   </indexed-field>
    
    ctx.get('value'); }</script>
               <target-collection name="F_DP_Report_(search)"/> </indexed-field>
    
            <filter>
        <indexed-field name="confidant" language="" search-by="substring">
         <conditions-script>
               <script>if (ctx.get('cmjfield').equals('confidant')){    <![CDATA[ctx.get('value').split('%')[0]; }</script>
                </indexed-field>
    
            var  result = false;<parent-link>
                    <doel>Owner</doel>
         var  typeName = session.find(ctx.get('HierRoot')).getDomainObject().getTypeName();
                        var qqz=ctx.get('Module.Type.Alias');
                        if (typeName.equals('F_DP_IntRkk') && (qqz.equals('NewModule'))){
                            result=true;
                        }
                        ctx.setResult(result);
                        ]]>
                </conditions-script>
            </filter>
        </target-domain-object>
    
        <!-- Резолюция -->
        <target-domain-object type="F_DP_Resolution">
            <!-- Модуль -->
            <indexed-field name="Module">
                <doel>Module</doel>
            </indexed-field>
    
            <!-- Контрольный -->
            <indexed-field name="isControl">
                <doel>CtrlIsControlled</doel>
            </indexed-field>
            <!-- Исполнен -->
            <indexed-field name="isExecuted">
                <doel>CtrlDateExecution</doel>
            </indexed-field>
            <!-- Дата регистрации -->
            <indexed-field name="regDate">
                <doel>HierRoot.regDate</doel>
            </indexed-field>
            <!-- Автор резолюции -->
            <indexed-field name="Superior" search-by="substring" language="">
                <doel>Author.orig_shortname</doel>
            </indexed-field>
            <!-- Дата резолюции -->
            <indexed-field name="resDate">
                <doel>Date</doel>
            </indexed-field>
            <!-- Срок резолюции -->
            <indexed-field name="resExDate">
                <doel>CtrlDeadline</doel>
            </indexed-field>
            <!-- Текст резолюции -->
            <indexed-field name="resText">
                <doel>Resolution</doel>
            </indexed-field>
            <!-- Рег. номер документа -->
            <indexed-field name="docNumber" search-by="substring">
                <script>var rn = ctx.get('regnumcnt'); if (rn == null) rn; else {
                    var prist = ctx.get('regnumprist'); if (prist == null) prist = '';
                    var fin = ctx.get('regnumfin'); if (fin == null) fin = '';
                    prist + rn + fin + ' ' + rn }
                </script>
            </indexed-field>
            <!-- Исполнитель резолюции -->
            <linked-domain-object type="F_DP_ResltnBase_ExecCurr">
                <indexed-field name="Executor" search-by="substring" language="">
                    <doel>ExecutorCurr.orig_shortname</doel>
                </indexed-field>
                <parent-link>
                    <doel>Owner</doel>
                </parent-link>
            </linked-domain-object>
            <linked-domain-object type="F_DP_ResltnBase_ExecExt">
                <indexed-field name="execpeoples" search-by="substring" language="">
                    <doel>ExecutorExt.orig_shortname</doel>
                </indexed-field>
                <indexed-field name="ORGANISATIONNAME" search-by="substring" language="">
                    <doel>ExecutorExt.OrgName</doel>
                </indexed-field>
                <parent-link>
                    <doel>Owner</doel>
                </parent-link>
            </linked-domain-object>
    
            <!-- Контролер резолюции -->
            <linked-domain-object type="F_DP_ResltnBase_Cntrller">
                <indexed-field name="ControlPeopleRes" search-by="substring" language="">
                    <doel>Controller.orig_shortname</doel>
                </indexed-field>
                <parent-link>
                    <doel>Owner</doel>
                </parent-link>
            </linked-domain-object>
    
            <target-collection name="F_DP_Resolution_(search)"/>
    
            <filter>
                <!--conditions-script>session.find(ctx.get('HierRoot')).getDomainObject().getTypeName() == 'F_DP_IntRkk'</conditions-script-->
                <conditions-script>
                    <![CDATA[
                        var result = false;
                        var typeName = session.find(ctx.get('HierRoot')).getDomainObject().getTypeName();
                        var qqz=ctx.get('Module.Type.Alias');
                        if (typeName.equals('F_DP_IntRkk') && (qqz.equals('NewModule'))){
                            result=true;
                        }
                        ctx.setResult(result);
                        ]]>
                </conditions-script>
            </filter>
        </target-domain-object>
    
        <!-- РКК -->
        <target-domain-object type="F_DP_IntRkk">
    
            <indexed-field name="Module">
                <doel>Module</doel>
            </indexed-field>
    
            <!--Содержание-->
            <indexed-content type="F_ContentRichText_Rkk"/>
            <indexed-content type="F_ContentFiles_Rkk"/>
            <indexed-content type="F_AddFiles_Rkk"/>
    
            <indexed-field name="Comments"/>
    
            <!-- Заголовок -->
            <indexed-field name="subject" search-by="substring">
                <doel>Subject</doel>
            </indexed-field>
    
            <!-- Вид документа -->
            <indexed-field name="reqType" search-by="substring" language="">
                <doel>Type</doel>
            </indexed-field>
    
            <!-- Номер проекта -->
            <indexed-field name="PNumber_Full" search-by="substring" language="">
                <script>
                    var rn = ctx.get('prjnumcounter'); if (rn == null) rn; else {
                    var prist = ctx.get('prjnumprist'); if (prist == null) prist = '';
                    var fin = ctx.get('prjnumfin'); if (fin == null) fin = '';
                    prist + rn + fin + ' ' + rn }
                </script>
            </indexed-field>
    
            <!-- Регистрационный номер -->
            <indexed-field name="regFullNumber" search-by="substring" language="">
                <script>var rn = ctx.get('regnumcnt'); if (rn == null) rn; else {
                    var prist = ctx.get('regnumprist'); if (prist == null) prist = '';
                    var fin = ctx.get('regnumfin'); if (fin == null) fin = '';
                    prist + rn + fin + ' ' + rn }
                </script>
            </indexed-field>
    
            <!-- Регистрационный номер, по точному совпадению -->
            <indexed-field name="regNumberExact" search-by="exactmatch">
                <script>var rn = ctx.get('regnumcnt'); if (rn == null) rn; else {
                    var prist = ctx.get('regnumprist'); if (prist == null) prist = '';
                    var fin = ctx.get('regnumfin'); if (fin == null) fin = '';
                    prist + rn + fin }
                </script>
            </indexed-field>
    
            <!-- Контрольный -->
            <indexed-field name="isControl">
                <script>ctx.get("RkkCtrlState") > 0 ? 1 : null;</script>
            </indexed-field>
    
            <!-- Исполнен -->
            <indexed-field name="isExecuted">
                <doel>CtrlDateExecution</doel>
            </indexed-field>
    
            <!-- Дата регистрации -->
            <indexed-field name="regDate"/>
    
            <!-- Дата документа -->
            <indexed-field name="docDate">
                <doel>RegDate</doel>
            </indexed-field>
    
            <!-- Дата документа -->
            <indexed-field name="docDateSimple">
                <doel>RegDate</doel>
            </indexed-field>
    
            <!-- Зарегистрирован -->
            <indexed-field name="isRegistered">
                <doel>RegNumCnt</doel>
            </indexed-field>
    
            <!-- Исполнение контролируют -->
            <linked-domain-object type="F_DP_RkkBase_Controller">
                <indexed-field name="ControlPeople" search-by="substring" language="">
                    <doel>Controller.orig_shortname</doel>
                </indexed-field>
                <parent-link>
                    <doel>Owner</doel>
                </parent-link>
            </linked-domain-object>
    
            <!-- Срок исполнения -->
            <indexed-field name="extControlDate">
                <doel>CtrlDeadline</doel>
            </indexed-field>
    
            <!-- Место регистрации -->
            <indexed-field name="Registration" search-by="substring" language="">
                <doel>RegCode.orig_shortname</doel>
            </indexed-field>
    
            <!-- Тематика -->
            <linked-domain-object type="F_DP_RkkBase_Theme">
                <indexed-field name="Theme" search-by="substring"/>
                <parent-link>
                    <doel>Owner</doel>
                </parent-link>
    
            </linked-domain-object>
    
            <!-- Подпись -->
            <linked-domain-object type="F_DP_Rkk_SigningInfoTn_Field_Datetime" nested="true">
    
                <indexed-field name="UserFromDateControl" searchsolr-byprefix="substring" language=""cm_dt">
                    <script>if  <doel>signer.orig_shortname</doel>(ctx.get('cmjfield').equals('DateControl')){ ctx.get('value'); }</script>
                </indexed-field>
    
                <parent<indexed-link>
                    <doel>Owner</doel>field name="DateControlEnd" solr-prefix="cm_dt">
                </parent-link>
      <script>if (ctx.get('cmjfield').equals('DateControlEnd')){     </linked-domain-object>
    
    ctx.get('value'); }</script>
            <!-- Исполнитель -->
            <linked-domain-object type="F_DP_IntRkk_Executor"></indexed-field>
    
                <indexed-field name="Mast" search-by="substringdateAttorney" languagesolr-prefix="cm_dt">
                    <script>if  <doel>Executor.orig_shortname</doel>(ctx.get('cmjfield').equals('dateAttorney')){ ctx.get('value'); }</script>
                </indexed-field>
    
                <parent-link>
                    <doel>Owner</doel>
                </parent-link>
            </linked-domain-object>
    
            <!-- АдресатЗаголовок -->
            <indexed-field name="Subject" search-by="substring"/>
    
            <!--Подпись -->
            <linked-domain-object type="F_DP_IntRkkRkk_AddresseeSigningInfo">
                <indexed-field name="ToSuperior" search-by="substring" language="">
                    <doel>Addressee<doel>signer.orig_shortname</doel>
                </indexed-field>
                <parent-link>
                    <doel>Owner</doel>
                </parent-link>
              <doel>Owner</doel></linked-domain-object>
    
            <!-- Вид документа -->
            <indexed-field name="reqType" search-by="substring" language="">
                <<doel>Type</parent-link>doel>
            </linkedindexed-domain-object>field>
    
            <!-- Регистрационный linkedDocномер -->
            <linked-domain-object type="F_DP_RkkWORegAndCtrl_ULnk">
    <indexed-field name="regFullNumber" search-by="substring" language="">
                <script>var rn = ctx.get('regnumcnt'); if <indexed-field name="linkedDocs">
    (rn == null) rn; else {
                    var prist = <script>ctxctx.get('docnameregnumprist') + ' ' + ctx.get('docsubjects')</script>; if (prist == null) prist = '';
                </indexed-field>
        var fin = ctx.get('regnumfin'); if (fin == null) fin  <parent-link>= '';
                    <doel>Owner</doel>prist + rn + fin + ' ' + rn }
                </parent-link>script>
            </linkedindexed-domain-object>field>
    
            <!-- SpecMark Регистрационный номер, по точному совпадению -->
            <linked-domain-object type="F_DP_RkkWORegAndCtrl_SMrk<indexed-field name="regNumberExact" search-by="exactmatch">
                <script>var <indexed-fieldrn name="specMark" search-by="substring">
    = ctx.get('regnumcnt'); if (rn == null) rn; else {
                    var prist = ctx.get('regnumprist'); if (prist == null) prist  <doel>specmark</doel>= '';
                </indexed-field>
        var fin = ctx.get('regnumfin'); if (fin == null) fin  <parent-link>
    = '';
                    prist +  <doel>Owner</doel>rn + fin }
                </parent-link>script>
            </linkedindexed-domain-object>field>
    
            <target-collection name="InternalDocs_(search)"/>
    
            <filter>
                <conditions-script>ctx.get('Module.Type.Alias') == '<Module>Attorney'</conditions-script>
            </filter>
    
        </target-domain-object>
    </search-area>


  3. Результаты поиска выводятся в представление ВнД InternalDocs_(search)

  4. Запустить ru.intertrust.cm_sochi.plugins.SolrReindexingPlugin по таблицам: F_DP_Report, F_DP_Resolution,F_DP_IntRkk