acumatica - 如何通过自动化步骤在Acumatica中使用分配和批准图?

标签 acumatica acumatica-kb

我需要制作使用情况分配和批准图。在EP205000页上构建的 map 使用模板是什么?我在Acumatica的文件coderepository.xml中进行了研究,发现其中有EPApprovalAutomation类。我想使用它,但它要求在参数之间使用实现IAssignedMap接口(interface)的类。这带来了另一个问题,因为IAssignedMap接口(interface)是内部的,这又带来了另一个难题,如何使用IAssignedMap接口(interface)?什么是替代品?

最佳答案

这个答案可能会晚一点,但是我相信它对其他人可能有用,因此我将与大家分享。

数据库的新表和字段

XXSetupApproval

在您的模块中添加用于批准设置的新设置表(进一步XXSetupApproval)。您可以在下面看到所有必填字段,但是如果您想为不同类型的实体划分批准,则可能需要添加任何其他参数。

CREATE TABLE XXSetupApproval
(
    CompanyID int NOT NULL,
    ApprovalID int NOT NULL identity,
    AssignmentMapID int NOT NULL,
    AssignmentNotificationID int NULL,
    CreatedByID uniqueidentifier NOT NULL,
    CreatedByScreenID char(8) NOT NULL,
    CreatedDateTime datetime NOT NULL,
    LastModifiedByID uniqueidentifier NOT NULL,
    LastModifiedByScreenID char(8) NOT NULL,
    LastModifiedDateTime datetime NOT NULL,
    Tstamp timestamp NULL,
    IsActive bit NOT NULL
)
GO

ALTER TABLE XXSetupApproval
    ADD CONSTRAINT XXSetupApproval_PK PRIMARY KEY CLUSTERED (CompanyID, ApprovalID) 
GO

XX注册

修改您需要实现批准机制的实体表(进一步XXRegister)。您的实体应包括三个必填字段,您可以在下面看到它们。
OwnerID uniqueidentifier NULL,
WorkGroupID int NULL,
Approved bit NOT NULL

XX设置

修改模块中主要设置的表(进一步修改XXSetup)。您的设置应包括一个必填字段,您可以在下面看到。根据您的实体名称为该标志命名,因为它将指示是否启用了批准机制(进一步请参见XXRequestApproval)。
XXRequestApproval bit NULL

数据库的新更新脚本

更新XXRegister表,并根据您的条件为所有现有记录将Approved标志设置为1。使用您自己的表达式而不是三个点。
EXEC sp_executesql N'UPDATE XXRegister SET Approved = 1 WHERE ...'

代码的新表和字段

AssignmentMapTypeXX

将您的实体添加到AssignmentMapType类(进一步为AssignmentMapTypeXX)。此类型应仅用于选择所需类型的分配图。
public static class AssignmentMapType
{
    ...
    public class AssignmentMapTypeXX : Constant<string>
    {
        public AssignmentMapTypeXX() : base(typeof(XXRegister).FullName) { }
    }
    ...
}

XX设置

根据数据库中的新字段,将新的属性和类添加到XXSetup DAC。如果需要,请使用其他任何属性。
#region XXRequestApproval
public abstract class xXRequestApproval : PX.Data.IBqlField { }
[EPRequireApproval]
[PXDefault(false, PersistingCheck = PXPersistingCheck.Null)]
[PXUIField(DisplayName = "Require Approval")]
public virtual bool? XXRequestApproval { get; set; }       
#endregion

XXSetupApproval

根据数据库中的XXSetupApproval表将新的DAC添加到代码中。 XXSetupApproval DAC应该实现IAssignedMap接口(interface)(AssignmentMapID,AssignmentNotificationID,IsActive字段)。如果需要,请使用其他任何属性。
[Serializable]
public partial class XXSetupApproval : IBqlTable, IAssignedMap
{
    #region ApprovalID
    public abstract class approvalID : IBqlField { }
    [PXDBIdentity(IsKey = true)]
    public virtual int? ApprovalID { get; set; }
    #endregion

