@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.
- package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +3 -1
- package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +25 -2
- package/dist/modules/Order/holderRelations.d.ts +14 -0
- package/dist/modules/Order/holderRelations.js +154 -0
- package/dist/modules/Order/index.d.ts +2 -2
- package/dist/modules/Order/index.js +92 -47
- package/dist/modules/Order/types.d.ts +19 -1
- package/dist/modules/Order/types.js +2 -0
- package/dist/modules/Order/utils/discountProductLineIdentity.d.ts +1 -1
- package/dist/modules/Order/utils/discountProductLineIdentity.js +142 -7
- package/dist/modules/Order/utils/orderCollectionIdentity.js +24 -10
- package/dist/modules/Order/utils.d.ts +1 -1
- package/dist/modules/Order/utils.js +35 -9
- package/dist/server/index.js +18 -12
- package/dist/server/modules/order/index.d.ts +4 -0
- package/dist/server/modules/order/index.js +255 -190
- package/dist/server/modules/order/types.d.ts +3 -0
- package/dist/shared/receipt/small-ticket.js +17 -0
- package/dist/shared/sales/loadSalesOrderSnapshot.js +1 -1
- package/dist/solution/BaseSales/index.js +97 -27
- package/dist/solution/BaseSales/types.d.ts +2 -1
- package/dist/solution/BaseSales/utils/parseSalesResponse.d.ts +3 -1
- package/dist/solution/BaseSales/utils/parseSalesResponse.js +7 -3
- package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +12 -3
- package/dist/solution/BookingByStep/index.d.ts +1 -1
- package/dist/solution/BookingTicket/index.d.ts +1 -13
- package/dist/solution/BookingTicket/index.js +7 -4
- package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.js +6 -2
- package/lib/model/strategy/adapter/promotion/index.js +46 -1
- package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +3 -1
- package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +16 -1
- package/lib/modules/Order/holderRelations.d.ts +14 -0
- package/lib/modules/Order/holderRelations.js +98 -0
- package/lib/modules/Order/index.d.ts +2 -2
- package/lib/modules/Order/index.js +44 -12
- package/lib/modules/Order/types.d.ts +19 -1
- package/lib/modules/Order/types.js +1 -0
- package/lib/modules/Order/utils/discountProductLineIdentity.d.ts +1 -1
- package/lib/modules/Order/utils/discountProductLineIdentity.js +51 -2
- package/lib/modules/Order/utils/orderCollectionIdentity.js +5 -0
- package/lib/modules/Order/utils.d.ts +1 -1
- package/lib/modules/Order/utils.js +27 -6
- package/lib/server/index.js +6 -0
- package/lib/server/modules/order/index.d.ts +4 -0
- package/lib/server/modules/order/index.js +46 -4
- package/lib/server/modules/order/types.d.ts +3 -0
- package/lib/shared/receipt/small-ticket.js +15 -0
- package/lib/shared/sales/loadSalesOrderSnapshot.js +1 -1
- package/lib/solution/BaseSales/index.js +39 -2
- package/lib/solution/BaseSales/types.d.ts +2 -1
- package/lib/solution/BaseSales/utils/parseSalesResponse.d.ts +3 -1
- package/lib/solution/BaseSales/utils/parseSalesResponse.js +4 -0
- package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +7 -0
- package/lib/solution/BookingByStep/index.d.ts +1 -1
- package/lib/solution/BookingTicket/index.d.ts +1 -13
- package/lib/solution/BookingTicket/index.js +4 -1
- package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +7 -1
- 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
|
|
144
|
-
|
|
278
|
+
var _iterator6 = _createForOfIteratorHelper(tempOrder.products || []),
|
|
279
|
+
_step6;
|
|
145
280
|
try {
|
|
146
|
-
for (
|
|
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 =
|
|
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
|
-
|
|
357
|
+
_iterator6.e(err);
|
|
223
358
|
} finally {
|
|
224
|
-
|
|
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.
|
|
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 =
|
|
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
|
-
|
|
411
|
+
_iterator6.e(err);
|
|
398
412
|
} finally {
|
|
399
|
-
|
|
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
|
|
433
|
-
|
|
446
|
+
var _iterator7 = _createForOfIteratorHelper(order.products || []),
|
|
447
|
+
_step7;
|
|
434
448
|
try {
|
|
435
|
-
for (
|
|
449
|
+
for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
|
|
436
450
|
var _product$metadata3;
|
|
437
|
-
var _product =
|
|
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
|
-
|
|
465
|
+
_iterator7.e(err);
|
|
452
466
|
} finally {
|
|
453
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
1773
|
+
clearHolder(origin.metadata);
|
|
1749
1774
|
}
|
|
1750
1775
|
if (origin._extend && _typeof(origin._extend) === 'object') {
|
|
1751
|
-
|
|
1776
|
+
clearHolder(origin._extend);
|
|
1777
|
+
delete origin._extend.holder_relations;
|
|
1752
1778
|
}
|
|
1753
1779
|
}
|
|
1754
1780
|
}
|
package/dist/server/index.js
CHANGED
|
@@ -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 =
|
|
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
|
-
|
|
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
|
|
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 =
|
|
2873
|
+
_context34.next = 20;
|
|
2871
2874
|
break;
|
|
2872
|
-
case
|
|
2875
|
+
case 10:
|
|
2873
2876
|
if (!(this.order && externalSaleNumber && typeof this.order.markOrderSyncedByExternalSaleNumber === 'function')) {
|
|
2874
|
-
_context34.next =
|
|
2877
|
+
_context34.next = 19;
|
|
2875
2878
|
break;
|
|
2876
2879
|
}
|
|
2877
2880
|
patch = this.buildCheckoutSyncSuccessPatch(fresh);
|
|
2878
|
-
_context34.next =
|
|
2881
|
+
_context34.next = 14;
|
|
2879
2882
|
return this.order.markOrderSyncedByExternalSaleNumber({
|
|
2880
2883
|
externalSaleNumber: externalSaleNumber,
|
|
2881
2884
|
patch: patch
|
|
2882
2885
|
});
|
|
2883
|
-
case
|
|
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 =
|
|
2899
|
+
_context34.next = 20;
|
|
2897
2900
|
break;
|
|
2898
|
-
case
|
|
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;
|