Разработка программной системы автоматизации подбора сотрудников в IT-компаниях

Анализ предметной области подбора персонала разрабатываемой системы, процесс формализации требований и автоматизируемые бизнес-процессы. Проектирование поведения системы, модели данных, проектирование нейросети для определения подходящих кандидатов.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 01.12.2019
Размер файла 4,7 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

const routes: Routes = [

{

path: '',

component: MainComponent,

children: [

{ path: 'about', loadChildren: '../about/about.module#AboutModule', canActivate: [MainGuard] },

{ path: 'admin', loadChildren: '../admin/admin.module#AdminModule', canActivate: [MainGuard] },

{ path: 'applicant', loadChildren: '../applicant/applicant.module#ApplicantModule', canActivate: [MainGuard] },

{ path: 'company', loadChildren: '../company/company.module#CompanyModule', canActivate: [MainGuard] },

{ path: 'resume', loadChildren: '../resume/resume.module#ResumeModule', canActivate: [MainGuard] },

{ path: 'vacancy', loadChildren: '../vacancy/vacancy.module#VacancyModule', canActivate: [MainGuard] },

{ path: 'identification', loadChildren: '../identification/identification.module#IdentificationModule', canActivate: [MainGuard] },

{ path: 'skill', loadChildren: '../skill/skill.module#SkillModule', canActivate: [MainGuard] },

{ path: 'source', loadChildren: '../source/source.module#SourceModule', canActivate: [MainGuard] },

{ path: 'user-actions', loadChildren: '../user-action/user-action.module#UserActionModule', canActivate: [MainGuard] },

{ path: 'report', loadChildren: '../report/report.module#ReportModule', canActivate: [MainGuard] },

{ path: 'restricted', loadChildren: '../restricted/restricted.module#RestrictedModule' },

{ path: '**', canActivate: [MainGuard] }

]}

];

@NgModule({

imports: [

RouterModule.forChild(routes),

CommonModule,

FormsModule,

ReactiveFormsModule,

MatListModule,

MatSidenavModule,

MatIconModule,

MatSlideToggleModule,

MatToolbarModule,

HeaderPanelModule

],

exports: [

MainComponent

],

providers: [

MainGuard

],

declarations: [

MainComponent

]

})

export class MainModule {

}

Как видно из примера выше, блок pages разбит на следующие модули:

· about - страница с основной информацией о приложении, ее создателях, а также о роли пользователя в системе и доступном ему функционале;

· admin - блок страниц для работы с администраторами (их создание, просмотр, вывод списка, кабинет администратора, редактирование его профиля, редактирование другого администратора и т.д.);

· applicant - блок страниц для работы с соискателем (регистрация, просмотр соискателя, их список, кабинет, редактирование профиля, редактирование другого соискателя и т.д.);

· company - блок страниц для работы с работодателем (создание, просмотр работодателя, их список, кабинет, редактирование профиля, редактирование другого работодателя и т.д.);

· resume - блок страниц для работы с резюме (создание, просмотр, редактирование и список резюме);

· vacancy - блок страниц для работы с вакансией (создание, просмотр, редактирование и список вакансий);

· identification - страница для идентификации пользователя в системе;

· skill - страница для учета навыков в системе;

· user-actions - страница для отслеживания действий пользователей в системе;

· report - блок страниц для работы с отчетами о сопоставлении вакансий с резюме (создание, просмотр, редактирование и список отчетов);

· restricted - страница, на которую отправляется пользователь, если система находится в сервисном режиме.

На примере сущностей «company» и «resume» будут продемонстрированы базовые страницы системы.

Регистрация работодателей в приложении выполняется на странице «/company/company-registration». Страница содержит набор компонент типа Editor, различного типа (None, Password, Phone, Mail). На некоторых полях стоят наблюдатели (observer), которые следят за появлением ошибки при заполнении. Страница регистрации представлена на рисунке 3.11.

Кабинет работодателя, представленный на рисунке 3.12, на странице «/company/company-cabinet» также содержит ряд блоков Editor с активным свойством «disabled», PictureBox с изображением работодателя, а также навигационный блок по приложению и доступным для роли пользователя функциям.

Рисунок 3.11. Страница «Регистрация работодателя»

Рисунок 3.12. Страница «Кабинет работодателя»

Перемещение по страницам, доступным пользователям с определенными ролями также доступно через боковое меню (рис. 3.13).

Рисунок 3.13. Навигационное меню в режиме «Администратор»

«Просмотр компаний» на странице «/company/company-list», представленный на рисунке 3.14, содержит компоненту типа SimpleCollection, и отображает все компании, зарегистрированные в системе.

Рисунок 3.14. Страница «Список компаний»

В различных режимах пользователь имеет доступ к определенному функционалу, который подробно описан в руководстве пользователя (см. прил. D). «Просмотр работодателя» на странице «/company/company-view/login», так же как и кабинет работодателя, состоит из нескольких компонент типа Editor и компоненты PictureBox. Страница просмотра поддерживает весь функционал, которым обладает пользователь на странице просмотра, а также может переключаться по доступным сущностям (рис. 3.15).

Рисунок 3.15. Страница «Просмотр работодателя»

Учет таких документов, как резюме и вакансия, выполняется в соответствующих блоках. «Список резюме» представлен на странице «/resume/resume-list». Данная страница содержит компоненты типа Simple и Group Collection. Их активность зависит от выбранного параметра «Сгруппировать по пользователям». Страница представлена на рисунке 3.16.

Рисунок 3.16. Страница «Список резюме»

Резюме на странице «просмотра резюме» по адресу «/resume/resume-view/id» для пользователя выводятся в двух случаях: либо резюме является опубликованным, либо пользователь является его создателем. На данной странице используется компонента SkillTable, которая может отображать как глобальные навыки, так и навыки, указанные в резюме, что показано на рисунке 3.17.

Рисунок 3.17. Страница «Просмотр резюме»

Рисунки, на которых представлен остальной функционал системы представлены в руководстве пользователя (см. прил. D).

3.3 Реализация back-end компоненты системы HR Helper

При создании back-end части приложения, основываясь на проектировании системы были разработаны следующие блоки: Model, Repositories, Services и Controllers.

