Как повернуть изображение этикетки доставки, полученное с носителя, при подтверждении отгрузки в Acumatica? - PullRequest
0 голосов
/ 04 февраля 2020

Мы используем пользовательский отчет об упаковочном листе в Acumatica, который работает со всеми различными типами носителей (UPS, FedEx, USPS Et c.) И требует изображения с этикеткой доставки без поворота.

Изображение отгрузочной этикетки, полученное с помощью Stamps.com и FedEx, не вращается, но изображение отгрузочной этикетки с интегрированной несущей ИБП поворачивается по часовой стрелке на 270 градусов по часовой стрелке и плохо помещается в обозначенной области (клей ) из канцтоваров / Репортаж.

1 Ответ

2 голосов
/ 04 февраля 2020

В API UPS Shipping Label отсутствует возможность указать степень поворота для изображения этикетки доставки. Мы будем решать эту проблему с помощью настройки для ShipmentEntry графика / BL C, работающего с Shipment Entry screen (SO302000).

Не будет никаких изменений в текущем рабочем процессе (с точки зрения конечного пользователя). Когда отгрузка подтверждается в Acumatica, этикетка генерируется и извлекается из ИБП, в ходе этого процесса наша настройка будет вращать извлеченную этикетку (только если Ship-Via при отгрузке работает с подключаемым модулем UPS, а формат этикетки - GIF) по часовой стрелке на 90 градусов. Эта метка ИБП будет совмещена с меткой, созданной с помощью других плагинов (FedEx и Stamps.com). На уровне отчета корректировка не требуется.

Этикетка доставки создается виртуальным методом ShipPackages в ShipmentEntry График / BL C. Итак, мы будем переопределять ShipPackages виртуальный метод в Graph / BL C Расширение ShipmentEntry Graph / BL C.

public class SOShipmentEntryRotateGIFLabelExt : PXGraphExtension<SOShipmentEntry>
{
     public delegate void ShipPackagesBaseDelegate(SOShipment shiporder);

     [PXOverride]
     public void ShipPackages(SOShipment shiporder, ShipPackagesBaseDelegate BaseInvoke)
     {
         //Custom code to rotate image if carrier is UPS and label format is GIF                 
         //Invoke base method 
         BaseInvoke(shiporder);
     }
}

Вложение файлов в Acumatica осуществляется через UploadFileMaintenance График / BL C. Мы расширим логи c, добавив обработчик событий RowInserted для UploadFileRevision DA C к графику UploadFileMaintenance.

Поскольку экземпляр UploadFileMaintenance BL C создается в ShipPackages и недоступен до его выполнения, мы добавим делегата в коллекцию stati c InstanceCreated PXGraph учебный класс.

И внутри делегата, который выполняется при инициализации экземпляра UploadFileMaintenance BL C, мы добавим обработчик событий в коллекцию RowInserted экземпляра UploadFileMaintenance Graph / BL C .

public class SOShipmentEntryRotateGIFLabelExt : PXGraphExtension<SOShipmentEntry>
{
    public delegate void ShipPackagesBaseDelegate(SOShipment shiporder);

    [PXOverride]
    public void ShipPackages(SOShipment shiporder, ShipPackagesBaseDelegate BaseInvoke)
    {
        #region Custom-code-to-rotate-retrieved-Label

        PXGraph.InstanceCreated.AddHandler<UploadFileMaintenance>((fileGraph) =>
        {
            fileGraph.RowInserted.AddHandler<UploadFileRevision>((sender, e) =>
            {
                UploadFileRevision fileData = (UploadFileRevision)e.Row;
            });
        });

        #endregion
        //Invoke base method 
        BaseInvoke(shiporder);
    }
}

В обработчике событий RowInserted мы берем обрабатываемую запись данных UploadFileRevision, получаем изображение с этикеткой доставки и поворачиваем его.

И, наконец, мы вызываем базовый метод.

using PX.Data;
using PX.Objects.CS;
using PX.Objects.SO;
using PX.SM;
using System.Drawing;
using System.IO;

namespace PX.RotateUPSLabelImage.Ext
{
    public class SOShipmentEntryRotateGIFLabelExt : PXGraphExtension<SOShipmentEntry>
    {
        public delegate void ShipPackagesBaseDelegate(SOShipment shiporder);

        [PXOverride]
        public void ShipPackages(SOShipment shiporder, ShipPackagesBaseDelegate BaseInvoke)
        {
            #region Custom-code-to-rotate-retrieved-Label
            //Identify specified Ship-Via/Carrier Shipment is working with
            var carrier = Carrier.PK.Find(Base, shiporder.ShipVia);
            //If specified Ship-Via/Carrier is API/Plug-In based
            if (carrier?.IsExternal == true)
            {
                //Identify Connected Carrier Plug-In 
                var plugin = CarrierPlugin.PK.Find(Base, carrier.CarrierPluginID);
                //If Plug-In is working with UPS
                if (plugin?.PluginTypeName?.Trim() == typeof(PX.UpsCarrier.UpsCarrier).FullName)
                {
                    PXGraph.InstanceCreated.AddHandler<UploadFileMaintenance>((fileGraph) =>
                    {
                        fileGraph.RowInserted.AddHandler<UploadFileRevision>((sender, e) =>
                        {
                            UploadFile fileInfo = (UploadFile)sender.Graph.Caches<UploadFile>()?.Current;
                            if (fileInfo != null)
                            {
                                if (fileInfo.Name.StartsWith("Label #") && (fileInfo.Extansion.ToUpper() == "GIF"))
                                {
                                    UploadFileRevision fileData = (UploadFileRevision)e.Row;
                                    using (MemoryStream fileMemoryStream = new MemoryStream(fileData?.Data))
                                    {
                                        Image labelImage = Image.FromStream(fileMemoryStream);
                                        if (labelImage != null)
                                        {
                                            labelImage.RotateFlip(RotateFlipType.Rotate90FlipNone);
                                            ImageConverter imgConverter = new ImageConverter();
                                            fileData.Data = (byte[])imgConverter.ConvertTo(labelImage, typeof(byte[]));
                                        }
                                    }
                                }
                            }
                        });
                    });
                }
            }
            #endregion
            //Invoke base method 
            BaseInvoke(shiporder);
        }
    }
}

Загрузить пакет развертывания Acumatica Customization

Ниже справочные статьи можно найти в Руководстве по настройке Acumatica

. C# код BL C

для переопределения виртуального метода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...