    #region AssignmentMapID
    public abstract class assignmentMapID : IBqlField { }
    [PXDefault]
    [PXDBInt]
    [PXSelector(typeof(Search<EPAssignmentMap.assignmentMapID, Where<EPAssignmentMap.entityType, Equal<AssignmentMapType.AssignmentMapTypeXX>>>), 
        DescriptionField = typeof(EPAssignmentMap.name))]
    [PXUIField(DisplayName = "Approval Map")]
    public virtual int? AssignmentMapID { get; set; }
    #endregion

    #region AssignmentNotificationID
    public abstract class assignmentNotificationID : IBqlField { }
    [PXDBInt]
    [PXSelector(typeof(PX.SM.Notification.notificationID), SubstituteKey = typeof(PX.SM.Notification.name))]
    [PXUIField(DisplayName = "Pending Approval Notification")]
    public virtual int? AssignmentNotificationID { get; set; }
    #endregion

    #region tstamp
    public abstract class Tstamp : IBqlField { }
    [PXDBTimestamp()]
    public virtual byte[] tstamp { get; set; }     
    #endregion

    #region CreatedByID
    public abstract class createdByID : IBqlField { }
    [PXDBCreatedByID()]
    public virtual Guid? CreatedByID { get; set; }     
    #endregion

    #region CreatedByScreenID
    public abstract class createdByScreenID : IBqlField { }
    [PXDBCreatedByScreenID()]
    public virtual string CreatedByScreenID { get; set; }          
    #endregion

    #region CreatedDateTime
    public abstract class createdDateTime : IBqlField { }
    [PXDBCreatedDateTime()]
    public virtual DateTime? CreatedDateTime { get; set; }         
    #endregion

    #region LastModifiedByID
    public abstract class lastModifiedByID : IBqlField { }
    [PXDBLastModifiedByID()]
    public virtual Guid? LastModifiedByID { get; set; }        
    #endregion

    #region LastModifiedByScreenID
    public abstract class lastModifiedByScreenID : IBqlField { }
    [PXDBLastModifiedByScreenID()]
    public virtual string LastModifiedByScreenID { get; set; }         
    #endregion

    #region LastModifiedDateTime
    public abstract class lastModifiedDateTime : IBqlField { }
    [PXDBLastModifiedDateTime()]
    public virtual DateTime? LastModifiedDateTime { get; set; }        
    #endregion

    #region IsActive
    public abstract class isActive : IBqlField { }
    [PXDBBool()]
    [PXDefault(typeof(Search<XXSetup.xXRequestApproval>), PersistingCheck = PXPersistingCheck.Nothing)]
    public virtual bool? IsActive { get; set; }
    #endregion
}

XX注册

将PXEmailSource属性添加到XXRegister DAC,这是“分配和批准图”树选择器所必需的。
[PXEMailSource]
public partial class XXRegister : IBqlTable, EP.IAssign ...

根据数据库中的新字段,将新的属性和类添加到XXRegister DAC。 XXRegister DAC应该实现IAssign接口(interface)(OwnerID,WorkgroupID字段)。如果需要,请使用其他任何属性。使用您自己的表达式而不是三个点。
#region OwnerID
public abstract class ownerID : IBqlField { }
[PXDBGuid()]
[PXDefault(typeof(...), PersistingCheck = PXPersistingCheck.Nothing)]
[PX.TM.PXOwnerSelector()]
[PXUIField(DisplayName = "Owner")]
public virtual Guid? OwnerID { get; set; }
#endregion

#region WorkgroupID
public abstract class workgroupID : IBqlField { }
[PXDBInt]
[PXDefault(typeof(...), PersistingCheck = PXPersistingCheck.Nothing)]
[PX.TM.PXCompanyTreeSelector]
[PXUIField(DisplayName = "Workgroup", Enabled = false)]
public virtual int? WorkgroupID { get; set; }      
#endregion

#region Approved
public abstract class approved : IBqlField { }
[PXDBBool]
[PXDefault(false, PersistingCheck = PXPersistingCheck.Nothing)]
[PXUIField(DisplayName = "Approved", Visibility = PXUIVisibility.Visible, Enabled = false)]
public virtual bool? Approved { get; set; }    
#endregion