В блоке Model были созданы основные и «нейросетевые» классы системы, а также разработаны DTO [29] для каждого из классов. Также были созданы классы, наследованные от DbContext, с помощью которых будет выполняться генерация баз данных. В данных классах были указаны основные таблицы элементов - DbSet<T>, а также установлена структура зависимостей между классами с каскадным удалением элементов, и прописано подключение, к которому подключается DbContext. Пример реализации класса MainDBContext представлен ниже:

public class MainDBContext: DbContext

{

public MainDBContext(DbContextOptions<MainDBContext> options)

: base(options)

{

}

// Сеты для Мейн БД

public DbSet<Account> Accounts { get; set; }

public DbSet<Admin> Admins { get; set; }

public DbSet<Applicant> Applicants { get; set; }

public DbSet<Company> Companies { get; set; }

public DbSet<Vacancy> Vacancies { get; set; }

public DbSet<Resume> Resumes { get; set; }

public DbSet<Skill> Skills { get; set; }

public DbSet<Report> Reports { get; set; }

public DbSet<Match> Matches { get; set; }

public DbSet<UserAction> UserActions { get; set; }

public DbSet<TokenGuid> TokenGuids { get; set; }

public DbSet<ResumeSkill> ResumeSkills { get; set; }

public DbSet<VacancySkill> VacancySkills { get; set; }

public DbSet<WebSelector> WebSelectors { get; set; }

public DbSet<WebSource> WebSources { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)

{

base.OnModelCreating(modelBuilder);

// Уникальный ключ по ResumeId и SkillId

modelBuilder.Entity<ResumeSkill>().HasKey(s => new { s.ResumeId, s.SkillId });

// Удаление связи резюме-навык при удалении навыка

modelBuilder.Entity<ResumeSkill>()

.HasOne(x => x.Skill)

.WithMany()

.OnDelete(DeleteBehavior.Cascade);

// Удаление связи резюме-навык при удалении резюме

modelBuilder.Entity<ResumeSkill>()

.HasOne(x => x.Resume)

.WithMany()

.OnDelete(DeleteBehavior.Cascade);

// Уникальный ключ по VacancyId и SkillId

modelBuilder.Entity<VacancySkill>().HasKey(s => new { s.VacancyId, s.SkillId });

// Удаление связи вакансия-навык при удалении вакансии

modelBuilder.Entity<VacancySkill>()

.HasOne(x => x.Vacancy)

.WithMany()

.OnDelete(DeleteBehavior.Cascade);

// Удаление связи вакансия-навык при удалении навыка

modelBuilder.Entity<VacancySkill>()

.HasOne(x => x.Skill)

.WithMany()

.OnDelete(DeleteBehavior.Cascade);

// Удаление сопоставления при удалении отчета

modelBuilder.Entity<Match>()

.HasOne(x => x.Report)

.WithMany()

.OnDelete(DeleteBehavior.Cascade);

// Удаление сопоставления при удалении резюме

modelBuilder.Entity<Match>()

.HasOne(x => x.Resume)

.WithMany()

.OnDelete(DeleteBehavior.Cascade);

// Удаление отчета при удалении вакансии

modelBuilder.Entity<Report>()

.HasOne(x => x.Vacancy)

.WithMany()

.OnDelete(DeleteBehavior.Cascade);

// Удаление резюме при удалении соискателя

modelBuilder.Entity<Resume>()

.HasOne(x => x.Applicant)

.WithMany()

.OnDelete(DeleteBehavior.Cascade);

// Удаление вакансий при удалении компании

modelBuilder.Entity<Vacancy>()

.HasOne(x => x.Company)

.WithMany()

.OnDelete(DeleteBehavior.Cascade);

// Удаление селекторов при удалении источника

modelBuilder.Entity<WebSelector>()

.HasOne(x => x.Source)

.WithMany()

.OnDelete(DeleteBehavior.Cascade);

}

}

public class MainContextDbFactory : IDesignTimeDbContextFactory<MainDBContext>

{

MainDBContext IDesignTimeDbContextFactory<MainDBContext>.CreateDbContext(string[] args)

{

var optionsBuilder = new DbContextOptionsBuilder<MainDBContext>();

optionsBuilder.UseNpgsql<MainDBContext>("Host=localhost;Port=5432;Database=HrhDatabase;Username=***;Password=***;Pooling=true");

return new MainDBContext(optionsBuilder.Options);

}

}

На основе сформированной модели данных с помощью технологии .Net Core и диспетчера NuGet-пакетов была выполнена генерация базы данных на ранее созданном сервере PostgreSQL. Для этого использовалась технология migration, которая сгенерировала 2 базы данных, основанных на разработанных моделях (рис. 3.18).

Рисунок 3.18. Сгенерированная база данных в СУБД PostgreSQL

На основе классов системы и результатов этапа проектирования были созданы репозитории, пример реализации которых представлен ниже:

public class AccountRepository

{

// Контейнер, взаимодействующий с мейн БД

private readonly MainDBContext _dBContext;

/// <summary>

/// Конструктор репозитория для пользователей

/// </summary>

/// <param name="dBContext">Мейн контейнер</param>

public AccountRepository(MainDBContext dBContext)

{

_dBContext = dBContext;

}

/// <summary>

/// Вывод списка пользователей

/// </summary>

public DbSet<Account> Accounts => _dBContext.Accounts;

/// <summary>

/// Вывод пользователя по его логину

/// </summary>

/// <param name="login">Логин пользователя</param>

/// <returns>Получаемый пользователь</returns>

public Account this[string login]

{

get { return Accounts.Where(account => account.Login == login).FirstOrDefault(); }

}

/// <summary>

/// Добавление пользователя в БД

/// </summary>

/// <param name="input">Передаваемый пользователь</param>

/// <returns>Созданный пользователь</returns>

public Account Create(Account input)

{

_dBContext.Accounts.Add(input);

return input;

}

/// <summary>

/// Удаление пользователя из БД

/// </summary>

/// <param name="login">Логин пользователя, который должен быть удален из системы</param>

public void Delete(string login)

{

var account = this[login];

if (account != null)

{

_dBContext.Accounts.Remove(account);

}

}

/// <summary>

/// Сохранение изменений

/// </summary>

public void SaveChanges()

{

_dBContext.SaveChanges();

}

}

