1766424233
2025-12-22 15:03:00
アシストコマース、コールセンター、B2B のシナリオでは、 販売代理店 多くの場合、単一の認証されたセッション内で複数の顧客に代わって作業する必要があります。
一般的な要件は次のようになります。
-
販売エージェントは 1 回ログインします (OKTA 経由)
-
用途 顧客の選択 顧客を選ぶ
-
その顧客のカートを管理します
-
別の顧客に切り替える
前の顧客に戻り、中断したところから続行します。
Optimizely Commerce は、箱から出してすぐに次のことを想定しています ユーザーごとに 1 つのアクティブなカートそのため、このシナリオは簡単ではありません。
このブログでは、 クリーンでスケーラブルなパターン サポートするために 単一の販売エージェントセッション内の複数の顧客カート Optimizely Commerce 14 で。
課題
デフォルトでは、Optimizely Commerce のカートは以下に関連付けられています。
-
CustomerId -
市場
-
カート名
販売支援シナリオでは:
-
の ログインしているユーザーは販売代理店です
-
の 実際の買い物客は選択された顧客です
-
販売代理店は管理する必要があります 複数のカート、顧客ごとに 1 つ
設計原則(私が使用したもの)
販売代理店をカートの所有者ではなく、オペレーターとして扱います。
-
販売代理店のアイデンティティは一定のまま
-
それぞれの顧客はそれぞれの 独自の永続カート
-
顧客のコンテキストスイッチングは、 明示的な
-
UI で一度にアクティブにできるカートは 1 つだけです
したがって、この要件を達成するために、アクティブな顧客と選択された顧客の顧客 ID を受け入れるエンドポイントを作成しました。これにより、顧客 ID に基づいてシステムが正しいカートを切り替え/選択し、そのカートをプライマリ カートにします。
顧客コンテキストスイッチングの入力モデル
顧客の切り替えは、単純かつ明示的な入力モデルによって駆動されます。
public class CustomerCartDetailsInputModel
{
[DataMember(Name = "activeCustomerId")]
public string ActiveCustomerId { get; set; }
[DataMember(Name = "selectedCustomerId")]
public string SelectedCustomerId { get; set; }
}
目的:
これにより、暗黙的なセッション動作が回避され、カートの所有権が明確に保たれます。
顧客カート切り替えエンドポイント
販売代理店がクリックするたびに 顧客の選択、フロントエンドは単一のエンドポイントを呼び出します。
[HttpPost]
public async Task Post(
[FromBody] CustomerCartDetailsInputModel inputModel)
{
return new JsonHttpStatusResult(
await _customerCartService.UpdateCustomerCartAsync(inputModel),
SerializerSettings.JsonDefault);
}
このエンドポイントは、 唯一の真実の情報源 のために:
-
アクティブな顧客のカートを永続化する
-
選択した顧客のカートのロードまたは作成
-
アクティブなカート コンテキストの切り替え
高レベルのスイッチング フロー
-
販売代理店の ID を解決する
-
をロードまたは作成します 販売エージェントのコンテキスト カート
-
アクティブな顧客のカートを永続化する
-
選択した顧客のカートをロードまたは作成します
-
選択した顧客カートを販売エージェントのコンテキストにコピーします。
-
選択した顧客をアクティブとしてマークします
簡略化されたカート切り替えロジック (コアパターン)
以下は、マルチカートの処理のみに焦点を当てた、コア ロジックのクリーンアップ バージョンです。
public async Task UpdateCustomerCartAsync(
CustomerCartDetailsInputModel inputModel)
{
var salesAgentId = GetSalesAgentId();
// Load or create Sales Agent context cart
var agentCart = _orderRepository.LoadOrCreateCart(
salesAgentId, OrderNames.Default);
// Ensure identifiers exist
if (string.IsNullOrEmpty(inputModel.ActiveCustomerId))
inputModel.ActiveCustomerId = Guid.NewGuid().ToString();
if (string.IsNullOrEmpty(inputModel.SelectedCustomerId))
inputModel.SelectedCustomerId = Guid.NewGuid().ToString();
Guid.TryParse(inputModel.ActiveCustomerId, out var activeCustomerId);
Guid.TryParse(inputModel.SelectedCustomerId, out var selectedCustomerId);
// Persist active customer cart
if (activeCustomerId != Guid.Empty)
{
var activeCustomerCart =
_orderRepository.LoadCart(activeCustomerId, OrderNames.Default)
?? _orderRepository.Create(activeCustomerId, OrderNames.Default);
activeCustomerCart.CopyFrom(agentCart, _orderGroupFactory);
activeCustomerCart.CustomerId = activeCustomerId;
_cartRepository.SaveCart(activeCustomerCart);
}
// Load or create selected customer cart
var selectedCustomerCart =
_orderRepository.LoadCart(selectedCustomerId, OrderNames.Default)
?? _orderRepository.Create(selectedCustomerId, OrderNames.Default);
selectedCustomerCart.CustomerId = selectedCustomerId;
// Switch active context
agentCart.CopyFrom(selectedCustomerCart, _orderGroupFactory);
agentCart.CustomerId = salesAgentId;
_cartRepository.SaveCart(agentCart); // Save Cart
return new CartGetViewModel
{
Cart = await BuildCartViewModel(agentCart), // Generate View Model of Cart
CartCustomerId = selectedCustomerId.ToString()
};
}
理解する CopyFrom 方法
CopyFrom Optimizely Commerce API のコアです。 カート構造全体のディープコピー ある注文グループから別の注文グループへ。
targetCart.CopyFrom(sourceCart, _orderGroupFactory);
何 CopyFrom する
-
品目、出荷、支払い、住所をコピーします
-
カスタムプロパティをコピーします
-
を使用してすべてのエンティティを再作成します
IOrderGroupFactory
なぜ CopyFrom ここでは不可欠です
マルチカート シナリオの場合:
-
顧客のカートは隔離されたままにしておく必要があります
-
Sales Agent コンテキスト カートの状態を完全に切り替える必要があります
-
部分的なアップデートは安全ではありません
CopyFrom を保証します データ漏洩のないクリーンなカートスイッチ。
分けることで 販売代理店のアイデンティティ から 顧客のカートの所有権 そして明示的なものを使用して 顧客の選択 フローを利用すると、プラットフォームと競合することなく、Optimizely Commerce でスケーラブルなアシストコマース エクスペリエンスを構築できます。
以下は設計の出力です。
2025 年 12 月 22 日
#Optimi #の #つの販売エージェント #セッションで複数のカートを処理する