@pisell/pisellos 0.10.59 → 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 (58) 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/Order/holderRelations.d.ts +14 -0
  4. package/dist/modules/Order/holderRelations.js +154 -0
  5. package/dist/modules/Order/index.d.ts +2 -2
  6. package/dist/modules/Order/index.js +92 -47
  7. package/dist/modules/Order/types.d.ts +19 -1
  8. package/dist/modules/Order/types.js +2 -0
  9. package/dist/modules/Order/utils/discountProductLineIdentity.d.ts +1 -1
  10. package/dist/modules/Order/utils/discountProductLineIdentity.js +142 -7
  11. package/dist/modules/Order/utils/orderCollectionIdentity.js +24 -10
  12. package/dist/modules/Order/utils.d.ts +1 -1
  13. package/dist/modules/Order/utils.js +35 -9
  14. package/dist/server/index.js +18 -12
  15. package/dist/server/modules/order/index.d.ts +4 -0
  16. package/dist/server/modules/order/index.js +255 -190
  17. package/dist/server/modules/order/types.d.ts +3 -0
  18. package/dist/shared/receipt/small-ticket.js +17 -0
  19. package/dist/shared/sales/loadSalesOrderSnapshot.js +1 -1
  20. package/dist/solution/BaseSales/index.js +97 -27
  21. package/dist/solution/BaseSales/types.d.ts +2 -1
  22. package/dist/solution/BaseSales/utils/parseSalesResponse.d.ts +3 -1
  23. package/dist/solution/BaseSales/utils/parseSalesResponse.js +7 -3
  24. package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +12 -3
  25. package/dist/solution/BookingByStep/index.d.ts +1 -1
  26. package/dist/solution/BookingTicket/index.d.ts +1 -13
  27. package/dist/solution/BookingTicket/index.js +7 -4
  28. package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.js +6 -2
  29. package/lib/model/strategy/adapter/promotion/index.js +46 -1
  30. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +3 -1
  31. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +16 -1
  32. package/lib/modules/Order/holderRelations.d.ts +14 -0
  33. package/lib/modules/Order/holderRelations.js +98 -0
  34. package/lib/modules/Order/index.d.ts +2 -2
  35. package/lib/modules/Order/index.js +44 -12
  36. package/lib/modules/Order/types.d.ts +19 -1
  37. package/lib/modules/Order/types.js +1 -0
  38. package/lib/modules/Order/utils/discountProductLineIdentity.d.ts +1 -1
  39. package/lib/modules/Order/utils/discountProductLineIdentity.js +51 -2
  40. package/lib/modules/Order/utils/orderCollectionIdentity.js +5 -0
  41. package/lib/modules/Order/utils.d.ts +1 -1
  42. package/lib/modules/Order/utils.js +27 -6
  43. package/lib/server/index.js +6 -0
  44. package/lib/server/modules/order/index.d.ts +4 -0
  45. package/lib/server/modules/order/index.js +46 -4
  46. package/lib/server/modules/order/types.d.ts +3 -0
  47. package/lib/shared/receipt/small-ticket.js +15 -0
  48. package/lib/shared/sales/loadSalesOrderSnapshot.js +1 -1
  49. package/lib/solution/BaseSales/index.js +39 -2
  50. package/lib/solution/BaseSales/types.d.ts +2 -1
  51. package/lib/solution/BaseSales/utils/parseSalesResponse.d.ts +3 -1
  52. package/lib/solution/BaseSales/utils/parseSalesResponse.js +4 -0
  53. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +7 -0
  54. package/lib/solution/BookingByStep/index.d.ts +1 -1
  55. package/lib/solution/BookingTicket/index.d.ts +1 -13
  56. package/lib/solution/BookingTicket/index.js +4 -1
  57. package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +7 -1
  58. package/package.json +1 -1
@@ -1,3 +1,11 @@
1
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
2
+ 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."); }
3
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
4
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
5
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
6
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
7
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
8
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
1
9
  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; } } }; }
2
10
  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); }
3
11
  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; }
@@ -10,6 +18,7 @@ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" ==
10
18
  import { cloneDeep } from 'lodash-es';
11
19
  import { buildProductLineFingerprint, getSafeProductNum } from "../../../solution/ScanOrder/utils";
12
20
  import { createUuidV4 } from "./orderCollectionIdentity";
21
+ import { getProductHolderRelations } from "../holderRelations";
13
22
 