#region Rejected
public abstract class rejected : IBqlField { }
[PXBool]
[PXDefault(false, PersistingCheck = PXPersistingCheck.Nothing)]
public bool? Rejected { get; set; }    
#endregion

状态

为实体添加新的批准状态,并在列表中使用它们。如果已经使用了“P”和“R”,请使用其他字母。
public const string PendingApproval = "P";
public const string Rejected = "R";

public class ListAttribute : PXStringListAttribute
{
    public ListAttribute() : base(
    new string[] { ..., PendingApproval, Rejected, ... },
    new string[] { ..., EP.Messages.PendingApproval, EP.Messages.Rejected, ... }) { ; }
}

实体的图的新代码

在与您的实体一起操作的图形中实现EPApprovalAutomation帮助器。使用您自己的参数而不是三个点。
public EPApprovalAutomation<...> Approval;

为XXSetupApproval DAC添加 View 。使用您自己的表达式而不是三个点。
public PXSelect<XXSetupApproval, Where<...>> SetupApproval;

用于主设置的图形的新代码

为XXSetupApproval DAC添加 View 。
public PXSelect<APSetupApproval> SetupApproval;

根据XXRequestApproval字段的新值更新每个XXSetupApproval行。
protected virtual void XXSetup_XXRequestApproval_FieldVerifying(PXCache sender, PXFieldVerifyingEventArgs e)
{
    PXCache cache = this.Caches[typeof(XXSetupApproval)];
    foreach (XXSetupApproval setup in PXSelect<XXSetupApproval>.Select(this))
    {
        setup.IsActive = (bool?)e.NewValue;
        cache.Update(setup);
    }
}

网页的新表和字段

XXSetup.aspx

将带有批准设置的新选项卡添加到设置的主页(进一步为XXSetup.aspx)。如果需要,请使用其他任何参数。
<px:PXTabItem Text="Approval">             
    <Template>
        <px:PXPanel ID="panelApproval" runat="server" >
            <px:PXLayoutRule runat="server" LabelsWidth="S" ControlSize="XM" />
            <px:PXCheckBox ID="chkXXRequestApproval" runat="server" AlignLeft="True" Checked="True" DataField="XXRequestApproval" CommitChanges="True" />                    
        </px:PXPanel>
        <px:PXGrid ID="gridApproval" runat="server" DataSourceID="ds" SkinID="Details" Width="100%" >
            <AutoSize Enabled="True" />
            <Levels>
                <px:PXGridLevel DataMember="SetupApproval" >
                    <RowTemplate>
                        <px:PXLayoutRule runat="server" StartColumn="True" LabelsWidth="M" ControlSize="XM" />
                        <px:PXSelector ID="edAssignmentMapID" runat="server" DataField="AssignmentMapID" AllowEdit="True" CommitChanges="True" />
                        <px:PXSelector ID="edAssignmentNotificationID" runat="server" DataField="AssignmentNotificationID" AllowEdit="True" />
                    </RowTemplate>
                    <Columns>
                        <px:PXGridColumn DataField="AssignmentMapID" Width="250px" RenderEditorText="True" TextField="AssignmentMapID_EPAssignmentMap_Name" />
                        <px:PXGridColumn DataField="AssignmentNotificationID" Width="250px" RenderEditorText="True" />
                    </Columns>
                </px:PXGridLevel>
            </Levels>                       
        </px:PXGrid>
        </Template>
</px:PXTabItem>

XXRegister.aspx

将新字段“已批准”添加到实体的主页(进一步为XXRegister.aspx)。如果需要,请使用其他任何参数。
<px:PXCheckBox ID="chkApproved" runat="server" DataField="Approved" CommitChanges="True" Enabled="False" />

