четверг, 12 сентября 2019 г.

SIL: Живой поиск дублируемых задач

Из жизни

Я решил создать отдельный проект, который я задействую как базу данных по компаниям-клиентам. 
Смысл простой: одна issue - один клиент. Внутри напичкано различными полями по клиенту, с информацией. 
Но изначально надо предусмотреть то, что когда у тебя будет хотя-бы овер 50 таких "карточек" - то велика вероятность, что кто-то ошибется и создаст дубликат уже имеющейся компании. 
Для этого я решил создать некий "живой поиск" по имеющимся компаниям. на помощь пришел SIL с Live Fields
О том как я это реализовал - ниже



Для начала необходимо иметь источник данных.
Я продумывал это так, что поле Summary будет являться уникальным именем компании и заполняться автоматически, с помощью lfSet. А значит именно по нему я и буду искать дубликаты. 
В силу того, что логика  работы такова, что каждый введенный символ должен проверяться - нам надо регулярно проходиться по списку имеющихся задач. 
И тут возникает сложность в том, что всякий раз, вызывая хук - дергать список по JQL очень не хочется. Ведь это будет нагружать инстанс. 
Поэтому я нашел решение собирать список задач, при открытии экрана создания, в файл CSV. А уже в хуке работать с этим списком из файла.
Для понимания: customfield_11120 - это однострочное текстовое поле с именем "Новая компания", в которой подразумевается пользовательский ввод новых данных. 
Итак, Main файл Live Field для проекта: 
lfm_CLIENTS.sil
lfHide("issueType");
lfDisable("createIssueSubmit");
if(argv["screen"] == "create")
    {
        lfHide("summary");
        /*
        Сначала удаляем имеющийся файл с задачами и создаем новый, с обновленными данными. Всякий раз, когда открывается экран создания.
        */
        deleteFile("Files/CLIENTS/CLIENTS_temp_allIssues_JQL.csv");
        createFile("Files/CLIENTS/CLIENTS_temp_allIssues_JQL.csv");
        printInFile("Files/CLIENTS/CLIENTS_temp_allIssues_JQL.csv""fKey,fSummary");
         
        string jql = "Project  = Клиенты";
        string [] issues = selectIssues(jql);
        for(string i in issues)
            {
                printInFile("Files/CLIENTS/CLIENTS_temp_allIssues_JQL.csv", i + "," + i.summary);
            }
    }
lfWatch("customfield_11120", {"customfield_11120"}, "LF/hooks/CLIENTS/hook_CLIENTS_newCompany.sil""keyup");

И файл хука: 
hook_CLIENTS_newCompany.sil
string input = argv["customfield_11120"]; //введенные символы
lfSet("summary", input);
//структура файла csv. всего 2 параметра из задачи, которые мне нужны. при необходимости - можно расширить
struct iss {
    string fKey;
    string fSummary;
}
iss [] fileContent = readFromCSVFile("Files/CLIENTS/CLIENTS_temp_allIssues_JQL.csv",true);
string [] contCompanys; //массив в котором мы будем хранить совпадающие компании
//Сразу разделим поведение ХУКа на 2 варианта. Есть введенные данные или нет (очистили поле)
if(isNotNull(input))
    {
        for(iss i in fileContent)
            {
                if(contains(i.fSummary,input))
                    {
                        contCompanys = addElementIfNotExist(contCompanys, "<a href=\"" + i.fKey + "\">" + i.fSummary + "<a/>");
                    }
                else
                    {
                        contCompanys = deleteElement(contCompanys, "<a href=\"" + i.fKey + "\">" + i.fSummary + "<a/>");
                    }
            }
         
        if(isNotNull(contCompanys))
            {
                lfShowFieldMessage("customfield_11120","Похожие компании: <b>" + contCompanys + "</b>","INFO");
                lfDisable("createIssueSubmit");
            }
        else
            {
                lfHideFieldMessage("customfield_11120");
                lfEnable("createIssueSubmit");
            }
    }
else
    {
        lfHideFieldMessage("customfield_11120");
        lfEnable("createIssueSubmit");
    }
Как это выглядит:
Вот таким образом можно организовать "живой поиск" дубликатов по имеющимся задачам. Будут вопросы - пишите в комментариях или мне в Telegram: @TheShestov

Комментариев нет:

Отправить комментарий