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

如何将项目模板中PMTask自定义用户字段值同步至新项目?

解决方案:同步PMTask自定义字段从项目模板到新项目

要实现自定义PMTask字段从项目模板同步到新项目,你可以通过重写项目模板应用的核心方法扩展Acumatica的默认逻辑,以下是两种可行方案:

方案一:重写PMProjectEntry的ApplyTemplate方法

这是最直接的方式,在标准模板应用逻辑执行完成后,手动复制模板任务的自定义字段到新项目任务中。

public class PMProjectEntryExt : PXGraphExtension<PMProjectEntry>
{
    public delegate void ApplyTemplateDelegate(PMProject templateProject);

    [PXOverride]
    public void ApplyTemplate(PMProject templateProject, ApplyTemplateDelegate baseMethod)
    {
        // 执行Acumatica默认的模板同步逻辑
        baseMethod(templateProject);

        // 获取模板项目下的所有任务
        var templateTasks = PXSelect<PMTask, 
            Where<PMTask.projectID, Equal<Required<PMTask.projectID>>>>
            .Select(Base, templateProject.ProjectID);

        PMProject newProject = Base.Project.Current;
        if (newProject == null) return;

        // 遍历模板任务,匹配新项目任务并同步自定义字段
        foreach (PMTask templateTask in templateTasks)
        {
            PMTask newTask = PXSelect<PMTask, 
                Where<PMTask.projectID, Equal<Required<PMTask.projectID>>, 
                And<PMTask.taskCD, Equal<Required<PMTask.taskCD>>>>>
                .Select(Base, newProject.ProjectID, templateTask.TaskCD);

            if (newTask != null)
            {
                // 替换为你的自定义字段名称,这里假设字段是UsrAssignedUser
                newTask.SetExt<PMTaskExt>(ext =>
                {
                    ext.UsrAssignedUser = templateTask.GetExtension<PMTaskExt>().UsrAssignedUser;
                });

                Base.Tasks.Update(newTask);
            }
        }

        Base.Actions.PressSave();
    }
}

方案二:通过PMTask的RowInserting事件同步

在新项目任务插入时,从模板任务中读取自定义字段值并赋值,适合需要实时同步的场景:

public class PMTaskExt : PXCacheExtension<PMTask>
{
    public void _(Events.RowInserting<PMTask> e)
    {
        PMTask newTask = e.Row as PMTask;
        if (newTask == null) return;

        // 获取当前项目,确认是否来自模板创建
        PMProjectEntry projectGraph = PXGraph.CreateInstance<PMProjectEntry>();
        PMProject currentProject = projectGraph.Project.Search<PMProject.projectID>(newTask.ProjectID);
        if (currentProject?.TemplateID == null) return;

        // 根据任务编号匹配模板中的对应任务
        PMTask templateTask = PXSelect<PMTask, 
            Where<PMTask.projectID, Equal<Required<PMTask.projectID>>, 
            And<PMTask.taskCD, Equal<Required<PMTask.taskCD>>>>>
            .Select(projectGraph, currentProject.TemplateID, newTask.TaskCD);

        if (templateTask != null)
        {
            // 同步自定义字段
            newTask.SetExt<PMTaskExt>(ext =>
            {
                ext.UsrAssignedUser = templateTask.GetExtension<PMTaskExt>().UsrAssignedUser;
            });
        }
    }
}

关键注意事项

  • 确保自定义字段已在PMTask的DAC扩展(如PMTaskExt)中正确定义,且在项目模板和项目的任务界面均配置了可见性。
  • 方案一更推荐,因为它在模板同步完成后批量处理任务,避免了RowInserting事件中可能出现的上下文依赖问题。
  • 测试时,先创建并保存带有自定义字段值的项目模板,再通过该模板创建新项目,验证任务的自定义字段是否同步成功。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 18:52:56