在屏幕案例(ScreenID:CR306000)上更改严重性的事件是什么?

What's the event for changing Severity on screen Case (ScreenID: CR306000)?

自定义下面的代码后,我想通过 AssignDateTime 更新 SLA。但是随着严重性的改变,我的 SLA 也发生了变化,从 createdDateTime 获取日期时间。我想它应该还有其他事件需要定制。

protected virtual void CRCase_RowUpdated(PXCache cache, PXRowUpdatedEventArgs e, PXRowUpdated InvokeBaseHandler)
{
    if (InvokeBaseHandler != null)
        InvokeBaseHandler(cache, e);
    var row = e.Row as CRCase;
    var oldRow = e.OldRow as CRCase;
    CRCaseExt rowExt = PXCache<CRCase>.GetExtension<CRCaseExt>(row);

    if (row == null || oldRow == null) return;

    if (row.OwnerID == null)
    {
        row.AssignDate = null;
        row.SLAETA = null;
    }
    else if (oldRow.OwnerID == null)
    {
        row.AssignDate = PXTimeZoneInfo.Now;
        if (row == null || row.AssignDate == null) return;

        if (row.ClassID != null && row.Severity != null)
        {
            var severity = (CRClassSeverityTime)PXSelect<CRClassSeverityTime,
                            Where<CRClassSeverityTime.caseClassID, Equal<Required<CRClassSeverityTime.caseClassID>>,
                            And<CRClassSeverityTime.severity, Equal<Required<CRClassSeverityTime.severity>>>>>
                            .Select(Base, row.ClassID, row.Severity);
            if (severity != null && severity.TimeReaction != null)
            {
                row.SLAETA = ((DateTime)row.AssignDate).AddMinutes((int)severity.TimeReaction);
            }
        }
        if (row.Severity != null && row.ContractID != null)
        {
            var template = (Contract)PXSelect<Contract, Where<Contract.contractID, Equal<Required<CRCase.contractID>>>>.Select(Base, row.ContractID);
            if (template == null) return;
            var sla = (ContractSLAMapping)PXSelect<ContractSLAMapping,
                    Where<ContractSLAMapping.severity, Equal<Required<CRCase.severity>>,
                    And<ContractSLAMapping.contractID, Equal<Required<CRCase.contractID>>>>>
                    .Select(Base, row.Severity, template.TemplateID);
            if (sla != null && sla.Period != null)
            {
                row.SLAETA = ((DateTime)row.AssignDate).AddMinutes((int)sla.Period);
            }
        }
    }
}

您可以使用 FieldUpdated 事件或在行更新事件中查找字段的更改。

例如:row.Severity != oldRow.Severity

SLAETA 字段用 PXFormulaAttribute 修饰,以便在每次对以下字段之一进行更改时引发 FieldDefaulting 事件:

  • CRCase.contractID
  • CRCase.severity
  • CRCase.caseClassID

    public partial class CRCase : IBqlTable, IAssign, IAttributeSupport, IPXSelectable
    {
        ...
    
        #region SLAETA
        public abstract class sLAETA : IBqlField { }
    
        [PXDBDate(PreserveTime = true, DisplayMask = "g")]
        [PXUIField(DisplayName = "SLA")]
        [PXFormula(typeof(Default<CRCase.contractID, CRCase.severity, CRCase.caseClassID>))]
        public virtual DateTime? SLAETA { get; set; }
        #endregion
    
        ...
    
    }
    

最好只在 CRCaseMaint BLC 扩展中自定义 CRCase_SLAETA_FieldDefaulting 处理程序,而不是实现 CRCase_RowUpdated:

public class CRCaseMaint : PXGraph<CRCaseMaint, CRCase>
{
    ...

    protected virtual void CRCase_SLAETA_FieldDefaulting(PXCache sender, PXFieldDefaultingEventArgs e)
    {
        CRCase row = e.Row as CRCase;
        if (row == null || row.CreatedDateTime == null) return;

        if (row.ClassID != null && row.Severity != null)
        {
            var severity = (CRClassSeverityTime)PXSelect<CRClassSeverityTime,
                                                    Where<CRClassSeverityTime.caseClassID, Equal<Required<CRClassSeverityTime.caseClassID>>,
                                                    And<CRClassSeverityTime.severity, Equal<Required<CRClassSeverityTime.severity>>>>>.
                                                    Select(this, row.ClassID, row.Severity);
            if (severity != null && severity.TimeReaction != null)
            {
                e.NewValue = ((DateTime)row.CreatedDateTime).AddMinutes((int)severity.TimeReaction);
                e.Cancel = true;
            }
        }

        if (row.Severity != null && row.ContractID != null)
        {
            var template = (Contract)PXSelect<Contract, Where<Contract.contractID, Equal<Required<CRCase.contractID>>>>.Select(this, row.ContractID);
            if (template == null) return;

            var sla = (ContractSLAMapping)PXSelect<ContractSLAMapping,
                                              Where<ContractSLAMapping.severity, Equal<Required<CRCase.severity>>,
                                              And<ContractSLAMapping.contractID, Equal<Required<CRCase.contractID>>>>>.
                                              Select(this, row.Severity, template.TemplateID);
            if (sla != null && sla.Period != null)
            {
                e.NewValue = ((DateTime)row.CreatedDateTime).AddMinutes((int)sla.Period);
                e.Cancel = true;
            }
        }
    }

    ...
}