Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /// <summary>
- /// Интерфейс состояния документа отправляемого в ОИ.рф.
- /// </summary>
- public interface IShippingDocumentState
- {
- // todo: специфицировать тип object до конкретного класса контракта.
- /// <summary>
- /// Создать документ для отправки в ОИ.рф.
- /// </summary>
- void CreateDocument(object creatingDocument);
- /// <summary>
- /// Отправить документ в ОИ.рф.
- /// </summary>
- void ShipDocument(object shippingDocument);
- /// <summary>
- /// Зарегистрировать факт доставки в ОИ.рф.
- /// </summary>
- void RegisterDelivery(object deliveringData);
- /// <summary>
- /// Зарегистрировать факт подтверждения доставки в ОИ.рф.
- /// </summary>
- void RegisterConfirmation(object confirmationData);
- }
- /// <summary>
- /// Класс состояния документа отправляемого в ОИ.рф.
- /// </summary>
- public class ShippingDocumentState : IShippingDocumentState
- {
- private static ILogger _logger = LogManager.GetCurrentClassLogger();
- protected DocumentHandler Handler;
- public ShippingDocumentState(DocumentHandler handler)
- {
- Handler = handler;
- }
- void SetHandler(DocumentHandler handler)
- {
- Handler = handler;
- }
- public virtual void CreateDocument(object creatingDocument)
- {
- _logger.Error("Операция не поддерживается текущим состоянием.");
- throw new InvalidOperationException("Операция не поддерживается текущим состоянием.");
- }
- public virtual void ShipDocument(object shippingDocument)
- {
- _logger.Error("Операция не поддерживается текущим состоянием.");
- throw new InvalidOperationException("Операция не поддерживается текущим состоянием.");
- }
- public virtual void RegisterDelivery(object deliveringData)
- {
- _logger.Error("Операция не поддерживается текущим состоянием.");
- throw new InvalidOperationException("Операция не поддерживается текущим состоянием.");
- }
- public virtual void RegisterConfirmation(object cofirmationData)
- {
- _logger.Error("Операция не поддерживается текущим состоянием.");
- throw new InvalidOperationException("Операция не поддерживается текущим состоянием.");
- }
- }
- /// <summary>
- /// Тип состояния документа.
- /// </summary>
- public enum StateType
- {
- Initial = 0,
- Created = 1,
- Shipped = 2,
- DeliveryFailed = 3,
- Delivered = 4,
- Confirmed = 5,
- ConfirmationFailed = 6
- }
- // todo: базовый интерфейс сообщения из ОИ.рф.
- public interface IElectroInspectionMessageStub
- {
- string DocumentId { get; }
- ElectroInspectionMessageType MessageType { get; set; }
- }
- public enum ElectroInspectionMessageType
- {
- DeliveryMessage,
- ConfirmationMessage
- }
- public interface IElectroDocumentStub
- {
- StateType State { get; }
- string OperationType { get; }
- }
- /// <summary>
- /// Подписчик сообщений сервиса 'Электронная проверка сервиса ОИ.рф'.
- /// </summary>
- public class ElectronicCheckSubscriber
- {
- void Start()
- {
- // Создаем NATS и подписку.
- }
- // todo: поиск по идентификатору в БД.
- protected virtual IElectroDocumentStub FindDocument(string id)
- {
- return null;
- }
- void HandleMessage(IElectroInspectionMessageStub msg)
- {
- var searchedDoc = FindDocument(msg.DocumentId);
- var handler = new DocumentHandler();
- if (searchedDoc != null)
- {
- // Восстанавливаем состояние из БД.
- handler.RestoreState(searchedDoc.State);
- switch (msg.MessageType)
- {
- case ElectroInspectionMessageType.ConfirmationMessage:
- handler.RegisterConfirmation(msg);
- break;
- case ElectroInspectionMessageType.DeliveryMessage:
- handler.RegisterDelivery(msg);
- break;
- }
- }
- else
- {
- // todo: Ошибка.
- }
- }
- }
- /// <summary>
- /// Обработчик полученных сообщений от ОИ.рф сервиса 'Электронная проверка'.
- /// </summary>
- public class DocumentHandler
- {
- // Текущее состояние обработчика.
- private IShippingDocumentState _currentState;
- public DocumentHandler()
- {
- _currentState = GetInitialState();
- }
- public DocumentHandler(IShippingDocumentState state)
- {
- _currentState = state ?? throw new ArgumentNullException(nameof(state));
- }
- public void RestoreState(StateType type)
- {
- IShippingDocumentState state;
- // Инициализируем handler в зависимости от сохраненного состояния.
- switch (type)
- {
- case StateType.Initial:
- state = GetInitialState();
- break;
- case StateType.Created:
- state = GetCreatedState();
- break;
- case StateType.Shipped:
- state = GetShippedState();
- break;
- case StateType.Delivered:
- state = GetDeliveredState();
- break;
- case StateType.DeliveryFailed:
- state = GetConfirmationFailedState();
- break;
- case StateType.Confirmed:
- state = GetConfirmedState();
- break;
- case StateType.ConfirmationFailed:
- state = GetConfirmationFailedState();
- break;
- default:
- throw new InvalidOperationException("Состояние не поддерживается.");
- }
- // Устанавливаем текущее состояние обработчика.
- ChangeState(state);
- }
- public void ChangeState(IShippingDocumentState state)
- {
- _currentState = state;
- }
- /// <summary>
- /// Создать документ для отправки в ОИ.рф.
- /// </summary>
- public void CreateDocument(object creatingDocument)
- {
- _currentState.CreateDocument(creatingDocument);
- }
- /// <summary>
- /// Отправить документ в ОИ.рф.
- /// </summary>
- public void ShipDocument(object shippingDocument)
- {
- _currentState.ShipDocument(shippingDocument);
- }
- /// <summary>
- /// Зарегистрировать факт доставки в ОИ.рф.
- /// </summary>
- public void RegisterDelivery(object deliveringData)
- {
- _currentState.RegisterDelivery(deliveringData);
- }
- /// <summary>
- /// Зарегистрировать факт подтверждения доставки в ОИ.рф.
- /// </summary>
- public void RegisterConfirmation(object confirmationData)
- {
- _currentState.RegisterConfirmation(confirmationData);
- }
- public InitialState GetInitialState()
- {
- return new InitialState(this);
- }
- public CreatedState GetCreatedState()
- {
- return new CreatedState(this);
- }
- public ShippedState GetShippedState()
- {
- return new ShippedState(this);
- }
- public DeliveryFailedState GetDeliveryFailedState()
- {
- return new DeliveryFailedState(this);
- }
- public DeliveredState GetDeliveredState()
- {
- return new DeliveredState(this);
- }
- public ConfirmedState GetConfirmedState()
- {
- return new ConfirmedState(this);
- }
- public ConfirmationFailedState GetConfirmationFailedState()
- {
- return new ConfirmationFailedState(this);
- }
- }
- /// <summary>
- /// Документ для отправки в ОИ.рф отсутствует.
- /// </summary>
- public class InitialState : ShippingDocumentState
- {
- public override void CreateDocument(object creatingDocument)
- {
- // 1. Создать документ для отправки в ОИ.рф.
- // 2. Сохранить созданный документ в БД.
- Handler.ChangeState(Handler.GetCreatedState());
- }
- public InitialState(DocumentHandler handler) : base(handler)
- {
- }
- }
- /// <summary>
- /// Документ для отправки в ОИ.рф создан.
- /// </summary>
- public class CreatedState : ShippingDocumentState
- {
- public override void ShipDocument(object shippingDocument)
- {
- // 1. Найти документ в БД (если нужно)
- // 2. Отправить сообщение в NATS.
- }
- public CreatedState(DocumentHandler handler) : base(handler)
- {
- }
- }
- /// <summary>
- /// Документ отправлен в ОИ.рф.
- /// </summary>
- public class ShippedState : ShippingDocumentState
- {
- public override void RegisterDelivery(object deliveringData)
- {
- // 1. Зарегистрировать сообщение от ОИ.рф.
- }
- public ShippedState(DocumentHandler handler) : base(handler)
- {
- }
- }
- /// <summary>
- /// Документ не доставлен в ОИ.рф (ошибка ФЛК на стороне ОИ.рф).
- /// </summary>
- public class DeliveryFailedState : ShippingDocumentState
- {
- public override void RegisterDelivery(object deliveringData)
- {
- // Повторное подтверждение доставки из ОИ.рф.
- }
- public DeliveryFailedState(DocumentHandler handler) : base(handler)
- {
- }
- }
- /// <summary>
- /// Документ доставлен в ОИ.рф.
- /// </summary>
- public class DeliveredState : ShippingDocumentState
- {
- public override void RegisterConfirmation(object confirmationData)
- {
- // Подтверждение получения документа.
- }
- public DeliveredState(DocumentHandler handler) : base(handler)
- {
- }
- }
- /// <summary>
- /// Подтверждено получение документа в ОИ.рф пользователем.
- /// </summary>
- public class ConfirmedState : ShippingDocumentState
- {
- // Конечное состояние.
- public ConfirmedState(DocumentHandler handler) : base(handler)
- {
- }
- }
- /// <summary>
- /// Ошибка подтверждения получения документа в ОИ.рф пользователем (ошибка ФЛК на стороне АСУ КНД).
- /// </summary>
- public class ConfirmationFailedState : ShippingDocumentState
- {
- public override void RegisterConfirmation(object confirmationData)
- {
- // Повторное получения документа.
- }
- public ConfirmationFailedState(DocumentHandler handler) : base(handler)
- {
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement