DFP 销售管理系统工作流程

本指南阐明了工作流程请求的定义以及两种不同的工作流程请求,并逐步介绍了如何在 API 中创建 WorkflowApprovalRequestWorkflowExternalConditionRequest 对象。

基础入门

DFP 销售管理系统中的工作流程指的是提案在售出前必须经历的几组规则。例如,如果发布商要求预留的展示次数超过 1000 次的所有提案必须获得公司内相关人员的批准,则会在 DFP 销售管理系统界面中定义一个 WorkflowRequest 来提供该项验证。

有以下两种类型的工作流程请求:

  • WorkflowApprovalRequest:这种对象需要获得由前端用户或 API 请求执行的审批操作,然后才能继续在工作流程链中运行。
  • WorkflowExternalConditionRequest:当外部系统在 DFP 广告管理系统(以下简称 DFP)外部执行一些逻辑来决定是要触发还是跳过工作流程链中的下一步操作之前,这种对象将一直处于待处理状态。这类请求适用于因太过复杂而无法使用仅限系统的规则进行定义的发布商工作流程。
工作流程与 RateCard 对象相关联,并会针对使用对应价目表的所有提案应用其规则。

提取工作流程请求

在大多数情况下,当与工作流程请求进行互动时,您将提取并进行属于单个提案的特定工作流程请求的验证。由于一个工作流程可能同时包含审批和外部条件这两个类型请求,因此必须将 type 传递到相应的查询语句。

要查看针对某个提案的所有待处理工作流程外部条件请求,请对 WorkflowRequestServiceInterface 进行实例化:

Java

  // Get the WorkflowRequestService.
  WorkflowRequestServiceInterface workflowRequestService =
      dfpServices.get(session, WorkflowRequestServiceInterface.class);
    

对于工作流程审批请求,请按 WORKFLOW_APPROVAL_REQUEST 类型、实体类型 PROPOSAL 以及 approvalStatus 为 PENDING_APPROVAL 的特定 Proposal 的 ID 进行过滤。

Java

  // Create a statement to select workflow approval requests for a proposal.
  StatementBuilder statementBuilder = new StatementBuilder()
      .where("WHERE entityId = :entityId and entityType = :entityType "
          + "and type = :type and approvalStatus = :approvalStatus")
      .orderBy("id ASC")
      .limit(StatementBuilder.SUGGESTED_PAGE_LIMIT)
      .withBindVariableValue("entityId", proposalId)
      .withBindVariableValue("entityType", WorkflowEntityType.PROPOSAL.toString())
      .withBindVariableValue("approvalStatus",
          WorkflowApprovalRequestStatus.PENDING_APPROVAL.toString())
      .withBindVariableValue("type", WorkflowRequestType.WORKFLOW_APPROVAL_REQUEST.toString());
    

对于工作流程外部条件请求,请按 WORKFLOW_EXTERNAL_CONDITION_REQUEST 类型、实体类型 PROPOSAL 以及 conditionStatus 为 PENDING 的特定 Proposal 的 ID 进行过滤。

Java

  // Create a statement to select workflow external condition requests for a proposal.
  StatementBuilder statementBuilder = new StatementBuilder()
      .where("WHERE entityId = :entityId and entityType = :entityType "
          + "and type = :type and conditionStatus = :conditionStatus")
      .orderBy("id ASC")
      .limit(StatementBuilder.SUGGESTED_PAGE_LIMIT)
      .withBindVariableValue("entityId", proposalId)
      .withBindVariableValue("entityType", WorkflowEntityType.PROPOSAL.toString())
      .withBindVariableValue("conditionStatus",
          WorkflowEvaluationStatus.PENDING.toString())
      .withBindVariableValue("type",
          WorkflowRequestType.WORKFLOW_EXTERNAL_CONDITION_REQUEST.toString());
    

将这两个过滤器语句传递到 getWorkflowRequestsByStatement 调用将产生针对该提案的待处理工作流程请求(按类型过滤):

Java

  // Get workflow requests by statement.
  WorkflowRequestPage page = workflowRequestService.getWorkflowRequestsByStatement(
      statementBuilder.toStatement());
    

批准工作流程审批请求

由于工作流程审批请求是系统定义的操作,因此这类请求可直接由用户批准,而无需执行进一步的操作。由于工作流程审批请求的过滤器语句仅会产生处于待处理状态的审批请求,因此您可以将现有的过滤器语句传递到 WorkflowRequestService 的某个操作调用中以供审批。

