计算工单结束日期

计算工单结束日期。

本文档介绍如何在 iTop 中自动计算工作订单(WorkOrder)的结束日期,即开始日期加固定延迟(如 2 小时)。更多详细内容请参考 iTop 官方文档

前提条件

目标

自动计算工作订单的结束日期,为其开始日期加上固定的 2 小时延迟。

实现方式

  • 使用 Designer:需要具有 Designer PHP developer 权限
  • 使用扩展:需要已创建扩展

前提条件

默认情况下,WorkOrder 的结束日期是必填的。我们需要更改此逻辑,因为该数据将在保存后自动设置。

使用 Designer

在 Designer 中修改 WorkOrder 类的 end_date 字段,将 is_null_allowed 设为 true

使用扩展

<class id="WorkOrder" _delta="must_exist">
  <fields>
    <field id="end_date">
      <is_null_allowed _delta="redefine">true</is_null_allowed>
    </field>
  </fields>
</class>

计算选项

计算无法通过 XML 完成,需要添加 PHP 方法。可以选择以下事件:

事件可能的回调方法名
创建或更新前(EVENT_DB_BEFORE_WRITE)EvtBeforeWrite(Combodo\iTop\Service\Events\EventData $oEventData)
重新计算对象值(EVENT_DB_COMPUTE_VALUES)EvtComputeValues(Combodo\iTop\Service\Events\EventData $oEventData)

创建或更新前

回调方法

在创建或修改时,如果用户修改了开始日期,结束日期必须自动重新计算:

public function EvtBeforeWrite(Combodo\iTop\Service\Events\EventData $oEventData)
{
   $oStartDate = new DateTime($this->Get('start_date'));
   $oEndDate = clone $oStartDate;
   $iDuration = 2*3600 ; // 2 小时(秒)
   $oEndDate->modify( '+'.$iDuration.' seconds');
   $this->Set('end_date',$oEndDate->Format(AttributeDateTime::GetInternalFormat()));
}

添加事件监听器

<class id="WorkOrder">
  <event_listeners>
    <event_listener id="EvtBeforeWrite" _delta="define">
      <event>EVENT_DB_BEFORE_WRITE</event>
      <rank>10</rank>
      <callback>EvtBeforeWrite</callback>
    </event_listener>
  </event_listeners>
</class>

重新计算对象值

另一个可用于计算字段的事件。逻辑与上述完全相同。

回调方法

public function EvtComputeValues(Combodo\iTop\Service\Events\EventData $oEventData)
{
   $oStartDate = new DateTime($this->Get('start_date'));
   $oEndDate = clone $oStartDate;
   $iDuration = 2*3600 ; // 2 小时(秒)
   $oEndDate->modify( '+'.$iDuration.' seconds');
   $this->Set('end_date',$oEndDate->Format(AttributeDateTime::GetInternalFormat()));
}

添加事件监听器

<class id="WorkOrder">
  <event_listeners>
    <event_listener id="EvtComputeValues" _delta="define">
      <event>EVENT_DB_COMPUTE_VALUES</event>
      <rank>10</rank>
      <callback>EvtComputeValues</callback>
    </event_listener>
  </event_listeners>
</class>

设置字段只读

防止用户输入结束日期,因为上面已通过计算强制设置了其值。

回调方法

创建两个方法,分别控制创建表单和修改表单:

public function evtSetInitialAttributeFlags(Combodo\iTop\Service\Events\EventData $oEventData)
{   
  $this->ForceInitialAttributeFlags('end_date', OPT_ATT_READONLY); 
}
public function evtSetAttributeFlags(Combodo\iTop\Service\Events\EventData $oEventData)
{   
  $this->ForceAttributeFlags('end_date', OPT_ATT_READONLY); 
}

添加事件监听器

<class id="WorkOrder">
  <event_listeners>
    <event_listener id="evtSetInitialFlags" _delta="define">
      <event>EVENT_DB_SET_INITIAL_ATTRIBUTES_FLAGS</event>
      <rank>10</rank>
      <callback>evtSetInitialFlags</callback>
    </event_listener>
    <event_listener id="evtSetAttributeFlags" _delta="define">
      <event>EVENT_DB_SET_ATTRIBUTES_FLAGS</event>
      <rank>10</rank>
      <callback>evtSetAttributeFlags</callback>
    </event_listener>
  </event_listeners>
</class>

原文:https://www.itophub.io/wiki/page?id=3_2_0:customization:compute-field

2025/05/16 15:23 by127.0.0.1

版本:3_2_0/customization/compute-field.txt · Last modified: 2025/05/16 15:23 by 127.0.0.1