在 Acumatica 中确认装运时,如何旋转从承运人检索到的装运标签图像?
How to rotate Shipping Label image retrieved from Carrier while confirming Shipment in Acumatica?
我们在 Acumatica 中使用自定义装箱单报告,它适用于所有不同类型的承运人(UPS、FedEx、USPS 等),并且需要没有任何旋转的运输标签图像。
通过 Stamps.com 和 FedEx 检索到的运输标签图像没有任何旋转,但通过 UPS 承运商集成的运输标签图像开箱后顺时针旋转了 270 度,并且不适合指定区域( stationary/Report 的粘合剂)。
UPS 运输标签 API 没有指定运输标签图像旋转度数的选项。我们将通过 ShipmentEntry
graph/BLC 与 Shipment Entry screen (SO302000)
.
的自定义来解决这个问题
当前工作流程不会有任何变化(最终用户的角度)。当在 Acumatica 中确认装运时,将生成标签并从 UPS 检索标签,在此过程中,我们的自定义将旋转检索到的标签(仅当 Ship-Via on Shipment 使用 UPS 插件且标签格式为 GIF 时)顺时针 90 度。此 UPS 标签将与通过其他插件(FedEx 和 Stamps.com)生成的标签对齐。并且不需要在报告级别进行调整。
发货标签是通过 ShipmentEntry
Graph/BLC 中的 ShipPackages
虚方法生成的。因此,我们将在 ShipmentEntry
Graph/BLC 的 Graph/BLC 扩展中覆盖 ShipPackages
虚方法。
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 执行的。
我们将通过将 UploadFileRevision
DAC 的 RowInserted
事件处理程序添加到 UploadFileMaintenance
图中来扩展逻辑。
因为UploadFileMaintenance
BLC 实例是在ShipPackages
中创建的并且在执行之前不可用,我们将向[=26] 的静态InstanceCreated
集合添加一个委托=] class。
并且在初始化 UploadFileMaintenance
BLC 实例时执行的委托中,我们将向 UploadFileMaintenance
Graph/BLC 的 RowInserted
集合添加一个事件处理程序实例.
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);
}
}
}
Download Acumatica Customization deployment package
以下帮助文章可参考Acumatica自定义指南
我们在 Acumatica 中使用自定义装箱单报告,它适用于所有不同类型的承运人(UPS、FedEx、USPS 等),并且需要没有任何旋转的运输标签图像。
通过 Stamps.com 和 FedEx 检索到的运输标签图像没有任何旋转,但通过 UPS 承运商集成的运输标签图像开箱后顺时针旋转了 270 度,并且不适合指定区域( stationary/Report 的粘合剂)。
UPS 运输标签 API 没有指定运输标签图像旋转度数的选项。我们将通过 ShipmentEntry
graph/BLC 与 Shipment Entry screen (SO302000)
.
当前工作流程不会有任何变化(最终用户的角度)。当在 Acumatica 中确认装运时,将生成标签并从 UPS 检索标签,在此过程中,我们的自定义将旋转检索到的标签(仅当 Ship-Via on Shipment 使用 UPS 插件且标签格式为 GIF 时)顺时针 90 度。此 UPS 标签将与通过其他插件(FedEx 和 Stamps.com)生成的标签对齐。并且不需要在报告级别进行调整。
发货标签是通过 ShipmentEntry
Graph/BLC 中的 ShipPackages
虚方法生成的。因此,我们将在 ShipmentEntry
Graph/BLC 的 Graph/BLC 扩展中覆盖 ShipPackages
虚方法。
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 执行的。
我们将通过将 UploadFileRevision
DAC 的 RowInserted
事件处理程序添加到 UploadFileMaintenance
图中来扩展逻辑。
因为UploadFileMaintenance
BLC 实例是在ShipPackages
中创建的并且在执行之前不可用,我们将向[=26] 的静态InstanceCreated
集合添加一个委托=] class。
并且在初始化 UploadFileMaintenance
BLC 实例时执行的委托中,我们将向 UploadFileMaintenance
Graph/BLC 的 RowInserted
集合添加一个事件处理程序实例.
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);
}
}
}
Download Acumatica Customization deployment package
以下帮助文章可参考Acumatica自定义指南