在确认Acumatica中的装运时如何旋转从承运人检索到的装运标签图像?

问题描述 投票:0回答:1

我们正在Acumatica中使用自定义的装箱单报告,该报告适用于所有不同类型的承运人(UPS,FedEx,USPS等),并且要求货运标签图像没有任何旋转。

通过Stamps.com和FedEx检索的运输标签图像没有任何旋转,但是通过UPS承运商集成运输的运输标签图像是开箱即用顺时针旋转270度,并且与固定位置的指定区域(粘合剂)不太匹配/报告。

acumatica acumatica-kb
1个回答
0
投票

UPS运送标签API没有选项来指定运送标签图像的旋转度。我们将通过定制ShipmentEntry图/ BLC和Shipment Entry screen (SO302000)一起解决此问题。

[当前工作流程不会有任何变化(最终用户角度)。在Acumatica中确认发货后,便会生成标签并从UPS检索标签,在此过程中,我们的自定义操作将顺时针旋转90度(仅当Ship-Via on Shipment与UPS Plug-in一起使用且标签格式为GIF时)。此UPS标签将与通过其他插件(FedEx和Stamps.com)生成的标签对齐。并且在报告级别不需要调整。

发货标签是通过ShipPackages图形/ BLC中的ShipmentEntry虚拟方法生成的。因此,我们将在ShipPackages Graph / BLC的Graph / BLC扩展中重写ShipmentEntry虚拟方法。

    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图形/ BLC执行的。我们将通过将RowInserted DAC的UploadFileRevision事件处理程序添加到UploadFileMaintenance图形来扩展逻辑。

因为UploadFileMaintenance BLC实例是在ShipPackages中创建的,并且在执行之前不可用,所以我们将向InstanceCreated类的静态PXGraph集合中添加一个委托。

并且在初始化UploadFileMaintenance BLC实例时执行的委托中,我们将向RowInserted Graph / BLC实例的UploadFileMaintenance集合添加事件处理程序。

    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自定义指南的信息>>

To Explore the C# Code of a BLC

To Override a Virtual Method

© www.soinside.com 2019 - 2024. All rights reserved.