Все основные методы, указанные на диаграммах классов, были успешно реализованы. Следующий этап - создание сервисов для уменьшения кода в контроллерах. Пример разработанного сервиса (ApplicantService) представлен ниже:

public class ApplicantService

{

private readonly MainDBContainer _container;

private readonly AccountService _accountService;

private readonly ExportAccountService _exportAccountService;

/// <summary>

/// Конструктор сервиса для работы с соискателями

/// </summary>

/// <param name="container">Мейн контейнер</param>

/// <param name="accountService">Сервис для работы с пользователями</param>

/// <param name="expAccService">Сервис для экспорта пользователей</param>

public ApplicantService(MainDBContainer container, AccountService accountService, ExportAccountService expAccService)

{

_container = container;

_accountService = accountService;

_exportAccountService = expAccService;

}

/// <summary>

/// Удаление соискателя по логину

/// </summary>

/// <param name="login">Логин удаляемого соискателя</param>

public void Delete(string login)

{

_container.ApplicantRepository.Delete(login);

_accountService.Delete(login);

_container.SaveChanges();

}

/// <summary>

/// Регистрация нового соискателя

/// </summary>

/// <param name="applicant">Инфа о соискателе с паролем</param>

/// <returns>Токен идентифицированного соискателя</returns>

public AccountToken Register(ApplicantAccountWithPassword applicant)

{

_container.ApplicantRepository.Create(new Applicant()

{

Login = applicant.Login,

Info = applicant.Info,

Phone = applicant.Phone,

Mail = applicant.Mail,

IsGeneratedUser = applicant.IsGenerated

});

var token = _accountService.RegisterApplicant(new AccountLoginPasswordFIO()

{

Login = applicant.Login,

Password = applicant.Password,

FIO = applicant.FIO

});

_container.SaveChanges();

return token;

}

/// <summary>

/// Обновление информации о соискателе

/// </summary>

/// <param name="input">Инфа о соискателе без пароля</param>

public void UpdateApplicant(ApplicantAccount input)

{

var applicant = _container.ApplicantRepository[input.Login];

applicant.Info = input.Info;

applicant.Phone = input.Phone;

applicant.Mail = input.Mail;

applicant.IsGeneratedUser = input.IsGenerated;

_accountService.UpdateAccount(new AccountInfo()

{

Login = input.Login,

FIO = input.FIO,

Role = Roles.Applicant

});

_container.SaveChanges();

}

}

Последний блок разработки back-end части системы - разработка контроллеров. Для каждого основного класса был создан контроллер, поддерживающий пользовательскую авторизацию и запросы типов HttpGet, HttpDelete, HttpPut и HttpPost. Пример методов в контроллере UserActionController приведен ниже:

/// <summary>

/// Получение действия пользователя

/// </summary>

/// <param name="id">ИД действия</param>

/// <returns>Действие пользователя</returns>

[HttpGet("{id}")]

[Authorize(Roles = Roles.Admin)]

public UserActionViewing GetAction(long id)

{

// GET hrhApi/userAction/123

var action = _container.UserActionRepository[id];

if (action != null)

{

return new UserActionViewing()

{

Id = action.Id,

User = action.User,

Page = action.Page,

ActionType = action.ActionType,

Success = action.Success,

Params = action.Params,

TimeStamp = action.TimeStamp,

ResponseStatus = true,

ResponseError = ""

};

}

else

{

return new UserActionViewing()

{

ResponseStatus = false,

ResponseError = "Такого действия нет"

};

}

}

/// <summary>

/// Удаление неактуального лога из БД

/// </summary>

[HttpDelete]

[Authorize(Roles = Roles.Admin)]

public BaseDTO DeleteLog()

{

// DELETE hrhApi/userAction

var account = _container.AdminRepository[User.Identity.Name];

if (account == null)

return new BaseDTO()

{

ResponseStatus = false,

ResponseError = "Вас нет, извините"

};

else

return new BaseDTO()

{

ResponseStatus = false,

ResponseError = "Удаление неактуального лога не выполнено. На доработке."

};

}

/// <summary>

/// Создание нового действия пользователя

/// </summary>

/// <param name="input">Действие пользователя</param>

[HttpPost]

public BaseDTO CreateAction([FromBody] UserActionAdding input)

{

//POST hrhApi/userAction/create

_userActionService.Create(input);

return new BaseDTO()

{

ResponseStatus = true,

ResponseError = ""

};

}

/// <summary>

/// Удаление действия пользователя из БД

/// </summary>

/// <param name="id">ИД удаляемого действия</param>

[HttpDelete("{id}")]

[Authorize(Roles = Roles.Admin)]

public BaseDTO DeleteAction(long id)

{

// DELETE hrhApi/userAction/123

var action = _container.UserActionRepository[id];

if (action == null)

return new BaseDTO()

{

ResponseStatus = false,

ResponseError = "Навык отсутствует"

};

_userActionService.Delete(id);

return new BaseDTO()

{

ResponseStatus = true,

ResponseError = ""

};

}

3.4 Разработка модулей экспорта, импорта и сбора данных системы HR Helper

Генерация отчетов в формате таблиц Excel по деятельности пользователей, востребованности вакансий и резюме, актуальности лога реализована с помощью технологии OfficeOpenXml - библиотека для фреймворка .Net Core, позволяющая выполнять импорт и экспорт данных в Excel. Экспорт данных осуществляется в специальном сервисе ExportLogService, который позволяет экспортировать отчеты для каждой сущности в формате массива байт:

public byte[] Export(string aim, string param = "")

{

byte[] fileContents;

using (var package = new ExcelPackage())

{

switch (aim)

{

case Entities.Admin:

if (param != "")

fileContents = ExportAdmin(package, param);

else

fileContents = ExportAdmin(package);

break;

case Entities.Applicant:

if (param != "")

fileContents = ExportApplicant(package, param);

else

fileContents = ExportApplicant(package);

break;

default:

fileContents = new byte[] { };

break;

}

}

return fileContents;

}

На клиентской части приложения полученный массив конвертируется в BLOB (Binary Large Object) и переносится в загрузки браузера, как показано на рисунке 3.19.

Рисунок 3.19. Строка загрузок в браузере

Реализация конвертации полученного файла в BLOB и его перенос в строку загрузки браузера представлена ниже:

