最后我发现我的方法从一开始就完全错误,不应该做订单拆分,既不生成多个购物车也不使用寄售,这两个都是错误的选择。
由于要求将多个订单发送到 ERP,而在我的客户案例中,DataHub 是负责执行此操作的,因此需要扩展的两个扩展是:saporderexchange、saporderexchangeb2b 和 ysaporderfullfillment。
首先我从 ysaporderfullfillment 模板创建了一个 customsaporderfullfillment 扩展,然后我必须更改 SendOrderToDataHubAction 中的 executeAction 方法来拆分生成的订单来自 Hybris,根据设定的标准:
@Override
public Transition executeAction(final OrderProcessModel process) throws RetryLaterException
{
LOG.info("Executing Send Order To DataHub Action");
final OrderModel order = process.getOrder();
List<SendToDataHubResult> results = new ArrayList<>();
List<AbstractOrderEntryModel> entries = order.getEntries();
Map<String, List<AbstractOrderEntryModel>> sortedEntries = sortEntries(entries);
final Object[] keyArray = sortedEntries.keySet().toArray();
LOG.info("Number of Orders to generate: " + keyArray.length);
for (int i = 0; i < keyArray.length; i++)
{
// Clone the order
String newOrderCode = generateOrderCode();
LOG.info("Generated Order Code " + newOrderCode);
OrderModel clonedOrder = getOrderService().clone(null, null, order,
newOrderCode);
LOG.info("Cloned order.");
String key = keyArray[i].toString();
LOG.info("Setting entries for Key: " + key);
final List<AbstractOrderEntryModel> entriesForCart = sortedEntries.get(key);
clonedOrder.setEntries(entriesForCart);
LOG.info("Sending Order to DataHub");
sendOrder(clonedOrder, results);
}
if (!results.isEmpty() && results.stream().allMatch(result -> result.isSuccess())) {
LOG.info("All Orders were sent successfully.");
setOrderStatus(order, ExportStatus.EXPORTED);
resetEndMessage(process);
return Transition.OK;
} else {
LOG.info("Not all Orders were sent successfully.");
setOrderStatus(order, ExportStatus.NOTEXPORTED);
handleRetry(process);
return Transition.NOK;
}
}
然后我必须用我自己的 customaporderexchangeb2b 扩展扩展 saporderexchangeb2b 扩展,我必须创建一个 CustomB2BOrderContributor 来映射到我需要的 RawHybrisOrder 属性:
@Override
public Set<String> getColumns()
{
final Set<String> columns = super.getColumns();
columns.addAll(Arrays.asList(CustomOrderCsvColumns.SALES_ORGANIZATION, CustomOrderCsvColumns.DISTRIBUTION_CHANNEL,
CustomOrderCsvColumns.DIVISION, CustomOrderCsvColumns.DOCUMENT_TYPE));
LOG.info("Columns present " + columns.size() + " : " + columns.toString());
return columns;
}
@Override
public List<Map<String, Object>> createRows(final OrderModel model)
{
final List<Map<String, Object>> rows = super.createRows(model);
return enhanceRowsByCustomB2BFields(model, rows);
}
protected List<Map<String, Object>> enhanceRowsByCustomB2BFields(final OrderModel model, final List<Map<String, Object>> rows)
{
// There is only one row on order level
final Map<String, Object> row = rows.get(0);
final String salesArea = ((HelvexProductModel) model.getEntries().get(0).getProduct()).getSalesArea();
final String[] valuesArray = salesArea.split("_");
final String salesOrganization = valuesArray[0];
final String distributionChannel = valuesArray[1];
final String division = valuesArray[2];
LOG.info("Enhancing columns of Order " + model.getCode() + " with Sales Organization : " + salesOrganization
+ ", Distribution Channel : " + distributionChannel + ", Division : " + division);
row.put(CustomOrderCsvColumns.SALES_ORGANIZATION, salesOrganization);
row.put(CustomOrderCsvColumns.DISTRIBUTION_CHANNEL, distributionChannel);
row.put(CustomOrderCsvColumns.DIVISION, division);
row.put(CustomOrderCsvColumns.DOCUMENT_TYPE, Config.getParameter("helvex.org.sales." + salesOrganization));
row.put(CustomOrderCsvColumns.MOTIVE, sessionService.getAttribute(CustomOrderCsvColumns.MOTIVE));
LOG.info("Enhanced rows " + row.toString());
return rows;
}
由于 RawHybrisOrder 缺少 saporder-raw、saporder-canonical 和 saporder-target 中的映射,我不得不将添加的属性添加到 raw 和 canonical 的行中,最后我覆盖了要发送的 iDoc 的目标定义所以我在规范中映射的属性被用来代替标准映射。
现在你会说,生成的 Hybris 订单怎么样?由于我们显示的订单是从 ERP 而非 Hybris 数据库中检索的,因此该订单不会显示在店面中。