14
23
  /**
15
24
  * 商品券拆行的身份与回并工具。
@@ -80,15 +89,20 @@ function ensureProductsByUid(tempOrder) {
80
89
  * 正常 Order 写路径会在 normalize 阶段提前创建 UID。
81
90
  */
82
91
  export function ensureUniqueProductLineUids(tempOrder) {
92
+ var discounts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
83
93
  // usedUids 只描述本次 Rules 返回的商品集合,不能直接依赖 productsByUid:
84
94
  // productsByUid 可能还保留已删除行的历史 runtime,历史 UID 不应导致当前行被改号。
85
95
  var usedUids = new Set();
86
96
  var productsByUid = ensureProductsByUid(tempOrder);
97
+ var splitGroups = new Map();
87
98
  tempOrder.products = (tempOrder.products || []).map(function (product) {
88
99
  var sourceUid = getProductLineUid(product);
89
100
  // 单测 mock 或兼容旧 Rules 时可能返回没有 UID 的裸商品。
90
101
  // 这里不主动补 UID,避免一个“校验重复”的工具意外改变旧协议对象形状。
91
102
  if (!sourceUid) return product;
103
+ var group = splitGroups.get(sourceUid) || [];
104
+ group.push(product);
105
+ splitGroups.set(sourceUid, group);
92
106
 
93
107
  // 实际场景:可乐 ×5 首次进入 Rules 时只有一行。
94
108
  // 使用三张券后 Rules 可能返回「可乐 ×2 + 三条可乐 ×1」,但四条都复制原 UID。
@@ -122,6 +136,127 @@ export function ensureUniqueProductLineUids(tempOrder) {
122
136
  usedUids.add(splitUid);
123
137
  return product;
124
138
  });
139
+
140
+ // 仅按本次券上的明确 Holder 分配迁移。数组顺序不能代表券对应的人。
141
+ // 未能明确分配时保留原 UID,不把整组关系复制给每一个拆分行。
142
+ var _iterator = _createForOfIteratorHelper(splitGroups),
143
+ _step;
144
+ try {
145
+ var _loop = function _loop() {
146
+ var _step$value = _slicedToArray(_step.value, 2),
147
+ sourceUid = _step$value[0],
148
+ products = _step$value[1];
149
+ if (products.length < 2) return 0; // continue
150
+ var relations = getProductHolderRelations(tempOrder, {
151
+ metadata: {
152
+ unique_identification_number: sourceUid
153
+ }
154
+ });
155
+ if (!relations.length || relations.some(function (relation) {
156
+ return relation.holder_type !== 'form';
157
+ })) return 0; // continue
158
+ var assignments = new Map();
159
+ var remaining = _toConsumableArray(relations);
160
+ var ambiguous = false;
161
+ var _iterator2 = _createForOfIteratorHelper(products),
162
+ _step2;
163
+ try {
164
+ var _loop2 = function _loop2() {
165
+ var product = _step2.value;
166
+ var holderIds = new Set();
167
+ var _iterator4 = _createForOfIteratorHelper(product.discount_list || []),
168
+ _step4;
169
+ try {
170
+ var _loop3 = function _loop3() {
171
+ var _discount$holder;
172
+ var item = _step4.value;
173
+ var discount = discounts.find(function (candidate) {
174
+ var _item$discount;
175
+ return String(candidate.id) === String((_item$discount = item.discount) === null || _item$discount === void 0 ? void 0 : _item$discount.resource_id);
176
+ });
177
+ if ((discount === null || discount === void 0 || (_discount$holder = discount.holder) === null || _discount$holder === void 0 ? void 0 : _discount$holder.holder_type) !== 'form') return 1; // continue
178
+ var value = discount.holder.holder_id;
179
+ (Array.isArray(value) ? value : [value]).forEach(function (id) {
180
+ var recordId = id && _typeof(id) === 'object' ? id.form_record_id : id;
181
+ if (recordId !== undefined && recordId !== null && recordId !== '') holderIds.add(String(recordId));
182
+ });
183
+ };
184
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
185
+ if (_loop3()) continue;
186
+ }
187
+ } catch (err) {
188
+ _iterator4.e(err);
189
+ } finally {
190
+ _iterator4.f();
191
+ }
192
+ if (!holderIds.size) return 0; // continue
193
+ var assigned = remaining.filter(function (relation) {
194
+ return holderIds.has(String(relation.holder_id));
195
+ });
196
+ if (assigned.length !== Number(product.num)) {
197
+ ambiguous = true;
198
+ return 1; // break
199
+ }
200
+ assignments.set(product, assigned);
201
+ remaining = remaining.filter(function (relation) {
202
+ return !assigned.includes(relation);
203
+ });
204
+ },
205
+ _ret2;
206
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
207
+ _ret2 = _loop2();
208
+ if (_ret2 === 0) continue;
209
+ if (_ret2 === 1) break;
210
+ }
211
+ } catch (err) {
212
+ _iterator2.e(err);
213
+ } finally {
214
+ _iterator2.f();
215
+ }
216
+ var unassigned = products.filter(function (product) {
217
+ return !assignments.has(product);
218
+ });
219
+ if (ambiguous || unassigned.length > 1) return 0; // continue
220
+ if (unassigned.length === 1) {
221
+ if (remaining.length !== Number(unassigned[0].num)) return 0; // continue
222
+ assignments.set(unassigned[0], remaining);
223
+ } else if (remaining.length) return 0; // continue
224
+ var _iterator3 = _createForOfIteratorHelper(assignments),
225
+ _step3;
226
+ try {
227
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
228
+ var _step3$value = _slicedToArray(_step3.value, 2),
229
+ product = _step3$value[0],
230
+ assigned = _step3$value[1];
231
+ var _iterator5 = _createForOfIteratorHelper(assigned),
232
+ _step5;
233
+ try {
234
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
235
+ var relation = _step5.value;
236
+ relation.relation_uuid = String(getProductLineUid(product));
237
+ }
238
+ } catch (err) {
239
+ _iterator5.e(err);
240
+ } finally {
241
+ _iterator5.f();
242
+ }
243
+ }
244
+ } catch (err) {
245
+ _iterator3.e(err);
246
+ } finally {
247
+ _iterator3.f();
248
+ }
249
+ },
250
+ _ret;
251
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
252
+ _ret = _loop();
253
+ if (_ret === 0) continue;
254
+ }
255
+ } catch (err) {
256
+ _iterator.e(err);
257
+ } finally {
258
+ _iterator.f();
259
+ }
125
260
  }
