即使没有在B2BCustomer上设置权限,订单仍会通过审批流程

2020-09-27 02:43发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好,

我使用的是Hybris 6.0,即使我们没有在B2BCustomer级别定义的权限,该订单也已通过(b2bAccOrderApproval.xml)中定义的批准流程。 在进一步调试中,我看到权限" B2BOrderThresholdPermission"和" B2BOrderThresholdTimespanPermission"在各自的策略类" DefaultB2BOrderThresholdEvaluationStrategy"和" DefaultB2BOrderThresholdTimespanEvaluationStrategy"中默认设置为" OPEN"状态。 我希望在没有为客户定义权限的情况下自动获得订单批准。 Hybris OOTB行为默认使用这些权限是否有原因? 有人可以帮我吗 预先感谢。

关于Karthika

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好,

我使用的是Hybris 6.0,即使我们没有在B2BCustomer级别定义的权限,该订单也已通过(b2bAccOrderApproval.xml)中定义的批准流程。 在进一步调试中,我看到权限" B2BOrderThresholdPermission"和" B2BOrderThresholdTimespanPermission"在各自的策略类" DefaultB2BOrderThresholdEvaluationStrategy"和" DefaultB2BOrderThresholdTimespanEvaluationStrategy"中默认设置为" OPEN"状态。 我希望在没有为客户定义权限的情况下自动获得订单批准。 Hybris OOTB行为默认使用这些权限是否有原因? 有人可以帮我吗 预先感谢。

关于Karthika

付费偷看设置
发送
4条回答
me_for_i
1楼 · 2020-09-27 03:21.采纳回答

我也将要提出这个问题,所以我将花点时间在这里回答我的解决方案,因为真正的Hybris专家尚未回答该问题的真正解决方法。

我们遇到了完全相同的事情,并得出了相同的结论。 为什么Hybris会这样工作?

在文件b2bapprovalprocess-spring.xml中,您具有defaultB2BPermissionService的定义。 看起来像这样:

  
          
              <设置>
                  
                  
                  
              
          
          <属性名称=" b2bApproverService" ref =" b2bApproverService"/>
          <属性名称=" permissionResultHelper" ref =" permissionResultHelper"/>
          
          <属性名称=" baseDao" ref =" baseDao"/>
          
              <列表>
                   B2BBudgetExceededPermission 
                   B2BOrderThresholdPermission 
                   B2BOrderThresholdTimespanPermission 
              
          
          
          
          <属性名称=" b2bPermissionDao" ref =" b2bPermissionDao"/>
      

  

这些策略决定订单批准工作流程中的评估,而不是实际的B2BPermissions,我认为这很奇怪,因为它总是使评估对所提供的策略保持静态。 这些是Hybris在简单的工作流程中设置的默认权限,并且它们已经执行的默认实现要求所有批准订单都包含所有这些权限。 我认为这是一个错误,在Hybris解释原因之前,我将尽快解决该问题。

因此,就像您一样进入源代码,并检查DefaultB2BOrderThresholdTimespanEvaluationStrategy及其评估方式。 在评估方法中,我们找到对getTypesToEvaluate的方法调用。 这是做什么的? 好吧,它将获得下订单的当前客户的所有权限,并且在此过程中还将执行getActivePermissions。 因此,它将检查Permission上的布尔值是否处于活动状态。 如果未激活,它将在返回的集合中排除该许可。 我首先想到的很好,然后我可能只是将Permission设置为inactive,而不必为此订单批准订单。 但是那没用。