public exportToBrowser(file: BlobPart, title: string, format: string = 'application/octet-stream') {

const thefile = new Blob([file], {type: format});

if (navigator.appVersion.toString().indexOf('.NET') > 0) {

window.navigator.msSaveBlob(thefile, title);

} else {

const link = document.createElement('a');

link.href = window.URL.createObjectURL(thefile);

link.download = `${title}`;

link.click();

}

}

Пример сгенерированного отчета в формате Excel представлен на рисунке 3.20.

Рисунок 3.20. Сгенерированный отчет Excel

Генерация документов Word реализована с помощью технологии GemBox.Document. Данная технология, в сравнении со стандартной технологией работы с документами Microsoft.Interop.Word, работает быстрее и требует меньшей нагрузки на систему. В разработанной системе используется TRIAL_версия технологии, так как бесплатная версия ограничивает число обрабатываемых объектов класса Paragraph до 20, в то время как используемая версия не содержит таких ограничений, при этом в документах, превысивших число используемых параграфов, в верхний колонтитул вставляется информация об используемой технологии. Экспорт документов в формате Word реализован в отдельном сервисе ExportDocumentService. Получение документа, его преобразование в BLOB и вывод в строку загрузок реализован аналогичным образом, как и в экспорте в Excel.

Реализация экспорта документа представлена в следующем блоке кода:

public byte[] Export(string aim, long id)

{

byte[] fileContents;

ComponentInfo.SetLicense("FREE-LIMITED-KEY");

ComponentInfo.FreeLimitReached += (sender, e) => e.FreeLimitReachedAction = FreeLimitReachedAction.ContinueAsTrial;

var document = new DocumentModel();

switch(aim)

{

case Entities.Resume:

fileContents = ExportResume(document, id);

break;

case Entities.Vacancy:

fileContents = ExportVacancy(document, id);

break;

default:

fileContents = new byte[] { };

break;

}

return fileContents;

}

var vacancy = _container.VacancyRepository[id];

if (vacancy == null)

return new byte[] { };

var blocks = new List<Block>();

var account = _container.AccountRepository[vacancy.CompanyLogin];

var company = _container.CompanyRepository[vacancy.CompanyLogin];

blocks.Add(

new Paragraph(

document,

new Run(document, "Компания: " + company.CompanyType + " " + account.FIO),

new SpecialCharacter(document, SpecialCharacterType.LineBreak),

new Run(document, "Должность: " + vacancy.Position),

new SpecialCharacter(document, SpecialCharacterType.LineBreak),

new Run(document, "Зарплата: " + vacancy.Salary),

new SpecialCharacter(document, SpecialCharacterType.LineBreak),

new Run(document, "Количество образований: " + vacancy.Education),

new SpecialCharacter(document, SpecialCharacterType.LineBreak),

new Run(document, "Опыт работы в месяцах: " + vacancy.Experience),

new SpecialCharacter(document, SpecialCharacterType.LineBreak),

new Run(document, "Количество изученных языков: " + vacancy.Language),

new SpecialCharacter(document, SpecialCharacterType.LineBreak),

new Run(document, "Умеет ли водить: " + (vacancy.Driving ? "Да" : "Нет")),

new SpecialCharacter(document, SpecialCharacterType.LineBreak)

));

for (int i = 0; i < vacancySkills.Count(); i++)

{

TableRow row = new TableRow(document);

skillTable.Rows.Add(row);

var skill = _container.SkillRepository[vacancySkills[i].SkillId];

Paragraph namePar = new Paragraph(document, skill.Name);

Paragraph descPar = new Paragraph(document, skill.Description);

row.Cells.Add(

new TableCell(document, namePar));

row.Cells.Add(

new TableCell(document, descPar));

}

blocks.Add(skillTable);

Пример экспортированной вакансии представлен на рисунке 3.21.

Рисунок 3.21. Сгенерированный отчет Excel

Загрузка изображений в систему реализована на части Front_end с помощью дополнительно реализованной компоненты upload_button, включающей стандартный HTML_элемент <input type=”file”> и кнопку, которая вызывает событие click() у input. Реализация компоненты upload-button представлена ниже:

import {AfterViewInit, ChangeDetectorRef, Component, Input, NgModule} from '@angular/core';

import {MatIconModule, MatListModule, MatSidenavModule, MatSlideToggleModule, MatToolbarModule} from '@angular/material';

import {FormsModule, ReactiveFormsModule} from '@angular/forms';

import {CommonModule} from '@angular/common';

import {ButtonElement} from '@hrh/app/models/component-models/button-element';

@Component({

selector: 'hrh-upload-button',

templateUrl: './upload-button.component.html',

styleUrls: ['/upload-button.component.scss']

})

export class UploadButtonComponent implements AfterViewInit {

@Input()

public buttonRule: ButtonElement;

public uploadFile(event: any) {

event.preventDefault();

const upload: HTMLElement = document.getElementById(`upload${this.buttonRule.id}`) as HTMLElement;

upload.click();

}

public afterChanging(event: any) {

}

public ngAfterViewInit() {

}

constructor(private cd: ChangeDetectorRef) {

}

}

HTML_разметка данной компоненты представлена далее:

<input class="file" id="upload{{buttonRule.id}}" type="file" (change)="buttonRule.action($event)" accept="{{buttonRule.format !=='' ? buttonRule : ''}}" style="display: none">

<button mat-icon-button (click)="uploadFile($event)" title="{{buttonRule.title}}">

<mat-icon>{{buttonRule.icon}}</mat-icon>

</button>

Загрузка документов Word для генерации вакансий и резюме реализована аналогичным образом с помощью технологии GemBox.Document. Для этого на клиентской части приложения используется компонента upload-button, а на серверной части разбор документа происходит в отдельном сервисе ImportDocumentService, пример реализации которого представлен в блоке кода ниже:

public UploadResultDTO Import(string stringFile, string aim, string login)