126
261
 
127
262
  /**
@@ -140,12 +275,12 @@ export function consolidateDiscountFreeProductLines(tempOrder) {
140
275
  // 清除客户/商品券后,四行都恢复为无折扣状态,应在本轮重算中立即回并为「可乐 ×5」。
141
276
  var consolidatedProducts = [];
142
277
  var productIndexByKey = new Map();
143
- var _iterator = _createForOfIteratorHelper(tempOrder.products || []),
144
- _step;
278
+ var _iterator6 = _createForOfIteratorHelper(tempOrder.products || []),
279
+ _step6;
145
280
  try {
146
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
281
+ for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
147
282
  var _product$booking_uid, _product$metadata4, _booking_id, _product$metadata5, _product$order_detail, _holder_id, _product$metadata6, _product$metadata7, _product$metadata8, _product$product_sku2, _product$metadata9, _tempOrder$_extend, _product$selling_pric, _product$original_pri, _custom_price, _product$is_charge_ta, _product$gift_card, _product$bundle_edit, _product$metadata$pri, _product$metadata10, _product$metadata$sou, _product$metadata11, _product$metadata$mai, _product$metadata12, _product$metadata$mai2, _product$metadata13, _product$product_vari;
148
- var product = _step.value;
283
+ var product = _step6.value;
149
284
  var productBundle = Array.isArray(product.product_bundle) ? product.product_bundle : [];
150
285
  var hasDiscount = (product.discount_list || []).length > 0 || productBundle.some(function (bundle) {
151
286
  return ((bundle === null || bundle === void 0 ? void 0 : bundle.discount_list) || []).length > 0;
@@ -161,7 +296,7 @@ export function consolidateDiscountFreeProductLines(tempOrder) {
161
296
  // - 手动改价/备注:用户显式表达了不同价格或不同制作要求;
162
297
  // - 称重商品:每次称重的净重和金额属于独立交易事实;
163
298
  // - 预约/holder/历史订单行:分别关联预约、持有人或后端 order_detail。
164
- var hasMergeBoundary = hasDiscount || Boolean(((_product$metadata7 = product.metadata) === null || _product$metadata7 === void 0 ? void 0 : _product$metadata7._giftInfo) || product._giftInfo) || Boolean((_product$metadata8 = product.metadata) === null || _product$metadata8 === void 0 ? void 0 : _product$metadata8._promotion) || isManualProductDiscountLine(product) || hasProductLineNote(product) || Number(((_product$product_sku2 = product.product_sku) === null || _product$product_sku2 === void 0 ? void 0 : _product$product_sku2.open_sold_weight) || 0) === 1 || ((_product$metadata9 = product.metadata) === null || _product$metadata9 === void 0 ? void 0 : _product$metadata9.is_edit_for_runtime) === true || bookingId !== undefined && bookingId !== null && bookingId !== 0 && bookingId !== '0' || bookingUid !== undefined && bookingUid !== null && String(bookingUid) !== '' || holderId !== undefined && holderId !== null && String(holderId) !== '' || orderDetailId !== undefined && orderDetailId !== null && orderDetailId !== '';
299
+ var hasMergeBoundary = hasDiscount || Boolean(((_product$metadata7 = product.metadata) === null || _product$metadata7 === void 0 ? void 0 : _product$metadata7._giftInfo) || product._giftInfo) || Boolean((_product$metadata8 = product.metadata) === null || _product$metadata8 === void 0 ? void 0 : _product$metadata8._promotion) || isManualProductDiscountLine(product) || hasProductLineNote(product) || Number(((_product$product_sku2 = product.product_sku) === null || _product$product_sku2 === void 0 ? void 0 : _product$product_sku2.open_sold_weight) || 0) === 1 || ((_product$metadata9 = product.metadata) === null || _product$metadata9 === void 0 ? void 0 : _product$metadata9.is_edit_for_runtime) === true || bookingId !== undefined && bookingId !== null && bookingId !== 0 && bookingId !== '0' || bookingUid !== undefined && bookingUid !== null && String(bookingUid) !== '' || getProductHolderRelations(tempOrder, product).length > 0 || holderId !== undefined && holderId !== null && String(holderId) !== '' || orderDetailId !== undefined && orderDetailId !== null && orderDetailId !== '';
165
300
  if (hasMergeBoundary) {
166
301
  consolidatedProducts.push(product);
167
302
  continue;
@@ -219,9 +354,9 @@ export function consolidateDiscountFreeProductLines(tempOrder) {
219
354
  // 保留历史索引比立即清理更安全;当前购物车身份始终以 tempOrder.products 为准。
220
355
  }
221
356
  } catch (err) {
222
- _iterator.e(err);
357
+ _iterator6.e(err);
223
358
  } finally {
224
- _iterator.f();
359
+ _iterator6.f();
225
360
  }
226
361
  tempOrder.products = consolidatedProducts;
227
362
  }
@@ -367,12 +367,26 @@ export function applyOrderCollectionUidRemaps(sourceOrder, uidRemaps) {
367
367
  _iterator4.f();
368
368
  }
369
369
  if (remap.scope !== 'linked-owner') {
370
- var _iterator5 = _createForOfIteratorHelper(order.products || []),
370
+ var _iterator5 = _createForOfIteratorHelper(order.holder_relations || []),
371
371
  _step5;
372
372
  try {
373
373
  for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
374
+ var relation = _step5.value;
375
+ if (relation.relation_model === 'order_detail' && String(relation.relation_uuid) === remap.from) {
376
+ relation.relation_uuid = remap.to;
377
+ }
378
+ }
379
+ } catch (err) {
380
+ _iterator5.e(err);
381
+ } finally {
382
+ _iterator5.f();
383
+ }
384
+ var _iterator6 = _createForOfIteratorHelper(order.products || []),
385
+ _step6;
386
+ try {
387
+ for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
374
388
  var _product$metadata, _product$metadata2;
375
- var product = _step5.value;
389
+ var product = _step6.value;
376
390
  if (String((product === null || product === void 0 || (_product$metadata = product.metadata) === null || _product$metadata === void 0 ? void 0 : _product$metadata.parent_unique_identification_number) || '') === remap.from) {
377
391
  product.metadata = _objectSpread(_objectSpread({}, product.metadata || {}), {}, {
378
392
  parent_unique_identification_number: remap.to
@@ -394,9 +408,9 @@ export function applyOrderCollectionUidRemaps(sourceOrder, uidRemaps) {
394
408
  }
395
409
  }
396
410
  } catch (err) {
397
- _iterator5.e(err);
411
+ _iterator6.e(err);
398
412
  } finally {
399
- _iterator5.f();
413
+ _iterator6.f();
400
414
  }
401
415
  }
402
416
  var productsByUid = (_order$_extend = order._extend) === null || _order$_extend === void 0 ? void 0 : _order$_extend.productsByUid;
@@ -429,12 +443,12 @@ export function applyOrderCollectionUidRemaps(sourceOrder, uidRemaps) {
429
443
  }
430
444
  }
431
445
  if (remap.kind === 'booking') {
432
- var _iterator6 = _createForOfIteratorHelper(order.products || []),
433
- _step6;
446
+ var _iterator7 = _createForOfIteratorHelper(order.products || []),
447
+ _step7;
434
448
  try {
435
- for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
449
+ for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
436
450
  var _product$metadata3;
437
- var _product = _step6.value;
451
+ var _product = _step7.value;
438
452
  if (remap.scope === 'linked-owner' && (linkedOwnerIsAmbiguous || getOrderCollectionUid('product', _product) !== remap.referenceOwnerUid)) {
439
453
  continue;
440
454
  }
@@ -448,9 +462,9 @@ export function applyOrderCollectionUidRemaps(sourceOrder, uidRemaps) {
448
462
  }
449
463
  }
450
464
  } catch (err) {
451
- _iterator6.e(err);
465
+ _iterator7.e(err);
452
466
  } finally {
453
- _iterator6.f();
467
+ _iterator7.f();
454
468
  }
455
469
  }
456
470
  },
@@ -173,7 +173,7 @@ export declare function resolveManualOverrideLineOriginalPrice(params: {
173
173
  * // => -4
174
174
  */
