@pisell/pisellos 0.10.2 → 0.10.4

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 (139) hide show
  1. package/dist/core/index.d.ts +2 -0
  2. package/dist/core/index.js +7 -0
  3. package/dist/model/strategy/adapter/promotion/adapter.d.ts +4 -0
  4. package/dist/model/strategy/adapter/promotion/adapter.js +23 -0
  5. package/dist/model/strategy/adapter/promotion/evaluator.d.ts +17 -0
  6. package/dist/model/strategy/adapter/promotion/evaluator.js +279 -6
  7. package/dist/model/strategy/adapter/promotion/examples.d.ts +86 -0
  8. package/dist/model/strategy/adapter/promotion/examples.js +99 -0
  9. package/dist/model/strategy/adapter/promotion/index.d.ts +1 -1
  10. package/dist/model/strategy/adapter/promotion/index.js +0 -9
  11. package/dist/model/strategy/adapter/promotion/type.d.ts +90 -2
  12. package/dist/model/strategy/adapter/promotion/type.js +45 -0
  13. package/dist/modules/BaseModule.d.ts +1 -0
  14. package/dist/modules/BaseModule.js +24 -28
  15. package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +5 -3
  16. package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +6 -3
  17. package/dist/modules/OpenData/index.d.ts +2 -0
  18. package/dist/modules/OpenData/index.js +8 -0
  19. package/dist/modules/Order/index.d.ts +41 -10
  20. package/dist/modules/Order/index.js +943 -546
  21. package/dist/modules/Order/payment-utils.d.ts +26 -0
  22. package/dist/modules/Order/payment-utils.js +225 -0
  23. package/dist/modules/Order/types.d.ts +43 -2
  24. package/dist/modules/Order/utils/orderCollectionIdentity.js +7 -2
  25. package/dist/modules/Order/utils.js +10 -6
  26. package/dist/modules/Payment/index.d.ts +2 -0
  27. package/dist/modules/Payment/index.js +79 -50
  28. package/dist/modules/Payment/types.d.ts +107 -28
  29. package/dist/modules/Payment/types.js +20 -3
  30. package/dist/modules/Payment/walletpass.d.ts +38 -1
  31. package/dist/modules/Payment/walletpass.js +917 -114
  32. package/dist/modules/ProductList/index.js +1 -1
  33. package/dist/modules/Rules/index.d.ts +3 -0
  34. package/dist/modules/Rules/index.js +130 -99
  35. package/dist/server/index.d.ts +16 -0
  36. package/dist/server/index.js +2084 -1188
  37. package/dist/server/modules/index.d.ts +1 -1
  38. package/dist/server/modules/order/index.d.ts +70 -4
  39. package/dist/server/modules/order/index.js +1816 -728
  40. package/dist/server/modules/order/types.d.ts +25 -3
  41. package/dist/server/modules/order/types.js +7 -1
  42. package/dist/solution/BaseSales/index.d.ts +114 -14
  43. package/dist/solution/BaseSales/index.js +1848 -478
  44. package/dist/solution/BaseSales/types.d.ts +55 -1
  45. package/dist/solution/BaseSales/types.js +2 -1
  46. package/dist/solution/BaseSales/utils/cartPromotion.d.ts +3 -1
  47. package/dist/solution/BaseSales/utils/cartPromotion.js +90 -31
  48. package/dist/solution/BaseSales/utils/parseSalesResponse.d.ts +6 -1
  49. package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +6 -3
  50. package/dist/solution/BookingByStep/index.d.ts +1 -1
  51. package/dist/solution/BookingTicket/index.d.ts +8 -16
  52. package/dist/solution/BookingTicket/index.js +138 -52
  53. package/dist/solution/BookingTicket/types.d.ts +1 -0
  54. package/dist/solution/BookingTicket/utils/addProductDecision.js +6 -0
  55. package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.d.ts +8 -0
  56. package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.js +173 -83
  57. package/dist/solution/BookingTicket/utils/weighingProductSku.d.ts +5 -0
  58. package/dist/solution/BookingTicket/utils/weighingProductSku.js +45 -0
  59. package/dist/solution/Sales/index.d.ts +1 -0
  60. package/dist/solution/Sales/index.js +10 -2
  61. package/dist/solution/ScanOrder/index.js +31 -20
  62. package/dist/solution/UnifiedBookingSales/index.d.ts +3 -0
  63. package/dist/solution/UnifiedBookingSales/index.js +392 -304
  64. package/dist/solution/UnifiedBookingSales/types.d.ts +7 -0
  65. package/dist/solution/VenueBooking/index.d.ts +1 -0
  66. package/dist/solution/VenueBooking/index.js +34 -24
  67. package/dist/types/index.d.ts +1 -0
  68. package/dist/utils/payment-number.d.ts +9 -0
  69. package/dist/utils/payment-number.js +69 -0
  70. package/lib/core/index.d.ts +2 -0
  71. package/lib/core/index.js +4 -0
  72. package/lib/model/strategy/adapter/promotion/adapter.d.ts +4 -0
  73. package/lib/model/strategy/adapter/promotion/adapter.js +20 -0
  74. package/lib/model/strategy/adapter/promotion/evaluator.d.ts +17 -0
  75. package/lib/model/strategy/adapter/promotion/evaluator.js +235 -0
  76. package/lib/model/strategy/adapter/promotion/examples.d.ts +86 -0
  77. package/lib/model/strategy/adapter/promotion/examples.js +91 -0
  78. package/lib/model/strategy/adapter/promotion/index.d.ts +1 -1
  79. package/lib/model/strategy/adapter/promotion/index.js +2 -0
  80. package/lib/model/strategy/adapter/promotion/type.d.ts +90 -2
  81. package/lib/model/strategy/adapter/promotion/type.js +2 -0
  82. package/lib/modules/BaseModule.d.ts +1 -0
  83. package/lib/modules/BaseModule.js +24 -37
  84. package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +2 -1
  85. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +2 -1
  86. package/lib/modules/OpenData/index.d.ts +2 -0
  87. package/lib/modules/OpenData/index.js +5 -0
  88. package/lib/modules/Order/index.d.ts +41 -10
  89. package/lib/modules/Order/index.js +322 -86
  90. package/lib/modules/Order/payment-utils.d.ts +26 -0
  91. package/lib/modules/Order/payment-utils.js +224 -0
  92. package/lib/modules/Order/types.d.ts +43 -2
  93. package/lib/modules/Order/utils/orderCollectionIdentity.js +3 -0
  94. package/lib/modules/Order/utils.js +11 -4
  95. package/lib/modules/Payment/index.d.ts +2 -0
  96. package/lib/modules/Payment/index.js +34 -13
  97. package/lib/modules/Payment/types.d.ts +107 -28
  98. package/lib/modules/Payment/types.js +4 -3
  99. package/lib/modules/Payment/walletpass.d.ts +38 -1
  100. package/lib/modules/Payment/walletpass.js +730 -21
  101. package/lib/modules/ProductList/index.js +9 -1
  102. package/lib/modules/Rules/index.d.ts +3 -0
  103. package/lib/modules/Rules/index.js +39 -10
  104. package/lib/server/index.d.ts +16 -0
  105. package/lib/server/index.js +677 -28
  106. package/lib/server/modules/index.d.ts +1 -1
  107. package/lib/server/modules/order/index.d.ts +70 -4
  108. package/lib/server/modules/order/index.js +818 -69
  109. package/lib/server/modules/order/types.d.ts +25 -3
  110. package/lib/server/modules/order/types.js +1 -0
  111. package/lib/solution/BaseSales/index.d.ts +114 -14
  112. package/lib/solution/BaseSales/index.js +907 -58
  113. package/lib/solution/BaseSales/types.d.ts +55 -1
  114. package/lib/solution/BaseSales/types.js +2 -1
  115. package/lib/solution/BaseSales/utils/cartPromotion.d.ts +3 -1
  116. package/lib/solution/BaseSales/utils/cartPromotion.js +63 -12
  117. package/lib/solution/BaseSales/utils/parseSalesResponse.d.ts +6 -1
  118. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +3 -2
  119. package/lib/solution/BookingByStep/index.d.ts +1 -1
  120. package/lib/solution/BookingTicket/index.d.ts +8 -16
  121. package/lib/solution/BookingTicket/index.js +63 -9
  122. package/lib/solution/BookingTicket/types.d.ts +1 -0
  123. package/lib/solution/BookingTicket/utils/addProductDecision.js +4 -0
  124. package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.d.ts +8 -0
  125. package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +37 -5
  126. package/lib/solution/BookingTicket/utils/weighingProductSku.d.ts +5 -0
  127. package/lib/solution/BookingTicket/utils/weighingProductSku.js +63 -0
  128. package/lib/solution/Sales/index.d.ts +1 -0
  129. package/lib/solution/Sales/index.js +5 -3
  130. package/lib/solution/ScanOrder/index.js +8 -0
  131. package/lib/solution/UnifiedBookingSales/index.d.ts +3 -0
  132. package/lib/solution/UnifiedBookingSales/index.js +48 -2
  133. package/lib/solution/UnifiedBookingSales/types.d.ts +7 -0
  134. package/lib/solution/VenueBooking/index.d.ts +1 -0
  135. package/lib/solution/VenueBooking/index.js +13 -6
  136. package/lib/types/index.d.ts +1 -0
  137. package/lib/utils/payment-number.d.ts +9 -0
  138. package/lib/utils/payment-number.js +64 -0
  139. package/package.json +1 -1
