Принтер не может получить работу от DeviceHub - PullRequest
5 голосов
/ 10 июня 2019

У меня есть точная ситуация, описанная в этом вопросе: Связь Device Hub с очередью принтера

Из-за того, что у вопроса нет ни принятого, ни приемлемого ответа, я снова задаю вопрос.

Я настроил DeviceHub с помощью Acumatica, и мой принтер отображается. Я отправляю задание на печать через PXAction. После выполнения действия DeviceHub регистрирует успешный прием задания, но очередь принтера не получает его.

Вот мой код, потому что это StackOverflow:

public PXAction<PX.Objects.CR.BAccount> PrintAddressLabel;

[PXButton(CommitChanges=true)]
[PXUIField(DisplayName = "Print Label")]
protected void printAddressLabel()
{
  BAccount baccount = Base.Caches[typeof(BAccount)].Current as BAccount;
  string bAccountID = baccount.BAccountID.ToString();

  Dictionary<string, string> parameters = new Dictionary<string, string>();
  parameters["BAccountID"] = bAccountID;

  PXReportRequiredException ex = null;
  ex = PXReportRequiredException.CombineReport(ex, "ZRCRADDR", parameters);
  SMPrintJobMaint.CreatePrintJobGroup("DYMOLABEL", ex, "Address Label");
}

Может ли кто-нибудь указать мне полезное направление?

EDIT:

После дальнейшего тестирования я обнаружил следующее:

Acumatica будет успешно печатать на моем принтере DeviceHub с использованием встроенных процессов печати. Однако при печати одного из этих заданий в журналах DeviceHub отображается событие POLL. При попытке печати из моего кода DeviceHub записывает событие NT, которое никогда не попадает в очередь принтера.

При дальнейшем тестировании в 2019 году R1 журналы немного изменились. Печать счетов из Acumatica также приводит к событию NT. Однако есть одна строка, отличающаяся от задания, созданного в Acumatica, и задания, созданного в коде.

Зеленый = работа от Acumatica

Оранжевый = работа из кода

В задании, отправленном с кодом, отсутствует строка Printer DYMOLABEL - printing PDF to \\*printer*.

Ответы [ 2 ]

3 голосов
/ 11 июня 2019

Если я правильно понимаю, вам нужно добавить отчет через экран Automation Steps и связать его с DeviceHub.
Пример был написан для Invoices , когда будет работать процесс, при котором нужно распечатать Invoice, тогда будут использованы следующие настройки:

public class CustomEntry : PXGraph<CustomEntry>
{
 [PXQuickProcess.Step.IsBoundToAttribute(typeof(UsrPath.SO303000.Balanced.Report.PrintLabelReport), false)][PXQuickProcess.Step.RequiresStepsAttribute(typeof(SOQuickProcessParameters.prepareInvoice))]
 [PXQuickProcess.Step.IsInsertedJustAfterAttribute(typeof(SOQuickProcessParameters.prepareInvoice))]
 [PXQuickProcess.Step.IsApplicableAttribute(typeof(Where<Current<SOOrderType.behavior>, In3<SOOrderTypeConstants.salesOrder, SOOrderTypeConstants.invoiceOrder, SOOrderTypeConstants.creditMemo>, And<Current<SOOrderType.aRDocType>, NotEqual<ARDocType.noUpdate>>>))]
 protected virtual void SOQuickProcessParameters_PrintInvoice_CacheAttached(PXCache sender)
 {
 }
}
public static class UsrPath
{
 public static class SO303000
 {
    public static readonly Type GroupGraph = typeof(SOInvoiceEntry);
    public static class Balanced
    {
        public const string GroupStepID = "Balanced";
        public static class Report
        {
            public const string GroupActionID = "Report";
            public class PrintLabelReport : PXQuickProcess.Step.IDefinition
            {
                public Type Graph
                {
                    get
                    {
                        return UsrPath.SO303000.GroupGraph;
                    }
                }
                public string StepID
                {
                    get
                    {
                        return "Balanced";
                    }
                }
                public string ActionID
                {
                    get
                    {
                        return "Report";
                    }
                }
                public string MenuID
                {
                    get
                    {
                        return "Print Label";
                    }
                }
                public string OnSuccessMessage
                {
                    get
                    {
                        return "<Invoice form> is prepared";
                    }
                }
                public string OnFailureMessage
                {
                    get
                    {
                        return "Preparing Invoice form";
                    }
                }
            }
        }
     }
  }
}  