175
175
  export declare function resolveEffectivePerUnitDiscount(product: Record<string, any>): number;
176
- export declare function createDefaultOrderRulesHooks(getBookings?: () => OrderTempOrder['bookings']): RulesParamsHooks;
176
+ export declare function createDefaultOrderRulesHooks(getBookings?: () => OrderTempOrder['bookings'], getHolderRelations?: () => OrderTempOrder['holder_relations']): RulesParamsHooks;
177
177
  /**
178
178
  * 通过 session 类商品的开始时间结束时间生成商品的时长
179
179
  * @param {CartItem} cartItem
@@ -1,6 +1,6 @@
1
1
  var _excluded = ["custom_product_bundle_map_id"],
2
2
  _excluded2 = ["unique_identification_number"],
3
- _excluded3 = ["num", "surcharge_fee", "discount_amount", "discount_type", "discountway", "product_discount_reason", "discount_per", "production_code"],
3
+ _excluded3 = ["num", "_extend", "surcharge_fee", "discount_amount", "discount_type", "discountway", "product_discount_reason", "discount_per", "production_code"],
4
4
  _excluded4 = ["_extend", "relation_id", "table_form_id", "resource_id", "summary", "lastOrderInfo", "paid_amount", "shop_id", "shop_note", "shop_service_type", "start_time", "customer", "discount_list", "order_meta_list", "tax_fee", "total_amount", "total_refund_amount", "create_date", "holder_id", "payment_status", "notes"],
5
5
  _excluded5 = ["collect_pax", "table_occupancy_duration", "cart_settlement_key", "cart_settlement_snapshot", "legal_currency_snapshot"];
6
6
  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; }
@@ -22,6 +22,7 @@ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symb
22
22
  function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
23
23
  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; }
24
24
  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); }
25
+ import { cloneDeep } from 'lodash-es';
25
26
  import dayjs from "dayjs";
26
27
  import customParseFormat from 'dayjs/plugin/customParseFormat';
27
28
  import Decimal from 'decimal.js';
@@ -32,6 +33,7 @@ import { buildProductLineFingerprint, createEmptySummary } from "../../solution/
32
33
  import { createUuidV4 } from "./utils/orderCollectionIdentity";
33
34
  import { encodeSalesNotes } from "./salesNotes";
34
35
  import { isFulfillmentTimingBooking } from "./pickupTiming";
36
+ import { ensureHolderRelationUuids, getProductHolderRelations, hasProductBooking, removeProductHolderRelations } from "./holderRelations";
35
37
  dayjs.extend(customParseFormat);
36
38
  var POINT_CARD_SNAPSHOT_TAG = 'point_card';
37
39
  var VIRTUAL_CURRENCY_SNAPSHOT_TAG = 'virtual_currency';
@@ -788,7 +790,7 @@ export function resolveEffectivePerUnitDiscount(product) {
788
790
  if (!Number.isFinite(originalPrice) || !Number.isFinite(finalPrice)) return fromList;
789
791
  return fromList + (originalPrice - finalPrice);
790
792
  }
791
- export function createDefaultOrderRulesHooks(getBookings) {
793
+ export function createDefaultOrderRulesHooks(getBookings, getHolderRelations) {
792
794
  var getProductStartDate = function getProductStartDate(product) {
793
795
  var _ref17, _product$metadata$uni, _product$metadata2, _ref18, _product$booking_uid, _product$metadata3, _product$metadata4, _product$metadata5, _product$metadata6;
794
796
  var productUid = String((_ref17 = (_product$metadata$uni = (_product$metadata2 = product.metadata) === null || _product$metadata2 === void 0 ? void 0 : _product$metadata2.unique_identification_number) !== null && _product$metadata$uni !== void 0 ? _product$metadata$uni : product.unique_identification_number) !== null && _ref17 !== void 0 ? _ref17 : '');
@@ -911,7 +913,13 @@ export function createDefaultOrderRulesHooks(getBookings) {
911
913
  // 勿写死 false:否则 Rules 不会走 total≠origin_total 的手动价推断,
912
914
  // 无券时会把 bundle 价还原成 original_price(手动改价套餐会从 20 回到 30)。
913
915
  isManualDiscount: resolveRulesManualDiscountFlag(metadataAny),
914
- holder_id: (_product$metadata9 = product.metadata) === null || _product$metadata9 === void 0 ? void 0 : _product$metadata9.holder_id,
916
+ holder_id: hasProductBooking(product) || !getHolderRelations ? (_product$metadata9 = product.metadata) === null || _product$metadata9 === void 0 ? void 0 : _product$metadata9.holder_id : getProductHolderRelations({
917
+ holder_relations: getHolderRelations()
918
+ }, product).filter(function (relation) {
919
+ return relation.holder_type === 'form';
920
+ }).map(function (relation) {
921
+ return relation.holder_id;
922
+ }),
915
923
  startDate: getProductStartDate(product),
916
924
  main_product_selling_price: metadataAny.main_product_selling_price !== undefined ? new Decimal(Number(metadataAny.main_product_selling_price) || 0).minus(optionSellingSum).toDecimalPlaces(2).toString() : undefined,
917
925
  inPromotion: ((_metadataAny$_promoti = metadataAny._promotion) === null || _metadataAny$_promoti === void 0 ? void 0 : _metadataAny$_promoti.inPromotion) === true,
@@ -1208,6 +1216,7 @@ function normalizeSubmitProduct(product) {
1208
1216
  _runtimeUid = _ref37.unique_identification_number,
1209
1217
  submitProduct = _objectWithoutProperties(_ref37, _excluded2);
1210
1218
  var num = submitProduct.num,
1219
+ _productExtend = submitProduct._extend,
1211
1220
  _productSurchargeFee = submitProduct.surcharge_fee,
1212
1221
  _deprecatedDiscountAmount = submitProduct.discount_amount,
1213
1222
  _deprecatedDiscountType = submitProduct.discount_type,
@@ -1398,6 +1407,7 @@ export function createDefaultTempOrder(params) {
1398
1407
  request_unique_idempotency_token: '',
1399
1408
  vouchers: [],
1400
1409
  products: [],
1410
+ holder_relations: [],
1401
1411
  notes: [],
1402
1412
  bookings: [],
1403
1413
  payments: [],
@@ -1474,6 +1484,7 @@ export function buildSubmitPayload(params) {
1474
1484
  type = params.type,
1475
1485
  summary = params.summary,
1476
1486
  enhance = params.enhance;
1487
+ ensureHolderRelationUuids(tempOrder);
1477
1488
  var scheduleDate = tempOrder.schedule_date || tempOrder.created_at || formatDateTime(now);
1478
1489
  var bookingUuid = createUuidV4();
1479
1490
  var virtualSettlementMode = ((_tempOrder$metadata2 = tempOrder.metadata) === null || _tempOrder$metadata2 === void 0 || (_tempOrder$metadata2 = _tempOrder$metadata2.currency_settlement_config) === null || _tempOrder$metadata2 === void 0 ? void 0 : _tempOrder$metadata2.settlement_type) === 'virtual_currency';
@@ -1510,7 +1521,9 @@ export function buildSubmitPayload(params) {
1510
1521
  tempOrderBusinessCode: tempOrder.business_code,
1511
1522
  bookings: tempOrder.bookings
1512
1523
  });
1513
- var payload = _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, tempOrderRest), {}, {
1524
+ var payload = _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({}, tempOrderRest), tempOrder.holder_relations !== undefined ? {
1525
+ holder_relations: cloneDeep(tempOrder.holder_relations)
1526
+ } : {}), {}, {
1514
1527
  customer_id: (_tempOrder$customer_i = tempOrder.customer_id) !== null && _tempOrder$customer_i !== void 0 ? _tempOrder$customer_i : 1,
1515
1528
  customer_name: tempOrder.customer_name || 'Walk-In',
1516
1529
  country_calling_code: String((_tempOrder$country_ca = tempOrder.country_calling_code) !== null && _tempOrder$country_ca !== void 0 ? _tempOrder$country_ca : ''),
@@ -1697,21 +1710,32 @@ export function hasAssignedHolderId(value) {
1697
1710
  * clearTempOrderHolderAssignments(tempOrder);
1698
1711
  */