将带有批准信息的新选项卡添加到XXRegister.aspx网页。如果需要,请使用其他任何参数。
<px:PXTabItem Text="Approval Details" BindingContext="form" RepaintOnDemand="false">
    <Template>
        <px:PXGrid ID="gridApproval" runat="server" DataSourceID="ds" Width="100%" SkinID="DetailsInTab" NoteIndicator="True" Style="left: 0px; top: 0px;">
            <AutoSize Enabled="True" />
            <Mode AllowAddNew="False" AllowDelete="False" AllowUpdate="False" />
            <Levels>
                <px:PXGridLevel DataMember="Approval">
                    <Columns>
                        <px:PXGridColumn DataField="ApproverEmployee__AcctCD" Width="160px" />
                        <px:PXGridColumn DataField="ApproverEmployee__AcctName" Width="160px" />
                        <px:PXGridColumn DataField="ApprovedByEmployee__AcctCD" Width="100px" />
                        <px:PXGridColumn DataField="ApprovedByEmployee__AcctName" Width="160px" />
                        <px:PXGridColumn DataField="ApproveDate" Width="90px" />
                        <px:PXGridColumn DataField="Status" AllowNull="False" AllowUpdate="False" RenderEditorText="True"/>
                        <px:PXGridColumn DataField="WorkgroupID" Width="150px" />
                    </Columns>
                </px:PXGridLevel>
            </Levels>
        </px:PXGrid>
    </Template>
</px:PXTabItem>

自动化定义的新自动化步骤

这是批准实现过程中最困难的部分,因为应该在实体的当前行为范围内创建一些新的自动化步骤。例如,实体具有相应的下一个状态和自动化步骤:“保留”->“打开”。我们应该在这两个步骤之间实现批准机制。然后应创建三个新的自动化步骤:“保留”(如果我们不需要批准文档),“保留待批准”(如果我们需要批准文档),“待批准”(从以下步骤开始)实体应被批准还是拒绝)。新的生命周期将如下所示:“保留”->“保留开放”或“保留待批准”->“开放”或“待批准”。因此,“保持打开”和“等待批准”自动化步骤仅仅是确定“保持”之后应使用哪个自动化步骤的开关。
<Step StepID="Hold-Open" Description="Hold-Open" GraphName="…" ViewName="Document" TimeStampName="tstamp">
    <Filter FieldName="Status" Condition="Equals" Value="H" Operator="And" />
    <Filter FieldName="Hold" Condition="Equals" Value="False" Value2="False" Operator="And" />
    <Filter FieldName="Approved" Condition="Equals" Value="True" Value2="False" Operator="And" />
    <Action ActionName="*" IsDefault="1">
        <Fill FieldName="Status" Value="N" />
    </Action>
 </Step>
<Step StepID="Hold-Pending Approval" Description="Hold-Pending Approval" GraphName="…" ViewName="Document" TimeStampName="tstamp">
    <Filter OpenBrackets="1" FieldName="Status" Condition="Equals" Value="H" Operator="Or" />
    <Filter FieldName="Status" Condition="Equals" Value="N" CloseBrackets="1" Operator="And" />
    <Filter FieldName="Hold" Condition="Equals" Value="False" Value2="False" Operator="And" />
    <Filter FieldName="Approved" Condition="Equals" Value="False" Value2="False" Operator="And" />
    <Action ActionName="*" IsDefault="1">
        <Fill FieldName="Status" Value="P" />
    </Action>
</Step>

















感谢Acumatica开发团队的Evgeny Kralko的工作。

关于acumatica - 如何通过自动化步骤在Acumatica中使用分配和批准图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32400353/

相关文章:

docker - Acumatica - 在一台计算机上安装多个版本

acumatica - 如何在 acumatica 门户中获取登录的企业帐户 ID?

acumatica - 设置 SOLine 网格中字段的默认值

c# - Acumatica:PXLongOperation 意外行为导致 UI 无一异常(exception)地崩溃

acumatica - 通过 Web 服务 API 添加销售订单时如何覆盖税务详细信息

rest - 在 Acumatica 中使用 REST API 将数据提供程序和场景替换为代码

acumatica - Excel文件生成-公开的API/方法?

c# - 我如何使用不同的提供商从 Acumatica ERP 发送短信?

acumatica - 我们如何在 Acumatica 中添加对自定义新屏幕的通用搜索