这是因为在执行此操作后仅几行:

  B2BOrderThresholdTimespanPermissionModelPermissionToEvaluate =(B2BOrderThresholdTimespanPermissionModel)this.getPermissionToEvaluate(b2bGroupPermissions,order);
          PermissionStatus状态= PermissionStatus.OPEN;
          如果(permissionToEvaluate!= null && PermissionToEvaluate.getThreshold()!= null){

  

因此,就像您发现它始终将策略的权限设置为OPEN一样,这意味着批准者或管理员必须处理此问题。 如果您没有权限或将其设置为非活动状态,将会发生什么,就是方法getPermissionToEvaluate将返回null。 如果返回null,则Hybris认为这意味着权限评估失败,这就是为什么我们必须指定所有权限并将其激活的原因。 我认为这是一个非常奇怪的决定,使实现非常陈旧和静态。 因此,我只做了很小的改动就制定了自己的策略。 下面是一个示例:

 /**
   *这是B2BOrderThresholdTimespan权限的替代评估策略,具有Hybris默认值的更改
   *现在,我们仅检查许可是否存在且处于活动状态。  Hybris可能会失败,并且在上述情况下需要批准。
   *
   *现在我们有了它,以使许可权值中的NO_LIMIT(-1)意味着许可权对订单值没有限制。
   */
  公共类CB2BOrderThresholdTimespanEvaluationStrategy扩展了AbstractB2BOrderThresholdPermissionEvaluationStrategy 实现PermissionEvaluateStrategy  {
 
      私有静态最终Logger logger = LoggerFactory.getLogger(PyB2BOrderThresholdTimespanEvaluationStrategy.class);
 
      @Resource(name =" b2bOrderDao")
      私人B2BOrderDao b2bOrderDao;
      @Resource(name =" b2bDateUtils")
      私人B2BDateUtils b2bDateUtils;
 
      公共B2BPermissionResultModel评估(AbstractOrderModel订单,B2BCustomerModel员工){
          Set  b2bGroupPermissions = this.getTypesToEvaluate(员工,订单);
          如果(logger.isDebugEnabled()){
              迭代器var5 = b2bGroupPermissions.iterator();
 
              while(var5.hasNext()){
                  B2BPermissionModel b2bPermissionModel =(B2BPermissionModel)var5.next();
                  logger.debug(String.format("%s具有权限%s",employee.getUid(),b2bPermissionModel.getCode()));
              }
          }
 
          B2BOrderThresholdTimespanPermissionModelPermissionToEvaluate = this.getPermissionToEvaluate(b2bGroupPermissions,order);
          B2BPermissionResultModel result = null; //如果客户的权限无效或不存在,我们默认返回null
          如果(permissionToEvaluate!= null && PermissionToEvaluate.getThreshold()!= null){
              PermissionStatus状态= PermissionStatus.OPEN; //我们仅在存在且处于活动状态时评估许可
              BigDecimal阈值= this.toMoney(permissionToEvaluate.getThreshold());
              StandardDateRange dateRange = b2bDateUtils.createDateRange(permissionToEvaluate.getRange());
              List 批准的OrdersForDateRange = b2bOrderDao.findOrdersApprovedByDateRange(order.getUser(),dateRange.getStart(),dateRange.getEnd());
              BigDecimal totalForOrders = this.toMoney(order.getTotalPrice())。add(this.getOrderTotals(approvedOrdersForDateRange));
              如果(logger.isDebugEnabled()){
                  logger.debug("订单总数为:" + totalForOrders +"对于日期范围:[" + dateRange.getStart()+"-" + dateRange.getEnd()+"],允许的阈值为:" +阈值);
              }
             //我们进行了更改,以使NO_LIMIT确实意味着Permission将没有限制,并且无论订单上的值如何,该限制都将通过
              if(threshold.compareTo(this.toMoney(AbstractPermissionEvaluationStrategy.NOLIMIT))== 0 || threshold.compareTo(totalForOrders)> 0){
                  状态= PermissionStatus.PENDING_APPROVAL;
              }
              结果= this.getModelService()。create(B2BPermissionResultModel.class);
              result.setPermission(permissionToEvaluate);
              result.setApprover(employee);
              result.setPermissionTypeCode(" B2BOrderThresholdTimespanPermission");
              result.setStatus(status);
          }
 
 
          如果(logger.isDebugEnabled()){
              logger.debug(String.format(" PermissionResult%s |%s |%s",result.getPermissionTypeCode(),result.getStatus(),result.getApprover()。getUid()));
          }
 
          返回结果;
      }
 
      公共类<? 扩展B2BPermissionModel> getPermissionType(){
          返回B2BOrderThresholdTimespanPermissionModel.class;
      }
 
  }

  

如您所见,我已经进行了更改,因此,如果客户没有策略许可,或者客户处于非活动状态,则如果订单需要批准,则在最终判决中将不考虑策略评估。 我们还更改了我们认为对于NO_LIMIT值有问题的逻辑,我们认为这意味着Permission没有限制,但原始的Hybris逻辑却相反。

对于Hybris为工作流程所做的决策可能会有合理的解释。 我们可能只需要等待才能得到它。

大道至简
2楼-- · 2020-09-27 03:42

您是否已找到解决方案。我也面临着同样的问题。

关于Karthik,

huskylover
3楼-- · 2020-09-27 03:23

没有Karthik。 我猜定制是解决这个问题的唯一方法。

致谢,Karthika

大道至简
4楼-- · 2020-09-27 03:48

感谢Gustaf提供了非常有用的自定义代码。 如果我们需要自定义OTTB行为,那就完美了。

致谢,卡尔蒂卡

一周热门 更多>