В API транспортной этикетки UPS нет возможности указать угол поворота изображения транспортной этикетки. Мы будем решать эту проблему с помощью настройки ShipmentEntry
graph / BLC, работающего с Shipment Entry screen (SO302000)
.
Текущий рабочий процесс не изменится (с точки зрения конечного пользователя). Когда отгрузка подтверждается в Acumatica, этикетка создается и извлекается из UPS, во время этого процесса наша настройка будет вращать извлеченную этикетку (только если доставка через отгрузку работает с подключаемым модулем UPS и формат этикетки - GIF) по часовой стрелке на 90 градусов. Эта этикетка UPS будет совмещена с этикеткой, созданной с помощью других подключаемых модулей (FedEx и Stamps.com). При этом никаких настроек на уровне отчета не потребуется.
Транспортная этикетка создается ShipPackages
виртуальным методом в ShipmentEntry
Graph / BLC. Итак, мы переопределим виртуальный метод ShipPackages
в расширении Graph / BLC для ShipmentEntry
Graph / BLC.
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
Graph / BLC. Мы расширим логику, добавив обработчик событий RowInserted
для UploadFileRevision
DAC на график UploadFileMaintenance
.
Поскольку экземпляр UploadFileMaintenance
BLC создается в ShipPackages
и недоступен, пока не будет выполнен, мы добавим делегата в статическую коллекцию InstanceCreated
класса PXGraph
.
И внутри делегата, который выполняется при инициализации UploadFileMaintenance
экземпляра BLC, мы добавим обработчик событий в коллекцию RowInserted
экземпляра UploadFileMaintenance
Graph / BLC.
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 # BLC а>
Отмена виртуального метода
person
DChhapgar
schedule
04.02.2020