如何在自定义处理屏幕中添加流程前执行的自定义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在主流程之前执行,只需遵循以下规则:
- 在主处理方法(
Process/ProcessAll)的最开头调用自定义Action的逻辑,再执行核心流程。 - 如果是通过调度任务(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
相关产品推荐
相关产品推荐