1699
1712
  export function clearTempOrderHolderAssignments(tempOrder) {
1700
- var _tempOrder$_extend2;
1701
- var changed = false;
1713
+ var _tempOrder$holder_rel, _tempOrder$holder_rel2, _tempOrder$_extend2;
1714
+ var previousRelationCount = ((_tempOrder$holder_rel = tempOrder.holder_relations) === null || _tempOrder$holder_rel === void 0 ? void 0 : _tempOrder$holder_rel.length) || 0;
1715
+ removeProductHolderRelations(tempOrder, (tempOrder.products || []).filter(function (product) {
1716
+ return !hasProductBooking(product);
1717
+ }));
1718
+ var changed = previousRelationCount !== (((_tempOrder$holder_rel2 = tempOrder.holder_relations) === null || _tempOrder$holder_rel2 === void 0 ? void 0 : _tempOrder$holder_rel2.length) || 0);
1702
1719
  var resetHolderField = function resetHolderField(target) {
1703
1720
  var key = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'holder_id';
1704
1721
  if (!hasAssignedHolderId(target[key])) return;
1705
1722
  target[key] = null;
1706
1723
  changed = true;
1707
1724
  };
1725
+ var clearHolder = function clearHolder(target) {
1726
+ resetHolderField(target);
1727
+ if (target.holder !== undefined && target.holder !== null) {
1728
+ target.holder = null;
1729
+ changed = true;
1730
+ }
1731
+ };
1708
1732
  var _iterator8 = _createForOfIteratorHelper(tempOrder.products || []),
1709
1733
  _step8;
1710
1734
  try {
1711
1735
  for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
1712
1736
  var product = _step8.value;
1713
1737
  if (product.metadata && _typeof(product.metadata) === 'object') {
1714
- resetHolderField(product.metadata);
1738
+ clearHolder(product.metadata);
1715
1739
  }
1716
1740
  }
1717
1741
  } catch (err) {
@@ -1744,11 +1768,13 @@ export function clearTempOrderHolderAssignments(tempOrder) {
1744
1768
  var entry = _Object$values[_i4];
1745
1769
  var origin = entry === null || entry === void 0 ? void 0 : entry.origin;
1746
1770
  if (!origin || _typeof(origin) !== 'object') continue;
1771
+ clearHolder(origin);
1747
1772
  if (origin.metadata && _typeof(origin.metadata) === 'object') {
1748
- resetHolderField(origin.metadata);
1773
+ clearHolder(origin.metadata);
1749
1774
  }
1750
1775
  if (origin._extend && _typeof(origin._extend) === 'object') {
1751
- resetHolderField(origin._extend);
1776
+ clearHolder(origin._extend);
1777
+ delete origin._extend.holder_relations;
1752
1778
  }
1753
1779
  }
1754
1780
  }