{

try

{

ComponentInfo.SetLicense("FREE-LIMITED-KEY");

ComponentInfo.FreeLimitReached += (sender, e) => e.FreeLimitReachedAction = FreeLimitReachedAction.ContinueAsTrial;

var temp = stringFile.Split(",");

byte[] array = Convert.FromBase64String(temp[temp.Length - 1]);

var document = new DocumentModel();

using (MemoryStream stream = new MemoryStream(array))

{

document = DocumentModel.Load(stream);

}

UploadResultDTO result;

switch (aim)

{

case Entities.Vacancy:

result = ImportVacancy(document, login);

break;

case Entities.Resume:

result = ImportResume(document, login);

break;

default:

result = new UploadResultDTO()

{

ResponseStatus = false,

ResponseError = "Выпал дефолтный метод на сервисе"

};

break;

}

return result;

}

catch(Exception ex)

{

return new UploadResultDTO()

{

ResponseStatus = false,

ResponseError = "Загрузка не выполнилась"

};

}

}

Модуль сбора данных из сторонних систем реализован с помощью реализованного веб-скапера на языке C# с помощью технологии ScrapySharp.

Список источников, из которых система будет получать данные указывается администратором системы, который указывает адрес веб-сайта и все CSS_селекторы, которые необходимо парсить в процессе сбора данных. Пример описанного администратором веб-сайта представлен на рисунке 3.22.

Рисунок 3.22. Страница «Просмотр источника»

Сбор данных будет выполняться по двум возможным сценариям. Администратор имеет доступ к запуску сбора данных, при котором интерфейс блокируется загрузчиком и всплывает сообщение о выполнении загрузки. Если администратор не будет выполнять обновления данных, то система будет раз в день в 02:00 выполнять автоматический сбор данных.

3.5 Разработка модуля анализа с помощью нейронных сетей системы HR Helper

В модуле подготовки обучающих и тестовых множеств выполняется их создание и обновление при добавлении или удалении новых навыков в систему методом полного перебора. Таким образом, множества содержат большое количество элементов. Однако в обучении и тестировании моделей участвовать будут не все данные. Обучение модели выполняется на 20% сгенерированных данных, отсортированных в случайном порядке, а тестирование будет выполняться на 5% данных в тестовом множестве.

Затем нейросеть будет получать множество закодированных по правилам кодировки резюме, которые будут анализироваться нейросетью. В таблице ниже приведена система кодировок для элементов нейросети (табл. 3.1).

Таблица 3.1. Система кодирования входных сигналов для нейросетей

Название параметра

Кодирование

Пример исходных данных

Пример закодированных данных

Зарплата

)

22500

23

Опыт работа

Опыт работы в месяцах

23

23

Количество изученных языков

Количество языков

5

5

Количество полных образований

Кол-во полных образований

2

2

Вождение

Умеет водить

Да/Нет

1/0

Владение навыком

Владеет ли навыком

Да/Нет

1/0

Результат выполнения «нейросетевого» анализа в системе представлен на рисунке 3.23 на примере созданного пользователем отчета.

Как видно из рисунка 3.23, согласно установленным работодателем верхним и нижним границам в компоненте SimpleCollection, резюме отсортировались в порядке убывания результата сопоставления. Также согласно результатам, резюме в зависимости от результата окрасились в цвета: зеленый - результат хороший, кандидат с данным резюме по требованиям работодателя и его ожиданиям от работника подходит на должность; желтый - согласно требованиям и ожиданиям работодателя, сотрудник «слабоват» для работы, но его можно рассмотреть для другой должности; красный - соискатель, согласно требованиям и ожиданиям работодателя полностью не подходит на должность, и его рассматривать не стоит.

Рисунок 3.19. Результат проведения «нейросетевого анализа»

3.6 Тестирование системы HR Helper

Программная система была протестирована по критериям черного и белого ящика [10]. Были протестированы следующие функции системы:

· создание, редактирование, удаление документов системы;

· создание, редактирование и удаление пользователей системы;

· регистрация и идентификация пользователей системы, обновление страниц;

· экспорт статистических отчетов;

· импорт резюме и вакансий, а также изображений;

· сбор данных по расписанию и по требованию;

· обучение нейросетей;

· заполнение множеств на основании заработной платы, опыта, пользовательских навыков, указанных в системе и т.д.;

· анализ данных с помощью обученных нейросетей.

Также перед объединением с back-end частью приложения все функции системы были протестированы на тестовом наборе данных. Была проверена работоспособность следующих элементов веб-приложения:

· компоненты страниц;

· навигационное меню;

· компоненты для редактирования данных и загрузки изображений;

· компоненты Simple и Group Collection на возможность группировки, скроллинга, выбора элементов;

· компоненты таблицы на возможность сортировки отображаемых данных;

· компонента Simle Collection на возможность добавления цветового ранжирования элементов.

Результаты проведенного тестирования представлены в приложении E.

3.7 Развертывание системы HR Helper

Система HR Helper была развернута на серверах группы компаний Simpl:

· база данных развернута на внутреннем сервере баз данных;

· серверные части приложения развернуты на сервере web01 группы компаний Simpl;

· клиентская часть развернута и настроена на взаимодействие с серверной частью с помощью технологии IIS.

В результате проведенной реализации приложения была спроектирована архитектура системы и были разработаны основные блоки системы: части back-end и front-end, подготовлены модули сбора данных и «нейросетевого» анализа, а также выполнены тестирование системы и развертывание.

Заключение

В результате выполнения выпускной квалификационной работы была достигнута ее основная цель: создана программная система, автоматизирующая подбор персонала в IT_компаниях, в среде разработки MS Visual Studio и WebStorm с помощью технологий .Net Core и Angular. База данных выполнена с помощью СУБД PostgreSQL.

Данная система поддерживает работу 4 видов пользователей: не идентифицированный гость системы, который может просматривать компании и их вакансии в системе; соискатель, который может просматривать компании и вакансии, а также публиковать свои резюме, просматривать резюме других; соискателей, создавать отчеты по вакансиям и заполнять их с помощью обученных нейросетей; администраторы, которые могут выполнять учет всех данных в системе, проводить регулярные сбор и очистку неактуальных данных, а также отслеживать действия пользователя и генерировать статистические отчеты. Программная система была развернута на серверах группы компаний Simpl и предназначена для персонального пользования сотрудниками компании.

В рамках написания выпускной квалификационной работы были выполнены следующие задачи:

1. Проанализирована предметная область подбора персонала, а также проведен сравнительный анализ существующих в этой области программных систем.

