Выводы и предложения. Необходимо разработать конкретные предложения по усовершенствованию организации работы базы практики в рамках соответствующего профессионального модуля, что, по сути, становится итогом пройденной практики. При этом сравниваются результаты теоретического обучения с наблюдениями и выводами по работе в конкретной организации.
4. Приложения
Документальное подтверждение отдельных разделов, положений отчета (заполненные формы отчетности, документы, схемы, графики и прочее).
5. Литература
Законодательная база, №№ инструкций, приказов, распоряжений, учебные пособия, учебники и другая литература.
В ходе прохождения производственной практики по профессиональному модулю ПМ.02 «Ревьюирование программных модулей» на базе ГБУ г. Москвы «ОКЦ СВАО» было выполнено индивидуальное задание и достигнуты поставленные цели. В процессе работы:
выполнен анализ деятельности учреждения и особенностей его документооборота;
изучено ИТ-обеспечение организации и уровень технического оснащения рабочих мест сотрудников;
выполнен анализ предметной области и определены ключевые требования к программному модулю учёта документов;
обоснованы выбор технологий и средств разработки (C#, WPF, SQLite, Microsoft Visual Studio 2022) для создания прикладного программного решения;
разработан программный модуль учёта документов, реализующий ввод, сохранение, поиск и отображение данных, а также работу со справочником типов документов;
выполнено обратное проектирование основных алгоритмов и подготовлены блок-схемы процессов обработки данных;
проведено ревьюирование программного кода с точки зрения корректности логики, структурированности, читаемости и возможности дальнейшего сопровождения;
использованы инструментальные средства отладки Visual Studio (точки останова, пошаговое выполнение, окна контроля переменных и исключений) для проверки корректности работы приложения;
проведено тестирование программного модуля по сценариям, включая проверку добавления документов, поиска, обработки некорректного ввода и работы справочника типов;
по результатам проверки подтверждена работоспособность приложения и соответствие базовым требованиям к настольным информационным системам административного назначения.
Разработанный программный модуль может быть использован в качестве элемента информационного обеспечения документооборота и учёта в ГБУ г. Москвы «ОКЦ СВАО». В качестве рекомендации предлагается рассмотреть возможность внедрения приложения в практическую деятельность учреждения для повышения оперативности обработки документов, повышения качества контроля данных и снижения вероятности ошибок при ручном ведении учёта.
Список используемых источников
Основная литература:
Троелсен, Э. Pro C# 10 with .NET 6: Modern Cross-Platform Development. — 11th ed. — Berkeley : Apress, 2022. — 1440 p. — ISBN 978-1-4842-7871-3.
Мак-Дональд, М. WPF: Профессиональное программирование на C# (Windows Presentation Foundation). — Москва : Вильямс, 2019. — 1024 с. — ISBN 978-5-8459-2029-7.
Microsoft. Windows Presentation Foundation (WPF) documentation. — Текст : электронный. — URL: https://learn.microsoft.com/dotnet/desktop/wpf/
Microsoft. Visual Studio documentation (Debugging and diagnostics). — Текст : электронный. — URL: https://learn.microsoft.com/visualstudio/debugger/
SQLite Consortium. SQLite Documentation. — Текст : электронный. — URL: https://www.sqlite.org/docs.html
Дополнительная литература:
Haack, J. SQLite for .NET Developers: Build Highly Responsive Data-Driven Apps. — Birmingham : Packt Publishing, 2020. — 292 p. — ISBN 978-1-83898-989-9.
Fowler, M. Refactoring: Improving the Design of Existing Code. — 2nd ed. — Boston : Addison-Wesley, 2018. — 448 p. — ISBN 978-0-13-475759-9.
Документация организации: сведения о ГБУ г. Москвы «ОКЦ СВАО» (ИНН 7715628325) из открытых источников (карточка организации). — Текст : электронный // Rusprofile.ru.
Программный код приложения
using Microsoft.Data.Sqlite;
using OKC.DocFlow.App.Models;
namespace OKC.DocFlow.App.Db;
public sealed class Database
{
private readonly string _dbPath;
public Database(string dbPath)
{
_dbPath = dbPath;
}
private SqliteConnection Open()
{
var cs = new SqliteConnectionStringBuilder
{
DataSource = _dbPath,
Mode = SqliteOpenMode.ReadWriteCreate
}.ToString();
var conn = new SqliteConnection(cs);
conn.Open();
return conn;
}
public void EnsureCreated()
{
using var conn = Open();
using var cmd = conn.CreateCommand();
cmd.CommandText = @"
PRAGMA foreign_keys = ON;
CREATE TABLE IF NOT EXISTS DocTypes(
Id INTEGER PRIMARY KEY AUTOINCREMENT,
Name TEXT NOT NULL UNIQUE
);
CREATE TABLE IF NOT EXISTS Documents(
Id INTEGER PRIMARY KEY AUTOINCREMENT,
RegNumber TEXT NOT NULL,
Title TEXT NOT NULL,
Correspondent TEXT NOT NULL,
DocDate TEXT NOT NULL,
DocTypeId INTEGER NOT NULL,
Notes TEXT,
FOREIGN KEY(DocTypeId) REFERENCES DocTypes(Id) ON DELETE RESTRICT
);
";
cmd.ExecuteNonQuery();
// Seed минимум для удобства (если пусто)
using var seed = conn.CreateCommand();
seed.CommandText = "SELECT COUNT(*) FROM DocTypes;";
var count = Convert.ToInt64(seed.ExecuteScalar() ?? 0);
if (count == 0)
{
using var ins = conn.CreateCommand();
ins.CommandText = @"
INSERT INTO DocTypes(Name) VALUES
('Входящий'),
('Исходящий'),
('Внутренний'),
('Приказ'),
('Договор');
";
ins.ExecuteNonQuery();
}
}
public List<DocTypeModel> GetDocTypes()
{
using var conn = Open();
using var cmd = conn.CreateCommand();
cmd.CommandText = "SELECT Id, Name FROM DocTypes ORDER BY Name;";
using var reader = cmd.ExecuteReader();
var list = new List<DocTypeModel>();
while (reader.Read())
{
list.Add(new DocTypeModel
{
Id = reader.GetInt64(0),
Name = reader.GetString(1)
});
}
return list;
}
public long AddDocType(string name)
{
using var conn = Open();
using var cmd = conn.CreateCommand();
cmd.CommandText = "INSERT INTO DocTypes(Name) VALUES ($name); SELECT last_insert_rowid();";
cmd.Parameters.AddWithValue("$name", name.Trim());
return Convert.ToInt64(cmd.ExecuteScalar() ?? 0);
}
public void UpdateDocType(long id, string name)
{
using var conn = Open();
using var cmd = conn.CreateCommand();
cmd.CommandText = "UPDATE DocTypes SET Name=$name WHERE Id=$id;";
cmd.Parameters.AddWithValue("$name", name.Trim());
cmd.Parameters.AddWithValue("$id", id);
cmd.ExecuteNonQuery();
}
public void DeleteDocType(long id)
{
using var conn = Open();
using var cmd = conn.CreateCommand();
cmd.CommandText = "DELETE FROM DocTypes WHERE Id=$id;";
cmd.Parameters.AddWithValue("$id", id);
cmd.ExecuteNonQuery();
}
public List<DocumentModel> GetDocuments(string? search = null)
{
using var conn = Open();
using var cmd = conn.CreateCommand();
cmd.CommandText = @"
SELECT d.Id, d.RegNumber, d.Title, d.Correspondent, d.DocDate, d.DocTypeId, t.Name, IFNULL(d.Notes,'')
FROM Documents d
JOIN DocTypes t ON t.Id = d.DocTypeId
WHERE ($q IS NULL OR $q = '' OR
d.RegNumber LIKE '%' || $q || '%' OR
d.Title LIKE '%' || $q || '%' OR
d.Correspondent LIKE '%' || $q || '%')
ORDER BY d.DocDate DESC, d.Id DESC;
";
cmd.Parameters.AddWithValue("$q", search ?? "");
using var reader = cmd.ExecuteReader();
var list = new List<DocumentModel>();
while (reader.Read())
{
list.Add(new DocumentModel
{
Id = reader.GetInt64(0),
RegNumber = reader.GetString(1),
Title = reader.GetString(2),
Correspondent = reader.GetString(3),
DocDate = DateTime.Parse(reader.GetString(4)),
DocTypeId = reader.GetInt64(5),
DocTypeName = reader.GetString(6),
Notes = reader.GetString(7)
});
}
return list;
}
public long AddDocument(DocumentModel doc)
{
using var conn = Open();
using var cmd = conn.CreateCommand();
cmd.CommandText = @"
INSERT INTO Documents(RegNumber, Title, Correspondent, DocDate, DocTypeId, Notes)
VALUES ($reg, $title, $corr, $date, $typeId, $notes);
SELECT last_insert_rowid();
";
cmd.Parameters.AddWithValue("$reg", doc.RegNumber.Trim());
cmd.Parameters.AddWithValue("$title", doc.Title.Trim());
cmd.Parameters.AddWithValue("$corr", doc.Correspondent.Trim());
cmd.Parameters.AddWithValue("$date", doc.DocDate.ToString("yyyy-MM-dd"));
cmd.Parameters.AddWithValue("$typeId", doc.DocTypeId);
cmd.Parameters.AddWithValue("$notes", (doc.Notes ?? "").Trim());
return Convert.ToInt64(cmd.ExecuteScalar() ?? 0);
}
public void UpdateDocument(DocumentModel doc)
{
using var conn = Open();
using var cmd = conn.CreateCommand();
cmd.CommandText = @"
UPDATE Documents
SET RegNumber=$reg,
Title=$title,
Correspondent=$corr,
DocDate=$date,
DocTypeId=$typeId,
Notes=$notes
WHERE Id=$id;
";
cmd.Parameters.AddWithValue("$reg", doc.RegNumber.Trim());
cmd.Parameters.AddWithValue("$title", doc.Title.Trim());
cmd.Parameters.AddWithValue("$corr", doc.Correspondent.Trim());
cmd.Parameters.AddWithValue("$date", doc.DocDate.ToString("yyyy-MM-dd"));
cmd.Parameters.AddWithValue("$typeId", doc.DocTypeId);
cmd.Parameters.AddWithValue("$notes", (doc.Notes ?? "").Trim());
cmd.Parameters.AddWithValue("$id", doc.Id);
cmd.ExecuteNonQuery();
}
public void DeleteDocument(long id)
{
using var conn = Open();
using var cmd = conn.CreateCommand();
cmd.CommandText = "DELETE FROM Documents WHERE Id=$id;";
cmd.Parameters.AddWithValue("$id", id);
cmd.ExecuteNonQuery();
}
}
public class DocTypeModel
{
public long Id { get; set; }
public string Name { get; set; } = "";
public override string ToString() => Name;
}
public class DocumentModel
{
public long Id { get; set; }
public string RegNumber { get; set; } = "";
public string Title { get; set; } = "";
public string Correspondent { get; set; } = "";
public DateTime DocDate { get; set; } = DateTime.Today;
public long DocTypeId { get; set; }
public string DocTypeName { get; set; } = "";
public string Notes { get; set; } = "";
}
public static class Guard
{
public static bool IsBlank(string? s) => string.IsNullOrWhiteSpace(s);
}