@pisell/pisellos 0.10.59 → 0.10.61

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +3 -1
  2. package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +25 -2
  3. package/dist/modules/Discount/index.js +1 -0
  4. package/dist/modules/Order/holderRelations.d.ts +14 -0
  5. package/dist/modules/Order/holderRelations.js +154 -0
  6. package/dist/modules/Order/index.d.ts +1 -1
  7. package/dist/modules/Order/index.js +92 -47
  8. package/dist/modules/Order/types.d.ts +19 -1
  9. package/dist/modules/Order/types.js +2 -0
  10. package/dist/modules/Order/utils/discountProductLineIdentity.d.ts +1 -1
  11. package/dist/modules/Order/utils/discountProductLineIdentity.js +142 -7
  12. package/dist/modules/Order/utils/orderCollectionIdentity.js +24 -10
  13. package/dist/modules/Order/utils.d.ts +1 -1
  14. package/dist/modules/Order/utils.js +35 -9
  15. package/dist/server/index.js +18 -12
  16. package/dist/server/modules/order/index.d.ts +4 -0
  17. package/dist/server/modules/order/index.js +255 -190
  18. package/dist/server/modules/order/types.d.ts +3 -0
  19. package/dist/shared/receipt/small-ticket.js +17 -0
  20. package/dist/shared/sales/loadSalesOrderSnapshot.js +1 -1
  21. package/dist/solution/BaseSales/index.js +97 -27
  22. package/dist/solution/BaseSales/types.d.ts +2 -1
  23. package/dist/solution/BaseSales/utils/parseSalesResponse.d.ts +3 -1
  24. package/dist/solution/BaseSales/utils/parseSalesResponse.js +7 -3
  25. package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +12 -3
  26. package/dist/solution/BookingTicket/index.js +7 -4
  27. package/dist/solution/BookingTicket/utils/addProductDecision.d.ts +1 -1
  28. package/dist/solution/BookingTicket/utils/addProductDecision.js +4 -3
  29. package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.js +6 -2
  30. package/dist/solution/BookingTicket/utils/scan/cloudSearch.js +1 -0
  31. package/dist/solution/BookingTicket/utils/scan/handleScan.js +2 -1
  32. package/dist/solution/UnifiedBookingSales/index.d.ts +1 -1
  33. package/dist/solution/UnifiedBookingSales/index.js +4 -4
  34. package/dist/utils/platform.d.ts +2 -0
  35. package/dist/utils/platform.js +6 -0
  36. package/lib/model/strategy/adapter/promotion/index.js +46 -1
  37. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +3 -1
  38. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +16 -1
  39. package/lib/modules/Discount/index.js +1 -0
  40. package/lib/modules/Order/holderRelations.d.ts +14 -0
  41. package/lib/modules/Order/holderRelations.js +98 -0
  42. package/lib/modules/Order/index.d.ts +1 -1
  43. package/lib/modules/Order/index.js +44 -12
  44. package/lib/modules/Order/types.d.ts +19 -1
  45. package/lib/modules/Order/types.js +1 -0
  46. package/lib/modules/Order/utils/discountProductLineIdentity.d.ts +1 -1
  47. package/lib/modules/Order/utils/discountProductLineIdentity.js +51 -2
  48. package/lib/modules/Order/utils/orderCollectionIdentity.js +5 -0
  49. package/lib/modules/Order/utils.d.ts +1 -1
  50. package/lib/modules/Order/utils.js +27 -6
  51. package/lib/server/index.js +6 -0
  52. package/lib/server/modules/order/index.d.ts +4 -0
  53. package/lib/server/modules/order/index.js +46 -4
  54. package/lib/server/modules/order/types.d.ts +3 -0
  55. package/lib/shared/receipt/small-ticket.js +15 -0
  56. package/lib/shared/sales/loadSalesOrderSnapshot.js +1 -1
  57. package/lib/solution/BaseSales/index.js +39 -2
  58. package/lib/solution/BaseSales/types.d.ts +2 -1
  59. package/lib/solution/BaseSales/utils/parseSalesResponse.d.ts +3 -1
  60. package/lib/solution/BaseSales/utils/parseSalesResponse.js +4 -0
  61. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +7 -0
  62. package/lib/solution/BookingTicket/index.js +4 -1
  63. package/lib/solution/BookingTicket/utils/addProductDecision.d.ts +1 -1
  64. package/lib/solution/BookingTicket/utils/addProductDecision.js +4 -3
  65. package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +7 -1
  66. package/lib/solution/BookingTicket/utils/scan/cloudSearch.js +1 -0
  67. package/lib/solution/BookingTicket/utils/scan/handleScan.js +2 -1
  68. package/lib/solution/UnifiedBookingSales/index.d.ts +1 -1
  69. package/lib/solution/UnifiedBookingSales/index.js +3 -3
  70. package/lib/utils/platform.d.ts +2 -0
  71. package/lib/utils/platform.js +7 -0
  72. package/package.json +1 -1
@@ -1,4 +1,5 @@
1
1
  import type { ScheduleEventResource } from '../resource/types';
2
+ import type { OrderHolderRelation } from '../../../modules/Order/types';
2
3
  /**
3
4
  * Order 模块主键类型(对齐标准 Sales 协议的 order_id)
4
5
  */