2. Выявлены, сформулированы и формализованы основные требования к системе подбора персонала в IT_компаниях с помощью UML диаграммы прецедентов.

3. Описаны автоматизируемые системой бизнес-процессы в нотации UML диаграмм активностей.

4. Спроектирована концептуальная модель предметной области в нотации ERD, выполнено описание поведения системы в нотации UML диаграмм последовательностей, спроектированы основные классы разрабатываемой системы в нотации UML диаграмм классов, выполнено проектирование модели нейронной сети, а также ее обучение и тестирование в программной системе «Нейросимулятор 5».

5. Реализованы клиентская часть системы на языке TypeScript, фреймворке Angular и серверная часть приложения на языке C#, фреймворк .Net Core. Также были разработаны модули импорта и экспорта в различных форматах, сбор данных из сторонних источников в Internet и анализ данных с помощью нейронных сетей.

6. Проведено тестирование разработанной системы HR Helper.

7. Написана основная документация для разработанной системы HR Helper.

Для реализованной системы была разработана основная документация:

· руководство пользователя (см. прил. D);

· руководство программиста (см. прил. F).

Подробный листинг программной системы приведен в приложении G.

Пути развития программы:

1. Реализация возможности отправления уведомлений на привязанную почту пользователя с приглашением идентифицироваться в системе.

2. Реализация модуля тестирования соискателей внутри системы.

3. Реализация синонимизации указываемых навыков для более точного отбора сотрудников.

4. Реализация возможности общения между соискателями и работодателями.

Библиографический список

1. ГОСТ 19.301-79 Программа и методика испытаний. Требования к содержанию и оформлению.

2. ГОСТ 34.602-89 Информационная технология. Комплекс стандартов на автоматизированные системы. Техническое задание на создание автоматизированной системы.

3. Азарнова Т., Терновых И., Применение нейросетей в процессе подбора персонала. - Воронеж: Вестник ВГУ, Серия: системный анализ и информационные технологии, 2009. - 4 с.

4. Блохина О., Петрова Е. HRM-системы в управлении персоналом. - Саранск: «Системное управление», 2009. 8 с.

5. Бурменко Т. Сфера услуг: менеджмент: учебное пособие для вузов. - М.: КНОРУС, 2017. - 416 с.

6. Буч Г. Рамбо Д., Якобсон И. Язык UML. Руководство пользователя. - М.: ДМК Пресс, 2006

7. Гордиенко Ю., Обухов Д., Самыгин С. Управление персоналом. - Ростов н/Д: Феникс, 2004. - 345 с.

8. Дергачев А.М. Проблемы эффективного использования сетевых сервисов // Научно-технический вестник СПбГУ ИТМО, 2011. № 1 (71). С. 83-87.

9. Нильсен Я., Лоранжер Х. Веб-дизайн. Удобство использования Веб-сайтов. М.: Вильямс, 2009.

10. Плаксин М.А. Тестирование и отладка программ для профессионалов будущих и настоящих. М.: БИНОМ. Лаборатория знаний, 2015.

11. Роббинс Д.Н. HTML5, CSS3 и JavaScript. Исчерпывающее руководство. 4-е изд. М.: Эксмо, 2014.

12. Орунбасарова Ж., Кошимова М. Функции и роль HR-менеджера в современной организации. - Международный экономический форум, 2012.

13. Черепанов Ф.М., Ясницкий Л.Н. Нейросимулятор 5.0. Свидетельство о государственной регистрации программы для ЭВМ № 2014618208. Заявка Роспатент № 2014614649. Зарегистрировано в Реестре программ для ЭВМ 12 августа 2014г.

14. Ясницкий Л.Н. Введение в искусственный интеллект. - М.: Издательский центр «Академия», 2005. - 176с.

15. Apatean A., Szakacs E., Tilca M. Machine Learning Based Application for Staff Recruitment // Acta Technica Napocencis, Electronics and Telecommunications, vol. 58, no. 4, pp. 16-21, Dec 2017.

16. Bechman A., Lomborg S. Using APIs for Data Collection on Social Media // The Information Society, vol. 30, pp. 256-265, Jul. 2014.

17. Buse M. Staff Recruitment - A Qualitative Aspect of the Human Resources Management // Annals of the University of Petrosani, Economics, vol.9, no 3, pp. 107-114, Jan 2009.

18. Copes F. The Vue Handbook // CreateSpace Independent Publishing Platform, 121pp, Aug 2018.

19. Liang H., Zhu J.J.H. Big Data, Collection of (Social Media, Harvesting) // The International Encyclopedia of Communication Research Methods, pp. 1_18, Nov. 2017.

20. Morgan A. The Angular Tutorial: Learn Front-End Development and Automated Testing with Angular // CreateSpace Independent Publishing Platform, 533pp, Apr 2018.

21. Melanthiou Y. The Use of Social Network Sites as an E-Recruitment Tool // Journal of Transitional Management, pp. 31-46, Oct. 2014.

22. Nolasco F. Professional Front-end Architecture: Helping Front-End Development Reach Its Full Potential _ CreateSpace Independent Publishing Platform, 300pp, Aug 2018.

23. Rosenblatt F. Principles of Neurodynamics: Perceptrons and the Theory of Brain Mechanisms- New York: Spartan Books, 1962. - pp. 245-248.

24. Travers S.D. Selection of Surgical Residents: A Neural Network Approach // Cybernetics and Systems: An International Journal, vol. 13, pp. 421-429, Oct 2010.

25. Подбор персонала // Talantix. 2018. URL: https://talantix.ru/?utm_source=article&utm_medium=referral&utm_campaign=504207 (дата обращения: 07.12.2018).

26. Руководство по Angular 6 [Электронный ресурс]. URL: https://metanit.com/web/angular2/ (Дата обращения: 10.04.2019).

27. Руководство по ASP.Net Core 2 [Электронный ресурс]. URL: https://metanit.com/sharp/aspnet5/ (Дата обращения: 10.04.2019).

28. Руководство по TypeScript [Электронный ресурс]. URL: https://metanit.com/web/typescript/ (Дата обращения: 10.04.2019).

29. Справочник «Паттерны проектирования» [Электронный ресурс]. URL: http://design-pattern.ru/patterns/ (Дата обращения: 12.04.2019)

