diadoc / diadocsdk-csharp

Official Diadoc SDK for C#
MIT License
35 stars 64 forks source link

Как сделать отбор по дате изменения статуса в методе GetDocuments? #986

Closed kyklochev closed 2 years ago

kyklochev commented 2 years ago

Здравствуйте!

Требуется получить список документов у которых статус изменился сегодня / вчера / произвольный интервал. Для интеграции используется библиотека Диадок COM SDK. В документации https://developer.kontur.ru/Docs/diadoc-api/http/GetDocuments.html не нашёл описания такого отбора, хотя ранее использовали коннектор Reporter и в нем можно было настроить выгрузку документов по дате изменения статуса (выгружать все документы, у которых статус был изменен после 01.01.2022).

Подскажите, какой метод и с какими параметрами необходимо вызвать, чтобы получить список документов, по которым статус был изменен в соответствии с отбором по интервалу дат?

yudinvs1 commented 2 years ago

Вам зачем? Походу одно и то же делаем. Задача явно по отправленным докам ловить состояние подписали или нет. Я делаю примерно так: var EvetsList = diadocApi.GetNewEvents(authTokenByCertificateThumbprint, myBox.BoxId, lasteventid, null, null, null, null, null, TicksFromStart); Последнее просто передают определенную дату, чтобы не тянуть события за весь период. Ключевое -lasteventid - последнее обработанное событие. Его его в базе храню. ну а дальше ` foreach (BoxEvent even in EvetsList.Events) {

                    if (even.HasMessage)
                    {

                        gg++;
                        Diadoc.Api.Proto.Events.Message msg = even.Message;

                        foreach (Entity MsgEnty in msg.Entities)
                        {
                            //MsgEnty.DocumentInfo.DocumentNumber;
                            //MsgEnty.DocumentInfo.DocumentDate;

                            if (MsgEnty.DocumentInfo != null)
                            {

                                Diadoc.Api.Proto.Documents.Document docinfo = MsgEnty.DocumentInfo;

                                if (docinfo.Type == Diadoc.Api.Com.DocumentType.UniversalTransferDocument)
                                {

                                    Diadoc.Api.Proto.Documents.Document doc = diadocApi.GetDocument(authTokenByCertificateThumbprint, myBox.BoxId, docinfo.MessageId, docinfo.EntityId);

                                    string depId = doc.DepartmentId;`
kyklochev commented 2 years ago

Бизнес задача - гарантированно выгружать всё подписанные документы в автоматическом режиме. Т. е. получаем список документов по которым статус изменился сегодня и пытаемся их скачать с применением пакетной статусной модели (если хотя бы один документ пакета имеет не конечный статус, то такой пакет не выгружаем, условно завтра последний документ пакета будет подписан, мы получим его в отборе изменения статуса за день, попробуем выгрузить весь пакет проверив статусную модель и уже выгрузим).

Как я понял, Вы список событий методом GetNewEvents, сохраняете в БД, потом разбираете информацию выделяя атрибуты документов. А можно из ответа метода GetNewEvents получить DocumentID?

yudinvs1 commented 2 years ago

У Event есть message, у message есть entity, у entity docinfo - смотрите код выше. Там все что нужно.

Diadoc.Api.Proto.Documents.Document doc = diadocApi.GetDocument(authTokenByCertificateThumbprint, myBox.BoxId, docinfo.MessageId, docinfo.EntityId);

yudinvs1 commented 2 years ago

Я получаю ленту событий, из событий получаю то что связано с документами и обновляю их статус, вытаскиваю печатную форму.