⟨/⟩ 55_Backend/Handlers/InputPackets/NormalizePacketHandler.cs

60 строк · в начало

using System;
using Ban.Sdaid.Notation.Documents;
using Ban.Sdaid.Icd;
using Ban.Sdaid.Icd.Api.Endpoints.InputPackets.NormalizePacket;
using Ban.Sdaid.Icd.Domain.Capture;
using Ban.Sdaid.Icd.Arch.Adr;
using Ban.Sdaid.Icd.Arch.Tech.CSharp;

namespace Ban.Sdaid.Icd.Backend.Handlers.InputPackets
{
    /// <summary>Handler нормализации кадров пакета через orthocover.</summary>
    public class NormalizePacketHandler : IHandlerDocument, IFolder<BackendFolder>, IHasStructuralLinks
    {
        public SdaidLink[] Links => new[]
        {
            Rel.Uses<Ban.Sdaid.Icd.Domain.BC_Icd>(),
            Rel.Uses<ImageFrameSpec>(),
            Rel.Uses<DOC_NormalizePacket>(),
            Rel.Uses<ADR_SRV_005_ImageNormalizationOrthocover>(),
            Rel.Uses<ADR_002_PacketIdentityAndFileKeys>(),
        };

        public static string _refName = "Handler NormalizePacket";

        public string Name => "Handler: NormalizePacket";

        public string Description =>
            @"Что произойдёт при запуске обработки: прогнать кадр(ы) пакета через orthocover, сохранить обработанные изображения и проставить на кадре ключ/флаг/время.";

        public string Version => "0.1";
        public string Status => "draft";
        public string[] Comments => new string[0];

        public static string Purpose = $"""
            ## Назначение

            Ручная обработка кадров ({SdaidAnchors.RefTo<ImageFrameSpec>()}) по
            {SdaidAnchors.RefTo<DOC_NormalizePacket>()} (`{nameof(NormalizePacketCommand)}`): нормализация через
            внешний сервис orthocover — решение {SdaidAnchors.RefTo<ADR_SRV_005_ImageNormalizationOrthocover>()}.
            Результат нужен этапу «Проверка файлов» (переключение «оригинал ↔ обработанное»).
            """;

        public static string Scenario = $"""
            ## Сценарий вызова

            1. Найти пакет по `{nameof(NormalizePacketCommand.PacketId)}` (не удалённый) с кадрами; нет — `404`.
            2. Отобрать кадры: если задан `{nameof(NormalizePacketCommand.FrameOrder)}` — один кадр, иначе все.
            3. По каждому кадру:
               - взять оригинал из хранилища по ключу ({SdaidAnchors.RefTo<ADR_002_PacketIdentityAndFileKeys>()});
               - определить тип страницы orthocover по роли (штрихкод → `barcode`, остальное → `text`);
               - вызвать сервис; сохранить обработанный PNG под ключом `<номер>/<NN>_<роль>_norm.png`;
               - проставить на кадре ключ обработанного, флаг качества и время.
            4. Сбой по кадру (сервис недоступен и т.п.) не валит остальные — фиксируется в сводке
               (`{nameof(NormalizedFrameInfo.Error)}`).
            5. Вернуть `{nameof(NormalizePacketResult)}` со сводкой (`{nameof(NormalizedPacketPayload.Processed)}` /
               `{nameof(NormalizedPacketPayload.Failed)}`).
            """;
    }
}