@pisell/pisellos 0.10.58 → 0.10.60

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 (81) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.js +1 -0
  3. package/dist/inventory/index.d.ts +92 -0
  4. package/dist/inventory/index.js +500 -0
  5. package/dist/model/strategy/adapter/promotion/index.js +0 -9
  6. package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +3 -1
  7. package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +25 -2
  8. package/dist/modules/Order/holderRelations.d.ts +14 -0
  9. package/dist/modules/Order/holderRelations.js +154 -0
  10. package/dist/modules/Order/index.d.ts +21 -4
  11. package/dist/modules/Order/index.js +1453 -1060
  12. package/dist/modules/Order/types.d.ts +24 -1
  13. package/dist/modules/Order/types.js +2 -0
  14. package/dist/modules/Order/utils/discountProductLineIdentity.d.ts +1 -1
  15. package/dist/modules/Order/utils/discountProductLineIdentity.js +142 -7
  16. package/dist/modules/Order/utils/orderCollectionIdentity.js +24 -10
  17. package/dist/modules/Order/utils.d.ts +1 -1
  18. package/dist/modules/Order/utils.js +35 -9
  19. package/dist/modules/ProductList/index.d.ts +1 -3
  20. package/dist/modules/ProductList/index.js +120 -192
  21. package/dist/modules/ProductList/types.d.ts +0 -8
  22. package/dist/modules/ProductList/types.js +0 -2
  23. package/dist/server/index.js +18 -12
  24. package/dist/server/modules/order/index.d.ts +4 -0
  25. package/dist/server/modules/order/index.js +255 -190
  26. package/dist/server/modules/order/types.d.ts +3 -0
  27. package/dist/shared/receipt/small-ticket.js +17 -0
  28. package/dist/shared/sales/loadSalesOrderSnapshot.js +1 -1
  29. package/dist/solution/BaseSales/index.d.ts +8 -0
  30. package/dist/solution/BaseSales/index.js +1478 -1233
  31. package/dist/solution/BaseSales/types.d.ts +2 -1
  32. package/dist/solution/BaseSales/utils/parseSalesResponse.d.ts +3 -1
  33. package/dist/solution/BaseSales/utils/parseSalesResponse.js +7 -3
  34. package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +12 -3
  35. package/dist/solution/BookingByStep/index.d.ts +1 -1
  36. package/dist/solution/BookingTicket/index.d.ts +1 -13
  37. package/dist/solution/BookingTicket/index.js +7 -4
  38. package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.js +6 -2
  39. package/dist/solution/UnifiedBookingSales/index.d.ts +1 -7
  40. package/dist/solution/UnifiedBookingSales/index.js +446 -586
  41. package/lib/index.d.ts +1 -0
  42. package/lib/index.js +12 -0
  43. package/lib/inventory/index.d.ts +92 -0
  44. package/lib/inventory/index.js +280 -0
  45. package/lib/model/strategy/adapter/promotion/index.js +46 -1
  46. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +3 -1
  47. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +16 -1
  48. package/lib/modules/Order/holderRelations.d.ts +14 -0
  49. package/lib/modules/Order/holderRelations.js +98 -0
  50. package/lib/modules/Order/index.d.ts +21 -4
  51. package/lib/modules/Order/index.js +155 -31
  52. package/lib/modules/Order/types.d.ts +24 -1
  53. package/lib/modules/Order/types.js +1 -0
  54. package/lib/modules/Order/utils/discountProductLineIdentity.d.ts +1 -1
  55. package/lib/modules/Order/utils/discountProductLineIdentity.js +51 -2
  56. package/lib/modules/Order/utils/orderCollectionIdentity.js +5 -0
  57. package/lib/modules/Order/utils.d.ts +1 -1
  58. package/lib/modules/Order/utils.js +27 -6
  59. package/lib/modules/ProductList/index.d.ts +1 -3
  60. package/lib/modules/ProductList/index.js +22 -31
  61. package/lib/modules/ProductList/types.d.ts +0 -8
  62. package/lib/modules/ProductList/types.js +0 -1
  63. package/lib/server/index.js +6 -0
  64. package/lib/server/modules/order/index.d.ts +4 -0
  65. package/lib/server/modules/order/index.js +46 -4
  66. package/lib/server/modules/order/types.d.ts +3 -0
  67. package/lib/shared/receipt/small-ticket.js +15 -0
  68. package/lib/shared/sales/loadSalesOrderSnapshot.js +1 -1
  69. package/lib/solution/BaseSales/index.d.ts +8 -0
  70. package/lib/solution/BaseSales/index.js +121 -9
  71. package/lib/solution/BaseSales/types.d.ts +2 -1
  72. package/lib/solution/BaseSales/utils/parseSalesResponse.d.ts +3 -1
  73. package/lib/solution/BaseSales/utils/parseSalesResponse.js +4 -0
  74. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +7 -0
  75. package/lib/solution/BookingByStep/index.d.ts +1 -1
  76. package/lib/solution/BookingTicket/index.d.ts +1 -13
  77. package/lib/solution/BookingTicket/index.js +4 -1
  78. package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +7 -1
  79. package/lib/solution/UnifiedBookingSales/index.d.ts +1 -7
  80. package/lib/solution/UnifiedBookingSales/index.js +12 -80
  81. package/package.json +1 -1
