如何通过代码调用文件同步操作 (SM202530)

How can I invoke File Synchonization Action via code (SM202530)

我们正在使用文件同步将付款批处理文件发送到外部站点。文件同步仅在每个文件的基础上工作,因此我们设置了一个文件,我们的导出方案将填充该文件。

因为我们需要将此文件的每个版本都发送到外部站点,所以我需要确保同步文件的每个修订版。

我的想法是覆盖批量付款 (AP305000) 上的导出按钮,以在文件同步屏幕上使用导出文件操作调用处理所有文件操作。挑战在于我无法找到要实例化以访问该业务对象的图的名称。

这是我所在的位置:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using PX.Api;
using PX.Data;
using PX.Data.WorkflowAPI;
using PX.Objects.AP;
using PX.Objects.AR;
using PX.Objects.CM;
using PX.Objects.Common.Extensions;
using PX.Objects.CR;
using PX.Objects.CS;
using PX.Objects.GL;
using PX.Objects.AP.MigrationMode;
using PX.Objects;
using PX.Objects.CA;
using PX.Objects.SM;

namespace PX.Objects.CA
{
  public class CABatchEntry_Extension : PXGraphExtension<CABatchEntry>
  {

    [PXOverride]
    public virtual IEnumerable Export(PXAdapter adapter)
    {

      Base.export.Press(adapter);

      //Challenge is here
      SynchronizationProcess docgraph = PXGraph.CreateInstance<SynchronizationProcess>();

      foreach (var action in (docgraph.action.GetState(null) as PXButtonState).Menus)
      {
        if (action.Command == "Process All Files")
        {
          PXAdapter adapter2 = new PXAdapter(new DummyView(docgraph, docgraph.Document.View.BqlSelect, new List<object> { docgraph.Document.Current }));
          adapter2.Menu = action.Command;
          docgraph.action.PressButton(adapter2);

          TimeSpan timespan;
          Exception ex;
          while (PXLongOperation.GetStatus(docgraph.UID, out timespan, out ex) == PXLongRunStatus.InProcess)
          { }
          break;
        }
      }
      return adapter.Get();
    }

    internal class DummyView : PXView
    {
      List<object> _Records;
      internal DummyView(PXGraph graph, BqlCommand command, List<object> records)
               : base(graph, true, command)
      {
        _Records = records;
      }
      public override List<object> Select(object[] currents, object[] parameters, object[] searches, string[] sortcolumns, bool[] descendings, PXFilterRow[] filters, ref int startRow, int maximumRows, ref int totalRows)
      {
        return _Records;
      }
    }

  }
}

您可以编写自己的 PXLongOperation,它将以与页面相同的方式调用处理委托,如下所示。然后您可以使用 PXLongOperation.WaitCompletion(this.Base.UID) 等待该过程完成,然后执行您需要执行的任何其他操作。

public PXAction<SOOrder> RunSynchronization;

[PXButton(CommitChanges = true)]
[PXUIField(DisplayName = "Sync Files")]
protected IEnumerable runSynchronization(PXAdapter adapter)
{
    PXLongOperation.StartOperation(this.Base, () =>
    {
        SynchronizationProcess docgraph = PXGraph.CreateInstance<SynchronizationProcess>();
        docgraph.filter.SetValueExt<SynchronizationFilter.operation>(docgraph.filter.Current,"U"); //U - export D - import
        var records = docgraph.SelectedFiles.Select().RowCast<UploadFileWithIDSelector>().ToList();
        docgraph.SelectedFiles.GetProcessDelegate().DynamicInvoke(records);
    });
    return adapter.Get();
}