30. Учебник: введение в React [Электронный ресурс]. URL: https://learn-reactjs.ru/tutorial (Дата обращения: 14.04.2019).

31. 1С: Зарплата и управление персоналом 8 // 1С: Предприятие 8. 2018. URL: http://v8.1c.ru/hrm/kadrovyj_uchet (дата обращения: 07.12.2018).

32. Oracle Human Capital Management // Oracle. 2018. URL: https://www.oracle.com/ru/applications/human-capital-management/#close (дата обращения: 07.12.2018).

33. Accord .NET Framework [Электронный ресурс]. URL: http://accord-framework.net/ (Дата обращения: 30.04.2019)

34. Angular vs. React vs. Vue: Сравнение 2017 [Электронный ресурс]. URL: https://www.pvsm.ru/javascript/264031 (Дата обращения: 10.04.2019).

35. HeadHunter API: Документация и библиотеки [Электронный ресурс]. URL: https://dev.hh.ru/ (Дата обращения: 25.04.2019).

36. Reactive Extensions for JavaScript. Полное руководство [Электронный ресурс]. URL: https://habr.com/post/132463/ (Дата обращения: 11.04.2019).

37. ReactiveX. Documentations [Электронный ресурс]. URL: http://reactivex.io/documentation/subject.html (Дата обращения: 11.04.2019).

Приложение

Описания прецедентов

Название: Учет данных в системе.

Акторы: Администратор.

Краткое описание: Администратор выполняет учет данных в системе.

Триггер: Запущено приложение, открыт кабинет администратора.

Основной поток: табл. А.1.

Таблица A.1. Прецедент «Учет данных в системе»

Действие акторов

Отклик системы

1. Администратор выбирает сущность, для которой необходимо выполнить учет.

2. Система открывает страницу со списком видимых сущностей в системе (Е1).

3. Администратор выполняет выбранную операцию над сущностью.

4. Система проверяет доступ администратора к выполняемой операции (Е2).

5. Система выполняет операцию.

Альтернативные потоки:

Е1: Если администратор не имеет доступ к сущности, система выводит сообщение об этом. Переход к шагу 1.

Е2: Если администратор не имеет доступ к операции над выбранной сущностью, система выводит сообщение об этом. Переход к шагу 3.

Название: Импорт данных.

Акторы: Пользователь.

Краткое описание: Пользователь импортирует данные в систему.

Триггер: Приложение запущено.

Основной поток: табл. А.2.

Таблица A.2. Прецедент «Импорт данных»

Действие акторов

Отклик системы

1. Пользователь открывает страницу, на которой можно выполнить импорт данных.

2. Система открывает выбранную страницу (Е1).

3. Пользователь нажимает на кнопку загрузки.

4. Система открывает файловую систему пользователя.

5. Пользователь выбирает файл, подтверждает выбор.

6. Система проверяет формат выбранного файла (Е2).

7. Система загружает файл на сервер.

8. Система добавляет данные из файла (Е3).

Альтернативные потоки:

Е1: Если у пользователя нет доступа к операции загрузки, система отказывает к загрузке. Переход к шагу 1.

Е2: Если формат выбранного файла не соответствует требуемому, система выведет ошибку об этом. Переход к шагу 3.

Е3. Если данные в файле заполнены не корректно, система выводит сообщение об этом. Переход к шагу 3.

Название: Импорт резюме.

Акторы: Кандидат.

Краткое описание: Кандидат загружает резюме в систему.

Триггер: Открыта страница, на которой можно загрузить резюме.

Основной поток: табл. А.3.

Таблица A.3. Прецедент «Импорт резюме»

Действие акторов

Отклик системы

1. Кандидат нажимает на кнопку загрузки файла.

2. Система открывает файловую систему пользователя.

3. Кандидат выбирает файл, подтверждает выбор.

4. Система проверяет формат файла (Е1).

5. Система загружает файл на сервер.

6. Система генерирует резюме (Е2).

Альтернативные потоки:

Е1: Если формат выбранного файла не соответствует требуемому, система выведет ошибку об этом. Переход к шагу 1.

Е2. Если данные в файле заполнены не корректно, система выводит сообщение об этом. Переход к шагу 1.

Название: Импорт вакансии.

Акторы: Работодатель.

Краткое описание: Работодатель загружает вакансию в систему.

Триггер: Открыта страница, на которой можно загрузить вакансию.

Основной поток: табл. А.4.

Таблица A.4. Прецедент «Импорт вакансии»

Действие акторов

Отклик системы

1. Соискатель нажимает на кнопку загрузки файла.

2. Система открывает файловую систему пользователя.

3. Пользователь выбирает файл, подтверждает выбор.

4. Система проверяет формат файла (Е1).

5. Система загружает файл на сервер.

6. Система генерирует резюме (Е2).

Альтернативные потоки:

Е1: Если формат выбранного файла не соответствует требуемому, система выведет ошибку об этом. Переход к шагу 1.

Е2. Если данные в файле заполнены не корректно, система выводит сообщение об этом. Переход к шагу 1.

Название: Запуск сбора данных.

Акторы: Администратор.

Краткое описание: Администратор регистрируется в системе.

Триггер: Приложение запущено.

Основной поток: табл. А.5.

Таблица A.5. Прецедент «Запуск сбора данных»

Действие акторов

Отклик системы

1. Администратор переходит на страницу, с которой можно запустить сбор данных.

2. Система проверяет наличие сайтов, по которым будет выполняться сбор данных (Е1).

3. Система парсит сторонние сайты (Е2) (Е3).

4. Система проверяет существующие резюме пользователей в системе и заполненные в них данные (S1).

5. Система сохраняет собранные данные.

Подпотоки:

S1: Если в системе присутствуют резюме, к которым привязаны резюме, размещенные на сайтах-источниках данных, то система обновляет данные, а не добавляет новое резюме.

Альтернативные потоки:

Е1: Если сайтов нет в системе, то система выдает об этом информацию.

Е2: Если для системы не указаны все требуемые CSS-селекторы, то сайт в сборе данных не участвует.

Е3. Если система принимает не правильные данные, то данные в систему не поступают.

Название: Создание резюме.

Акторы: Кандидат.

Краткое описание: Кандидат создает резюме в системе.

Триггер: Запущено приложение, открыта страница, на которой можно создать резюме.