@@ -7,13 +7,15 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol"
7
7
  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); }
8
8
  function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
9
9
  function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
10
+ import { cloneDeep } from 'lodash-es';
11
+ import { getProductHolderRelations } from "../../Order/holderRelations";
10
12
  import { getProductSkuOptions } from "../../Order/utils";
11
13
  import { isEntitlementPass } from "../../Discount/entitlementPass";
12
14
  import { buildProductOptionStringFromOrderLine } from "./orderLineDisplay";
13
15
  /**
14
16
  * 从已加车的普通商品 order line 反查 SkuDetailModal edit 所需的 cacheItem。
15
17
  *
16
- * 与 `buildCacheItemFromOrderLine`(预约行 + booking)并列;不含 resource / duration / holder 等预约字段。
18
+ * 与 `buildCacheItemFromOrderLine`(预约行 + booking)并列;Holder 从订单关系回填,不生成预约字段。
17
19
  */
18
20
  /**
19
21
  * 解析 v2 主商品 source 价(不含 option、不含 bundle),供 SkuDetailModal / transform 使用。
@@ -85,7 +87,7 @@ function mapOrderBundleToOtherBundle(bundle) {
85
87
  });
86
88
  }
87
89
  export function buildNormalProductCacheItemFromOrderLine(input) {
88
- var _product$product_id, _product$selling_pric2, _product$original_pri, _product$metadata, _product$metadata2, _product$metadata3, _product$product_vari, _originExtend$other, _product$num, _product$product_vari2, _product$num2, _title, _product$note, _originExtend$price, _originExtend$total, _originExtend$origin_, _product$metadata4, _originExtend$priceOv, _product$metadata5, _ref7, _title2, _ref8, _cover, _price3, _product$order_detail, _product$product_sku;
90
+ var _product$product_id, _product$selling_pric2, _product$original_pri, _product$metadata, _product$metadata2, _product$metadata3, _product$product_vari, _originExtend$other, _product$num, _product$product_vari2, _product$num2, _title, _product$note, _originExtend$price, _originExtend$total, _originExtend$origin_, _product$metadata4, _originExtend$priceOv, _product$metadata5, _product$metadata6, _ref7, _title2, _ref8, _cover, _price3, _product$order_detail, _product$product_sku;
89
91
  var product = input.product,
90
92
  sourceProduct = input.sourceProduct;
91
93
  var resolvedId = (_product$product_id = product.product_id) !== null && _product$product_id !== void 0 ? _product$product_id : sourceProduct === null || sourceProduct === void 0 ? void 0 : sourceProduct.id;
@@ -94,6 +96,23 @@ export function buildNormalProductCacheItemFromOrderLine(input) {
94
96
  var original = Number((_product$original_pri = product.original_price) !== null && _product$original_pri !== void 0 ? _product$original_pri : selling);
95
97
  var uid = (_product$metadata = product.metadata) === null || _product$metadata === void 0 ? void 0 : _product$metadata.unique_identification_number;
96
98
  var originExtend = (_product$metadata2 = product.metadata) === null || _product$metadata2 === void 0 || (_product$metadata2 = _product$metadata2.origin) === null || _product$metadata2 === void 0 ? void 0 : _product$metadata2._extend;
99
+ var holderRelations = cloneDeep(getProductHolderRelations(input, product));
100
+ var formRelations = holderRelations.filter(function (relation) {
101
+ return relation.holder_type === 'form';
102
+ });
103
+ var holderIds = formRelations.map(function (relation) {
104
+ return relation.holder_id;
105
+ });
106
+ var holderNames = formRelations.map(function (relation) {
107
+ var _relation$metadata;
108
+ return (_relation$metadata = relation.metadata) === null || _relation$metadata === void 0 ? void 0 : _relation$metadata.name;
109
+ }).filter(function (name) {
110
+ return typeof name === 'string' && name.length > 0;
111
+ });
112
+ var holder = formRelations.length > 0 ? _objectSpread(_objectSpread({}, formRelations[0].metadata || {}), {}, {
113
+ form_record: holderIds,
114
+ name: holderNames.join(',')
115
+ }) : null;
97
116
  var shouldPreserveEntitlementPriceOverride = hasEntitlementPassDiscount(product) && ((originExtend === null || originExtend === void 0 ? void 0 : originExtend.priceOverride) !== undefined || ((_product$metadata3 = product.metadata) === null || _product$metadata3 === void 0 ? void 0 : _product$metadata3.price_override) != null);
98
117
  var hasPriceOverride = (originExtend === null || originExtend === void 0 ? void 0 : originExtend.priceOverride) !== undefined || shouldPreserveEntitlementPriceOverride;
99
118
  var option = getProductSkuOptions(product);
@@ -125,6 +144,9 @@ export function buildNormalProductCacheItemFromOrderLine(input) {
125
144
  skuValue: JSON.parse(JSON.stringify(skuValue)),
126
145
  _skuValue: JSON.parse(JSON.stringify(skuValue)),
127
146
  isNormalProduct: true,
147
+ holder_relations: holderRelations,
148
+ holder: holder,
149
+ holder_id: holderIds,
128
150
  metadata: {
129
151
  product_add_schedule_time: (_product$metadata4 = product.metadata) === null || _product$metadata4 === void 0 ? void 0 : _product$metadata4.product_add_schedule_time
130
152
  }
@@ -140,6 +162,7 @@ export function buildNormalProductCacheItemFromOrderLine(input) {
140
162
  extend._skuValue = JSON.parse(JSON.stringify(extend.skuValue));
141
163
  }
142
164
  return _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, sourceProduct || {}), {}, {
165
+ holder_config: (sourceProduct === null || sourceProduct === void 0 ? void 0 : sourceProduct.holder_config) !== undefined ? sourceProduct.holder_config : (_product$metadata6 = product.metadata) === null || _product$metadata6 === void 0 ? void 0 : _product$metadata6.holder_config,
143
166
  id: resolvedId,
144
167
  product_id: resolvedId,
145
168
  _id: uid,
@@ -0,0 +1,14 @@
1
+ import type { OrderHolderRelation, OrderTempOrder } from './types';
2
+ /** 在原订单上补齐关系身份,让缓存、提交和重试共用同一个 UUID。 */
3
+ export declare function ensureHolderRelationUuids(order: {
4
+ holder_relations?: OrderHolderRelation[];
5
+ }): void;
6
+ export declare function hasProductBooking(product: Record<string, any>): boolean;
7
+ export declare function getProductHolderRelations(order: {
8
+ holder_relations?: OrderHolderRelation[];
9
+ }, product: Record<string, any>): OrderHolderRelation[];
10
+ export declare function replaceProductHolderRelations(order: OrderTempOrder, product: Record<string, any>, patch: OrderHolderRelation[] | undefined): void;
11
+ /** 只删除明确被用户删除的行,不从稀疏远端快照推断删除。 */
12
+ export declare function removeProductHolderRelations(order: OrderTempOrder, products: Array<Record<string, any>>): void;
13
+ /** 仅兼容尚无新字段的旧测试草稿;显式 [] 永远不恢复旧 product 数据。 */
14
+ export declare function restoreLegacyHolderRelations(order: Record<string, any>): OrderHolderRelation[] | undefined;
@@ -0,0 +1,154 @@
1
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
2
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
3
+ 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; }
4
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
5
+ 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); }
6
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
7
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
8
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
9
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
10
+ 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); }
11
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
12
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
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
+ import { createUuidV4 } from "./utils/orderCollectionIdentity";
15
+ function getHolderRelationUuid(relation) {
16
+ return typeof (relation === null || relation === void 0 ? void 0 : relation.uuid) === 'string' && relation.uuid.trim() ? relation.uuid : undefined;
17
+ }
18
+
19
+ /** 在原订单上补齐关系身份,让缓存、提交和重试共用同一个 UUID。 */
20
+ export function ensureHolderRelationUuids(order) {
21
+ if (!Array.isArray(order.holder_relations)) return;
22
+ var _iterator = _createForOfIteratorHelper(order.holder_relations),
23
+ _step;
24
+ try {
25
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
26
+ var relation = _step.value;
27
+ if (relation && _typeof(relation) === 'object' && !getHolderRelationUuid(relation)) {
28
+ relation.uuid = createUuidV4();
29
+ }
30
+ }
31
+ } catch (err) {
32
+ _iterator.e(err);
33
+ } finally {
34
+ _iterator.f();
35
+ }
36
+ }
37
+ export function hasProductBooking(product) {
38
+ var _product$metadata, _product$metadata2;
39
+ var bookingIds = [product.booking_id, (_product$metadata = product.metadata) === null || _product$metadata === void 0 ? void 0 : _product$metadata.booking_id, product.schedule_event_id];
40
+ return Boolean(product.booking_uid || ((_product$metadata2 = product.metadata) === null || _product$metadata2 === void 0 ? void 0 : _product$metadata2.booking_uid)) || bookingIds.some(function (id) {
41
+ return id !== undefined && id !== null && String(id) !== '' && String(id) !== '0';
42
+ });
43
+ }
44
+ export function getProductHolderRelations(order, product) {
45
+ var _product$metadata$uni, _product$metadata3;
46
+ var uid = (_product$metadata$uni = (_product$metadata3 = product.metadata) === null || _product$metadata3 === void 0 ? void 0 : _product$metadata3.unique_identification_number) !== null && _product$metadata$uni !== void 0 ? _product$metadata$uni : product.unique_identification_number;
47
+ if (uid === undefined || uid === null || uid === '') return [];
48
+ return (order.holder_relations || []).filter(function (relation) {
49
+ return relation.relation_model === 'order_detail' && String(relation.relation_uuid) === String(uid);
50
+ });
51
+ }
52
+ export function replaceProductHolderRelations(order, product, patch) {
53
+ var _product$metadata$uni2, _product$metadata4;
54
+ if (patch === undefined || hasProductBooking(product)) return;
55
+ var uid = (_product$metadata$uni2 = (_product$metadata4 = product.metadata) === null || _product$metadata4 === void 0 ? void 0 : _product$metadata4.unique_identification_number) !== null && _product$metadata$uni2 !== void 0 ? _product$metadata$uni2 : product.unique_identification_number;
56
+ if (uid === undefined || uid === null || uid === '') return;
57
+ var existing = getProductHolderRelations(order, product);
58
+ var next = new Map();
59
+ var _iterator2 = _createForOfIteratorHelper(patch),
60
+ _step2;
61
+ try {
62
+ var _loop = function _loop() {
63
+ var relation = _step2.value;
64
+ var key = "".concat(relation.holder_type, ":").concat(relation.holder_id);
65
+ var previous = existing.find(function (item) {
66
+ return item.holder_type === relation.holder_type && String(item.holder_id) === String(relation.holder_id);
67
+ });
68
+ next.set(key, _objectSpread(_objectSpread(_objectSpread({}, previous), relation), {}, {
69
+ uuid: getHolderRelationUuid(previous) || getHolderRelationUuid(relation) || createUuidV4(),
70
+ relation_model: 'order_detail',
71
+ relation_uuid: String(uid)
72
+ }, previous !== null && previous !== void 0 && previous.metadata || relation.metadata ? {
73
+ metadata: _objectSpread(_objectSpread({}, previous === null || previous === void 0 ? void 0 : previous.metadata), relation.metadata)
74
+ } : {}));
75
+ };
76
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
77
+ _loop();
78
+ }
79
+ } catch (err) {
80
+ _iterator2.e(err);
81
+ } finally {
82
+ _iterator2.f();
83
+ }
84
+ order.holder_relations = [].concat(_toConsumableArray((order.holder_relations || []).filter(function (relation) {
85
+ return relation.relation_model !== 'order_detail' || String(relation.relation_uuid) !== String(uid);
86
+ })), _toConsumableArray(next.values()));
87
+ }
88
+
89
+ /** 只删除明确被用户删除的行,不从稀疏远端快照推断删除。 */
90
+ export function removeProductHolderRelations(order, products) {
91
+ if (!Array.isArray(order.holder_relations)) return;
92
+ var removedUids = new Set(products.map(function (product) {
93
+ var _ref, _product$metadata$uni3, _product$metadata5;
94
+ return String((_ref = (_product$metadata$uni3 = (_product$metadata5 = product.metadata) === null || _product$metadata5 === void 0 ? void 0 : _product$metadata5.unique_identification_number) !== null && _product$metadata$uni3 !== void 0 ? _product$metadata$uni3 : product.unique_identification_number) !== null && _ref !== void 0 ? _ref : '');
95
+ }));
96
+ order.holder_relations = order.holder_relations.filter(function (relation) {
97
+ return relation.relation_model !== 'order_detail' || !removedUids.has(String(relation.relation_uuid));
98
+ });
99
+ }
100
+
101
+ /** 仅兼容尚无新字段的旧测试草稿;显式 [] 永远不恢复旧 product 数据。 */
102
+ export function restoreLegacyHolderRelations(order) {
103
+ if (Object.prototype.hasOwnProperty.call(order, 'holder_relations')) {
104
+ return Array.isArray(order.holder_relations) ? order.holder_relations : undefined;
105
+ }
106
+ var relations = [];
107
+ var bookingProductUids = new Set((order.bookings || []).map(function (booking) {
108
+ var _ref2, _booking$product_uid, _booking$metadata;
109
+ return String((_ref2 = (_booking$product_uid = booking.product_uid) !== null && _booking$product_uid !== void 0 ? _booking$product_uid : (_booking$metadata = booking.metadata) === null || _booking$metadata === void 0 ? void 0 : _booking$metadata.product_uid) !== null && _ref2 !== void 0 ? _ref2 : '');
110
+ }));
111
+ var _iterator3 = _createForOfIteratorHelper(order.products || []),
112
+ _step3;
113
+ try {
114
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
115
+ var _product$metadata$uni4, _product$metadata6, _product$metadata7, _product$metadata$hol, _product$metadata8;
116
+ var product = _step3.value;
117
+ if (hasProductBooking(product)) continue;
118
+ var uid = (_product$metadata$uni4 = (_product$metadata6 = product.metadata) === null || _product$metadata6 === void 0 ? void 0 : _product$metadata6.unique_identification_number) !== null && _product$metadata$uni4 !== void 0 ? _product$metadata$uni4 : product.unique_identification_number;
119
+ if (uid === undefined || uid === null || uid === '' || bookingProductUids.has(String(uid))) continue;
120
+ var holder = ((_product$metadata7 = product.metadata) === null || _product$metadata7 === void 0 ? void 0 : _product$metadata7.holder) || {};
121
+ var rawIds = (_product$metadata$hol = (_product$metadata8 = product.metadata) === null || _product$metadata8 === void 0 ? void 0 : _product$metadata8.holder_id) !== null && _product$metadata$hol !== void 0 ? _product$metadata$hol : holder.form_record;
122
+ var ids = (Array.isArray(rawIds) ? rawIds : [rawIds]).filter(function (id) {
123
+ return id !== undefined && id !== null && id !== '' && Number.isInteger(Number(id)) && Number(id) >= 0;
124
+ });
125
+ var _iterator4 = _createForOfIteratorHelper(ids),
126
+ _step4;
127
+ try {
128
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
129
+ var id = _step4.value;
130
+ var metadata = _objectSpread(_objectSpread({}, holder), {}, {
131
+ form_record: [Number(id)]
132
+ });
133
+ if (ids.length !== 1) delete metadata.name;
134
+ relations.push({
135
+ relation_model: 'order_detail',
136
+ relation_uuid: String(uid),
137
+ holder_type: 'form',
138
+ holder_id: Number(id),
139
+ metadata: metadata
140
+ });
141
+ }
142
+ } catch (err) {
143
+ _iterator4.e(err);
144
+ } finally {
145
+ _iterator4.f();
146
+ }
147
+ }
148
+ } catch (err) {
149
+ _iterator3.e(err);
150
+ } finally {
151
+ _iterator3.f();
152
+ }
153
+ return relations.length ? relations : undefined;
154
+ }
@@ -4,7 +4,7 @@ import { OrderModuleAPI, CommitOrderParams, UpdateOrderBookingParams, UpdateOrde
4
4
  import { CartItem } from '../Cart/types';
5
5
  import { type SubmitPayloadEnhancer } from './utils';
6
6
  import { type PickupTimingBooking, type PickupTimingBookingInput } from './pickupTiming';
7
- import type { OrderAmountSnapshot, AddProductBookingInput, AddProductToOrderOptions, OrderIdentitySnapshot, OrderPaymentSource, OrderSnapshot, OrderSyncState, SyncPaymentsToOrderParams, SyncPaymentsToOrderResult, SubmitSalesOrderParams, OrderProduct, OrderProductIdentity, OrderSummary, OrderTempOrder, OrderPaymentData, OrderPaymentUpdateOptions, OrderPaymentUpdateResult, SendCustomerPayLinkParams, UpdateTempOrderCustomerInput, OrderCustomerPatch, OrderCustomerView, OrderCartIntentCommitContext, ReplaceTempOrderOptions, OrderPromotionEvaluator, OrderGiftSelectResolver, OrderUnfulfilledPromotion, OrderLastGiftActions, RemoveProductsFromOrderOptions, SalesNote, SalesNotesMutationSnapshot, SetSalesNoteInput, PickupReferenceMode, PointCardSnapshotMergeContext, PointCardSnapshotItem, ShopServiceData, ShopServiceType } from './types';
7
+ import type { OrderAmountSnapshot, AddProductBookingInput, AddProductToOrderOptions, OrderIdentitySnapshot, OrderPaymentSource, OrderSnapshot, OrderSyncState, SyncPaymentsToOrderParams, SyncPaymentsToOrderResult, SubmitSalesOrderParams, OrderProduct, OrderProductIdentity, OrderSummary, OrderTempOrder, OrderPaymentData, OrderPaymentUpdateOptions, OrderPaymentUpdateResult, SendCustomerPayLinkParams, UpdateTempOrderCustomerInput, OrderCustomerPatch, OrderCustomerView, OrderHooksConfig, OrderCartIntentCommitContext, ReplaceTempOrderOptions, OrderPromotionEvaluator, OrderGiftSelectResolver, OrderUnfulfilledPromotion, OrderLastGiftActions, RemoveProductsFromOrderOptions, SalesNote, SalesNotesMutationSnapshot, SetSalesNoteInput, PickupReferenceMode, PointCardSnapshotMergeContext, PointCardSnapshotItem, ShopServiceData, ShopServiceType } from './types';
8
8
  import type { ICustomer } from '../AccountList/types';
9
9
  import type { Discount } from '../Discount/types';
10
10
  import { UnavailableReason } from '../Rules/types';
@@ -29,6 +29,12 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
29
29
  private rulesHooksOverride?;
30
30
  private moduleHooksOverride?;
31
31
  private orderHooks?;
32
+ private cartCommandQueue;
33
+ private queueCartCommand;
34
+ /** Use the exact Order normalizers/merge rules on a private draft, not a second projection. */
35
+ private beginCartMutation;
36
+ /** Serializes checkout preparation with local cart commands; hydration remains outside this guard. */
37
+ prepareCheckout<T>(prepare: (items: OrderProduct[]) => Promise<T>): Promise<T>;
32
38
  private otherParams?;
33
39
  /** 评估器引用;由 SalesSdkProvider 注入,未注入时 applyPromotion 静默跳过 */
34
40
  private promotionEvaluator;
@@ -66,7 +72,11 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
66
72
  * @example
67
73
  * orderModule.updateOtherParams({ cacheId: 'cache-2', channel: 'pos' });
68
74
  */
69
- updateOtherParams(params: Record<string, any>): void;
75
+ updateOtherParams(params: Record<string, any>, options?: {
76
+ hooks?: OrderHooksConfig;
77
+ changedParams?: Record<string, any>;
78
+ cover?: boolean;
79
+ }): void;
70
80
  /** Internal intent boundary shared with asynchronous scanner/detail flows. */
71
81
  createCartIntentCommitGuard(action: OrderCartIntentCommitContext['action'], tempOrder?: OrderTempOrder | null): () => void;
72
82
  /** PC/H5 属于在线店铺;其它或缺失平台统一沿用 POS 行为。 */
@@ -481,6 +491,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
481
491
  * // → tempOrder.products 新增 3 行,每行 num=1,bookings 3 条
482
492
  */
483
493
  addProductToOrder(product: Partial<OrderProduct> & OrderProductIdentity, booking?: AddProductBookingInput, options?: AddProductToOrderOptions): Promise<OrderProduct[]>;
494
+ private addProductToOrderDraft;
484
495
  /**
485
496
  * 批量添加商品行,所有行追加完成后只触发一次促销、折扣、summary 重算与持久化。
486
497
  *
@@ -496,6 +507,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
496
507
  }>, options?: {
497
508
  skipEditDiscountConfigRefresh?: boolean;
498
509
  }): Promise<OrderProduct[]>;
510
+ private addProductsToOrderDraft;
499
511
  private getFullCoveragePassDiscounts;
500
512
  private hasEntitlementPassDiscount;
501
513
  private hasGoodPassDiscount;
@@ -507,8 +519,11 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
507
519
  private isRestrictedCartProductUpdate;
508
520
  private applyOrderProductUpdateToTempOrder;
509
521
  updateOrderProduct(params: UpdateOrderProductParams): Promise<OrderProduct[]>;
522
+ private updateOrderProductDraft;
510
523
  updateOrderProducts(paramsList: UpdateOrderProductParams[]): Promise<OrderProduct[]>;
524
+ private updateOrderProductsDraft;
511
525
  updateOrderProductQuantity(params: UpdateOrderProductQuantityParams): Promise<OrderProduct[]>;
526
+ private updateOrderProductQuantityDraft;
512
527
  updateOrderBooking(params: UpdateOrderBookingParams): any[];
513
528
  /**
514
529
  * 商品行写路径收尾:促销 → 折扣 → 清洗 → summary → 持久化。
@@ -525,12 +540,14 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
525
540
  * await order.removeProductsFromOrder([identityA, identityB]);
526
541
  */
527
542
  removeProductsFromOrder(identities: OrderProductIdentity[], options?: RemoveProductsFromOrderOptions): Promise<OrderProduct[]>;
543
+ private removeProductsFromOrderDraft;
528
544
  removeProductFromOrder(identity: OrderProductIdentity, options?: RemoveProductsFromOrderOptions): Promise<OrderProduct[]>;
529
545
  /**
530
546
  * 仅清空购物车行(products / bookings),不重置整单。
531
547
  * 普通整单 note 保持不变;以商品行为主体的 Sales Notes 同步删除。
532
548
  */
533
549
  clearOrderCartLines(): Promise<OrderTempOrder>;
550
+ private clearOrderCartLinesDraft;
534
551
  /**
535
552
  * 切换购物车结算单位时清理所有会影响新币种的订单状态,但保留当前客户。
536
553
  */
@@ -592,7 +609,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
592
609
  generateIdempotencyToken(): string;
593
610
  syncPaymentsToOrder<T = any>(params: SyncPaymentsToOrderParams): Promise<SyncPaymentsToOrderResult<T>>;
594
611
  createOrder(params: CommitOrderParams['query']): {
595
- type: "appointment_booking" | "virtual";
612
+ type: "virtual" | "appointment_booking";
596
613
  platform: string;
597
614
  sales_channel: string;
598
615
  order_sales_channel: string;
@@ -670,6 +687,6 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
670
687
  getOrderInfo(order_id: number): Promise<any>;
671
688
  getVouchers(): any[];
672
689
  }
673
- export type { AddProductToOrderOptions, OrderMetaList, PointCardSnapshotItem, VirtualCurrencySnapshotItem, RemoveProductsFromOrderOptions, SalesNote, SalesNoteDraftInput, SalesNoteLocalizedSelection, SalesNoteLocalizedText, SalesNoteRelation, SalesNoteTextInput, SetSalesNoteInput, UpdateOrderBookingParams, UpdateOrderProductParams, UpdateOrderProductQuantityParams, } from './types';
690
+ export type { OrderHolderRelation, AddProductToOrderOptions, OrderMetaList, PointCardSnapshotItem, VirtualCurrencySnapshotItem, RemoveProductsFromOrderOptions, SalesNote, SalesNoteDraftInput, SalesNoteLocalizedSelection, SalesNoteLocalizedText, SalesNoteRelation, SalesNoteTextInput, SetSalesNoteInput, UpdateOrderBookingParams, UpdateOrderProductParams, UpdateOrderProductQuantityParams, } from './types';
674
691
  export { isFulfillmentTimingBooking } from './pickupTiming';
675
692
  export type { PickupTimingBooking, PickupTimingBookingInput, PickupTimingBookingMetadata, PickupTimingSelectionMode, PickupTimingSource, } from './pickupTiming';