@@ -0,0 +1,26 @@
1
+ export type OrderPaymentTransactionStatus = 'success' | 'fail';
2
+ export interface OrderPaymentTransaction {
3
+ number: string;
4
+ status: OrderPaymentTransactionStatus;
5
+ }
6
+ export type OrderPaymentIdentityType = 'order_payment_id' | 'payment_number' | 'unique_payment_number';
7
+ export interface OrderPaymentIdentityMatch<T> {
8
+ index: number;
9
+ payment: T;
10
+ matchedBy: OrderPaymentIdentityType;
11
+ }
12
+ export declare function getOrderPaymentIdentityKeys(payment: unknown): string[];
13
+ export declare function isPendingOrderPayment(payment: unknown): boolean;
14
+ export declare function isIdentifiedPendingOrderPayment(payment: unknown): boolean;
15
+ export declare function hasOrderPaymentIdentityOverlap(left: unknown, right: unknown): boolean;
16
+ export declare function resolveOrderPaymentIdentity<T extends Record<string, any>>(payments: T[] | null | undefined, identity: string | number, mode?: 'payment_number' | 'compat'): OrderPaymentIdentityMatch<T> | null;
17
+ export declare function ensureOrderPaymentNumber<T extends Record<string, any>>(payment: T, devicePrefix: string, createPaymentNumber: () => string): T & {
18
+ payment_number: string;
19
+ };
20
+ export declare function mergeOrderPaymentTransactions(current: unknown, incoming: unknown): OrderPaymentTransaction[];
21
+ export declare function mergeOrderPaymentRecord<T extends Record<string, any>>(payment: T, updates: Record<string, any>): T;
22
+ export declare function mergeOrderPaymentSnapshot<T extends Record<string, any>>(current: T, incoming: T): T;
23
+ export declare function mergeOrderPaymentListsByIdentity<T extends Record<string, any>>(existing: T[] | null | undefined, incoming: T[] | null | undefined, options?: {
24
+ preserveUnmatchedExisting?: boolean;
25
+ preserveUnmatchedExistingWhen?: (payment: T) => boolean;
26
+ }): T[];
@@ -0,0 +1,225 @@
1
+ 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); }
2
+ 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; }
3
+ 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; }
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
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
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
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
8
+ 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."); }
9
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
10
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
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
+ var PAYMENT_IDENTITY_TYPES = ['payment_number', 'order_payment_id', 'unique_payment_number'];
15
+ function normalizePaymentIdentityValue(value) {
16
+ if (value === undefined || value === null || value === '') return null;
17
+ return String(value);
18
+ }
19
+ function getPaymentIdentityValue(payment, type) {
20
+ if (type === 'unique_payment_number') {
21
+ var _payment$metadata;
22
+ return payment === null || payment === void 0 || (_payment$metadata = payment.metadata) === null || _payment$metadata === void 0 ? void 0 : _payment$metadata.unique_payment_number;
23
+ }
24
+ return payment === null || payment === void 0 ? void 0 : payment[type];
25
+ }
26
+ export function getOrderPaymentIdentityKeys(payment) {
27
+ var record = payment;
28
+ if (!record) return [];
29
+ return PAYMENT_IDENTITY_TYPES.flatMap(function (type) {
30
+ var value = normalizePaymentIdentityValue(getPaymentIdentityValue(record, type));
31
+ return value === null ? [] : ["".concat(type, ":").concat(value)];
32
+ });
33
+ }
34
+ export function isPendingOrderPayment(payment) {
35
+ var record = payment;
36
+ return String((record === null || record === void 0 ? void 0 : record.status) || '').toLowerCase() === 'payment_pending';
37
+ }
38
+ export function isIdentifiedPendingOrderPayment(payment) {
39
+ return isPendingOrderPayment(payment) && getOrderPaymentIdentityKeys(payment).length > 0;
40
+ }
41
+ export function hasOrderPaymentIdentityOverlap(left, right) {
42
+ var leftKeys = new Set(getOrderPaymentIdentityKeys(left));
43
+ if (leftKeys.size === 0) return false;
44
+ return getOrderPaymentIdentityKeys(right).some(function (key) {
45
+ return leftKeys.has(key);
46
+ });
47
+ }
48
+ export function resolveOrderPaymentIdentity(payments, identity) {
49
+ var mode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'payment_number';
50
+ var target = String(identity);
51
+ var identityTypes = mode === 'payment_number' ? ['payment_number'] : PAYMENT_IDENTITY_TYPES;
52
+ var matchesByIndex = new Map();
53
+ var _iterator = _createForOfIteratorHelper(identityTypes),
54
+ _step;
55
+ try {
56
+ var _loop = function _loop() {
57
+ var type = _step.value;
58
+ (payments || []).forEach(function (payment, index) {
59
+ var value = normalizePaymentIdentityValue(getPaymentIdentityValue(payment, type));
60
+ if (value === target && !matchesByIndex.has(index)) {
61
+ matchesByIndex.set(index, {
62
+ index: index,
63
+ payment: payment,
64
+ matchedBy: type
65
+ });
66
+ }
67
+ });
68
+ };
69
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
70
+ _loop();
71
+ }
72
+ } catch (err) {
73
+ _iterator.e(err);
74
+ } finally {
75
+ _iterator.f();
76
+ }
77
+ var matches = _toConsumableArray(matchesByIndex.values());
78
+ if (matches.length > 1) {
79
+ throw new Error("\u652F\u4ED8\u9879\u8EAB\u4EFD\u5B58\u5728\u6B67\u4E49: ".concat(target));
80
+ }
81
+ return matches[0] || null;
82
+ }
83
+ export function ensureOrderPaymentNumber(payment, devicePrefix, createPaymentNumber) {
84
+ var existing = normalizePaymentIdentityValue(payment.payment_number);
85
+ if (existing) return _objectSpread(_objectSpread({}, payment), {}, {
86
+ payment_number: existing
87
+ });
88
+ var uuid = normalizePaymentIdentityValue(payment.uuid) || createPaymentNumber();
89
+ var prefix = normalizePaymentIdentityValue(devicePrefix) || 'LOCAL';
90
+ // TODO: 使用 ID Generator 替换当前 UUID 段生成器。
91
+ return _objectSpread(_objectSpread({}, payment), {}, {
92
+ payment_number: "".concat(prefix, "_").concat(uuid)
93
+ });
94
+ }
95
+ export function mergeOrderPaymentTransactions(current, incoming) {
96
+ var records = new Map();
97
+ var append = function append(value) {
98
+ if (!Array.isArray(value)) return;
99
+ value.forEach(function (item) {
100
+ var number = item && _typeof(item) === 'object' ? String(item.number || '') : '';
101
+ var status = item && _typeof(item) === 'object' ? item.status : undefined;
102
+ if (!number || status !== 'success' && status !== 'fail') return;
103
+ var previous = records.get(number);
104
+ if ((previous === null || previous === void 0 ? void 0 : previous.status) === 'success' && status === 'fail') return;
105
+ records.set(number, {
106
+ number: number,
107
+ status: status
108
+ });
109
+ });
110
+ };
111
+ append(current);
112
+ append(incoming);
113
+ return _toConsumableArray(records.values());
114
+ }
115
+ export function mergeOrderPaymentRecord(payment, updates) {
116
+ var _updates$status, _updates$updated_at;
117
+ var currentMetadata = payment.metadata || {};
118
+ var incomingMetadata = updates.metadata || {};
119
+ var transactions = mergeOrderPaymentTransactions(currentMetadata.transactions, incomingMetadata.transactions);
120
+ var currentPaid = payment.status === 'paid';
121
+ var nextStatus = currentPaid && updates.status !== 'paid' ? 'paid' : (_updates$status = updates.status) !== null && _updates$status !== void 0 ? _updates$status : payment.status;
122
+ return _objectSpread(_objectSpread(_objectSpread({}, payment), updates), {}, {
123
+ status: nextStatus,
124
+ updated_at: (_updates$updated_at = updates.updated_at) !== null && _updates$updated_at !== void 0 ? _updates$updated_at : payment.updated_at,
125
+ metadata: _objectSpread(_objectSpread(_objectSpread({}, currentMetadata), incomingMetadata), transactions.length > 0 || Array.isArray(incomingMetadata.transactions) ? {
126
+ transactions: transactions
127
+ } : {})
128
+ });
129
+ }
130
+ export function mergeOrderPaymentSnapshot(current, incoming) {
131
+ var currentMetadata = current.metadata || {};
132
+ var incomingMetadata = incoming.metadata || {};
133
+ var currentUniquePaymentNumber = normalizePaymentIdentityValue(currentMetadata.unique_payment_number);
134
+ var incomingUniquePaymentNumber = normalizePaymentIdentityValue(incomingMetadata.unique_payment_number);
135
+ var incomingOrderPaymentId = normalizePaymentIdentityValue(incoming.order_payment_id);
136
+ var incomingFallbackPrefix = incomingOrderPaymentId ? "os-fallback:payment:order-payment:".concat(incomingOrderPaymentId) : null;
137
+ var incomingUsesDerivedUniquePaymentNumber = Boolean(incomingUniquePaymentNumber && incomingFallbackPrefix && (incomingUniquePaymentNumber === incomingFallbackPrefix || incomingUniquePaymentNumber.startsWith("".concat(incomingFallbackPrefix, ":conflict:"))));
138
+ var transactions = mergeOrderPaymentTransactions(currentMetadata.transactions, incomingMetadata.transactions);
139
+ return _objectSpread(_objectSpread(_objectSpread({}, current), incoming), {}, {
140
+ order_payment_id: normalizePaymentIdentityValue(incoming.order_payment_id) !== null ? incoming.order_payment_id : current.order_payment_id,
141
+ payment_number: incoming.payment_number || current.payment_number,
142
+ metadata: _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, currentMetadata), incomingMetadata), incomingUsesDerivedUniquePaymentNumber && currentUniquePaymentNumber ? {
143
+ unique_payment_number: currentUniquePaymentNumber
144
+ } : {}), transactions.length > 0 ? {
145
+ transactions: transactions
146
+ } : {})
147
+ });
148
+ }
149
+ function compactOrderPaymentList(payments) {
150
+ var result = [];
151
+ var _iterator2 = _createForOfIteratorHelper(payments),
152
+ _step2;
153
+ try {
154
+ var _loop2 = function _loop2() {
155
+ var payment = _step2.value;
156
+ var matchingIndexes = result.flatMap(function (existing, index) {
157
+ return hasOrderPaymentIdentityOverlap(existing, payment) ? [index] : [];
158
+ });
159
+ if (matchingIndexes.length === 0) {
160
+ result.push(mergeOrderPaymentSnapshot({}, payment));
161
+ return 1; // continue
162
+ }
163
+ var firstIndex = matchingIndexes[0];
164
+ var merged = result[firstIndex];
165
+ var _iterator3 = _createForOfIteratorHelper(matchingIndexes.slice(1)),
166
+ _step3;
167
+ try {
168
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
169
+ var index = _step3.value;
170
+ merged = mergeOrderPaymentSnapshot(merged, result[index]);
171
+ }
172
+ } catch (err) {
173
+ _iterator3.e(err);
174
+ } finally {
175
+ _iterator3.f();
176
+ }
177
+ result[firstIndex] = mergeOrderPaymentSnapshot(merged, payment);
178
+ var _iterator4 = _createForOfIteratorHelper(matchingIndexes.slice(1).sort(function (a, b) {
179
+ return b - a;
180
+ })),
181
+ _step4;
182
+ try {
183
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
184
+ var _index = _step4.value;
185
+ result.splice(_index, 1);
186
+ }
187
+ } catch (err) {
188
+ _iterator4.e(err);
189
+ } finally {
190
+ _iterator4.f();
191
+ }
192
+ };
193
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
194
+ if (_loop2()) continue;
195
+ }
196
+ } catch (err) {
197
+ _iterator2.e(err);
198
+ } finally {
199
+ _iterator2.f();
200
+ }
201
+ return result;
202
+ }
203
+ export function mergeOrderPaymentListsByIdentity(existing, incoming) {
204
+ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
205
+ var existingList = compactOrderPaymentList(_toConsumableArray(existing || []));
206
+ var incomingList = compactOrderPaymentList(_toConsumableArray(incoming || []));
207
+ if (options.preserveUnmatchedExisting) {
208
+ return compactOrderPaymentList([].concat(_toConsumableArray(existingList), _toConsumableArray(incomingList)));
209
+ }
210
+ var mergedIncoming = incomingList.map(function (incomingPayment) {
211
+ var matchingExisting = existingList.filter(function (existingPayment) {
212
+ return hasOrderPaymentIdentityOverlap(existingPayment, incomingPayment);
213
+ });
214
+ return matchingExisting.reduce(function (merged, existingPayment) {
215
+ return mergeOrderPaymentSnapshot(existingPayment, merged);
216
+ }, incomingPayment);
217
+ });
218
+ var preservedExisting = options.preserveUnmatchedExistingWhen ? existingList.filter(function (existingPayment) {
219
+ var _options$preserveUnma;
220
+ return !incomingList.some(function (incomingPayment) {
221
+ return hasOrderPaymentIdentityOverlap(existingPayment, incomingPayment);
222
+ }) && ((_options$preserveUnma = options.preserveUnmatchedExistingWhen) === null || _options$preserveUnma === void 0 ? void 0 : _options$preserveUnma.call(options, existingPayment));
223
+ }) : [];
224
+ return compactOrderPaymentList([].concat(_toConsumableArray(mergedIncoming), _toConsumableArray(preservedExisting)));
225
+ }
@@ -165,6 +165,8 @@ export interface OrderCustomerChangePayload {
165
165
  }