Основной поток: табл. А.6.

Таблица A.6. Прецедент «Создание резюме»

Действие акторов

Отклик системы

1. Кандидат нажимает на кнопку «Создать резюме».

2. Система открывает страницу «Создание резюме».

3. Кандидат указывает желаемую должность.

4. Кандидат указывает ожидаемую зарплату.

5. Кандидат заполняет данные об образовании, опыте работы, языках и умении водить транспортное средство.

6. Кандидат указывает навыки для резюме.

7. Кандидат нажимает на кнопку «Создать резюме».

8. Система добавляет новое резюме в базу данных (Е1).

Альтернативные потоки:

Е1: Если обязательные поля не заполнены или заполнены некорректно, система выводит сообщение «Данные заполнены некорректно» под полями, которые заполнены с ошибкой, переход к шагу 3.

Название: Экспорт резюме кандидата.

Акторы: Работодатель.

Краткое описание: Работодатель скачивает резюме пользователя из системы.

Триггер: Запущено приложение, открыта страница, с которой можно скачать резюме пользователя.

Основной поток: табл. А.7.

Таблица A.7. Прецедент «Экспорт резюме кандидата»

Действие акторов

Отклик системы

1. Работодатель нажимает на кнопку «Скачать резюме пользователя».

2. Система генерирует документ Word.

3. Система выводит сгенерированный документ в загрузки браузера.

Название: Отслеживание действий пользователей.

Акторы: Администратор.

Краткое описание: Администратор отслеживает действия пользователей в системе.

Триггер: Запущено приложение, открыт кабинет администратора.

Основной поток: табл. А.8.

Таблица A.8. Прецедент «Отслеживание действий пользователей»

Действие акторов

Отклик системы

1. Администратор переходит на страницу «Лог».

2. Система открывает страницу «Лог».

3. Администратор просматривает лог по пользователям.

4. Администратор фильтрует действия по конкретному пользователю, странице на которой пользователи работали, статусу выполнения операции и т.д.

5. Система фильтрует данные (Е1).

Альтернативные потоки:

Е1:Если по настроенным администраторам фильтрам нет результатов, система выводит сообщение «Нет данных».

Название: Формирование статистических отчетов.

Акторы: Администратор.

Краткое описание: Администратор генерирует статистический отчет о сущности. Триггер: Запущено приложение, открыт кабинет адмнистратора.

Основной поток: табл. А.9.

Таблица A.9. Прецедент «Формирование статистических отчетов»

Действие акторов

Отклик системы

1. Администратор выбирает сущность, по которой он хочет получить статистический отчет.

2. Администратор нажимает на кнопку «Сгенерировать отчет по сущности».

3. Система генерирует отчет по всем экземплярам выбранной сущности в системе.

4. Система выводит сгенерированный отчет в загрузки браузера.

5. Администратор переходит на страницу со списком сущностей.

6. Система переходит на страницу списка экземпляров выбранной сущности.

7. Администратор выбирает экземпляр сущности из списка предложенных.

8. Администратор нажимает на кнопку «Сгенировать статистический отчет по выбранной сущности».

9. Система генерирует статистический отчет по выбранной сущности.

Название: Экспорт результатов сопоставления.

Акторы: Работодатель.

Краткое описание: Работодатель скачивает отчет с результатами сопоставления.

Триггер: Запущено приложение, открыта страница с отчетами о сопоставлениях.

Основной поток: табл. А.10.

Таблица A.10. Прецедент «Экспорт результатов сопоставления»

Действие акторов

Отклик системы

1. Администратор выбирает отчет из списка.

2. Администратор нажимает на кнопку «Экспортировать результаты сопоставления».

3. Система генерирует Excel таблицы с данными о сопоставлении (Е1).

4. Система выводит сгенерированный документ в загрузки браузера.

Альтернативные потоки:

Е1: Если отчет еще не заполнен, система вернет сообщение об этом. Переход к шагу 1.

Название: Генерация вакансии.

Акторы: Пользователь.

Краткое описание: Пользователь экспортирует вакансию из системы.

Триггер: Запущено приложение, открыта страница, с которой можно скачать вакансию работодателя.

Основной поток: табл. А.11.

Таблица A.11. Прецедент «Генерация вакансии»

Действие акторов

Отклик системы

1. Пользователь выбирает вакансию из списка опубликованных.

2. Пользователь нажимает на кнопку «Скачать вакансию».

3. Система генерирует документ Word с вакансией.

4. Система выводит сгенерированный документ в загрузки браузера.

Название: Отслеживание уникальных резюме.

Акторы: Администратор.

Краткое описание: Администратор сравнивает собранные резюме в системе.

Триггер: Запущено приложение, открыта страница со списком резюме.

Основной поток: табл. А.12.

Таблица A.12. Прецедент «Отслеживание уникальных резюме»

Действие акторов

Отклик системы

1. Администратор просматривает резюме пользователей.

2. Администратор находит идентичные резюме.

3. Администратор выбирает резюме более поздней версии.

4. Администратор удаляет неактуальное резюме.

5. Система удаляет выбранное неактуальное резюме.

Название: Очистка неактуальных данных.

Акторы: Администратор.

Краткое описание: Администратор выполняет автоматическую очистку неактуальных данных в системе.

Триггер: Запущено приложение, открыт кабинет администратора.

Основной поток: табл. А.13.

Таблица A.13. Прецедент «Очистка неактуальных данных»

Действие акторов

Отклик системы

1. Администратор выбирает сущность, для которой нужно выполнить очистку неактуальных данных.

2. Администратор нажимает на кнопку «Очистить неактуальные данные».

3. Система проверяет актуальность каждого экземпляра выбранной сущности.

4. Система удаляет неактуальные сущности.

Название: Скачивание руководства пользователя.

Акторы: Пользователь.

Краткое описание: Пользователь скачивает руководство пользователя из системы.

Триггер: Запущено приложение, открыта страница «О приложении».

Основной поток: табл. А.14.

Таблица A.14. Прецедент «Скачивание руководства пользователя»

Действие акторов

Отклик системы

1. Пользователь нажимает на кнопку «Скачать руководство пользователя».

2. Система выводит документ «Руководство пользователя» в загрузки браузера.

Диаграммы

<...


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.