@@ -2845,7 +2845,7 @@ var Server = /*#__PURE__*/function () {
2845
2845
  backendPath = params.backendPath, checkoutData = params.checkoutData, externalSaleNumber = params.externalSaleNumber, fresh = params.fresh, title = params.title, persistCheckoutDataWithResponse = params.persistCheckoutDataWithResponse;
2846
2846
  shouldMergeRemoteOrder = fresh ? this.isMergeableCheckoutOrder(fresh, externalSaleNumber) : false;
2847
2847
  if (!(this.order && fresh && (shouldMergeRemoteOrder || persistCheckoutDataWithResponse))) {
2848
- _context34.next = 9;
2848
+ _context34.next = 10;
2849
2849
  break;
2850
2850
  }
2851
2851
  syncedOrder = persistCheckoutDataWithResponse ? _objectSpread(_objectSpread(_objectSpread({}, checkoutData), this.mergeCheckoutSyncPayments(checkoutData, fresh, title)), {}, {
@@ -2857,9 +2857,12 @@ var Server = /*#__PURE__*/function () {
2857
2857
  need_sync: 0,
2858
2858
  is_draft_order: 0
2859
2859
  });
2860
- _context34.next = 6;
2860
+ if (!Array.isArray(fresh.holder_relations) && Array.isArray(checkoutData === null || checkoutData === void 0 ? void 0 : checkoutData.holder_relations)) {
2861
+ syncedOrder.holder_relations = cloneDeep(checkoutData.holder_relations);
2862
+ }
2863
+ _context34.next = 7;
2861
2864
  return this.order.upsertOrdersFromRemote([syncedOrder], 'checkoutSync');
2862
- case 6:
2865
+ case 7:
2863
2866
  this.logInfo("".concat(title, ": sync_sales \u5B8C\u6574\u8BA2\u5355\u5DF2\u540C\u6B65\u5230\u672C\u5730"), {
2864
2867
  order_id: fresh.order_id,
2865
2868
  external_sale_number: syncedOrder.external_sale_number,
@@ -2867,20 +2870,20 @@ var Server = /*#__PURE__*/function () {
2867
2870
  mergedRemoteOrder: shouldMergeRemoteOrder,
2868
2871
  persistedCheckoutDataWithResponse: persistCheckoutDataWithResponse
2869
2872
  });
2870
- _context34.next = 19;
2873
+ _context34.next = 20;
2871
2874
  break;
2872
- case 9:
2875
+ case 10:
2873
2876
  if (!(this.order && externalSaleNumber && typeof this.order.markOrderSyncedByExternalSaleNumber === 'function')) {
2874
- _context34.next = 18;
2877
+ _context34.next = 19;
2875
2878
  break;
2876
2879
  }
2877
2880
  patch = this.buildCheckoutSyncSuccessPatch(fresh);
2878
- _context34.next = 13;
2881
+ _context34.next = 14;
2879
2882
  return this.order.markOrderSyncedByExternalSaleNumber({
2880
2883
  externalSaleNumber: externalSaleNumber,
2881
2884
  patch: patch
2882
2885
  });
2883
- case 13:
2886
+ case 14:
2884
2887
  result = _context34.sent;
2885
2888
  syncedOrder = (result === null || result === void 0 ? void 0 : result.order) || _objectSpread(_objectSpread(_objectSpread({}, checkoutData), patch), {}, {
2886
2889
  external_sale_number: externalSaleNumber,
@@ -2893,17 +2896,17 @@ var Server = /*#__PURE__*/function () {
2893
2896
  hasRemoteOrder: !!fresh,
2894
2897
  mergedRemoteOrder: false
2895
2898
  });
2896
- _context34.next = 19;
2899
+ _context34.next = 20;
2897
2900
  break;
2898
- case 18:
2901
+ case 19:
2899
2902
  this.logWarning("".concat(title, ": sync_sales Order \u6A21\u5757\u672A\u6CE8\u518C"), {
2900
2903
  backendPath: backendPath,
2901
2904
  external_sale_number: externalSaleNumber,
2902
2905
  order_id: fresh === null || fresh === void 0 ? void 0 : fresh.order_id
2903
2906
  });
2904
- case 19:
2905
- return _context34.abrupt("return", syncedOrder);
2906
2907
  case 20:
2908
+ return _context34.abrupt("return", syncedOrder);
2909
+ case 21:
2907
2910
  case "end":
2908
2911
  return _context34.stop();
2909
2912
  }
@@ -8002,6 +8005,9 @@ var Server = /*#__PURE__*/function () {
8002
8005
  if (fresh.order_number !== undefined && fresh.order_number !== null) {
8003
8006
  patch.order_number = fresh.order_number;
8004
8007
  }
8008
+ if (Array.isArray(fresh.holder_relations)) {
8009
+ patch.holder_relations = cloneDeep(fresh.holder_relations);
8010
+ }
8005
8011
  return patch;
8006
8012
  }
8007
8013
  }, {
@@ -311,6 +311,10 @@ export declare class OrderModule extends BaseModule implements Module {
311
311
  private getIdentifiedPendingPayments;
312
312
  private shouldProtectLocalOrderFromRemoteSnapshot;
313
313
  private getUnmatchedIdentifiedPendingPayments;
314
+ /** 关系数组是完整快照,不能拼接或按商品子项生成 UID;扩展字段整体保留。 */
315
+ private applyHolderRelationsSnapshot;
316
+ /** 全量拉取缺少关系字段时,仍保留同一订单已有的关系快照。 */
317
+ private preserveOmittedHolderRelations;
314
318
  private mergeOrderRecords;
315
319
  private summarizeDuplicateOrders;
316
320
  private logDuplicateOrders;