You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在自定义处理屏幕中添加流程前执行的自定义Action?

Acumatica自定义处理屏幕流程前自动触发Action实现方案

1. 创建带自定义Action选项的筛选下拉字段

根据你使用的Action类型(工作流关联/独立自定义),有两种配置方式:

方式1:关联工作流的批量Action

如果你要触发的是工作流中定义的批量操作Action,直接保留PXWorkflowMassProcessing属性即可——该属性会自动从当前实体的工作流中提取所有标记为「Mass Processing」类型的Action,无需手动添加下拉选项:

[PXWorkflowMassProcessing(DisplayName = "操作")]
[PXUIField(DisplayName = "操作")]
public virtual string Action { get; set; }
public abstract class action : PX.Data.BQL.BqlString.Field<action> { }

注意:需要在工作流设计器中,给目标实体添加「Mass Processing」类型的Action,才能让该属性自动加载选项。

方式2:独立自定义Action

如果是完全独立的自定义Action,手动添加PXStringList属性定义下拉选项的键值对:

[PXStringList(
    new string[] { "MyPreProcessAction" }, // 后台标识值
    new string[] { "执行预处理操作" }       // 前端显示文本
)]
[PXUIField(DisplayName = "操作")]
public virtual string Action { get; set; }
public abstract class action : PX.Data.BQL.BqlString.Field<action> { }

2. 执行自定义Action的实现

在处理屏幕的Graph类中,先定义自定义Action的逻辑,再在主流程入口中调用:

步骤1:定义自定义Action方法

public PXAction<YourFilterDAC> preProcessAction;

[PXButton(CommitChanges = true)]
[PXUIField(DisplayName = "执行预处理操作")]
protected virtual IEnumerable PreProcessAction(PXAdapter adapter)
{
    // 这里写你的自定义预处理逻辑
    // 示例:遍历筛选后的目标记录执行操作
    foreach (var record in Base.YourPrimaryView.Select())
    {
        // 比如更新记录状态、调用业务方法等
        // record.YourField = "预处理完成";
        // Base.YourPrimaryView.Update(record);
    }
    return adapter.Get();
}

步骤2:在主流程中触发自定义Action

找到屏幕的主处理入口方法(通常是Process或ProcessAll),在原有流程逻辑前判断并执行自定义Action:

public PXAction<YourFilterDAC> process;

[PXButton(CommitChanges = true)]
[PXUIField(DisplayName = "处理")]
protected virtual IEnumerable Process(PXAdapter adapter)
{
    var filter = Base.Filter.Current;
    
    // 判断用户选择的是自定义预处理Action
    if (filter?.Action == "MyPreProcessAction")
    {
        // 触发自定义Action
        Base.PreProcessAction.Press();
    }

    // 执行原有的流程处理逻辑
    foreach (var record in Base.YourPrimaryView.Select())
    {
        // 你的核心流程代码
    }

    return adapter.Get();
}

3. 确保Action在流程前触发的时机控制

要保证自定义Action在主流程之前执行,只需遵循以下规则:

  1. 在主处理方法(Process/ProcessAll)的最开头调用自定义Action的逻辑,再执行核心流程。
  2. 如果是通过调度任务(Schedule)自动执行,需要在ProcessAll方法中添加同样的前置触发逻辑(调度任务默认调用ProcessAll):
public virtual IEnumerable ProcessAll(PXAdapter adapter)
{
    var filter = Base.Filter.Current;
    if (filter?.Action == "MyPreProcessAction")
    {
        Base.PreProcessAction.Press();
    }

    // 原ProcessAll的核心流程逻辑
    return adapter.Get();
}

如果不需要用户选择Action,而是强制每次流程前都执行预处理,直接去掉判断条件,在主处理方法开头直接调用Base.PreProcessAction.Press()即可。

内容的提问来源于stack exchange,提问作者pmfith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 20:46:16