Обновленный ответ

 public PXAction<BAccount> PrintAddressLabel;
    [PXButton(CommitChanges = true)]
    [PXUIField(DisplayName = "Print Label")]
    protected virtual IEnumerable printAddressLabel(PXAdapter adapter)
    {
        List<BAccount> list = adapter.Get<BAccount>().ToList<BAccount>();
        int? branchID = this.Base.Accessinfo.BranchID;
        const string reportID = "YOUR_REPORT_ID";
        Dictionary<string, string> dictionary = new Dictionary<string, string>();
        Dictionary<string, PXReportRequiredException> dictionary2 = new Dictionary<string, PXReportRequiredException>();
        PXReportRequiredException ex = null;
        foreach (BAccount account in list)
        {
            dictionary["BAccountID"] = account.AcctCD;
            ex = PXReportRequiredException.CombineReport(ex, null, dictionary);
            object row = PXSelectorAttribute.Select<BAccount.bAccountID>(this.Base.BAccount.Cache, account);
            string text = new NotificationUtility(this.Base).SearchReport(null, row, reportID, branchID);
            //I think you get this problem due to absence of this line
            PrintParameters printParams = new PrintParameters
            {
                PrintWithDeviceHub = true,
                DefinePrinterManually = true,
                PrinterName = "DYMOLABEL"
            };
            dictionary2 = SMPrintJobMaint.AssignPrintJobToPrinter(dictionary2, dictionary, printParams, new NotificationUtility(this.Base).SearchPrinter, null, reportID, reportID, this.Base.Accessinfo.BranchID);
        }
        if (ex != null)
        {
            SMPrintJobMaint.CreatePrintJobGroups(dictionary2);
            throw ex;
        }
        return adapter.Get();
    }

    [Serializable]
    [PXCacheName("Print Parameters")]
    public partial class PrintParameters : IBqlTable, IPrintable
    {
        #region PrintWithDeviceHub
        [PXDBBool]
        [PXDefault(typeof(FeatureInstalled<FeaturesSet.deviceHub>))]
        public virtual bool? PrintWithDeviceHub { get; set; }
        public abstract class printWithDeviceHub : IBqlField { }
        #endregion

        #region DefinePrinterManually
        [PXDBBool]
        [PXDefault(true)]
        public virtual bool? DefinePrinterManually { get; set; }
        public abstract class definePrinterManually : IBqlField { }
        #endregion

        #region PrinterName
        [PXPrinterSelector]
        public virtual string PrinterName { get; set; }
        public abstract class printerName : IBqlField { }
        #endregion
    }  

Конфигурация концентратора устройства

0 голосов
/ 01 июля 2019

Я не решаюсь опубликовать это как ответ, потому что код очень похож на то, что написал Вардан.Но этот код не работает для меня, и этот код работает.Это на самом деле происходит по той же ссылке, на которую он ссылался, но это из исходного кода, который связан в самом конце, который был добавлен из-за моего комментария к его сообщению.Я немного изменил код, потому что он мне не нужен, чтобы делать все, что он делал.

Надеюсь, он может кому-то помочь.

Пользовательские классы :

[System.SerializableAttribute]
public partial class PrintParameters : IBqlTable, PX.SM.IPrintable
{
  #region PrintWithDeviceHub
  public abstract class printWithDeviceHub : IBqlField { }

  [PXDBBool]
  [PXDefault(typeof(FeatureInstalled<FeaturesSet.deviceHub>))]
  [PXUIField(DisplayName = "Print with DeviceHub")]
  public virtual bool? PrintWithDeviceHub { get; set; }
  #endregion

  #region DefinePrinterManually
  public abstract class definePrinterManually : IBqlField { }

  [PXDBBool]
  [PXDefault(true)]
  [PXUIField(DisplayName = "Define Printer Manually")]
  public virtual bool? DefinePrinterManually { get; set; }
  #endregion

  #region Printer
  public abstract class printerName : PX.Data.IBqlField { }

  [PX.SM.PXPrinterSelector]
  public virtual string PrinterName { get; set; }
  #endregion
}

public class CsPrintMaint : PXGraph<CsPrintMaint>
{
  public void PrintReportInDeviceHub(string reportID, Dictionary<string, string> parametersDictionary, string printerName, int? branchID)
  {
    Dictionary<string, PXReportRequiredException> reportsToPrint = new Dictionary<string, PXReportRequiredException>();
    PrintParameters filter = new PrintParameters();
    filter.PrintWithDeviceHub = true;
    filter.DefinePrinterManually = true;
    filter.PrinterName = printerName;

    reportsToPrint = PX.SM.SMPrintJobMaint.AssignPrintJobToPrinter(reportsToPrint, parametersDictionary, filter, 
           new NotificationUtility(this).SearchPrinter, CRNotificationSource.BAccount, reportID, reportID, branchID);

    if (reportsToPrint != null)
    {
      PX.SM.SMPrintJobMaint.CreatePrintJobGroups(reportsToPrint);
    }
  }
}

Расширение BusinessAccountMaint:

public class BusinessAccountMaint_Extension : PXGraphExtension<BusinessAccountMaint>
{
  public PXAction<BAccount> printAddressLabelNH;
  [PXButton(CommitChanges = true)]
  [PXUIField(DisplayName = "Print Label (NH)")]
  public virtual IEnumerable PrintAddressLabelNH(PXAdapter adapter)
  {
    int? branchID = this.Base.Accessinfo.BranchID;
    Dictionary<string, string> parametersDictionary = new Dictionary<string, string>();
    BAccount bAccount = this.Base.Caches[typeof(BAccount)].Current as BAccount;
    parametersDictionary["BAccount.BAccountID"] = bAccount.BAccountID.ToString();

    CsPrintMaint printMaintGraph = PXGraph.CreateInstance<CsPrintMaint>();

    printMaintGraph.PrintReportInDeviceHub("ZRADDRBA", parametersDictionary, "DYMOLBLNH", branchID);

    return adapter.Get();
  }
}
...