Исправление кодировки: восстановлена кириллица в комментариях и документации (UTF-8)
This commit is contained in:
parent
939d44063e
commit
df3f9f2741
|
|
@ -1,29 +1,29 @@
|
|||
# Слой `chk` — функции
|
||||
# Слой `chk` — функции
|
||||
|
||||
## СпиÑок функций
|
||||
## Список функций
|
||||
|
||||
| СущноÑть | Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ | Ð¡Ñ‚Ð°Ñ‚ÑƒÑ | Параметры | Возвращает | Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ | Репозиторий | Комментарий |
|
||||
| Сущность | Функция | Статус | Параметры | Возвращает | Функция | Репозиторий | Комментарий |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| chk_type | chk_type_select | DEV | — | TABLE — Ñтроки Ñправочника | CODE | REQ | код: `functions/chk_type_select.sql`; теÑты: `tests/test_chk_type_select.psql`; репозиторий: `MT.Checks/Repository/ChkTypeRepository.cs` |
|
||||
| chk_status | chk_status_select | DEV | — | TABLE — Ñтроки Ñправочника | CODE | REQ | код: `functions/chk_status_select.sql`; теÑты: `tests/test_chk_status_select.psql`; репозиторий: `MT.Checks/Repository/ChkStatusRepository.cs` |
|
||||
| chk_check | chk_check_insert | DEV | p_check_date, p_chk_type_id, p_chk_status_id, p_smev_message_id, p_rr_organization_id, p_params (JSON), p_parent_check_id | int — id проверки | CODE | REQ | код: `functions/chk_check_insert.sql`; теÑты: `tests/test_chk_check_insert.psql`; репозиторий: `MT.Checks/Repository/ChkCheckRepository.cs` |
|
||||
| chk_check | chk_check_update | DEV | p_id + вÑе Ð¿Ð¾Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи | int — чиÑло Ñтрок (db-m-3) | CODE | REQ | Ð¿Ð¾Ð»Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ объекта (db-m-8); код: `functions/chk_check_update.sql`; теÑты: `tests/test_chk_check_update.psql` |
|
||||
| chk_check | chk_check_delete | DEV | p_id | int — чиÑло Ñтрок | CODE | REQ | код: `functions/chk_check_delete.sql`; теÑты: `tests/test_chk_check_delete.psql` |
|
||||
| chk_check | chk_check_select | DEV | p_check_date, p_chk_type_id, p_chk_status_id, p_rr_organization_id | TABLE — Ñтроки chk_check | CODE | REQ | NULL параметра = фильтр не применÑетÑÑ; код: `functions/chk_check_select.sql`; теÑты: `tests/test_chk_check_select.psql` |
|
||||
| chk_check | chk_check_get | DEV | p_id | TABLE — Ñтрока chk_check | CODE | REQ | код: `functions/chk_check_get.sql`; теÑты: `tests/test_chk_check_get.psql` |
|
||||
| chk_type | chk_type_select | DEV | — | TABLE — строки справочника | CODE | REQ | код: `functions/chk_type_select.sql`; тесты: `tests/test_chk_type_select.psql`; репозиторий: `MT.Checks/Repository/ChkTypeRepository.cs` |
|
||||
| chk_status | chk_status_select | DEV | — | TABLE — строки справочника | CODE | REQ | код: `functions/chk_status_select.sql`; тесты: `tests/test_chk_status_select.psql`; репозиторий: `MT.Checks/Repository/ChkStatusRepository.cs` |
|
||||
| chk_check | chk_check_insert | DEV | p_check_date, p_chk_type_id, p_chk_status_id, p_smev_message_id, p_rr_organization_id, p_params (JSON), p_parent_check_id | int — id проверки | CODE | REQ | код: `functions/chk_check_insert.sql`; тесты: `tests/test_chk_check_insert.psql`; репозиторий: `MT.Checks/Repository/ChkCheckRepository.cs` |
|
||||
| chk_check | chk_check_update | DEV | p_id + все поля записи | int — число строк (db-m-3) | CODE | REQ | полная запись объекта (db-m-8); код: `functions/chk_check_update.sql`; тесты: `tests/test_chk_check_update.psql` |
|
||||
| chk_check | chk_check_delete | DEV | p_id | int — число строк | CODE | REQ | код: `functions/chk_check_delete.sql`; тесты: `tests/test_chk_check_delete.psql` |
|
||||
| chk_check | chk_check_select | DEV | p_check_date, p_chk_type_id, p_chk_status_id, p_rr_organization_id | TABLE — строки chk_check | CODE | REQ | NULL параметра = фильтр не применяется; код: `functions/chk_check_select.sql`; тесты: `tests/test_chk_check_select.psql` |
|
||||
| chk_check | chk_check_get | DEV | p_id | TABLE — строка chk_check | CODE | REQ | код: `functions/chk_check_get.sql`; тесты: `tests/test_chk_check_get.psql` |
|
||||
|
||||
Спецификации функций и теÑÑ‚-планы: `func_specs/{функциÑ}.md` (d-db-9). Код функций:
|
||||
`functions/{ÑущноÑть}_{дейÑтвие}.sql` (db-func-4, раÑширение `.sql` — Ñоглашение
|
||||
репозиториÑ). psql-теÑты: `tests/test_{ÑущноÑть}_{дейÑтвие}.psql` (db-tst),
|
||||
Ð½ÑƒÐ¼ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€Ð¾Ðº = Ñтрокам таблиц «ТеÑты» Ñпецификаций. Выполнение теÑтов —
|
||||
на теÑтовой базе (db-tst-4): `psql -d <база> -f tests/test_*.psql`.
|
||||
Спецификации функций и тест-планы: `func_specs/{функция}.md` (d-db-9). Код функций:
|
||||
`functions/{сущность}_{действие}.sql` (db-func-4, расширение `.sql` — соглашение
|
||||
репозитория). psql-тесты: `tests/test_{сущность}_{действие}.psql` (db-tst),
|
||||
нумерация проверок = строкам таблиц «Тесты» спецификаций. Выполнение тестов —
|
||||
на тестовой базе (db-tst-4): `psql -d <база> -f tests/test_*.psql`.
|
||||
|
||||
СтатуÑÑ‹ (d-dev-1, d-dev-2, d-dev-5): `СтатуÑ` = `DEV` (Ñ€ÐµÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð°Ñ‡Ð°Ñ‚Ð°);
|
||||
колонка «ФункциÑ» = `CODE` (код и теÑты напиÑаны; `DONE` — поÑле утверждениÑ
|
||||
пользователем); «Репозиторий» = `REQ`.
|
||||
Статусы (d-dev-1, d-dev-2, d-dev-5): `Статус` = `DEV` (реализация начата);
|
||||
колонка «Функция» = `CODE` (код и тесты написаны; `DONE` — после утверждения
|
||||
пользователем); «Репозиторий» = `REQ`.
|
||||
|
||||
Примечание к колонке «Репозиторий» (2026-09-08, решение пользователÑ):
|
||||
unit-теÑты репозиториев не ÑоздаютÑÑ Ð²Ð¾Ð²Ñе; Ñпецификации теÑтов Ñохранены как
|
||||
Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð¾Ð¶Ð¸Ð´Ð°ÐµÐ¼Ð¾Ð³Ð¾ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ â€” `1-docs/2-core/chk/repository_tests/`.
|
||||
Код репозиториев напиÑан (проект `MT.Checks`); ÑÑ‚Ð°Ñ‚ÑƒÑ `CODE` по d-dev-3
|
||||
неприменим, Ñ‚.к. требует Ð½Ð°Ð»Ð¸Ñ‡Ð¸Ñ Ñ‚ÐµÑтов.
|
||||
Примечание к колонке «Репозиторий» (2026-09-08, решение пользователя):
|
||||
unit-тесты репозиториев не создаются вовсе; спецификации тестов сохранены как
|
||||
документация ожидаемого поведения — `1-docs/2-core/chk/repository_tests/`.
|
||||
Код репозиториев написан (проект `MT.Checks`); статус `CODE` по d-dev-3
|
||||
неприменим, т.к. требует наличия тестов.
|
||||
|
|
|
|||
|
|
@ -1,38 +1,38 @@
|
|||
namespace MT.Checks.Domain;
|
||||
namespace MT.Checks.Domain;
|
||||
|
||||
/// <summary>
|
||||
/// Проверка организаций (chk.chk_check). Колонка params хранитÑÑ Ð² jsonb,
|
||||
/// в домене передаётÑÑ Ñтрокой JSON.
|
||||
/// Проверка организаций (chk.chk_check). Колонка params хранится в jsonb,
|
||||
/// в домене передаётся строкой JSON.
|
||||
/// </summary>
|
||||
public class ChkCheck
|
||||
{
|
||||
/// <summary>Идентификатор проверки.</summary>
|
||||
/// <summary>Идентификатор проверки.</summary>
|
||||
public int Id { get; set; }
|
||||
|
||||
/// <summary>День (дата) проверки.</summary>
|
||||
/// <summary>День (дата) проверки.</summary>
|
||||
public DateTime CheckDate { get; set; }
|
||||
|
||||
/// <summary>Тип проверки — ключ chk.chk_type.</summary>
|
||||
/// <summary>Тип проверки — ключ chk.chk_type.</summary>
|
||||
public int TypeId { get; set; }
|
||||
|
||||
/// <summary>Объект Ñправочника типов; заполнÑетÑÑ Ð¿Ñ€Ð¸ÐºÐ»Ð°Ð´Ð½Ñ‹Ð¼ кодом при необходимоÑти.</summary>
|
||||
/// <summary>Объект справочника типов; заполняется прикладным кодом при необходимости.</summary>
|
||||
public ChkType? Type { get; set; }
|
||||
|
||||
/// <summary>Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ — ключ chk.chk_status.</summary>
|
||||
/// <summary>Статус проверки — ключ chk.chk_status.</summary>
|
||||
public int StatusId { get; set; }
|
||||
|
||||
/// <summary>Объект Ñправочника ÑтатуÑов; заполнÑетÑÑ Ð¿Ñ€Ð¸ÐºÐ»Ð°Ð´Ð½Ñ‹Ð¼ кодом при необходимоÑти.</summary>
|
||||
/// <summary>Объект справочника статусов; заполняется прикладным кодом при необходимости.</summary>
|
||||
public ChkStatus? Status { get; set; }
|
||||
|
||||
/// <summary>Идентификатор ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¡ÐœÐÐ’.</summary>
|
||||
/// <summary>Идентификатор сообщения СМЭВ.</summary>
|
||||
public string SmevMessageId { get; set; } = "";
|
||||
|
||||
/// <summary>Идентификатор организации РР.</summary>
|
||||
/// <summary>Идентификатор организации РР.</summary>
|
||||
public string RrOrganizationId { get; set; } = "";
|
||||
|
||||
/// <summary>Параметры проверки — JSON (результаты проверок, ÑоÑтав не фикÑирован).</summary>
|
||||
/// <summary>Параметры проверки — JSON (результаты проверок, состав не фиксирован).</summary>
|
||||
public string Params { get; set; } = "";
|
||||
|
||||
/// <summary>РодительÑÐºÐ°Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ°; null — ÐºÐ¾Ñ€Ð½ÐµÐ²Ð°Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ°.</summary>
|
||||
/// <summary>Родительская проверка; null — корневая проверка.</summary>
|
||||
public int? ParentCheckId { get; set; }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,31 +1,31 @@
|
|||
namespace MT.Checks.Domain;
|
||||
namespace MT.Checks.Domain;
|
||||
|
||||
/// <summary>
|
||||
/// Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ (Ñправочник chk.chk_status, фикÑированные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ â€” Ñм. init.sql).
|
||||
/// Статус проверки (справочник chk.chk_status, фиксированные значения — см. init.sql).
|
||||
/// </summary>
|
||||
public class ChkStatus
|
||||
{
|
||||
/// <summary>Идентификатор ÑтатуÑа.</summary>
|
||||
/// <summary>Идентификатор статуса.</summary>
|
||||
public int Id { get; set; }
|
||||
|
||||
/// <summary>Ðаименование ÑтатуÑа проверки.</summary>
|
||||
/// <summary>Наименование статуса проверки.</summary>
|
||||
public string Name { get; set; } = "";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Коды ÑтатуÑов проверок (chk.chk_status); Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ â€” DB/chk/init/init.sql.
|
||||
/// Коды статусов проверок (chk.chk_status); значения — DB/chk/init/init.sql.
|
||||
/// </summary>
|
||||
public static class ChkStatuses
|
||||
{
|
||||
/// <summary>Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½.</summary>
|
||||
/// <summary>Запрос отправлен.</summary>
|
||||
public const int RequestSent = 1;
|
||||
|
||||
/// <summary>Ответ получен.</summary>
|
||||
/// <summary>Ответ получен.</summary>
|
||||
public const int ResponseReceived = 2;
|
||||
|
||||
/// <summary>Ответ уÑпешно обработан.</summary>
|
||||
/// <summary>Ответ успешно обработан.</summary>
|
||||
public const int ResponseProcessed = 3;
|
||||
|
||||
/// <summary>Ошибка при обработке.</summary>
|
||||
/// <summary>Ошибка при обработке.</summary>
|
||||
public const int ProcessingError = 4;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,37 +1,37 @@
|
|||
namespace MT.Checks.Domain;
|
||||
namespace MT.Checks.Domain;
|
||||
|
||||
/// <summary>
|
||||
/// Тип проверки (Ñправочник chk.chk_type, фикÑированные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ â€” Ñм. init.sql).
|
||||
/// Тип проверки (справочник chk.chk_type, фиксированные значения — см. init.sql).
|
||||
/// </summary>
|
||||
public class ChkType
|
||||
{
|
||||
/// <summary>Идентификатор типа.</summary>
|
||||
/// <summary>Идентификатор типа.</summary>
|
||||
public int Id { get; set; }
|
||||
|
||||
/// <summary>Ðаименование типа проверки.</summary>
|
||||
/// <summary>Наименование типа проверки.</summary>
|
||||
public string Name { get; set; } = "";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Коды типов проверок (chk.chk_type); Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ â€” DB/chk/init/init.sql.
|
||||
/// Коды типов проверок (chk.chk_type); значения — DB/chk/init/init.sql.
|
||||
/// </summary>
|
||||
public static class ChkTypes
|
||||
{
|
||||
/// <summary>Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ (дельты) ЕГРЮЛ.</summary>
|
||||
/// <summary>Запрос изменений (дельты) ЕГРЮЛ.</summary>
|
||||
public const int EgrulDelta = 1;
|
||||
|
||||
/// <summary>Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ (дельты) ЕГРИП.</summary>
|
||||
/// <summary>Запрос изменений (дельты) ЕГРИП.</summary>
|
||||
public const int EgripDelta = 2;
|
||||
|
||||
/// <summary>Отправка запроÑа в ЕГРЮЛ.</summary>
|
||||
/// <summary>Отправка запроса в ЕГРЮЛ.</summary>
|
||||
public const int EgrulRequest = 3;
|
||||
|
||||
/// <summary>Отправка запроÑа в ЕГРИП.</summary>
|
||||
/// <summary>Отправка запроса в ЕГРИП.</summary>
|
||||
public const int EgripRequest = 4;
|
||||
|
||||
/// <summary>ÐÐºÑ‚ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¾Ñ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ð¸ ОТ.</summary>
|
||||
/// <summary>Актуализация организации ОТ.</summary>
|
||||
public const int OtActualization = 5;
|
||||
|
||||
/// <summary>ÐÐºÑ‚ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¾Ñ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ð¸ СОУТ.</summary>
|
||||
/// <summary>Актуализация организации СОУТ.</summary>
|
||||
public const int SoutActualization = 6;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,50 +1,50 @@
|
|||
namespace MT.Checks.Repository
|
||||
namespace MT.Checks.Repository
|
||||
{
|
||||
using Kit.Helpers.SqlHelperAbstract;
|
||||
using MT.Checks.Domain;
|
||||
using MT.Checks.Repository.Filter;
|
||||
|
||||
/// <summary>
|
||||
/// Репозиторий проверок организаций: чтение и запиÑÑŒ через хранимые функции Ñхемы chk.
|
||||
/// Транзакцию из неÑкольких вызовов Ñобирает вызывающий код.
|
||||
/// Репозиторий проверок организаций: чтение и запись через хранимые функции схемы chk.
|
||||
/// Транзакцию из нескольких вызовов собирает вызывающий код.
|
||||
/// </summary>
|
||||
public interface IChkCheckRepository
|
||||
{
|
||||
/// <summary>Создаёт проверку (chk.chk_check_insert); возвращает id новой запиÑи.</summary>
|
||||
/// <summary>Создаёт проверку (chk.chk_check_insert); возвращает id новой записи.</summary>
|
||||
int Insert(ChkCheck item);
|
||||
|
||||
/// <summary>ЗапиÑывает проверку целиком по Id (chk.chk_check_update);
|
||||
/// возвращает чиÑло запиÑанных Ñтрок. ИзменÑемый объект читаетÑÑ Ð·Ð°Ñ€Ð°Ð½ÐµÐµ
|
||||
/// методом Get (read-modify-write).</summary>
|
||||
/// <summary>Записывает проверку целиком по Id (chk.chk_check_update);
|
||||
/// возвращает число записанных строк. Изменяемый объект читается заранее
|
||||
/// методом Get (read-modify-write).</summary>
|
||||
int Update(ChkCheck item);
|
||||
|
||||
/// <summary>УдалÑет проверку по Id (chk.chk_check_delete);
|
||||
/// возвращает чиÑло удалённых Ñтрок.</summary>
|
||||
/// <summary>Удаляет проверку по Id (chk.chk_check_delete);
|
||||
/// возвращает число удалённых строк.</summary>
|
||||
int Delete(int id);
|
||||
|
||||
/// <summary>Выбирает проверки по уÑловиÑм фильтра (chk.chk_check_select);
|
||||
/// null ÑвойÑтва фильтра = уÑловие не применÑетÑÑ.</summary>
|
||||
/// <summary>Выбирает проверки по условиям фильтра (chk.chk_check_select);
|
||||
/// null свойства фильтра = условие не применяется.</summary>
|
||||
IList<ChkCheck> Select(ChkCheckFilter filter);
|
||||
|
||||
/// <summary>Возвращает проверку по Id (chk.chk_check_get); null — запиÑÑŒ не найдена.</summary>
|
||||
/// <summary>Возвращает проверку по Id (chk.chk_check_get); null — запись не найдена.</summary>
|
||||
ChkCheck? Get(int id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// РеализациÑ: каждый метод вызывает ровно одну хранимую функцию; имена
|
||||
/// параметров вызова Ñовпадают Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸ параметров функции (p_*).
|
||||
/// Реализация: каждый метод вызывает ровно одну хранимую функцию; имена
|
||||
/// параметров вызова совпадают с именами параметров функции (p_*).
|
||||
/// </summary>
|
||||
public class ChkCheckRepository : IChkCheckRepository
|
||||
{
|
||||
private readonly IConnectionString _connectionString;
|
||||
|
||||
/// <summary>Подключение передаётÑÑ Ñнаружи и не открываетÑÑ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸ÐµÐ¼.</summary>
|
||||
/// <summary>Подключение передаётся снаружи и не открывается репозиторием.</summary>
|
||||
public ChkCheckRepository(IConnectionString connectionString)
|
||||
{
|
||||
_connectionString = connectionString;
|
||||
}
|
||||
|
||||
/// <summary>Создаёт проверку (chk.chk_check_insert); возвращает id новой запиÑи.</summary>
|
||||
/// <summary>Создаёт проверку (chk.chk_check_insert); возвращает id новой записи.</summary>
|
||||
public int Insert(ChkCheck item)
|
||||
{
|
||||
return _connectionString.PrepareExecute<int>("chk.chk_check_insert")
|
||||
|
|
@ -59,14 +59,14 @@
|
|||
.ExecuteScalar();
|
||||
}
|
||||
|
||||
/// <summary>ЗапиÑывает проверку целиком по Id (chk.chk_check_update);
|
||||
/// возвращает чиÑло запиÑанных Ñтрок. ИзменÑемый объект читаетÑÑ Ð·Ð°Ñ€Ð°Ð½ÐµÐµ
|
||||
/// методом Get (read-modify-write).</summary>
|
||||
/// <summary>Записывает проверку целиком по Id (chk.chk_check_update);
|
||||
/// возвращает число записанных строк. Изменяемый объект читается заранее
|
||||
/// методом Get (read-modify-write).</summary>
|
||||
public int Update(ChkCheck item)
|
||||
{
|
||||
if (item.Id == 0)
|
||||
{
|
||||
throw new ArgumentException("ChkCheckRepository.Update: не задан идентификатор запиÑи (Id = 0)");
|
||||
throw new ArgumentException("ChkCheckRepository.Update: не задан идентификатор записи (Id = 0)");
|
||||
}
|
||||
|
||||
return _connectionString.PrepareExecute<int>("chk.chk_check_update")
|
||||
|
|
@ -82,13 +82,13 @@
|
|||
.ExecuteScalar();
|
||||
}
|
||||
|
||||
/// <summary>УдалÑет проверку по Id (chk.chk_check_delete);
|
||||
/// возвращает чиÑло удалённых Ñтрок.</summary>
|
||||
/// <summary>Удаляет проверку по Id (chk.chk_check_delete);
|
||||
/// возвращает число удалённых строк.</summary>
|
||||
public int Delete(int id)
|
||||
{
|
||||
if (id == 0)
|
||||
{
|
||||
throw new ArgumentException("ChkCheckRepository.Delete: не задан идентификатор запиÑи (id = 0)");
|
||||
throw new ArgumentException("ChkCheckRepository.Delete: не задан идентификатор записи (id = 0)");
|
||||
}
|
||||
|
||||
return _connectionString.PrepareExecute<int>("chk.chk_check_delete")
|
||||
|
|
@ -97,8 +97,8 @@
|
|||
.ExecuteScalar();
|
||||
}
|
||||
|
||||
/// <summary>Выбирает проверки по уÑловиÑм фильтра (chk.chk_check_select);
|
||||
/// null ÑвойÑтва фильтра = уÑловие не применÑетÑÑ.</summary>
|
||||
/// <summary>Выбирает проверки по условиям фильтра (chk.chk_check_select);
|
||||
/// null свойства фильтра = условие не применяется.</summary>
|
||||
public IList<ChkCheck> Select(ChkCheckFilter filter)
|
||||
{
|
||||
filter ??= new ChkCheckFilter();
|
||||
|
|
@ -128,12 +128,12 @@
|
|||
.ToList();
|
||||
}
|
||||
|
||||
/// <summary>Возвращает проверку по Id (chk.chk_check_get); null — запиÑÑŒ не найдена.</summary>
|
||||
/// <summary>Возвращает проверку по Id (chk.chk_check_get); null — запись не найдена.</summary>
|
||||
public ChkCheck? Get(int id)
|
||||
{
|
||||
if (id == 0)
|
||||
{
|
||||
throw new ArgumentException("ChkCheckRepository.Get: не задан идентификатор запиÑи (id = 0)");
|
||||
throw new ArgumentException("ChkCheckRepository.Get: не задан идентификатор записи (id = 0)");
|
||||
}
|
||||
|
||||
IList<ChkCheck> result = _connectionString.PrepareExecute<ChkCheck>("chk.chk_check_get")
|
||||
|
|
|
|||
|
|
@ -1,27 +1,27 @@
|
|||
namespace MT.Checks.Repository
|
||||
namespace MT.Checks.Repository
|
||||
{
|
||||
using Kit.Helpers.SqlHelperAbstract;
|
||||
using MT.Checks.Domain;
|
||||
|
||||
/// <summary>Репозиторий Ñправочника ÑтатуÑов проверок (только чтение).</summary>
|
||||
/// <summary>Репозиторий справочника статусов проверок (только чтение).</summary>
|
||||
public interface IChkStatusRepository
|
||||
{
|
||||
/// <summary>Возвращает вÑе Ñтроки Ñправочника (chk.chk_status_select).</summary>
|
||||
/// <summary>Возвращает все строки справочника (chk.chk_status_select).</summary>
|
||||
IList<ChkStatus> Select();
|
||||
}
|
||||
|
||||
/// <summary>РеализациÑ: ÐºÐ°Ð¶Ð´Ð°Ñ Ð²Ñ‹Ð±Ð¾Ñ€ÐºÐ° — вызов chk.chk_status_select.</summary>
|
||||
/// <summary>Реализация: каждая выборка — вызов chk.chk_status_select.</summary>
|
||||
public class ChkStatusRepository : IChkStatusRepository
|
||||
{
|
||||
private readonly IConnectionString _connectionString;
|
||||
|
||||
/// <summary>Подключение передаётÑÑ Ñнаружи и не открываетÑÑ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸ÐµÐ¼.</summary>
|
||||
/// <summary>Подключение передаётся снаружи и не открывается репозиторием.</summary>
|
||||
public ChkStatusRepository(IConnectionString connectionString)
|
||||
{
|
||||
_connectionString = connectionString;
|
||||
}
|
||||
|
||||
/// <summary>Возвращает вÑе Ñтроки Ñправочника (chk.chk_status_select).</summary>
|
||||
/// <summary>Возвращает все строки справочника (chk.chk_status_select).</summary>
|
||||
public IList<ChkStatus> Select()
|
||||
{
|
||||
return _connectionString.PrepareExecute<ChkStatus>("chk.chk_status_select")
|
||||
|
|
|
|||
|
|
@ -1,27 +1,27 @@
|
|||
namespace MT.Checks.Repository
|
||||
namespace MT.Checks.Repository
|
||||
{
|
||||
using Kit.Helpers.SqlHelperAbstract;
|
||||
using MT.Checks.Domain;
|
||||
|
||||
/// <summary>Репозиторий Ñправочника типов проверок (только чтение).</summary>
|
||||
/// <summary>Репозиторий справочника типов проверок (только чтение).</summary>
|
||||
public interface IChkTypeRepository
|
||||
{
|
||||
/// <summary>Возвращает вÑе Ñтроки Ñправочника (chk.chk_type_select).</summary>
|
||||
/// <summary>Возвращает все строки справочника (chk.chk_type_select).</summary>
|
||||
IList<ChkType> Select();
|
||||
}
|
||||
|
||||
/// <summary>РеализациÑ: ÐºÐ°Ð¶Ð´Ð°Ñ Ð²Ñ‹Ð±Ð¾Ñ€ÐºÐ° — вызов chk.chk_type_select.</summary>
|
||||
/// <summary>Реализация: каждая выборка — вызов chk.chk_type_select.</summary>
|
||||
public class ChkTypeRepository : IChkTypeRepository
|
||||
{
|
||||
private readonly IConnectionString _connectionString;
|
||||
|
||||
/// <summary>Подключение передаётÑÑ Ñнаружи и не открываетÑÑ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸ÐµÐ¼.</summary>
|
||||
/// <summary>Подключение передаётся снаружи и не открывается репозиторием.</summary>
|
||||
public ChkTypeRepository(IConnectionString connectionString)
|
||||
{
|
||||
_connectionString = connectionString;
|
||||
}
|
||||
|
||||
/// <summary>Возвращает вÑе Ñтроки Ñправочника (chk.chk_type_select).</summary>
|
||||
/// <summary>Возвращает все строки справочника (chk.chk_type_select).</summary>
|
||||
public IList<ChkType> Select()
|
||||
{
|
||||
return _connectionString.PrepareExecute<ChkType>("chk.chk_type_select")
|
||||
|
|
|
|||
|
|
@ -1,19 +1,19 @@
|
|||
namespace MT.Checks.Repository.Filter;
|
||||
namespace MT.Checks.Repository.Filter;
|
||||
|
||||
/// <summary>
|
||||
/// УÑÐ»Ð¾Ð²Ð¸Ñ Ð²Ñ‹Ð±Ð¾Ñ€ÐºÐ¸ проверок; null ÑвойÑтва = уÑловие не применÑетÑÑ.
|
||||
/// Условия выборки проверок; null свойства = условие не применяется.
|
||||
/// </summary>
|
||||
public class ChkCheckFilter
|
||||
{
|
||||
/// <summary>День (дата) проверки.</summary>
|
||||
/// <summary>День (дата) проверки.</summary>
|
||||
public DateTime? CheckDate { get; set; }
|
||||
|
||||
/// <summary>Тип проверки (chk.chk_type.id).</summary>
|
||||
/// <summary>Тип проверки (chk.chk_type.id).</summary>
|
||||
public int? TypeId { get; set; }
|
||||
|
||||
/// <summary>Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ (chk.chk_status.id).</summary>
|
||||
/// <summary>Статус проверки (chk.chk_status.id).</summary>
|
||||
public int? StatusId { get; set; }
|
||||
|
||||
/// <summary>Идентификатор организации РР.</summary>
|
||||
/// <summary>Идентификатор организации РР.</summary>
|
||||
public string? RrOrganizationId { get; set; }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,99 +1,99 @@
|
|||
# Отчёт генерации DAL (навык project_dal) — прогон 2026-09-08
|
||||
# Отчёт генерации DAL (навык project_dal) — прогон 2026-09-08
|
||||
|
||||
## Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ñтапов
|
||||
## Статус этапов
|
||||
|
||||
| Ðтап | Ð¡Ñ‚Ð°Ñ‚ÑƒÑ |
|
||||
| Этап | Статус |
|
||||
|---|---|
|
||||
| 0_scan (разведка) | done |
|
||||
| 1_rules (правила MCP) | done |
|
||||
| 2_spec (Ñпецификации теÑтов) | done — утверждены пользователем |
|
||||
| 3_code (генерациÑ) | done (теÑты не ÑоздаютÑÑ â€” решение пользователÑ) |
|
||||
| 4_validate | done — build 0 ошибок; check: 1 извеÑтный false positive (Ñм. ниже) |
|
||||
| 5_report | done — ожидание ÑƒÑ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ DONE |
|
||||
| 0_scan (разведка) | done |
|
||||
| 1_rules (правила MCP) | done |
|
||||
| 2_spec (спецификации тестов) | done — утверждены пользователем |
|
||||
| 3_code (генерация) | done (тесты не создаются — решение пользователя) |
|
||||
| 4_validate | done — build 0 ошибок; check: 1 известный false positive (см. ниже) |
|
||||
| 5_report | done — ожидание утверждения DONE |
|
||||
|
||||
## ВерÑии правил
|
||||
## Версии правил
|
||||
|
||||
- Каталог MCP standarts-catalog: **1.2** (= rules-baseline.json 1.2); раÑхождений
|
||||
нет, `validate-rules` не требовалÑÑ.
|
||||
- ИÑпользованные облаÑти: c-dal 1.1, d-tst 1.1, c-tst 1.1, c-cs 1.1, db-m 1.1,
|
||||
db-s 1.1, db-func 1.1, db-tst 1.1, c-dm 1.1, d-dev 1.1, d-db 1.1 (вÑе 2026-09-04).
|
||||
- Каталог MCP standarts-catalog: **1.2** (= rules-baseline.json 1.2); расхождений
|
||||
нет, `validate-rules` не требовался.
|
||||
- Использованные области: c-dal 1.1, d-tst 1.1, c-tst 1.1, c-cs 1.1, db-m 1.1,
|
||||
db-s 1.1, db-func 1.1, db-tst 1.1, c-dm 1.1, d-dev 1.1, d-db 1.1 (все 2026-09-04).
|
||||
|
||||
## Решение (проект `MT.Checks`)
|
||||
## Решение (проект `MT.Checks`)
|
||||
|
||||
- `MT.Checks.slnx` → проект `MT.Checks\MT.Checks.csproj` (net10.0),
|
||||
ProjectReference на `I:\Gitea\Kit\Kit.Core\Kit.Core\Kit.Core.csproj` (Kit.Helpers).
|
||||
- ТеÑтового проекта нет — решение Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Â«Ð±ÐµÐ· теÑтов ÑовÑем» (2026-09-08).
|
||||
- `MT.Checks.slnx` → проект `MT.Checks\MT.Checks.csproj` (net10.0),
|
||||
ProjectReference на `I:\Gitea\Kit\Kit.Core\Kit.Core\Kit.Core.csproj` (Kit.Helpers).
|
||||
- Тестового проекта нет — решение пользователя «без тестов совсем» (2026-09-08).
|
||||
|
||||
### Файлы
|
||||
### Файлы
|
||||
|
||||
| Файл | Содержимое |
|
||||
| Файл | Содержимое |
|
||||
|---|---|
|
||||
| `Domain\ChkCheck.cs` | ÑущноÑть проверки (+ Type/Status-Ñправочники, Params — Ñтрока JSON) |
|
||||
| `Domain\ChkType.cs` | Ñправочник типов + конÑтанты `ChkTypes` (6 значений) |
|
||||
| `Domain\ChkStatus.cs` | Ñправочник ÑтатуÑов + конÑтанты `ChkStatuses` (4 значениÑ) |
|
||||
| `Repository\Filter\ChkCheckFilter.cs` | фильтр Select (null = уÑловие не применÑетÑÑ) |
|
||||
| `Domain\ChkCheck.cs` | сущность проверки (+ Type/Status-справочники, Params — строка JSON) |
|
||||
| `Domain\ChkType.cs` | справочник типов + константы `ChkTypes` (6 значений) |
|
||||
| `Domain\ChkStatus.cs` | справочник статусов + константы `ChkStatuses` (4 значения) |
|
||||
| `Repository\Filter\ChkCheckFilter.cs` | фильтр Select (null = условие не применяется) |
|
||||
| `Repository\ChkCheckRepository.cs` | Insert/Update/Delete/Select/Get |
|
||||
| `Repository\ChkTypeRepository.cs` | Select (Ñправочник — только чтение) |
|
||||
| `Repository\ChkStatusRepository.cs` | Select (Ñправочник — только чтение) |
|
||||
| `Repository\ChkTypeRepository.cs` | Select (справочник — только чтение) |
|
||||
| `Repository\ChkStatusRepository.cs` | Select (справочник — только чтение) |
|
||||
|
||||
ÐеймÑпейÑÑ‹: `MT.Checks.Domain`, `MT.Checks.Repository`, `MT.Checks.Repository.Filter`
|
||||
(папка/Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ ÑÐ»Ð¾Ñ `Chk` в коде не иÑпользуютÑÑ â€” решение пользователÑ).
|
||||
Неймспейсы: `MT.Checks.Domain`, `MT.Checks.Repository`, `MT.Checks.Repository.Filter`
|
||||
(папка/префикс слоя `Chk` в коде не используются — решение пользователя).
|
||||
|
||||
### Методы → функции БД
|
||||
### Методы → функции БД
|
||||
|
||||
| Метод | Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ | Возврат |
|
||||
| Метод | Функция | Возврат |
|
||||
|---|---|---|
|
||||
| `ChkCheckRepository.Insert(ChkCheck)` | `chk.chk_check_insert` | id запиÑи |
|
||||
| `ChkCheckRepository.Update(ChkCheck)` | `chk.chk_check_update` | чиÑло Ñтрок (read-modify-write; guard Id=0) |
|
||||
| `ChkCheckRepository.Delete(int)` | `chk.chk_check_delete` | чиÑло Ñтрок (guard id=0) |
|
||||
| `ChkCheckRepository.Insert(ChkCheck)` | `chk.chk_check_insert` | id записи |
|
||||
| `ChkCheckRepository.Update(ChkCheck)` | `chk.chk_check_update` | число строк (read-modify-write; guard Id=0) |
|
||||
| `ChkCheckRepository.Delete(int)` | `chk.chk_check_delete` | число строк (guard id=0) |
|
||||
| `ChkCheckRepository.Select(ChkCheckFilter)` | `chk.chk_check_select` | `IList<ChkCheck>` |
|
||||
| `ChkCheckRepository.Get(int)` | `chk.chk_check_get` | `ChkCheck?` (guard id=0) |
|
||||
| `ChkTypeRepository.Select()` | `chk.chk_type_select` | `IList<ChkType>` |
|
||||
| `ChkStatusRepository.Select()` | `chk.chk_status_select` | `IList<ChkStatus>` |
|
||||
|
||||
Каждый метод — ровно одна Ñ…Ñ€Ð°Ð½Ð¸Ð¼Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ, транÑпорт — fluent API Kit.Helpers
|
||||
Каждый метод — ровно одна хранимая функция, транспорт — fluent API Kit.Helpers
|
||||
(`PrepareExecute<T>().AsStoredProcedure().AddParameter*().AddConverter(...)`),
|
||||
конвертеры таблиц ответа — inline-лÑмбды.
|
||||
конвертеры таблиц ответа — inline-лямбды.
|
||||
|
||||
## Слой БД (Ñтот же прогон)
|
||||
## Слой БД (этот же прогон)
|
||||
|
||||
- `DB/chk/functions/*.sql` — 7 функций (параметры `p_*` по db-func-5);
|
||||
- `DB/chk/func_specs/*.md` — 7 Ñпецификаций Ñ Ñ‚ÐµÑÑ‚-планами (d-db-9);
|
||||
- `DB/chk/tests/test_*.psql` — 7 psql-теÑтов (**не иÑполнÑлиÑÑŒ** — нужна теÑтоваÑ
|
||||
база: `psql -d <база> -f DB/chk/tests/test_*.psql`);
|
||||
- `DB/chk/functions.md` — ÑтатуÑÑ‹: функции `DEV`/«ФункциÑ»=`CODE`; «Репозиторий»=`REQ`
|
||||
Ñ Ð¿Ñ€Ð¸Ð¼ÐµÑ‡Ð°Ð½Ð¸ÐµÐ¼ (unit-теÑты не ÑоздаютÑÑ, `CODE` по d-dev-3 неприменим).
|
||||
- `DB/chk/functions/*.sql` — 7 функций (параметры `p_*` по db-func-5);
|
||||
- `DB/chk/func_specs/*.md` — 7 спецификаций с тест-планами (d-db-9);
|
||||
- `DB/chk/tests/test_*.psql` — 7 psql-тестов (**не исполнялись** — нужна тестовая
|
||||
база: `psql -d <база> -f DB/chk/tests/test_*.psql`);
|
||||
- `DB/chk/functions.md` — статусы: функции `DEV`/«Функция»=`CODE`; «Репозиторий»=`REQ`
|
||||
с примечанием (unit-тесты не создаются, `CODE` по d-dev-3 неприменим).
|
||||
|
||||
## ВалидациÑ
|
||||
## Валидация
|
||||
|
||||
- `dotnet build MT.Checks.slnx` — **0 ошибок** (Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñ NU1903/CS — из Kit.Core).
|
||||
- DalTools `check` (Ñ Ð¼Ð°Ð½Ð¸Ñ„ÐµÑтом) — **1 нарушение c-dal-1, извеÑтный false positive**:
|
||||
ÑвриÑтика «SQL в Ñтроке C#» Ñканирует текÑÑ‚ между Ñтроковыми литералами файла и
|
||||
находит Ñлово `Select` в Ñигнатуре метода `Select(ChkCheckFilter)` — Ð¸Ð¼Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð°
|
||||
обÑзательно по правилу c-dal-5 (имена CRUD: Insert/Update/Delete/Select/Get).
|
||||
ÐеуÑтранимо в коде без Ð½Ð°Ñ€ÑƒÑˆÐµÐ½Ð¸Ñ Ñтандарта; SQL в Ñтроках отÑутÑтвует.
|
||||
- `dotnet build MT.Checks.slnx` — **0 ошибок** (предупреждения NU1903/CS — из Kit.Core).
|
||||
- DalTools `check` (с манифестом) — **1 нарушение c-dal-1, известный false positive**:
|
||||
эвристика «SQL в строке C#» сканирует текст между строковыми литералами файла и
|
||||
находит слово `Select` в сигнатуре метода `Select(ChkCheckFilter)` — имя метода
|
||||
обязательно по правилу c-dal-5 (имена CRUD: Insert/Update/Delete/Select/Get).
|
||||
Неустранимо в коде без нарушения стандарта; SQL в строках отсутствует.
|
||||
|
||||
## Спецификации теÑтов
|
||||
## Спецификации тестов
|
||||
|
||||
`1-docs/2-core/chk/repository_tests/` — ChkCheckRepository.md (17 теÑтов),
|
||||
ChkTypeRepository.md, ChkStatusRepository.md — утверждены как документациÑ
|
||||
ожидаемого поведениÑ. ТеÑтовый код по решению Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ ÑоздаётÑÑ
|
||||
(Ñм. `DB/chk/functions.md`, примечание к колонке «Репозиторий»).
|
||||
`1-docs/2-core/chk/repository_tests/` — ChkCheckRepository.md (17 тестов),
|
||||
ChkTypeRepository.md, ChkStatusRepository.md — утверждены как документация
|
||||
ожидаемого поведения. Тестовый код по решению пользователя не создаётся
|
||||
(см. `DB/chk/functions.md`, примечание к колонке «Репозиторий»).
|
||||
|
||||
## ИзвеÑтные Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¸ решениÑ
|
||||
## Известные ограничения и решения
|
||||
|
||||
1. **ТранÑпорт `p_` vs `_`**: Kit.Helpers Ñтроит именованные аргументы `_<имÑ>`,
|
||||
функции chk объÑвлены Ñ `p_<имÑ>` (db-func-5; решение Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ â€” Ñохранить
|
||||
Ñтандарт). До доработки Kit.Helpers (админиÑтратор Kit) вызовы репозиториев
|
||||
против живой БД будут давать «function ... does not exist».
|
||||
2. **Имена**: решение/проект `MT.Checks` — по указанию пользователÑ
|
||||
(в `MT.Check.Core.Dal`/`MT.Checks.Test` отказ).
|
||||
3. **Без теÑтов**: теÑтовый проект отÑутÑтвует; `dotnet test` из конвейера иÑключён.
|
||||
4. ÐŸÑ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñ Ñборки NU1903 (уÑзвимые пакеты Npgsql/SqlClient и др.) —
|
||||
из Kit.Core, вне рамок навыка.
|
||||
1. **Транспорт `p_` vs `_`**: Kit.Helpers строит именованные аргументы `_<имя>`,
|
||||
функции chk объявлены с `p_<имя>` (db-func-5; решение пользователя — сохранить
|
||||
стандарт). До доработки Kit.Helpers (администратор Kit) вызовы репозиториев
|
||||
против живой БД будут давать «function ... does not exist».
|
||||
2. **Имена**: решение/проект `MT.Checks` — по указанию пользователя
|
||||
(в `MT.Check.Core.Dal`/`MT.Checks.Test` отказ).
|
||||
3. **Без тестов**: тестовый проект отсутствует; `dotnet test` из конвейера исключён.
|
||||
4. Предупреждения сборки NU1903 (уязвимые пакеты Npgsql/SqlClient и др.) —
|
||||
из Kit.Core, вне рамок навыка.
|
||||
|
||||
## Возобновление/завершение
|
||||
## Возобновление/завершение
|
||||
|
||||
ПоÑле доработки Kit.Helpers доÑтаточно проверить вызовы на теÑтовой БД
|
||||
(Ñпецификации вызовов не менÑÑŽÑ‚ÑÑ). СтатуÑÑ‹ `DONE` — поÑле утверждениÑ
|
||||
пользователем.
|
||||
После доработки Kit.Helpers достаточно проверить вызовы на тестовой БД
|
||||
(спецификации вызовов не меняются). Статусы `DONE` — после утверждения
|
||||
пользователем.
|
||||
|
|
|
|||
Loading…
Reference in New Issue