166
166
  export interface OrderScanCodeResult {
167
167
  isAvailable: boolean;
168
+ /** 卡券已加入当前订单折扣列表,但不一定能立即应用。 */
169
+ isAccepted?: boolean;
168
170
  discountList: Discount[];
169
171
  scannedDiscountList: Discount[];
170
172
  type: 'server' | 'clientCalc';
@@ -469,6 +471,8 @@ export interface SubmitSalesOrderParams {
469
471
  export interface PaymentItemData {
470
472
  /** 当前支付项的唯一 ID */
471
473
  uuid: string;
474
+ /** 支付项稳定唯一号 */
475
+ payment_number?: string;
472
476
  /** 当前支付方式付出去多少钱 */
473
477
  amount: string;
474
478
  /** 支付类型代码 */
@@ -491,13 +495,22 @@ export interface PaymentItemData {
491
495
  export interface OrderPaymentMetadata {
492
496
  rounding_rule?: Record<string, any>;
493
497
  unique_payment_number?: string;
498
+ /** 刷卡机设备快照;OS 不解析内部字段,仅透传并持久化 */
499
+ card_reader_snapshot?: Record<string, unknown>;
494
500
  shop_wallet_pass_id?: number | string;
495
501
  actual_paid_amount?: number | string;
496
502
  change_given_amount?: number | string;
503
+ transactions?: OrderPaymentTransaction[];
497
504
  [key: string]: any;
498
505
  }
506
+ export interface OrderPaymentTransaction {
507
+ number: string;
508
+ status: 'success' | 'fail';
509
+ }
499
510
  export interface OrderPaymentData {
500
511
  order_payment_id?: number | string;
512
+ /** 支付项稳定唯一号;历史支付项允许缺失 */
513
+ payment_number?: string;
501
514
  amount: string;
502
515
  code: string;
503
516
  custom_payment_id: number;
@@ -524,6 +537,15 @@ export interface OrderPaymentData {
524
537
  created_at?: string;
525
538
  updated_at?: string;
526
539
  }
540
+ export interface OrderPaymentUpdateOptions {
541
+ matchBy?: 'payment_number' | 'compat' | 'legacy';
542
+ }
543
+ export interface OrderPaymentUpdateResult {
544
+ updated: boolean;
545
+ payment: OrderPaymentData | null;
546
+ payments: OrderPaymentData[];
547
+ summary: OrderSummary | null;
548
+ }
527
549
  export type OrderPaymentSource = PaymentItem | OrderPaymentData | Record<string, any>;
528
550
  export interface MapOrderPaymentsOptions {
529
551
  includeVoided?: boolean;
@@ -539,6 +561,10 @@ export interface LoadSalesDetailParams {
539
561
  * 存在时 loadSalesDetail 会跳过远端 lookup,直接复用 hydrate 后半段逻辑。
540
562
  */
541
563
  preloadedSalesDetail?: Record<string, any>;
564
+ /**
565
+ * sessionStorage 快照复用详情 hydrate 时使用;不带该值时保持既有编辑订单语义。
566
+ */
567
+ hydrateSource?: 'sessionStorage';
542
568
  forceRemote?: boolean;
543
569
  merge?: boolean;
544
570
  }
@@ -680,6 +706,14 @@ export interface OrderModuleAPI {
680
706
  channel?: string;
681
707
  type?: string;
682
708
  }) => OrderSubmitPayload;
709
+ saveTempOrderAsDraft: <T = any>(params?: {
710
+ cacheId?: string;
711
+ platform?: string;
712
+ businessCode?: string;
713
+ channel?: string;
714
+ type?: string;
715
+ enhancePayload?: SubmitPayloadEnhancer;
716
+ }) => Promise<T>;
683
717
  applyLocalPrintOrderNumbers: (order?: Record<string, any> | null) => Promise<OrderTempOrder>;
684
718
  getTempOrderNote: () => string;
685
719
  updateTempOrderNote: {
@@ -701,8 +735,10 @@ export interface OrderModuleAPI {
701
735
  removeProductFromOrder: (identity: OrderProductIdentity) => Promise<OrderProduct[]>;
702
736
  /** 批量删除购物车行,末尾仅触发一次促销重算与 summary 刷新 */
703
737
  removeProductsFromOrder: (identities: OrderProductIdentity[]) => Promise<OrderProduct[]>;
704
- /** @deprecated no-op;OrderModule 不再负责 tempOrder localStorage 持久化。 */
738
+ /** 在显式开启时保存当前 tempOrder sessionStorage 会话快照。 */
705
739
  persistTempOrder: () => void;
740
+ /** 取出一次待恢复的 sessionStorage tempOrder 快照。 */
741
+ consumeSessionStorageRestore: () => Record<string, any> | null;
706
742
  /**
707
743
  * 控制 IndexedDB 草稿(saveDraft)开关;localStorage tempOrder 持久化已废弃。
708
744
  * BigSale 弹窗等场景传 false 可跳过 saveDraft。
@@ -739,11 +775,15 @@ export interface OrderModuleAPI {
739
775
  getOrderPayments: () => OrderPaymentData[];
740
776
  setOrderPayments: (payments: OrderPaymentSource[]) => OrderPaymentData[];
741
777
  addOrderPayment: (payment: OrderPaymentSource) => OrderPaymentData[];
742
- updateOrderPayment: (paymentIdentity: string | number, updates: Partial<OrderPaymentData> & Record<string, any>) => OrderPaymentData[];
778
+ addOrderPaymentAsync: (payment: OrderPaymentSource) => Promise<OrderPaymentData[]>;
779
+ updateOrderPayment: (paymentIdentity: string | number, updates: Partial<OrderPaymentData> & Record<string, any>, options?: OrderPaymentUpdateOptions) => Promise<OrderPaymentUpdateResult>;
743
780
  deleteOrderPayment: (paymentIdentity: string | number) => OrderPaymentData[];
744
781
  updateVoucherOrderPayments: (payments: OrderPaymentSource[], options?: {
745
782
  status?: 'paid' | 'payment_pending';
746
783
  }) => OrderPaymentData[];
784
+ updateVoucherOrderPaymentsAsync: (payments: OrderPaymentSource[], options?: {
785
+ status?: 'paid' | 'payment_pending';
786
+ }) => Promise<OrderPaymentData[]>;
747
787
  confirmPendingVoucherPayments: (options?: {
748
788
  persist?: boolean;
749
789
  recalculateSummary?: boolean;
@@ -756,6 +796,7 @@ export interface OrderModuleAPI {
756
796
  saveDraft: () => Promise<void>;
757
797
  hydrateTempOrderFromRecord: (record: Record<string, any>, options?: {
758
798
  recalcOnHydrate?: boolean;
799
+ source?: 'salesDetail' | 'sessionStorage';
759
800
  }) => Promise<OrderTempOrder>;
760
801
  syncPaymentsToOrder: <T = any>(params: SyncPaymentsToOrderParams) => Promise<SyncPaymentsToOrderResult<T>>;
761
802
  getSalesOrderByLookup: (params: SalesOrderLookupParams) => Promise<any>;
@@ -209,6 +209,11 @@ export function normalizeOrderCollection(kind, items, options) {
209
209
  var persistentId = getOrderCollectionPersistentId(kind, item);
210
210
  var uid = getOrderCollectionUid(kind, item);
211
211
  if (!uid) {
212
+ var _item;
213
+ if (kind === 'payment' && !isBlankOrderCollectionIdentity((_item = item) === null || _item === void 0 ? void 0 : _item.payment_number)) {
214
+ // payment_number 已提供稳定身份,不占用真实交易流水字段作为内部 UID。
215
+ continue;
216
+ }
212
217
  uid = persistentId ? buildOrderCollectionFallbackUid(kind, persistentId) : allocateAnonymousUid(occupiedUids, createAnonymousUid);
213
218
  item = setOrderCollectionUid(kind, item, uid);
214
219
  result[index] = item;
@@ -216,7 +221,7 @@ export function normalizeOrderCollection(kind, items, options) {
216
221
  if (!persistentId) stats.anonymousRowCount += 1;
217
222
  }
218
223
  if (occupiedUids.has(uid)) {
219
- var _item, _item2, _item3, _item4;
224
+ var _item2, _item3, _item4, _item5;
220
225
  var replacementUid = persistentId ? allocatePersistentConflictUid(kind, persistentId, occupiedUids) : allocateAnonymousUid(occupiedUids, createAnonymousUid);
221
226
  result[index] = setOrderCollectionUid(kind, item, replacementUid);
222
227
  uidRemaps.push({
@@ -225,7 +230,7 @@ export function normalizeOrderCollection(kind, items, options) {
225
230
  to: replacementUid,
226
231
  persistentId: persistentId,
227
232
  scope: 'linked-owner',
228
- referenceOwnerUid: kind === 'product' ? String(((_item = item) === null || _item === void 0 ? void 0 : _item.booking_uid) || ((_item2 = item) === null || _item2 === void 0 || (_item2 = _item2.metadata) === null || _item2 === void 0 ? void 0 : _item2.booking_uid) || '') || null : kind === 'booking' ? String(((_item3 = item) === null || _item3 === void 0 ? void 0 : _item3.product_uid) || ((_item4 = item) === null || _item4 === void 0 || (_item4 = _item4.metadata) === null || _item4 === void 0 ? void 0 : _item4.product_uid) || '') || null : null
233
+ referenceOwnerUid: kind === 'product' ? String(((_item2 = item) === null || _item2 === void 0 ? void 0 : _item2.booking_uid) || ((_item3 = item) === null || _item3 === void 0 || (_item3 = _item3.metadata) === null || _item3 === void 0 ? void 0 : _item3.booking_uid) || '') || null : kind === 'booking' ? String(((_item4 = item) === null || _item4 === void 0 ? void 0 : _item4.product_uid) || ((_item5 = item) === null || _item5 === void 0 || (_item5 = _item5.metadata) === null || _item5 === void 0 ? void 0 : _item5.product_uid) || '') || null : null
229
234
  });
230
235
  uid = replacementUid;
231
236
  stats.uidConflictCount += 1;
@@ -534,7 +534,8 @@ export function resolveEffectivePerUnitDiscount(product) {
534
534
  return sum + Number((discount === null || discount === void 0 ? void 0 : discount.amount) || 0);
535
535
  }, 0);
536
536
  var hasPromoDiscountItem = discountList.some(function (item) {
537
- return (item === null || item === void 0 ? void 0 : item.type) === 'promotion';
537
+ var _item$metadata, _item$metadata2;
538
+ return (item === null || item === void 0 ? void 0 : item.type) === 'promotion' || (item === null || item === void 0 ? void 0 : item.type) === 'product' && (item === null || item === void 0 || (_item$metadata = item.metadata) === null || _item$metadata === void 0 ? void 0 : _item$metadata.source) === 'promotion' && (item === null || item === void 0 || (_item$metadata2 = item.metadata) === null || _item$metadata2 === void 0 ? void 0 : _item$metadata2.actionType) === 'ITEM_REWARD';
538
539
  });
539
540
  if (hasPromoDiscountItem) return fromList;
540
541
  var metadata = (product === null || product === void 0 ? void 0 : product.metadata) || {};
@@ -1079,7 +1080,7 @@ export function createDefaultTempOrder(params) {
1079
1080
  };
1080
1081
  }
1081
1082
  export function buildSubmitPayload(params) {
1082
- var _tempOrder$customer_i, _tempOrder$order_numb, _tempOrder$shop_order, _tempOrder$shop_full_, _ref30, _tempOrder$is_price_i, _tempOrder$is_deposit, _enhancedPayload$summ;
1083
+ var _tempOrder$customer_i, _tempOrder$country_ca, _tempOrder$phone, _tempOrder$email, _tempOrder$order_numb, _tempOrder$shop_order, _tempOrder$shop_full_, _ref30, _tempOrder$is_price_i, _tempOrder$is_deposit, _enhancedPayload$summ;
1083
1084
  var tempOrder = params.tempOrder,
1084
1085
  cacheId = params.cacheId,
1085
1086
  _params$now = params.now,
@@ -1125,6 +1126,9 @@ export function buildSubmitPayload(params) {
1125
1126
  var payload = _objectSpread(_objectSpread({}, tempOrderRest), {}, {
1126
1127
  customer_id: (_tempOrder$customer_i = tempOrder.customer_id) !== null && _tempOrder$customer_i !== void 0 ? _tempOrder$customer_i : 1,
1127
1128
  customer_name: tempOrder.customer_name || 'Walk-In',
1129
+ country_calling_code: String((_tempOrder$country_ca = tempOrder.country_calling_code) !== null && _tempOrder$country_ca !== void 0 ? _tempOrder$country_ca : ''),
1130
+ phone: String((_tempOrder$phone = tempOrder.phone) !== null && _tempOrder$phone !== void 0 ? _tempOrder$phone : ''),
1131
+ email: String((_tempOrder$email = tempOrder.email) !== null && _tempOrder$email !== void 0 ? _tempOrder$email : ''),
1128
1132
  order_number: (_tempOrder$order_numb = tempOrder.order_number) !== null && _tempOrder$order_numb !== void 0 ? _tempOrder$order_numb : null,
1129
1133
  shop_order_number: (_tempOrder$shop_order = tempOrder.shop_order_number) !== null && _tempOrder$shop_order !== void 0 ? _tempOrder$shop_order : null,
1130
1134
  shop_full_order_number: (_tempOrder$shop_full_ = tempOrder.shop_full_order_number) !== null && _tempOrder$shop_full_ !== void 0 ? _tempOrder$shop_full_ : null,
@@ -1184,9 +1188,7 @@ export function mapPaymentItemToOrderPayment(paymentItem) {
1184
1188
  var item = paymentItem;
1185
1189
  var customPaymentId = (_item$custom_payment_ = item.custom_payment_id) !== null && _item$custom_payment_ !== void 0 ? _item$custom_payment_ : item.id;
1186
1190
  var metadata = item.metadata && _typeof(item.metadata) === 'object' ? _objectSpread({}, item.metadata) : {};
1187
- if (item.uuid && !metadata.unique_payment_number) {
1188
- metadata.unique_payment_number = String(item.uuid);
1189
- }
1191
+ var paymentNumber = item.payment_number;
1190
1192
  var paymentMetadataKeys = ['rounding_rule', 'shop_wallet_pass_id', 'actual_paid_amount', 'change_given_amount'];
1191
1193
  for (var _i3 = 0, _paymentMetadataKeys = paymentMetadataKeys; _i3 < _paymentMetadataKeys.length; _i3++) {
1192
1194
  var key = _paymentMetadataKeys[_i3];
@@ -1197,8 +1199,10 @@ export function mapPaymentItemToOrderPayment(paymentItem) {
1197
1199
  var timestamp = dayjs().format('YYYY-MM-DD HH:mm:ss');
1198
1200
  var paymentTime = (_item$payment_time = item.payment_time) !== null && _item$payment_time !== void 0 ? _item$payment_time : timestamp;
1199
1201
  var createdAt = (_item$created_at = item.created_at) !== null && _item$created_at !== void 0 ? _item$created_at : timestamp;
1200
- return _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({}, item.order_payment_id !== undefined ? {
1202
+ return _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({}, item.order_payment_id !== undefined ? {
1201
1203
  order_payment_id: item.order_payment_id
1204
+ } : {}), paymentNumber !== undefined && paymentNumber !== null && paymentNumber !== '' ? {
1205
+ payment_number: String(paymentNumber)
1202
1206
  } : {}), {}, {
1203
1207
  amount: String((_item$amount = item.amount) !== null && _item$amount !== void 0 ? _item$amount : '0.00'),
1204
1208
  code: String(item.code || ''),
@@ -20,6 +20,7 @@ export declare class PaymentModule extends BaseModule implements Module, Payment
20
20
  protected defaultVersion: string;
21
21
  request: RequestPlugin;
22
22
  private app;
23
+ private appPlugin;
23
24
  private store;
24
25
  window: WindowPlugin;
25
26
  private dbManager;
@@ -40,6 +41,7 @@ export declare class PaymentModule extends BaseModule implements Module, Payment
40
41
  * paymentModule.updateOtherParams({ fatherModule: 'bookingTicket' });
41
42
  */
42
43
  updateOtherParams(params: Record<string, any>): void;
44
+ private getPaymentNumberAppData;
43
45
  /**
44
46
  * 记录信息日志
45
47
  */