Java

  // Create action.
  com.google.api.ads.dfp.axis.v201702.ApproveWorkflowApprovalRequests action =
      new com.google.api.ads.dfp.axis.v201702.ApproveWorkflowApprovalRequests();

  // Perform action.
  UpdateResult result =
      workflowRequestService.performWorkflowRequestAction(
          action, statementBuilder.toStatement());
    

触发工作流程外部条件请求

工作流程外部条件请求适用于发布商工作流程包含的操作比 DFP/销售管理系统预定义的操作更复杂的情况。例如,当存在外部定价引擎时,或者发布商在预留广告资源前使用的是自己的广告资源预测方法时。举例来说,假设您定义了一个名为“检查外部广告资源”的规则,之后您可能希望对所有 ProposalLineItems 运行您系统的广告资源检查,但如果该规则无法运行外部检查,就会触发“请求审批”步骤:

Java

  Set<Long> workflowIdsToTrigger = Sets.newHashSet();
  Set<Long> workflowIdsToSkip = Sets.newHashSet();

  ProposalLineItemServiceInterface proposalLineItemService = dfpServices.get(
          session, ProposalLineItemServiceInterface.class);

  for (WorkflowRequest workflowRequest : page.getResults()) {
    if (workflowRequest.getWorkflowRuleName().equals(“Check Inventory External”)) {
      // Query for the ProposalLineItems belonging to the
      // Proposal via workflowRequest.getEntityId()
      StatementBuilder proposalLineItemStatementBuilder =
          new StatementBuilder()
              .where("proposalId = :proposalId")
              .orderBy("id ASC")
              .limit(StatementBuilder.SUGGESTED_PAGE_LIMIT)
              .withBindVariableValue("proposalId",
                  workflowRequest.getEntityId());

      // Get proposal line items by statement.
      ProposalLineItemPage proposalLineItemPage =
           proposalLineItemService.getProposalLineItemsByStatement(
               statementBuilder.toStatement());

      for (ProposalLineItem proposalLineItem : proposalLineItemPage.getResults()) {
        // Assume your external forecast returns true if overbooking.
        if (externalSystem.runExternalForcast(proposalLineItem)) {
            workflowIdsToTrigger.add(workflowRequest.getId());
            // In the example above, only one proposal line item failing to book
            // inventory is needed to trigger.
            break;
        }
      }

      if (!workflowIdsToTrigger.contains(workflowRequest.getId()){
        workflowIdsToSkip.add(workflowRequest.getId());
      }
    }
  }
    

这些请求将会一直处于 PENDING 状态,直到 DFP/销售管理系统外部发生某项操作为止(此时系统会决定是要 TRIGGER 还是要 SKIP 该规则中定义的操作)。 对于上述示例,我们想要通过 TriggerWorkflowExternalConditionRequest 操作触发 workflowIdsToTrigger 中的一系列工作流程请求,并跳过 workflowIdsToSkip 中的工作流程请求:

Java

  // Create actions.
  TriggerWorkflowExternalConditionRequests triggerAction =
      new TriggerWorkflowExternalConditionRequests();

  SkipWorkflowExternalConditionRequests skipAction =
      new SkipWorkflowExternalConditionRequests();

  // Perform action to selectively trigger workflow requests.
    StatementBuilder triggerStatementBuilder = new StatementBuilder()
      .where("id IN (" + Joiner.on(",").join(workflowIdsToTrigger, ‘,’) + ")");

  UpdateResult triggerResult =
      workflowRequestService.performWorkflowRequestAction(
          triggerAction, triggerStatementBuilder.toStatement());

  // Perform action to selectively skip workflow requests.
    StatementBuilder skipStatementBuilder = new StatementBuilder()
      .where("id IN (" + Joiner.on(",").join(workflowIdsToSkip, ‘,’) + ")");

  UpdateResult skipResult =
      workflowRequestService.performWorkflowRequestAction(
          skipAction, skipStatementBuilder.toStatement());
    

在该提案不再有任何待处理的请求后,便可完全提交给 DFP 并发送到广告投放管理环节。

发送以下问题的反馈:

此网页
DFP 广告管理系统
DFP 广告管理系统
需要帮助?请访问我们的支持页面