@@ -448,6 +449,8 @@ export interface OrderData {
448
449
  contacts_info?: unknown[];
449
450
  /** 订单级主体参数 */
450
451
  holder?: Record<string, unknown> | null;
452
+ /** 非预约商品 Holder 关系完整快照;缺席表示本次回包未提供 */
453
+ holder_relations?: OrderHolderRelation[];
451
454
  /** 订单前端扩展快照 */
452
455
  order_meta_list?: {
453
456
  point_cards_snapshot?: Array<{
@@ -20,6 +20,7 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
20
20
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
21
21
  import dayjs from 'dayjs';
22
22
  import Decimal from 'decimal.js';
23
+ import { getProductHolderRelations, hasProductBooking } from "../../modules/Order/holderRelations";
23
24
  import { isFulfillmentTimingBooking } from "../../modules/Order/pickupTiming";
24
25
  import { resolveInvoiceDataVisibility } from "./templateVisibility";
25
26
  var DEFAULT_LOCALES = ['en', 'zh_CN'];
@@ -115,6 +116,7 @@ var LABELS = {
115
116
  bookingDateTime: 'Date & time',
116
117
  bookingResource: 'Resource',
117
118
  bookingHolder: 'Holder',
119
+ productHolder: 'Holder',
118
120
  orderDiscount: 'Order discount',
119
121
  manualDiscount: 'Manual discount',
120
122
  manualMarkup: 'Manual markup',
@@ -160,6 +162,7 @@ var LABELS = {
160
162
  bookingDateTime: '日期和时间',
161
163
  bookingResource: '资源',
162
164
  bookingHolder: '预约人',
165
+ productHolder: '持有人',
163
166
  orderDiscount: '整单折扣',
164
167
  manualDiscount: '手动折扣',
165
168
  manualMarkup: '手动加价',
@@ -205,6 +208,7 @@ var LABELS = {
205
208
  bookingDateTime: '日期和時間',
206
209
  bookingResource: '資源',
207
210
  bookingHolder: '預約人',
211
+ productHolder: '持有人',
208
212
  orderDiscount: '整單折扣',
209
213
  manualDiscount: '手動折扣',
210
214
  manualMarkup: '手動加價',
@@ -248,6 +252,7 @@ var LABELS = {
248
252
  bookingDateTime: '日時',
249
253
  bookingResource: 'リソース',
250
254
  bookingHolder: '予約者',
255
+ productHolder: '利用者',
251
256
  orderDiscount: '注文割引',
252
257
  manualDiscount: '手動割引',
253
258
  manualMarkup: '手動値上げ',
@@ -292,6 +297,7 @@ var LABELS = {
292
297
  bookingDateTime: 'Data e hora',
293
298
  bookingResource: 'Recurso',
294
299
  bookingHolder: 'Titular',
300
+ productHolder: 'Titular',
295
301
  orderDiscount: 'Desconto do pedido',
296
302
  manualDiscount: 'Desconto manual',
297
303
  manualMarkup: 'Acréscimo manual',
@@ -461,6 +467,17 @@ function buildProducts(order, locale, productMap) {
461
467
  quantity: quantity,
462
468
  originalPrice: originalPrice
463
469
  });
470
+ var holderName = hasProductBooking(product) ? '' : getProductHolderRelations(order, product).map(function (relation) {
471
+ var _relation$metadata;
472
+ return getLocalizedValue((_relation$metadata = relation.metadata) === null || _relation$metadata === void 0 ? void 0 : _relation$metadata.name, locale).trim();
473
+ }).filter(Boolean).join(', ');
474
+ if (holderName) {
475
+ // 复用 Web Invoice / 原生均支持的文本扩展行,不混入金额或商品备注。
476
+ extensionList.push(_objectSpread(_objectSpread({}, receiptKey(rawProduct, 'product-holder', 'text')), {}, {
477
+ item: "".concat(label(locale, 'productHolder'), ": ").concat(holderName),
478
+ value: ''
479
+ }));
480
+ }
464
481
  var productNote = resolveProductNote(product, locale);
465
482
  var allergy = isPresentId(productUid) ? allergyByProductUid.get(String(productUid).trim()) || '' : '';
466
483
  var basePrice = resolveProductBasePrice(product);
@@ -4,7 +4,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
4
4
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
5
5
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
6
6
  function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
7
- export var SALES_ORDER_RELATIONS = ['products', 'bookings', 'payments', 'customer', 'summary', 'contacts_info', 'order_meta_list', 'refunds', 'notes'];
7
+ export var SALES_ORDER_RELATIONS = ['products', 'bookings', 'payments', 'customer', 'summary', 'contacts_info', 'order_meta_list', 'refunds', 'notes', 'holder_relations'];
8
8
 
9
9
  /** Shared transport contract; remote callers use their host's /h5 prefix. */
10
10
  export function loadSalesOrderSnapshot(request, params) {
@@ -39,6 +39,7 @@ import { BaseSalesHookNames } from "./types";
39
39
  import { OrderModule } from "../../modules/Order";
40
40
  import { isFulfillmentTimingBooking } from "../../modules/Order/pickupTiming";
41
41
  import { PickupTimingController } from "./pickupTiming";
42
+ import { getProductHolderRelations, hasProductBooking } from "../../modules/Order/holderRelations";
42
43
  import Decimal from 'decimal.js';
43
44
  import { cloneDeep, isEqual, mergeWith } from 'lodash-es';
44
45
  import { createModule } from "../BookingByStep/types";
@@ -399,6 +400,67 @@ function areBaseSalesNotesEquivalent(currentValue, loadedValue, options) {
399
400
  var loadedNotes = normalizeBaseSalesNotesForComparison(loadedValue);
400
401
  return currentNotes !== null && loadedNotes !== null && isEqual(currentNotes, loadedNotes);
401
402
  }
403
+ function mergeBaseSalesHolderRelations(currentRecord, incomingRecord, strategy) {
404
+ if (!Array.isArray(incomingRecord.holder_relations)) {
405
+ return cloneDeep(currentRecord.holder_relations);
406
+ }
407
+
408
+ // 仅保留商品集合合并实际留下的本地行关系;匹配的行沿用 incoming 快照。
409
+ // 未提供 products 的稀疏包不能据此判断哪些行已被删除或被本地保留。
410
+ var retainedProductUids = new Set();
411
+ if (Array.isArray(incomingRecord.products)) {
412
+ var _iterator2 = _createForOfIteratorHelper(currentRecord.products || []),
413
+ _step2;
414
+ try {
415
+ var _loop = function _loop() {
416
+ var product = _step2.value;
417
+ var retained = !incomingRecord.products.some(function (incomingProduct) {
418
+ return isSameOrderCollectionItem('product', product, incomingProduct);
419
+ }) && (strategy === 'preserve-local' || !getOrderCollectionPersistentId('product', product));
420
+ var uid = getOrderCollectionReferenceUid('product', product);
421
+ if (retained && uid) retainedProductUids.add(uid);
422
+ };
423
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
424
+ _loop();
425
+ }
426
+ } catch (err) {
427
+ _iterator2.e(err);
428
+ } finally {
429
+ _iterator2.f();
430
+ }
431
+ }
432
+ var belongsToRetainedProduct = function belongsToRetainedProduct(relation) {
433
+ return (relation === null || relation === void 0 ? void 0 : relation.relation_model) === 'order_detail' && retainedProductUids.has(String(relation.relation_uuid));
434
+ };
435
+ var selectedRelations = [].concat(_toConsumableArray(incomingRecord.holder_relations.filter(function (relation) {
436
+ return !belongsToRetainedProduct(relation);
437
+ })), _toConsumableArray(Array.isArray(currentRecord.holder_relations) ? currentRecord.holder_relations.filter(belongsToRetainedProduct) : []));
438
+ var result = [];
439
+ var indexByIdentity = new Map();
440
+ var _iterator3 = _createForOfIteratorHelper(selectedRelations),
441
+ _step3;
442
+ try {
443
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
444
+ var relation = _step3.value;
445
+ var identityParts = [relation === null || relation === void 0 ? void 0 : relation.relation_model, relation === null || relation === void 0 ? void 0 : relation.relation_uuid, relation === null || relation === void 0 ? void 0 : relation.holder_type, relation === null || relation === void 0 ? void 0 : relation.holder_id];
446
+ var identity = identityParts.every(function (value) {
447
+ return value !== undefined && value !== null;
448
+ }) ? JSON.stringify(identityParts) : null;
449
+ var existingIndex = identity === null ? undefined : indexByIdentity.get(identity);
450
+ if (existingIndex !== undefined) {
451
+ result[existingIndex] = cloneDeep(relation);
452
+ } else {
453
+ if (identity !== null) indexByIdentity.set(identity, result.length);
454
+ result.push(cloneDeep(relation));
455
+ }
456
+ }
457
+ } catch (err) {
458
+ _iterator3.e(err);
459
+ } finally {
460
+ _iterator3.f();
461
+ }
462
+ return result;
463
+ }
402
464
  function mergeSalesDetailRecordWithTempOrder(currentTempOrder, loadedRecord, strategy) {
403
465
  var _currentTempOrder$_ex, _normalizedLoadedReco;
404
466
  var loadedHasOrderMetaList = Object.prototype.hasOwnProperty.call(loadedRecord || {}, 'order_meta_list');
@@ -418,8 +480,12 @@ function mergeSalesDetailRecordWithTempOrder(currentTempOrder, loadedRecord, str
418
480
  var normalizedCurrentTempOrder = normalizeBaseSalesRecordCollections(currentTempOrder, {
419
481
  ensureUid: false
420
482
  });
483
+ var mergedHolderRelations = mergeBaseSalesHolderRelations(normalizedCurrentTempOrder, normalizedLoadedRecord, strategy);
421
484
  var uidRemaps = [];
422
- var mergedRecord = mergeWith(normalizedCurrentTempOrder, normalizedLoadedRecord, function (currentValue, loadedValue, key) {
485
+ var mergedRecord = mergeWith(normalizedCurrentTempOrder, normalizedLoadedRecord, function (currentValue, loadedValue, key, object) {
486
+ if (key === 'holder_relations' && object === normalizedCurrentTempOrder) {
487
+ return cloneDeep(mergedHolderRelations);
488
+ }
423
489
  // order_meta_list 是服务端/本地订单携带的完整业务快照。若 incoming
424
490
  // 明确提供它,必须整体替换;若省略,则保留当前值,避免 snapshot
425
491
  // 数组递归拼接后出现同 ID 的旧数据。
@@ -1844,20 +1910,20 @@ export var BaseSalesImpl = /*#__PURE__*/function (_BaseModule) {
1844
1910
  }, {
1845
1911
  key: "getFulfillmentRefMode",
1846
1912
  value: function getFulfillmentRefMode() {
1847
- var _iterator2 = _createForOfIteratorHelper(this.getFulfillmentRefModeConfigs()),
1848
- _step2;
1913
+ var _iterator4 = _createForOfIteratorHelper(this.getFulfillmentRefModeConfigs()),
1914
+ _step4;
1849
1915
  try {
1850
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
1851
- var config = _step2.value;
1916
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
1917
+ var config = _step4.value;
1852
1918
  var mode = config['fulfillment.fulfillment_ref_mode'];
1853
1919
  if (mode === undefined || mode === null) continue;
1854
1920
  var normalized = String(mode).trim();
1855
1921
  if (normalized) return normalized;
1856
1922
  }
1857
1923
  } catch (err) {
1858
- _iterator2.e(err);
1924
+ _iterator4.e(err);
1859
1925
  } finally {
1860
- _iterator2.f();
1926
+ _iterator4.f();
1861
1927
  }
1862
1928
  return undefined;
1863
1929
  }
@@ -3278,7 +3344,7 @@ export var BaseSalesImpl = /*#__PURE__*/function (_BaseModule) {
3278
3344
  _this$store$order9,
3279
3345
  _this18 = this,
3280
3346
  _discountModule$getDi3;
3281
- var tempOrder, orderStore, discountModule, rulesModule, orderId, customerId, currentDiscountList, originalDiscountList, hasManualDiscountSelection, discountAction, requestOrderIdentityKey, discountConfigCacheKey, requestEpoch, isCurrentRequest, getCurrentResult, searchedDiscountList, searchedDiscountIds, preparedDiscountList, _this$store$order$get4, _this$store$order10, _discountModule$setOr, prepareConfigPromise, _discountModule$setOr2, _discountModule$setDi, nextDiscountList, shouldSkipAutoApplyFetchedDiscounts, _orderStore$summary, orderTotalAmount, result, _iterator3, _step3, _product$metadata5, _tempOrder$_extend6, _product$metadata$sou, _product$metadata6, _product$metadata7, _product$original_pri, product, productUid, runtimeOrigin, totalPerUnitDiscount, optionSum, sourcePrice, newSourceSellingPrice, newMainSellingPrice;
3347
+ var tempOrder, orderStore, discountModule, rulesModule, orderId, customerId, currentDiscountList, originalDiscountList, hasManualDiscountSelection, discountAction, requestOrderIdentityKey, discountConfigCacheKey, requestEpoch, isCurrentRequest, getCurrentResult, searchedDiscountList, searchedDiscountIds, preparedDiscountList, _this$store$order$get4, _this$store$order10, _discountModule$setOr, prepareConfigPromise, _discountModule$setOr2, _discountModule$setDi, nextDiscountList, shouldSkipAutoApplyFetchedDiscounts, _orderStore$summary, orderTotalAmount, result, _iterator5, _step5, _product$metadata5, _tempOrder$_extend6, _product$metadata$sou, _product$metadata6, _product$metadata7, _product$original_pri, product, productUid, runtimeOrigin, totalPerUnitDiscount, optionSum, sourcePrice, newSourceSellingPrice, newMainSellingPrice;
3282
3348
  return _regeneratorRuntime().wrap(function _callee30$(_context30) {
3283
3349
  while (1) switch (_context30.prev = _context30.next) {
3284
3350
  case 0:
@@ -3508,15 +3574,15 @@ export var BaseSalesImpl = /*#__PURE__*/function (_BaseModule) {
3508
3574
  if (result.productList) {
3509
3575
  tempOrder.products = preserveManualProductDiscountProducts(tempOrder.products, result.productList);
3510
3576
  }
3511
- _iterator3 = _createForOfIteratorHelper(tempOrder.products || []);
3577
+ _iterator5 = _createForOfIteratorHelper(tempOrder.products || []);
3512
3578
  _context30.prev = 82;
3513
- _iterator3.s();
3579
+ _iterator5.s();
3514
3580
  case 84:
3515
- if ((_step3 = _iterator3.n()).done) {
3581
+ if ((_step5 = _iterator5.n()).done) {
3516
3582
  _context30.next = 99;
3517
3583
  break;
3518
3584
  }
3519
- product = _step3.value;
3585
+ product = _step5.value;
3520
3586
  productUid = (_product$metadata5 = product.metadata) === null || _product$metadata5 === void 0 ? void 0 : _product$metadata5.unique_identification_number;
3521
3587
  runtimeOrigin = productUid ? (_tempOrder$_extend6 = tempOrder._extend) === null || _tempOrder$_extend6 === void 0 || (_tempOrder$_extend6 = _tempOrder$_extend6.productsByUid) === null || _tempOrder$_extend6 === void 0 || (_tempOrder$_extend6 = _tempOrder$_extend6[productUid]) === null || _tempOrder$_extend6 === void 0 ? void 0 : _tempOrder$_extend6.origin : undefined;
3522
3588
  if (!(runtimeOrigin !== null && runtimeOrigin !== void 0 && runtimeOrigin.isManualDiscount || isBaseSalesManualProductDiscountProduct(product))) {
@@ -3549,10 +3615,10 @@ export var BaseSalesImpl = /*#__PURE__*/function (_BaseModule) {
3549
3615
  case 101:
3550
3616
  _context30.prev = 101;
3551
3617
  _context30.t0 = _context30["catch"](82);
3552
- _iterator3.e(_context30.t0);
3618
+ _iterator5.e(_context30.t0);
3553
3619
  case 104:
3554
3620
  _context30.prev = 104;
3555
- _iterator3.f();
3621
+ _iterator5.f();
3556
3622
  return _context30.finish(104);
3557
3623
  case 107:
3558
3624
  if (!result.discountList) {
@@ -3881,7 +3947,7 @@ export var BaseSalesImpl = /*#__PURE__*/function (_BaseModule) {
3881
3947
  key: "setDiscountSelected",
3882
3948
  value: function () {
3883
3949
  var _setDiscountSelected = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee34(params) {
3884
- var currentOrder, _store3, _store3$setDiscountLi, list, updated, tempOrder, orderStore, _discountModule, rulesModule, nextDiscountList, _orderStore$summary3, orderTotalAmount, result, beforeSelectedIds, _iterator4, _step4, d, selectedResourceIds, filterSelectedDiscountDetails, _iterator5, _step5, _product$metadata8, _tempOrder$_extend7, _product$metadata$sou2, _product$metadata9, _product$metadata10, _product$original_pri2, product, productUid, runtimeOrigin, totalPerUnitDiscount, optionSum, sourcePrice, newSourceSellingPrice, newMainSellingPrice;
3950
+ var currentOrder, _store3, _store3$setDiscountLi, list, updated, tempOrder, orderStore, _discountModule, rulesModule, nextDiscountList, _orderStore$summary3, orderTotalAmount, result, beforeSelectedIds, _iterator6, _step6, d, selectedResourceIds, filterSelectedDiscountDetails, _iterator7, _step7, _product$metadata8, _tempOrder$_extend7, _product$metadata$sou2, _product$metadata9, _product$metadata10, _product$original_pri2, product, productUid, runtimeOrigin, totalPerUnitDiscount, optionSum, sourcePrice, newSourceSellingPrice, newMainSellingPrice;
3885
3951
  return _regeneratorRuntime().wrap(function _callee34$(_context34) {
3886
3952
  while (1) switch (_context34.prev = _context34.next) {
3887
3953
  case 0:
@@ -3954,10 +4020,10 @@ export var BaseSalesImpl = /*#__PURE__*/function (_BaseModule) {
3954
4020
  }).map(function (d) {
3955
4021
  return d.id;
3956
4022
  }));
3957
- _iterator4 = _createForOfIteratorHelper(nextDiscountList);
4023
+ _iterator6 = _createForOfIteratorHelper(nextDiscountList);
3958
4024
  try {
3959
- for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
3960
- d = _step4.value;
4025
+ for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
4026
+ d = _step6.value;
3961
4027
  if (d.isSelected && !beforeSelectedIds.has(d.id)) {
3962
4028
  d.isSelected = false;
3963
4029
  d.isManualSelect = true;
@@ -3965,9 +4031,9 @@ export var BaseSalesImpl = /*#__PURE__*/function (_BaseModule) {
3965
4031
  }
3966
4032
  }
3967
4033
  } catch (err) {
3968
- _iterator4.e(err);
4034
+ _iterator6.e(err);
3969
4035
  } finally {
3970
- _iterator4.f();
4036
+ _iterator6.f();
3971
4037
  }
3972
4038
  }
3973
4039
  }
@@ -3984,15 +4050,15 @@ export var BaseSalesImpl = /*#__PURE__*/function (_BaseModule) {
3984
4050
  return rid != null && selectedResourceIds.has(rid);
3985
4051
  });
3986
4052
  };
3987
- _iterator5 = _createForOfIteratorHelper(tempOrder.products);
4053
+ _iterator7 = _createForOfIteratorHelper(tempOrder.products);
3988
4054
  _context34.prev = 27;
3989
- _iterator5.s();
4055
+ _iterator7.s();
3990
4056
  case 29:
3991
- if ((_step5 = _iterator5.n()).done) {
4057
+ if ((_step7 = _iterator7.n()).done) {
3992
4058
  _context34.next = 46;
3993
4059
  break;
3994
4060
  }
3995
- product = _step5.value;
4061
+ product = _step7.value;
3996
4062
  productUid = (_product$metadata8 = product.metadata) === null || _product$metadata8 === void 0 ? void 0 : _product$metadata8.unique_identification_number;
3997
4063
  runtimeOrigin = productUid ? (_tempOrder$_extend7 = tempOrder._extend) === null || _tempOrder$_extend7 === void 0 || (_tempOrder$_extend7 = _tempOrder$_extend7.productsByUid) === null || _tempOrder$_extend7 === void 0 || (_tempOrder$_extend7 = _tempOrder$_extend7[productUid]) === null || _tempOrder$_extend7 === void 0 ? void 0 : _tempOrder$_extend7.origin : undefined;
3998
4064
  if (!(runtimeOrigin !== null && runtimeOrigin !== void 0 && runtimeOrigin.isManualDiscount || isBaseSalesManualProductDiscountProduct(product))) {
@@ -4043,10 +4109,10 @@ export var BaseSalesImpl = /*#__PURE__*/function (_BaseModule) {
4043
4109
  case 48:
4044
4110
  _context34.prev = 48;
4045
4111
  _context34.t0 = _context34["catch"](27);
4046
- _iterator5.e(_context34.t0);
4112
+ _iterator7.e(_context34.t0);
4047
4113
  case 51:
4048
4114
  _context34.prev = 51;
4049
- _iterator5.f();
4115
+ _iterator7.f();
4050
4116
  return _context34.finish(51);
4051
4117
  case 54:
4052
4118
  OrderModule.populateSavedAmounts(tempOrder.products, nextDiscountList);
@@ -5172,7 +5238,11 @@ export var BaseSalesImpl = /*#__PURE__*/function (_BaseModule) {
5172
5238
  var walletProducts = tempOrder === null || tempOrder === void 0 ? void 0 : tempOrder.products.map(function (product) {
5173
5239
  var _product$holder_id, _product$product_vari3, _product$is_charge_ta, _metadata$main_produc, _metadata$main_produc2;
5174
5240
  var metadata = product.metadata || {};
5175
- var rawHolderId = (_product$holder_id = product.holder_id) !== null && _product$holder_id !== void 0 ? _product$holder_id : metadata.holder_id;
5241
+ var rawHolderId = hasProductBooking(product) ? (_product$holder_id = product.holder_id) !== null && _product$holder_id !== void 0 ? _product$holder_id : metadata.holder_id : getProductHolderRelations(tempOrder, product).filter(function (relation) {
5242
+ return relation.holder_type === 'form';
5243
+ }).map(function (relation) {
5244
+ return relation.holder_id;
5245
+ });
5176
5246
  var holderIdValue = Array.isArray(rawHolderId) ? rawHolderId[0] : rawHolderId;
5177
5247
  var holder_id = Number.isInteger(Number(holderIdValue)) ? Number(holderIdValue) : undefined;
5178
5248
  return {
@@ -4,7 +4,7 @@ import type { ScanOrderLogInput as BaseSalesLogInput, ScanOrderLoggerProviderCon
4
4
  import type { QuantityCheckResult, QuantityLimitResult } from '../../model/strategy/adapter/itemRule';
5
5
  import type { QuotationCustomerScopeInfo } from '../../modules/Quotation/types';
6
6
  import type { PaymentMethod } from '../../modules/Payment/types';
7
- import type { OrderPaymentSource } from '../../modules/Order/types';
7
+ import type { OrderHolderRelation, OrderPaymentSource } from '../../modules/Order/types';
8
8
  import type { SubmitPayloadEnhancer } from '../../modules/Order/utils';
9
9
  /**
10
10
  * BaseSales 流程 hook 后缀。
@@ -277,6 +277,7 @@ export interface BaseSalesTempOrder {
277
277
  contacts: any[];
278
278
  contacts_info: Record<string, any> | null;
279
279
  holder: Record<string, any> | null;
280
+ holder_relations?: OrderHolderRelation[];
280
281
  metadata: Record<string, any>;
281
282
  _extend?: {
282
283
  productsByUid?: Record<string, Record<string, any>>;
@@ -14,7 +14,7 @@
14
14
  * - 不在此处发明等价关系;UI 侧(ticketBooking)若需要别的字段,由 view-model 适配层做转换
15
15
  */
16
16
  import type { BaseSalesOrderProduct } from '../types';
17
- import type { OrderMetaList } from '../../../modules/Order/types';
17
+ import type { OrderHolderRelation, OrderMetaList } from '../../../modules/Order/types';
18
18
  export interface ISalesDetailHeader {
19
19
  order_id: number | string | null;
20
20
  order_number?: string;
@@ -121,6 +121,8 @@ export interface ISalesDetail {
121
121
  header: ISalesDetailHeader;
122
122
  /** 商品行快照(保留 tempOrder / 后端详情原字段) */
123
123
  products: BaseSalesOrderProduct[];
124
+ /** 非预约商品 Holder 关系,保留关系及 metadata 的扩展字段。 */
125
+ holder_relations?: OrderHolderRelation[];
124
126
  /** 全部 bookings,按服务端原始顺序输出(含 root + child) */
125
127
  bookings: ISalesBooking[];
126
128
  /** root booking(parent_id === 0),多个时取首个,无则为 null */
@@ -25,6 +25,7 @@ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" ==
25
25
 
26
26
  import { normalizeOrderCollections } from "../../../modules/Order/utils/orderCollectionIdentity";
27
27
  import { isFulfillmentTimingBooking } from "../../../modules/Order/pickupTiming";
28
+ import { cloneDeep } from 'lodash-es';
28
29
  /** OrderData 中除大数组外的"顶层 header 字段"白名单,按需扩展。 */
29
30
  var HEADER_KEYS = ['order_id', 'order_number', 'shop_order_number', 'shop_full_order_number', 'type', 'business_code', 'platform', 'sales_channel', 'order_sales_channel', 'vouchers', 'status', 'payment_status', 'shipping_status', 'customer_id', 'customer_name', 'country_calling_code', 'phone', 'email', 'is_price_include_tax', 'tax_title', 'tax_country_code', 'currency_code', 'currency_symbol', 'currency_format', 'is_deposit', 'deposit_amount', 'shop_discount', 'surcharge_fee', 'note', 'schedule_date', 'created_at', 'updated_at', 'order_meta_list', 'metadata', 'total_amount', 'shop_id', 'create_date', 'holder', 'relation_forms', 'contacts', 'contacts_info'];
30
31
  function pickHeader(raw) {
@@ -144,9 +145,12 @@ export function parseSalesResponse(input) {
144
145
  return _objectSpread({}, d || {});
145
146
  }) : [];
146
147
  var summary = raw !== null && raw !== void 0 && raw.summary && _typeof(raw.summary) === 'object' ? _objectSpread({}, raw.summary) : {};
147
- return {
148
+ return _objectSpread(_objectSpread({
148
149
  header: pickHeader(raw),
149
- products: products,
150
+ products: products
151
+ }, Array.isArray(raw === null || raw === void 0 ? void 0 : raw.holder_relations) ? {
152
+ holder_relations: cloneDeep(raw.holder_relations)
153
+ } : {}), {}, {
150
154
  bookings: bookings,
151
155
  rootBooking: rootBooking,
152
156
  bookingsByProductUid: bookingsByProductUid,
@@ -156,5 +160,5 @@ export function parseSalesResponse(input) {
156
160
  customer: pickCustomer(raw),
157
161
  summary: summary,
158
162
  raw: raw
159
- };
163
+ });
160
164
  }
@@ -12,6 +12,7 @@ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symb
12
12
  function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
13
13
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
14
14
  import { resolveWeighedSourcePrice, withOriginalBundleOptionPrices } from "../../../modules/Order/utils/weighedProduct";
15
+ import { isBookingProduct } from "../../../modules/BookingContext/utils/serviceTimes";
15
16
  import { composeLinePrice, getBundleSellingMagnitude, normalizeProductSkuOptions, sumOptionUnitPrice } from "../../../modules/Order/utils";
16
17
  import { buildManualProductDiscountItem, mergeManualProductDiscountIntoList, resolveManualDiscountOriginTotal, resolveManualDiscountReasonFromSources, shouldBuildManualProductDiscount } from "../../../modules/Order/utils/manualProductDiscount";
17
18
  function toNumber(value) {
@@ -168,7 +169,7 @@ function findVariantById(origin, variantId) {
168
169
  * 注意:这里不生成 identity,缺省时由 OrderModule 自动补齐。
169
170
  */
170
171
  export function transformBaseProductToOrderProduct(params) {
171
- var _ref12, _ref13, _ref14, _payload$product_id, _ref15, _ref16, _payload$product_vari, _payload$_origin, _payload$_origin2, _payload$metadata, _sourceProduct$metada, _callbackOrigin$metad, _origin$metadata, _payload$metadata2, _payload$_extend, _sourceProduct$metada2, _sourceProduct$_exten, _callbackOrigin$metad2, _callbackOrigin$_exte, _payload$_dataVariant, _sourceProduct$_dataV, _callbackOrigin$_data, _origin$_dataVariant, _ref17, _findVariantById, _origin$production_co, _ref18, _ref19, _ref20, _ref21, _ref22, _matchedVariant$price, _payload$product_sku, _payload$_extend$weig, _payload$_extend2, _origin$_extend, _ref23, _ref24, _payload$price, _ref25, _payload$line_total, _payload$_extend3, _ref26, _ref27, _payload$product_sku$, _payload$product_sku2, _payload$bundle, _payload$quantity, _payload$_extend4, _extend, _extend2, _ref28, _ref29, _origin$base_price, _ref30, _ref31, _payload$line_total2, _payload$_extend5, _payload$_extend6, _extend3, _payload$_extend7, _payload$_extend8, _ref32, _ref33, _payload$tax_fee, _ref34, _ref35, _payload$is_charge_ta;
172
+ var _ref12, _ref13, _ref14, _payload$product_id, _ref15, _ref16, _payload$product_vari, _payload$_origin, _payload$_origin2, _payload$metadata, _sourceProduct$metada, _callbackOrigin$metad, _origin$metadata, _payload$metadata2, _payload$_extend, _sourceProduct$metada2, _sourceProduct$_exten, _callbackOrigin$metad2, _callbackOrigin$_exte, _payload$_dataVariant, _sourceProduct$_dataV, _callbackOrigin$_data, _origin$_dataVariant, _ref17, _findVariantById, _origin$production_co, _ref18, _ref19, _ref20, _ref21, _ref22, _matchedVariant$price, _payload$product_sku, _payload$_extend$weig, _payload$_extend2, _origin$_extend, _ref23, _ref24, _payload$price, _ref25, _payload$line_total, _payload$_extend3, _ref26, _ref27, _payload$product_sku$, _payload$product_sku2, _payload$bundle, _payload$quantity, _payload$_extend4, _extend, _extend2, _ref28, _ref29, _origin$base_price, _ref30, _ref31, _payload$line_total2, _payload$_extend5, _payload$_extend6, _extend3, _payload$_extend7, _payload$_extend8, _find, _ref32, _ref33, _payload$tax_fee, _ref34, _ref35, _payload$is_charge_ta;
172
173
  var payload = params.payload,
173
174
  _params$fallbackProdu = params.fallbackProductId,
174
175
  fallbackProductId = _params$fallbackProdu === void 0 ? null : _params$fallbackProdu;
@@ -242,6 +243,9 @@ export function transformBaseProductToOrderProduct(params) {
242
243
  });
243
244
  var derivedMainSelling = hasExplicitLineTotal ? Number(lineCompositeTotal) - Number(bundleOnlyComposite) : Number(mainProductOriginalPrice);
244
245
  var mainProductSellingPrice = toPriceString(Number.isFinite(derivedMainSelling) && derivedMainSelling >= 0 ? derivedMainSelling : Number(mainProductOriginalPrice));
246
+ var holderRelations = (_find = [payload._extend, callbackOrigin === null || callbackOrigin === void 0 ? void 0 : callbackOrigin._extend, sourceProduct === null || sourceProduct === void 0 ? void 0 : sourceProduct._extend].find(function (source) {
247
+ return Array.isArray(source === null || source === void 0 ? void 0 : source.holder_relations);
248
+ })) === null || _find === void 0 ? void 0 : _find.holder_relations;
245
249
  var metadata = _objectSpread(_objectSpread(_objectSpread(_objectSpread({
246
250
  unique: payload.unique,
247
251
  session: payload.session,
@@ -275,7 +279,7 @@ export function transformBaseProductToOrderProduct(params) {
275
279
  var productTitle = _objectSpread(_objectSpread({}, productTitleI18n), {}, {
276
280
  original: productTitleI18n.original || (sourceProduct === null || sourceProduct === void 0 ? void 0 : sourceProduct.original_title) || (sourceProduct === null || sourceProduct === void 0 ? void 0 : sourceProduct.title) || ''
277
281
  });
278
- return _objectSpread(_objectSpread({
282
+ return _objectSpread(_objectSpread(_objectSpread({
279
283
  product_id: productId,
280
284
  product_variant_id: productVariantId,
281
285
  production_code: productionCode,
@@ -294,7 +298,12 @@ export function transformBaseProductToOrderProduct(params) {
294
298
  original_price: lineOriginalPrice,
295
299
  tax_fee: toPriceString((_ref32 = (_ref33 = (_payload$tax_fee = payload.tax_fee) !== null && _payload$tax_fee !== void 0 ? _payload$tax_fee : matchedVariant === null || matchedVariant === void 0 ? void 0 : matchedVariant.tax_fee) !== null && _ref33 !== void 0 ? _ref33 : origin === null || origin === void 0 ? void 0 : origin.tax_fee) !== null && _ref32 !== void 0 ? _ref32 : sourceProduct === null || sourceProduct === void 0 ? void 0 : sourceProduct.tax_fee, '0.00'),
296
300
  is_charge_tax: toNumber((_ref34 = (_ref35 = (_payload$is_charge_ta = payload.is_charge_tax) !== null && _payload$is_charge_ta !== void 0 ? _payload$is_charge_ta : matchedVariant === null || matchedVariant === void 0 ? void 0 : matchedVariant.is_charge_tax) !== null && _ref35 !== void 0 ? _ref35 : origin === null || origin === void 0 ? void 0 : origin.is_charge_tax) !== null && _ref34 !== void 0 ? _ref34 : sourceProduct === null || sourceProduct === void 0 ? void 0 : sourceProduct.is_charge_tax, 0),
297
- metadata: metadata,
301
+ metadata: metadata
302
+ }, holderRelations !== undefined && !isBookingProduct(origin) && !isBookingProduct(payload) ? {
303
+ _extend: {
304
+ holder_relations: holderRelations
305
+ }
306
+ } : {}), {}, {
298
307
  note: payload.note != null ? String(payload.note) : '',
299
308
  product_title: productTitle,
300
309
  product_cover: firstNonBlank(matchedVariant === null || matchedVariant === void 0 ? void 0 : matchedVariant.cover, sourceProduct === null || sourceProduct === void 0 ? void 0 : sourceProduct.cover),
@@ -2622,7 +2622,10 @@ export var BookingTicketImpl = /*#__PURE__*/function (_BaseSalesImpl) {
2622
2622
  }, {
2623
2623
  key: "buildNormalProductCacheItemFromOrderLine",
2624
2624
  value: function buildNormalProductCacheItemFromOrderLine(input) {
2625
- return buildNormalProductCacheItemFromOrderLineUtil(input);
2625
+ var _input$holder_relatio, _this$store$order7;
2626
+ return buildNormalProductCacheItemFromOrderLineUtil(_objectSpread(_objectSpread({}, input), {}, {
2627
+ holder_relations: (_input$holder_relatio = input.holder_relations) !== null && _input$holder_relatio !== void 0 ? _input$holder_relatio : (_this$store$order7 = this.store.order) === null || _this$store$order7 === void 0 || (_this$store$order7 = _this$store$order7.getTempOrder()) === null || _this$store$order7 === void 0 ? void 0 : _this$store$order7.holder_relations
2628
+ }));
2626
2629
  }
2627
2630
 
2628
2631
  /** 文档别名:与 OrderModule.updateOrderProduct 一致。 */
@@ -3147,7 +3150,7 @@ export var BookingTicketImpl = /*#__PURE__*/function (_BaseSalesImpl) {
3147
3150
  key: "handleRedeem",
3148
3151
  value: function () {
3149
3152
  var _handleRedeem = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee38(params) {
3150
- var _this$store$order7, _this$store$order7$ge, _this$store$order8, _ref20, _tempOrder$order_id2;
3153
+ var _this$store$order8, _this$store$order8$ge, _this$store$order9, _ref20, _tempOrder$order_id2;
3151
3154
  var voucherIds, status, voucherIdSet, tempOrder, vouchers, hasUpdatedVoucher, nextVouchers, identity, externalSaleNumber, orderId, orderLookup;
3152
3155
  return _regeneratorRuntime().wrap(function _callee38$(_context38) {
3153
3156
  while (1) switch (_context38.prev = _context38.next) {
@@ -3163,8 +3166,8 @@ export var BookingTicketImpl = /*#__PURE__*/function (_BaseSalesImpl) {
3163
3166
  }
3164
3167
  });
3165
3168
  voucherIdSet = new Set(voucherIds);
3166
- tempOrder = (_this$store$order7 = this.store.order) === null || _this$store$order7 === void 0 || (_this$store$order7$ge = _this$store$order7.getTempOrder) === null || _this$store$order7$ge === void 0 ? void 0 : _this$store$order7$ge.call(_this$store$order7);
3167
- vouchers = (tempOrder === null || tempOrder === void 0 ? void 0 : tempOrder.vouchers) || ((_this$store$order8 = this.store.order) === null || _this$store$order8 === void 0 ? void 0 : _this$store$order8.getVouchers()) || [];
3169
+ tempOrder = (_this$store$order8 = this.store.order) === null || _this$store$order8 === void 0 || (_this$store$order8$ge = _this$store$order8.getTempOrder) === null || _this$store$order8$ge === void 0 ? void 0 : _this$store$order8$ge.call(_this$store$order8);
3170
+ vouchers = (tempOrder === null || tempOrder === void 0 ? void 0 : tempOrder.vouchers) || ((_this$store$order9 = this.store.order) === null || _this$store$order9 === void 0 ? void 0 : _this$store$order9.getVouchers()) || [];
3168
3171
  hasUpdatedVoucher = false;
3169
3172
  nextVouchers = vouchers.map(function (voucher) {
3170
3173
  if (!voucherIdSet.has(voucher.voucher_id)) return voucher;
@@ -5,7 +5,7 @@ import type { OrderProduct, OrderProductIdentity, AddProductBookingInput } from
5
5
  * cart.addProduct 两阶段决策(与 ticketBooking `handleSelectProduct` 对齐):
6
6
  *
7
7
  * 1. `requiresDetail`:规格 / SKU / 套餐 / Session / 称重弹窗(门禁:`isOpenDetailModal` / `cartDetailValue` / `open_sold_weight`)
8
- * 2. `requiresBookingEdit`:资源 / 时间编辑抽屉(kiosk 强制进入;其他渠道由 `getIsAutoClose` 决定)
8
+ * 2. `requiresBookingEdit`:资源 / 时间编辑抽屉(自助终端强制进入;其他渠道由 `getIsAutoClose` 决定)
9
9
  * 3. `add`:两关均通过,直接 transform + 加车
10
10
  */
11
11
  export type AddProductDecision = {
@@ -8,12 +8,13 @@ import dayjs from 'dayjs';
8
8
  import { cacheItemToBookingInput, derivePresetStartTimeFromDate, getProductExtend, getIsAutoClose, isSessionProduct, isBookingProduct, applySessionTimesToExtend, hasActualResourceSelection, productNeedsResourceExtend } from "../../../modules/BookingContext";
9
9
  import { transformBaseProductToOrderProduct } from "../../BaseSales/utils/transformBaseProductToOrderProduct";
10
10
  import { buildProductSkuFromCacheItem } from "./weighingProductSku";
11
+ import { isSelfServicePlatform } from "../../../utils/platform";
11
12
 
12
13
  /**
13
14
  * cart.addProduct 两阶段决策(与 ticketBooking `handleSelectProduct` 对齐):
14
15
  *
15
16
  * 1. `requiresDetail`:规格 / SKU / 套餐 / Session / 称重弹窗(门禁:`isOpenDetailModal` / `cartDetailValue` / `open_sold_weight`)
16
- * 2. `requiresBookingEdit`:资源 / 时间编辑抽屉(kiosk 强制进入;其他渠道由 `getIsAutoClose` 决定)
17
+ * 2. `requiresBookingEdit`:资源 / 时间编辑抽屉(自助终端强制进入;其他渠道由 `getIsAutoClose` 决定)
17
18
  * 3. `add`:两关均通过,直接 transform + 加车
18
19
  */
19
20
 
@@ -30,11 +31,11 @@ function needsSpecDetailModal(item) {
30
31
  }
31
32
 
32
33
  /**
33
- * 第二段:预约商品是否仍需打开资源 / 时间编辑(kiosk 强制打开,其他渠道与 info2 `cacheItem.autoClose` 等价)。
34
+ * 第二段:预约商品是否仍需打开资源 / 时间编辑(自助终端强制打开,其他渠道与 info2 `cacheItem.autoClose` 等价)。
34
35
  */
35
36
  function needsBookingEdit(cacheItem, ctx) {
36
37
  if (isNormalBookingProduct(cacheItem)) return false;
37
- if ((ctx === null || ctx === void 0 ? void 0 : ctx.channel) === 'kiosk') return true;
38
+ if (isSelfServicePlatform(ctx === null || ctx === void 0 ? void 0 : ctx.channel)) return true;
38
39
  var isAutoAllocationOn = (ctx === null || ctx === void 0 ? void 0 : ctx.isAutoAllocationOn) || function () {
39
40
  return true;
40
41
  };
@@ -54,8 +54,12 @@ function _processScannedProductItem() {
54
54
  }
55
55
  return _context.abrupt("return", runRequiresDetailFlow(host, item, ctx, bridge));
56
56
  case 5:
57
- values = genScanProductValues(item, code);
58
- itemWithSelection = _objectSpread(_objectSpread({}, item), {}, {
57
+ values = genScanProductValues(item, code); // 条码已唯一命中某个规格时,商品目录的 price 可能是“最低规格价”。
58
+ // 仅在扫码预选规格的这条路径改用命中规格价,避免影响商品卡片和手工选规格。
59
+ itemWithSelection = values.price === undefined ? _objectSpread(_objectSpread({}, item), {}, {
60
+ cartDetailValue: values
61
+ }) : _objectSpread(_objectSpread({}, item), {}, {
62
+ price: values.price,
59
63
  cartDetailValue: values
60
64
  });
61
65
  decision = host.decideAddProduct(itemWithSelection, ctx);
@@ -13,6 +13,7 @@ export var searchWalletPass = /*#__PURE__*/function () {
13
13
  case 0:
14
14
  params = {
15
15
  code: code,
16
+ resolve_ticket_order: 1,
16
17
  translate_flag: 1,
17
18
  // 翻译识别码名称 0:不翻译 1:翻译
18
19
  relation_product: 1,
@@ -10,6 +10,7 @@ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try
10
10
  function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
11
11
  import { searchWalletPass, searchWallet, searchProduct, searchOrder } from "./cloudSearch";
12
12
  import scanCache from "./scanCache";
13
+ import { isSelfServicePlatform } from "../../../../utils/platform";
13
14
 
14
15
  /**
15
16
  * Promise.any 的替代实现
@@ -161,7 +162,7 @@ export var handleGlobalScan = function handleGlobalScan(request, localSearch, ch
161
162
  if (value.startsWith('WL')) {
162
163
  requestList = [searchWallet(request, value)];
163
164
  } else {
164
- requestList = [].concat(_toConsumableArray(channel === 'kiosk' ? [] : [searchOrder(request, value)]), [searchWalletPass(request, value), searchWallet(request, value), searchProduct(request, value)]);
165
+ requestList = [].concat(_toConsumableArray(isSelfServicePlatform(channel) ? [] : [searchOrder(request, value)]), [searchWalletPass(request, value), searchWallet(request, value), searchProduct(request, value)]);
165
166
  }
166
167
  return requestList;
167
168
  };
@@ -145,7 +145,7 @@ export declare class UnifiedBookingSalesImpl extends BookingTicket {
145
145
  */
146
146
  clearSessionStorageOrderSnapshot(): void;
147
147
  /**
148
- * PC/H5/Kiosk 结账默认直接等待云端 checkout;POS/WebPOS 仍保持本地待同步。
148
+ * PC/H5 及自助终端结账默认直接等待云端 checkout;POS/WebPOS 仍保持本地待同步。
149
149
  * 显式传 checkoutSyncTaskEnabled: true 时仍可回退到本地同步模式。
150
150
  */
151
151
  protected shouldUseCheckoutSyncTask(): boolean;
@@ -45,7 +45,7 @@ import { AvailabilityRemoteOccupancyCache } from "./remoteOccupancyCache";
45
45
  import { BusinessAvailabilityController } from "./businessAvailability";
46
46
  import { BookingTicket } from "../BookingTicket";
47
47
  import { addLocalCalendarDays, captureRuntimeOffsetMinutes, formatLocalDate, formatLocalDateTime, formatLocalTime, localDateTimeToScalar, localDateToScalar, localDateToScalarStart, parseLocalDate, parseLocalDateTime } from "../../modules/ResourcePlanner/localClock";
48
- import { isCustomerUserPlatform, normalizeRuntimePlatform } from "../../utils/platform";
48
+ import { isCustomerUserPlatform, isSelfServicePlatform, normalizeRuntimePlatform } from "../../utils/platform";
49
49
  import { ItemRuleEvaluator } from "../../model/strategy/adapter/itemRule";
50
50
  export * from "./types";
51
51
  export { AvailabilityError } from "../../modules/ResourcePlanner";
@@ -2005,7 +2005,7 @@ export var UnifiedBookingSalesImpl = /*#__PURE__*/function (_BookingTicket) {
2005
2005
  }
2006
2006
 
2007
2007
  /**
2008
- * PC/H5/Kiosk 结账默认直接等待云端 checkout;POS/WebPOS 仍保持本地待同步。
2008
+ * PC/H5 及自助终端结账默认直接等待云端 checkout;POS/WebPOS 仍保持本地待同步。
2009
2009
  * 显式传 checkoutSyncTaskEnabled: true 时仍可回退到本地同步模式。
2010
2010
  */
2011
2011
  }, {
@@ -2015,7 +2015,7 @@ export var UnifiedBookingSalesImpl = /*#__PURE__*/function (_BookingTicket) {
2015
2015
  var configured = (_this$otherParams16 = this.otherParams) === null || _this$otherParams16 === void 0 ? void 0 : _this$otherParams16.checkoutSyncTaskEnabled;
2016
2016
  if (configured === true) return true;
2017
2017
  var platform = normalizeRuntimePlatform((_this$otherParams17 = this.otherParams) === null || _this$otherParams17 === void 0 ? void 0 : _this$otherParams17.platform);
2018
- return !isCustomerUserPlatform(platform) && platform !== 'kiosk';
2018
+ return !isCustomerUserPlatform(platform) && !isSelfServicePlatform(platform);
2019
2019
  }
2020
2020
 
2021
2021
  /** UnifiedBookingSales 的真实结账默认请求收据数据,供云端确认后再本地打印。 */
@@ -2838,7 +2838,7 @@ export var UnifiedBookingSalesImpl = /*#__PURE__*/function (_BookingTicket) {
2838
2838
  throw new Error('[UnifiedBookingSales] getProtocol 需要 policyId');
2839
2839
  case 3:
2840
2840
  policyUrl = 'shop-policy';
2841
- if (this.otherParams.platform === 'kiosk' || this.otherParams.platform === 'pos' || this.otherParams.platform === 'shop') {
2841
+ if (isSelfServicePlatform(this.otherParams.platform) || this.otherParams.platform === 'pos' || this.otherParams.platform === 'shop') {
2842
2842
  policyUrl = 'policy';
2843
2843
  }
2844
2844
  return _context23.abrupt("return", this.request.get("/".concat(policyUrl, "/").concat(encodeURIComponent(normalizedPolicyId))));
@@ -6,3 +6,5 @@ export declare function normalizeRuntimePlatform(platform: unknown): string;
6
6
  * PC and H5 are authenticated-customer clients rather than staff terminals.
7
7
  */
8
8
  export declare function isCustomerUserPlatform(platform: unknown): boolean;
9
+ /** Kiosk and vending retain distinct channels but share self-service checkout behavior. */
10
+ export declare function isSelfServicePlatform(platform: unknown): boolean;