@pisell/pisellos 0.0.500 → 0.0.502
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/model/strategy/adapter/itemRule/adapter.d.ts +8 -0
- package/dist/model/strategy/adapter/itemRule/adapter.js +52 -8
- package/dist/model/strategy/adapter/itemRule/examples.d.ts +15 -0
- package/dist/model/strategy/adapter/itemRule/examples.js +68 -1
- package/dist/model/strategy/adapter/itemRule/index.d.ts +1 -1
- package/dist/model/strategy/adapter/itemRule/index.js +1 -1
- package/dist/model/strategy/adapter/itemRule/type.d.ts +20 -1
- package/dist/model/strategy/adapter/promotion/index.js +9 -0
- package/dist/modules/Order/index.d.ts +10 -0
- package/dist/modules/Order/index.js +64 -40
- package/dist/modules/Order/types.d.ts +13 -1
- package/dist/modules/Order/utils.d.ts +36 -1
- package/dist/modules/Order/utils.js +120 -24
- package/dist/modules/ProductList/index.js +2 -2
- package/dist/modules/Quotation/index.js +6 -3
- package/dist/modules/SalesSummary/types.d.ts +2 -1
- package/dist/modules/SalesSummary/utils.js +10 -10
- package/dist/modules/Schedule/utils.d.ts +1 -1
- package/dist/solution/ScanOrder/index.d.ts +22 -0
- package/dist/solution/ScanOrder/index.js +863 -369
- package/dist/solution/ScanOrder/types.d.ts +31 -8
- package/dist/solution/ScanOrder/utils.d.ts +26 -0
- package/dist/solution/ScanOrder/utils.js +191 -44
- package/dist/solution/VenueBooking/index.d.ts +42 -5
- package/dist/solution/VenueBooking/index.js +692 -280
- package/dist/solution/VenueBooking/types.d.ts +23 -0
- package/dist/solution/VenueBooking/utils/dateSummary.d.ts +2 -1
- package/dist/solution/VenueBooking/utils/dateSummary.js +7 -5
- package/dist/solution/VenueBooking/utils/resource.d.ts +11 -1
- package/dist/solution/VenueBooking/utils/resource.js +57 -21
- package/dist/solution/VenueBooking/utils/slotMerge.d.ts +5 -0
- package/dist/solution/VenueBooking/utils/slotMerge.js +33 -12
- package/dist/solution/VenueBooking/utils/timeSlot.d.ts +1 -1
- package/dist/solution/VenueBooking/utils/timeSlot.js +259 -62
- package/lib/model/strategy/adapter/itemRule/adapter.d.ts +8 -0
- package/lib/model/strategy/adapter/itemRule/adapter.js +41 -2
- package/lib/model/strategy/adapter/itemRule/examples.d.ts +15 -0
- package/lib/model/strategy/adapter/itemRule/examples.js +47 -0
- package/lib/model/strategy/adapter/itemRule/index.d.ts +1 -1
- package/lib/model/strategy/adapter/itemRule/index.js +2 -0
- package/lib/model/strategy/adapter/itemRule/type.d.ts +20 -1
- package/lib/modules/Order/index.d.ts +10 -0
- package/lib/modules/Order/index.js +40 -43
- package/lib/modules/Order/types.d.ts +13 -1
- package/lib/modules/Order/utils.d.ts +36 -1
- package/lib/modules/Order/utils.js +100 -21
- package/lib/modules/ProductList/index.js +3 -2
- package/lib/modules/Quotation/index.js +3 -0
- package/lib/modules/SalesSummary/types.d.ts +2 -1
- package/lib/modules/SalesSummary/utils.js +2 -2
- package/lib/modules/Schedule/utils.d.ts +1 -1
- package/lib/solution/ScanOrder/index.d.ts +22 -0
- package/lib/solution/ScanOrder/index.js +376 -21
- package/lib/solution/ScanOrder/types.d.ts +31 -8
- package/lib/solution/ScanOrder/utils.d.ts +26 -0
- package/lib/solution/ScanOrder/utils.js +128 -19
- package/lib/solution/VenueBooking/index.d.ts +42 -5
- package/lib/solution/VenueBooking/index.js +356 -84
- package/lib/solution/VenueBooking/types.d.ts +23 -0
- package/lib/solution/VenueBooking/utils/dateSummary.d.ts +2 -1
- package/lib/solution/VenueBooking/utils/dateSummary.js +14 -5
- package/lib/solution/VenueBooking/utils/resource.d.ts +11 -1
- package/lib/solution/VenueBooking/utils/resource.js +15 -4
- package/lib/solution/VenueBooking/utils/slotMerge.d.ts +5 -0
- package/lib/solution/VenueBooking/utils/slotMerge.js +29 -12
- package/lib/solution/VenueBooking/utils/timeSlot.d.ts +1 -1
- package/lib/solution/VenueBooking/utils/timeSlot.js +182 -43
- package/package.json +1 -1
|
@@ -159,41 +159,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
159
159
|
this.store.rules = rules;
|
|
160
160
|
}
|
|
161
161
|
createDefaultRulesHooks() {
|
|
162
|
-
return
|
|
163
|
-
getProduct: (product) => {
|
|
164
|
-
var _a, _b, _c, _d;
|
|
165
|
-
return {
|
|
166
|
-
id: product.product_id,
|
|
167
|
-
_id: product.identity_key ? `${product.product_id}_${product.product_variant_id}_${product.identity_key}` : `${product.product_id}_${product.product_variant_id}`,
|
|
168
|
-
price: product.selling_price,
|
|
169
|
-
total: new import_decimal.default(product.payment_price || product.selling_price || 0).times(product.num || 1).toNumber(),
|
|
170
|
-
origin_total: new import_decimal.default(product.original_price || product.selling_price || 0).times(product.num || 1).toNumber(),
|
|
171
|
-
original_price: product.original_price,
|
|
172
|
-
quantity: product.num || 1,
|
|
173
|
-
num: product.num || 1,
|
|
174
|
-
discount_list: product.discount_list || [],
|
|
175
|
-
bundle: product.product_bundle || [],
|
|
176
|
-
booking_id: ((_a = product._origin) == null ? void 0 : _a.booking_id) || null,
|
|
177
|
-
isClient: false,
|
|
178
|
-
isManualDiscount: ((_b = product._origin) == null ? void 0 : _b.isManualDiscount) || false,
|
|
179
|
-
holder_id: (_c = product._origin) == null ? void 0 : _c.holder_id,
|
|
180
|
-
startDate: (_d = product._origin) == null ? void 0 : _d.startDate
|
|
181
|
-
};
|
|
182
|
-
},
|
|
183
|
-
setProduct: (product, values) => ({
|
|
184
|
-
...product,
|
|
185
|
-
selling_price: values.price !== void 0 ? String(values.price) : product.selling_price,
|
|
186
|
-
payment_price: values.total !== void 0 ? String(values.total) : product.payment_price,
|
|
187
|
-
original_price: values.original_price !== void 0 ? String(values.original_price) : product.original_price,
|
|
188
|
-
discount_list: values.discount_list ?? product.discount_list,
|
|
189
|
-
num: values.quantity ?? product.num,
|
|
190
|
-
product_bundle: values.bundle ?? product.product_bundle,
|
|
191
|
-
metadata: {
|
|
192
|
-
...product.metadata || {},
|
|
193
|
-
...values.main_product_selling_price !== void 0 ? { main_product_selling_price: String(values.main_product_selling_price) } : {}
|
|
194
|
-
}
|
|
195
|
-
})
|
|
196
|
-
};
|
|
162
|
+
return (0, import_utils.createDefaultOrderRulesHooks)();
|
|
197
163
|
}
|
|
198
164
|
// ─── Discount: 公共 API ───
|
|
199
165
|
async loadDiscountConfig(params) {
|
|
@@ -267,28 +233,28 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
267
233
|
};
|
|
268
234
|
}
|
|
269
235
|
applyDiscount() {
|
|
270
|
-
var _a, _b, _c, _d, _e
|
|
236
|
+
var _a, _b, _c, _d, _e;
|
|
271
237
|
const tempOrder = this.store.tempOrder;
|
|
272
|
-
if (!
|
|
238
|
+
if (!tempOrder)
|
|
273
239
|
return;
|
|
274
240
|
const rulesModule = this.store.rules;
|
|
275
241
|
if (!rulesModule)
|
|
276
242
|
return;
|
|
277
|
-
const discountList = ((
|
|
278
|
-
const holders = ((
|
|
243
|
+
const discountList = ((_a = this.store.discount) == null ? void 0 : _a.getDiscountList()) || [];
|
|
244
|
+
const holders = ((_b = tempOrder.holder) == null ? void 0 : _b.form_record_id) ? [{ form_record_id: tempOrder.holder.form_record_id }] : [];
|
|
279
245
|
const result = rulesModule.calcDiscount({
|
|
280
246
|
productList: tempOrder.products,
|
|
281
247
|
discountList,
|
|
282
248
|
holders,
|
|
283
|
-
isFormSubject: !!((
|
|
284
|
-
orderTotalAmount: Number(((
|
|
249
|
+
isFormSubject: !!((_c = tempOrder.holder) == null ? void 0 : _c.type) && tempOrder.holder.type === "form",
|
|
250
|
+
orderTotalAmount: Number(((_d = tempOrder == null ? void 0 : tempOrder.summary) == null ? void 0 : _d.total_amount) || 0)
|
|
285
251
|
});
|
|
286
252
|
if (result == null ? void 0 : result.productList) {
|
|
287
253
|
tempOrder.products = result.productList;
|
|
288
254
|
}
|
|
289
255
|
if (result == null ? void 0 : result.discountList) {
|
|
290
256
|
OrderModule.populateSavedAmounts(result.productList || tempOrder.products, result.discountList);
|
|
291
|
-
(
|
|
257
|
+
(_e = this.store.discount) == null ? void 0 : _e.setDiscountList(result.discountList);
|
|
292
258
|
tempOrder.discount_list = result.discountList.filter((d) => d.isSelected);
|
|
293
259
|
}
|
|
294
260
|
}
|
|
@@ -350,6 +316,12 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
350
316
|
this.persistTempOrder();
|
|
351
317
|
return newOrder;
|
|
352
318
|
}
|
|
319
|
+
restoreOrder() {
|
|
320
|
+
const freshTempOrder = this.createDefaultTempOrderInstance();
|
|
321
|
+
this.store.tempOrder = freshTempOrder;
|
|
322
|
+
this.persistTempOrder();
|
|
323
|
+
return freshTempOrder;
|
|
324
|
+
}
|
|
353
325
|
getTempOrder() {
|
|
354
326
|
return this.store.tempOrder;
|
|
355
327
|
}
|
|
@@ -410,6 +382,12 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
410
382
|
this.persistTempOrder();
|
|
411
383
|
return tempOrder.note;
|
|
412
384
|
}
|
|
385
|
+
updateTempOrderBuzzer(buzzer) {
|
|
386
|
+
const tempOrder = this.ensureTempOrder();
|
|
387
|
+
tempOrder.buzzer = String(buzzer || "");
|
|
388
|
+
this.persistTempOrder();
|
|
389
|
+
return tempOrder.buzzer;
|
|
390
|
+
}
|
|
413
391
|
updateTempOrderContactsInfo(contactsInfo) {
|
|
414
392
|
const tempOrder = this.ensureTempOrder();
|
|
415
393
|
tempOrder.contacts_info = Array.isArray(contactsInfo) ? contactsInfo : [];
|
|
@@ -490,7 +468,12 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
490
468
|
const effectiveCacheId = (params == null ? void 0 : params.cacheId) ?? this.cacheId;
|
|
491
469
|
const payload = (0, import_utils.buildSubmitPayload)({
|
|
492
470
|
tempOrder,
|
|
493
|
-
cacheId: effectiveCacheId
|
|
471
|
+
cacheId: effectiveCacheId,
|
|
472
|
+
platform: params == null ? void 0 : params.platform,
|
|
473
|
+
businessCode: params == null ? void 0 : params.businessCode,
|
|
474
|
+
channel: params == null ? void 0 : params.channel,
|
|
475
|
+
type: params == null ? void 0 : params.type,
|
|
476
|
+
enhance: params == null ? void 0 : params.enhancePayload
|
|
494
477
|
});
|
|
495
478
|
let result;
|
|
496
479
|
if (tempOrder.order_id) {
|
|
@@ -733,6 +716,20 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
733
716
|
};
|
|
734
717
|
return this.request.put(fetchUrl, requestBody);
|
|
735
718
|
}
|
|
719
|
+
// TODO 获取详情的接口
|
|
720
|
+
async getOrderInfoByRemote(order_id) {
|
|
721
|
+
const res = await this.request.get(`/order/sales/${order_id}`, {
|
|
722
|
+
with: ["products", "scheduleEvents"]
|
|
723
|
+
});
|
|
724
|
+
if (res.code === 200 && this.store.tempOrder) {
|
|
725
|
+
this.store.tempOrder.lastOrderInfo = res.data;
|
|
726
|
+
}
|
|
727
|
+
return res;
|
|
728
|
+
}
|
|
729
|
+
getLastOrderInfo() {
|
|
730
|
+
var _a, _b;
|
|
731
|
+
return (_b = (_a = this.store) == null ? void 0 : _a.tempOrder) == null ? void 0 : _b.lastOrderInfo;
|
|
732
|
+
}
|
|
736
733
|
};
|
|
737
734
|
// Annotate the CommonJS export names for ESM import in node:
|
|
738
735
|
0 && (module.exports = {
|
|
@@ -3,6 +3,7 @@ import type { ScanOrderTempOrder, ScanOrderOrderProduct, ScanOrderOrderProductId
|
|
|
3
3
|
import type { DiscountModule } from '../Discount';
|
|
4
4
|
import type { RulesModule } from '../Rules';
|
|
5
5
|
import type { Discount } from '../Discount/types';
|
|
6
|
+
import type { SubmitPayloadEnhancer } from './utils';
|
|
6
7
|
export declare enum OrderHooks {
|
|
7
8
|
OnOrderCreate = "order:onOrderCreate",
|
|
8
9
|
OnOrderUpdate = "order:onOrderUpdate",
|
|
@@ -68,10 +69,12 @@ export interface SubmitScanOrderBooking {
|
|
|
68
69
|
start_time?: string;
|
|
69
70
|
end_time?: string;
|
|
70
71
|
metadata?: Record<string, any>;
|
|
72
|
+
resources?: Array<Record<string, any>>;
|
|
73
|
+
product_uid?: string;
|
|
71
74
|
}
|
|
72
75
|
export interface SubmitScanOrderFormRecord {
|
|
73
76
|
form_id: number | string;
|
|
74
|
-
|
|
77
|
+
form_record_id: number | string;
|
|
75
78
|
}
|
|
76
79
|
export interface SubmitScanOrderParams {
|
|
77
80
|
url?: string;
|
|
@@ -107,6 +110,8 @@ export interface SubmitScanOrderParams {
|
|
|
107
110
|
shop_discount: string;
|
|
108
111
|
surcharge_fee: string;
|
|
109
112
|
note: string;
|
|
113
|
+
delivery_type?: string;
|
|
114
|
+
table_number?: Record<string, any>;
|
|
110
115
|
schedule_date: string;
|
|
111
116
|
created_at?: string;
|
|
112
117
|
products: SubmitScanOrderProduct[];
|
|
@@ -195,12 +200,14 @@ export interface OrderModuleAPI {
|
|
|
195
200
|
getTempOrder: () => ScanOrderTempOrder | null;
|
|
196
201
|
ensureTempOrder: () => ScanOrderTempOrder;
|
|
197
202
|
addNewOrder: () => Promise<ScanOrderTempOrder>;
|
|
203
|
+
restoreOrder: () => ScanOrderTempOrder;
|
|
198
204
|
getOrderProducts: () => ScanOrderOrderProduct[];
|
|
199
205
|
getScanOrderSummary: () => Promise<ScanOrderSummary>;
|
|
200
206
|
recalculateSummary: (options?: {
|
|
201
207
|
createIfMissing?: boolean;
|
|
202
208
|
}) => Promise<ScanOrderSummary | null>;
|
|
203
209
|
updateTempOrderNote: (note: string) => string;
|
|
210
|
+
updateTempOrderBuzzer: (buzzer: string) => string;
|
|
204
211
|
updateTempOrderContactsInfo: (contactsInfo: any[]) => any[];
|
|
205
212
|
addProductToOrder: (product: Partial<ScanOrderOrderProduct> & ScanOrderOrderProductIdentity) => Promise<ScanOrderOrderProduct[]>;
|
|
206
213
|
updateProductInOrder: (params: {
|
|
@@ -212,6 +219,11 @@ export interface OrderModuleAPI {
|
|
|
212
219
|
persistTempOrder: () => void;
|
|
213
220
|
submitTempOrder: <T = any>(params?: {
|
|
214
221
|
cacheId?: string;
|
|
222
|
+
platform?: string;
|
|
223
|
+
businessCode?: string;
|
|
224
|
+
channel?: string;
|
|
225
|
+
type?: string;
|
|
226
|
+
enhancePayload?: SubmitPayloadEnhancer;
|
|
215
227
|
}) => Promise<T>;
|
|
216
228
|
loadDiscountConfig: (params: {
|
|
217
229
|
customerId: number;
|
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
import { CartItem } from "../Cart";
|
|
2
2
|
import type { ScanOrderSubmitPayload, ScanOrderSubmitProduct, ScanOrderSummary, ScanOrderTempOrder } from '../../solution/ScanOrder/types';
|
|
3
|
+
import type { RulesParamsHooks } from '../Rules/types';
|
|
4
|
+
/**
|
|
5
|
+
* OrderModule 默认 Rules 钩子工厂。
|
|
6
|
+
*
|
|
7
|
+
* 价格语义约定(订单域):
|
|
8
|
+
* - `selling_price`:券后单品单价(实际成交单价)。初次加购 = `original_price`;券应用后由 Rules 引擎更新。
|
|
9
|
+
* - `original_price`:券前单品单价(店铺售价)。不承载后台划线价语义。
|
|
10
|
+
* - `payment_price`:已从内部字段移除;只在出站 payload 中由 `selling_price` 派生以兼容后端。
|
|
11
|
+
*
|
|
12
|
+
* Rules 钩子契约:
|
|
13
|
+
* - `getProduct.total` = `selling_price × num`(当前成交总价)
|
|
14
|
+
* - `getProduct.origin_total` = `original_price × num`(券前总价)
|
|
15
|
+
* - `setProduct` 写回 `selling_price` 的优先级:
|
|
16
|
+
* 1. `values.main_product_selling_price`(券应用分支,per-unit 券后主价)
|
|
17
|
+
* 2. `values.price`(还原分支 `restoredPrice`、good_pass 归零)
|
|
18
|
+
* 3. `values.total / num`(仅当 Rules 只给出总价时的兜底)
|
|
19
|
+
*
|
|
20
|
+
* 导出为纯函数方便单测直接驱动钩子,不依赖 OrderModule 实例。
|
|
21
|
+
*/
|
|
22
|
+
export declare function createDefaultOrderRulesHooks(): RulesParamsHooks;
|
|
3
23
|
/**
|
|
4
24
|
* 通过 session 类商品的开始时间结束时间生成商品的时长
|
|
5
25
|
* @param {CartItem} cartItem
|
|
@@ -28,14 +48,29 @@ export declare function formatDateTime(date: Date): string;
|
|
|
28
48
|
export declare function normalizeSubmitBooking<T extends {
|
|
29
49
|
metadata?: Record<string, any>;
|
|
30
50
|
}>(booking: T): T;
|
|
51
|
+
/** 提交用人数:有限且为正则向下取整,否则为 1 */
|
|
52
|
+
export declare function normalizeSubmitCollectPaxValue(value: unknown): number;
|
|
53
|
+
/** 从临时订单 metadata 解析合成 booking 的 collect_pax */
|
|
54
|
+
export declare function resolveSubmitCollectPax(tempOrder: ScanOrderTempOrder): number;
|
|
31
55
|
export declare function createDefaultTempOrder(params: {
|
|
32
56
|
now: string;
|
|
33
57
|
summary?: ScanOrderSummary;
|
|
34
58
|
}): ScanOrderTempOrder;
|
|
59
|
+
export interface SubmitPayloadEnhancerContext {
|
|
60
|
+
tempOrder: ScanOrderTempOrder;
|
|
61
|
+
bookingUuid: string;
|
|
62
|
+
now: Date;
|
|
63
|
+
}
|
|
64
|
+
export type SubmitPayloadEnhancer = (payload: ScanOrderSubmitPayload, ctx: SubmitPayloadEnhancerContext) => ScanOrderSubmitPayload;
|
|
35
65
|
export declare function buildSubmitPayload(params: {
|
|
36
66
|
tempOrder: ScanOrderTempOrder;
|
|
37
67
|
cacheId?: string;
|
|
38
68
|
now?: Date;
|
|
69
|
+
platform?: string;
|
|
70
|
+
businessCode?: string;
|
|
71
|
+
channel?: string;
|
|
72
|
+
type?: string;
|
|
73
|
+
enhance?: SubmitPayloadEnhancer;
|
|
39
74
|
}): ScanOrderSubmitPayload;
|
|
40
75
|
export declare function formatV1Product(products: ScanOrderSubmitProduct[]): {
|
|
41
76
|
bundle: any[];
|
|
@@ -43,7 +78,7 @@ export declare function formatV1Product(products: ScanOrderSubmitProduct[]): {
|
|
|
43
78
|
option: any[];
|
|
44
79
|
product_id: number | null;
|
|
45
80
|
product_variant_id: number;
|
|
46
|
-
|
|
81
|
+
num: number;
|
|
47
82
|
rowKey: number | null;
|
|
48
83
|
session: null;
|
|
49
84
|
unique: string;
|
|
@@ -30,6 +30,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
30
30
|
var utils_exports = {};
|
|
31
31
|
__export(utils_exports, {
|
|
32
32
|
buildSubmitPayload: () => buildSubmitPayload,
|
|
33
|
+
createDefaultOrderRulesHooks: () => createDefaultOrderRulesHooks,
|
|
33
34
|
createDefaultTempOrder: () => createDefaultTempOrder,
|
|
34
35
|
createEmptySummary: () => import_utils2.createEmptySummary,
|
|
35
36
|
createUuidV4: () => createUuidV4,
|
|
@@ -39,12 +40,59 @@ __export(utils_exports, {
|
|
|
39
40
|
getAllDiscountList: () => getAllDiscountList,
|
|
40
41
|
isTempOrder: () => isTempOrder,
|
|
41
42
|
mergeRelationForms: () => mergeRelationForms,
|
|
42
|
-
normalizeSubmitBooking: () => normalizeSubmitBooking
|
|
43
|
+
normalizeSubmitBooking: () => normalizeSubmitBooking,
|
|
44
|
+
normalizeSubmitCollectPaxValue: () => normalizeSubmitCollectPaxValue,
|
|
45
|
+
resolveSubmitCollectPax: () => resolveSubmitCollectPax
|
|
43
46
|
});
|
|
44
47
|
module.exports = __toCommonJS(utils_exports);
|
|
45
48
|
var import_dayjs = __toESM(require("dayjs"));
|
|
49
|
+
var import_decimal = __toESM(require("decimal.js"));
|
|
46
50
|
var import_utils = require("../../solution/ScanOrder/utils");
|
|
47
51
|
var import_utils2 = require("../../solution/ScanOrder/utils");
|
|
52
|
+
function createDefaultOrderRulesHooks() {
|
|
53
|
+
const toUnitPriceString = (totalLike, num) => {
|
|
54
|
+
const effectiveNum = Number(num) > 0 ? Number(num) : 1;
|
|
55
|
+
return new import_decimal.default(Number(totalLike) || 0).dividedBy(effectiveNum).toDecimalPlaces(2).toString();
|
|
56
|
+
};
|
|
57
|
+
return {
|
|
58
|
+
getProduct: (product) => {
|
|
59
|
+
var _a, _b, _c, _d;
|
|
60
|
+
return {
|
|
61
|
+
id: product.product_id,
|
|
62
|
+
_id: product.identity_key ? `${product.product_id}_${product.product_variant_id}_${product.identity_key}` : `${product.product_id}_${product.product_variant_id}`,
|
|
63
|
+
price: product.selling_price,
|
|
64
|
+
total: new import_decimal.default(product.selling_price || 0).times(product.num || 1).toNumber(),
|
|
65
|
+
origin_total: new import_decimal.default(product.original_price || product.selling_price || 0).times(product.num || 1).toNumber(),
|
|
66
|
+
original_price: product.original_price,
|
|
67
|
+
quantity: product.num || 1,
|
|
68
|
+
num: product.num || 1,
|
|
69
|
+
discount_list: product.discount_list || [],
|
|
70
|
+
bundle: product.product_bundle || [],
|
|
71
|
+
booking_id: ((_a = product._origin) == null ? void 0 : _a.booking_id) || null,
|
|
72
|
+
isClient: false,
|
|
73
|
+
isManualDiscount: ((_b = product._origin) == null ? void 0 : _b.isManualDiscount) || false,
|
|
74
|
+
holder_id: (_c = product._origin) == null ? void 0 : _c.holder_id,
|
|
75
|
+
startDate: (_d = product._origin) == null ? void 0 : _d.startDate
|
|
76
|
+
};
|
|
77
|
+
},
|
|
78
|
+
setProduct: (product, values) => {
|
|
79
|
+
const nextNum = Number(values.quantity ?? product.num ?? 1) || 1;
|
|
80
|
+
const nextSellingPrice = values.main_product_selling_price !== void 0 ? String(values.main_product_selling_price) : values.price !== void 0 ? String(values.price) : values.total !== void 0 ? toUnitPriceString(values.total, nextNum) : product.selling_price;
|
|
81
|
+
return {
|
|
82
|
+
...product,
|
|
83
|
+
selling_price: nextSellingPrice,
|
|
84
|
+
original_price: values.original_price !== void 0 ? String(values.original_price) : product.original_price,
|
|
85
|
+
discount_list: values.discount_list ?? product.discount_list,
|
|
86
|
+
num: values.quantity ?? product.num,
|
|
87
|
+
product_bundle: values.bundle ?? product.product_bundle,
|
|
88
|
+
metadata: {
|
|
89
|
+
...product.metadata || {},
|
|
90
|
+
...values.main_product_selling_price !== void 0 ? { main_product_selling_price: String(values.main_product_selling_price) } : {}
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
}
|
|
48
96
|
var generateDuration = (cartItem) => {
|
|
49
97
|
const startDate = (0, import_dayjs.default)(`${cartItem.start_date} ${cartItem.start_time}`);
|
|
50
98
|
const endDate = (0, import_dayjs.default)(`${cartItem.end_date} ${cartItem.end_time}`);
|
|
@@ -124,13 +172,18 @@ function normalizeSubmitProduct(product) {
|
|
|
124
172
|
if (rawMetadata.price_breakdown) {
|
|
125
173
|
cleanMetadata.price_breakdown = rawMetadata.price_breakdown;
|
|
126
174
|
}
|
|
175
|
+
if (rawMetadata.is_rule !== void 0) {
|
|
176
|
+
cleanMetadata.is_rule = rawMetadata.is_rule;
|
|
177
|
+
}
|
|
127
178
|
return {
|
|
128
179
|
...submitProduct,
|
|
129
180
|
...bookingUid ? { booking_uid: bookingUid } : {},
|
|
130
181
|
product_option_item: submitProduct.product_option_item || [],
|
|
131
182
|
discount_list: submitProduct.discount_list || [],
|
|
132
183
|
product_bundle: submitProduct.product_bundle || [],
|
|
133
|
-
metadata: cleanMetadata
|
|
184
|
+
metadata: cleanMetadata,
|
|
185
|
+
// 出站兼容:后端仍消费 payment_price 字段,从 selling_price(券后单价)派生。
|
|
186
|
+
payment_price: submitProduct.selling_price
|
|
134
187
|
};
|
|
135
188
|
}
|
|
136
189
|
var SUBMIT_BOOKING_METADATA_WHITELIST = [
|
|
@@ -172,6 +225,14 @@ function resolveTableOccupancyDuration(tempOrder) {
|
|
|
172
225
|
}
|
|
173
226
|
return DEFAULT_TABLE_OCCUPANCY_DURATION;
|
|
174
227
|
}
|
|
228
|
+
function normalizeSubmitCollectPaxValue(value) {
|
|
229
|
+
const n = Number(value);
|
|
230
|
+
return Number.isFinite(n) && n > 0 ? Math.floor(n) : 1;
|
|
231
|
+
}
|
|
232
|
+
function resolveSubmitCollectPax(tempOrder) {
|
|
233
|
+
var _a;
|
|
234
|
+
return normalizeSubmitCollectPaxValue((_a = tempOrder.metadata) == null ? void 0 : _a.collect_pax);
|
|
235
|
+
}
|
|
175
236
|
function createDefaultTempOrder(params) {
|
|
176
237
|
const summary = params.summary || (0, import_utils.createEmptySummary)();
|
|
177
238
|
return {
|
|
@@ -221,7 +282,16 @@ function createDefaultTempOrder(params) {
|
|
|
221
282
|
};
|
|
222
283
|
}
|
|
223
284
|
function buildSubmitPayload(params) {
|
|
224
|
-
const {
|
|
285
|
+
const {
|
|
286
|
+
tempOrder,
|
|
287
|
+
cacheId,
|
|
288
|
+
now = /* @__PURE__ */ new Date(),
|
|
289
|
+
platform,
|
|
290
|
+
businessCode,
|
|
291
|
+
channel,
|
|
292
|
+
type,
|
|
293
|
+
enhance
|
|
294
|
+
} = params;
|
|
225
295
|
const scheduleDate = tempOrder.schedule_date || tempOrder.created_at || formatDateTime(now);
|
|
226
296
|
const summary = tempOrder.summary || (0, import_utils.createEmptySummary)();
|
|
227
297
|
const relationId = tempOrder.relation_id;
|
|
@@ -231,8 +301,8 @@ function buildSubmitPayload(params) {
|
|
|
231
301
|
const bookingDuration = resolveTableOccupancyDuration(tempOrder);
|
|
232
302
|
const bookingEnd = bookingStart.add(bookingDuration, "minute");
|
|
233
303
|
const bookings = relationId && tableFormId ? [{
|
|
234
|
-
relation_id:
|
|
235
|
-
form_id:
|
|
304
|
+
relation_id: 0,
|
|
305
|
+
form_id: 0,
|
|
236
306
|
start_time: bookingStart.format("HH:mm"),
|
|
237
307
|
start_date: bookingStart.format("YYYY-MM-DD"),
|
|
238
308
|
end_time: bookingEnd.format("HH:mm"),
|
|
@@ -240,28 +310,28 @@ function buildSubmitPayload(params) {
|
|
|
240
310
|
duration: bookingDuration,
|
|
241
311
|
metadata: {
|
|
242
312
|
unique_identification_number: bookingUuid,
|
|
243
|
-
collect_pax:
|
|
313
|
+
collect_pax: resolveSubmitCollectPax(tempOrder)
|
|
244
314
|
},
|
|
245
315
|
select_date: bookingStart.format("YYYY-MM-DD"),
|
|
246
316
|
is_all: false,
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
317
|
+
like_status: "common",
|
|
318
|
+
schedule_id: 0,
|
|
319
|
+
relation_type: "",
|
|
320
|
+
number: 1
|
|
251
321
|
}] : tempOrder.bookings || [];
|
|
252
322
|
const formRecordIds = relationId && tableFormId ? [{
|
|
253
323
|
form_id: tableFormId,
|
|
254
|
-
|
|
324
|
+
form_record_id: relationId
|
|
255
325
|
}] : void 0;
|
|
256
326
|
const { created_at: _createdAt, summary: _summary, surcharges: _surcharges, ...tempOrderRest } = tempOrder;
|
|
257
|
-
|
|
327
|
+
const payload = {
|
|
258
328
|
...tempOrderRest,
|
|
259
|
-
platform: normalizeSubmitPlatform(tempOrder.platform),
|
|
329
|
+
platform: normalizeSubmitPlatform(platform ?? tempOrder.platform),
|
|
260
330
|
request_unique_idempotency_token: cacheId,
|
|
261
|
-
type: tempOrder.type
|
|
262
|
-
business_code: tempOrder.business_code
|
|
331
|
+
type: type ?? tempOrder.type ?? "table-order",
|
|
332
|
+
business_code: businessCode ?? tempOrder.business_code ?? "table-order",
|
|
263
333
|
sales_channel: tempOrder.sales_channel || "my_pisel",
|
|
264
|
-
order_sales_channel: tempOrder.order_sales_channel
|
|
334
|
+
order_sales_channel: channel ?? tempOrder.order_sales_channel ?? "online_store",
|
|
265
335
|
status: tempOrder.status || "normal",
|
|
266
336
|
payment_status: tempOrder.payment_status || "payment_processing",
|
|
267
337
|
// shipping_status: tempOrder.shipping_status || 'unfulfilled',
|
|
@@ -282,13 +352,19 @@ function buildSubmitPayload(params) {
|
|
|
282
352
|
contacts_info: tempOrder.contacts_info || [],
|
|
283
353
|
// holder: tempOrder.holder || null,
|
|
284
354
|
// summary,
|
|
285
|
-
metadata: {
|
|
286
|
-
|
|
287
|
-
|
|
355
|
+
metadata: (() => {
|
|
356
|
+
const {
|
|
357
|
+
collect_pax: _collectPax,
|
|
358
|
+
table_occupancy_duration: _tableOccupancyDuration,
|
|
359
|
+
...rest
|
|
360
|
+
} = tempOrder.metadata || {};
|
|
361
|
+
return { ...rest };
|
|
362
|
+
})(),
|
|
288
363
|
products: (tempOrder.products || []).map(
|
|
289
364
|
(product) => normalizeSubmitProduct(product)
|
|
290
365
|
)
|
|
291
366
|
};
|
|
367
|
+
return enhance ? enhance(payload, { tempOrder, bookingUuid, now }) : payload;
|
|
292
368
|
}
|
|
293
369
|
function formatV1Product(products) {
|
|
294
370
|
return products.map((product) => {
|
|
@@ -298,7 +374,7 @@ function formatV1Product(products) {
|
|
|
298
374
|
option: product.product_option_item,
|
|
299
375
|
product_id: product.product_id,
|
|
300
376
|
product_variant_id: product.product_variant_id,
|
|
301
|
-
|
|
377
|
+
num: product.num,
|
|
302
378
|
rowKey: product.product_id,
|
|
303
379
|
session: null,
|
|
304
380
|
unique: createUuidV4()
|
|
@@ -308,6 +384,7 @@ function formatV1Product(products) {
|
|
|
308
384
|
// Annotate the CommonJS export names for ESM import in node:
|
|
309
385
|
0 && (module.exports = {
|
|
310
386
|
buildSubmitPayload,
|
|
387
|
+
createDefaultOrderRulesHooks,
|
|
311
388
|
createDefaultTempOrder,
|
|
312
389
|
createEmptySummary,
|
|
313
390
|
createUuidV4,
|
|
@@ -317,5 +394,7 @@ function formatV1Product(products) {
|
|
|
317
394
|
getAllDiscountList,
|
|
318
395
|
isTempOrder,
|
|
319
396
|
mergeRelationForms,
|
|
320
|
-
normalizeSubmitBooking
|
|
397
|
+
normalizeSubmitBooking,
|
|
398
|
+
normalizeSubmitCollectPaxValue,
|
|
399
|
+
resolveSubmitCollectPax
|
|
321
400
|
});
|
|
@@ -61,7 +61,7 @@ var ProductList = class extends import_BaseModule.BaseModule {
|
|
|
61
61
|
cacheId,
|
|
62
62
|
with_schedule
|
|
63
63
|
}, options) {
|
|
64
|
-
var _a
|
|
64
|
+
var _a;
|
|
65
65
|
let userPlugin = this.core.getPlugin("user");
|
|
66
66
|
let customer_id = void 0;
|
|
67
67
|
try {
|
|
@@ -97,7 +97,8 @@ var ProductList = class extends import_BaseModule.BaseModule {
|
|
|
97
97
|
schedule_date,
|
|
98
98
|
with_schedule,
|
|
99
99
|
schedule_datetime,
|
|
100
|
-
application_code:
|
|
100
|
+
// application_code: this.otherParams?.channel,
|
|
101
|
+
application_code: "online-store",
|
|
101
102
|
is_eject: 1
|
|
102
103
|
},
|
|
103
104
|
{ osServer: true, callback: options == null ? void 0 : options.callback, subscriberId: options == null ? void 0 : options.subscriberId, useCache: true, customToast: () => {
|
|
@@ -43,6 +43,9 @@ var QuotationModule = class extends import_BaseModule.BaseModule {
|
|
|
43
43
|
const query = {};
|
|
44
44
|
if (params == null ? void 0 : params.channel)
|
|
45
45
|
query.channel = params.channel;
|
|
46
|
+
if ((params == null ? void 0 : params.channel) === "online_store") {
|
|
47
|
+
query.channel = "online-store";
|
|
48
|
+
}
|
|
46
49
|
const res = await this.request.get(
|
|
47
50
|
"/quotation/available",
|
|
48
51
|
query,
|
|
@@ -2,9 +2,10 @@ export interface SalesSummaryProduct {
|
|
|
2
2
|
product_id: number | null;
|
|
3
3
|
product_variant_id: number;
|
|
4
4
|
num: number;
|
|
5
|
+
/** 券后单品单价(订单域成交单价),由 OrderModule 维护。 */
|
|
5
6
|
selling_price: string;
|
|
7
|
+
/** 券前单品单价(店铺售价)。 */
|
|
6
8
|
original_price: string;
|
|
7
|
-
payment_price: string;
|
|
8
9
|
tax_fee: string;
|
|
9
10
|
is_charge_tax?: number;
|
|
10
11
|
product_option_item?: any[];
|
|
@@ -82,7 +82,7 @@ function getBundleUnitPrice(product, useOriginal = false) {
|
|
|
82
82
|
}
|
|
83
83
|
function getUnitPaymentTotal(product) {
|
|
84
84
|
const variantPrice = getVariantPrice(product);
|
|
85
|
-
const basePrice = variantPrice || toDecimal(product.selling_price
|
|
85
|
+
const basePrice = variantPrice || toDecimal(product.selling_price);
|
|
86
86
|
return basePrice.plus(getOptionUnitPrice(product)).plus(getBundleUnitPrice(product));
|
|
87
87
|
}
|
|
88
88
|
function getUnitOriginalTotal(product) {
|
|
@@ -231,7 +231,7 @@ function calculateSingleItemTax(params) {
|
|
|
231
231
|
function getMainProductPaymentTotal(product) {
|
|
232
232
|
var _a, _b, _c, _d;
|
|
233
233
|
const variantPrice = getVariantPrice(product);
|
|
234
|
-
let total = variantPrice || toDecimal(((_a = product.metadata) == null ? void 0 : _a.main_product_selling_price) ?? product.selling_price
|
|
234
|
+
let total = variantPrice || toDecimal(((_a = product.metadata) == null ? void 0 : _a.main_product_selling_price) ?? product.selling_price);
|
|
235
235
|
const mainDiscountList = ((_c = (_b = product._origin) == null ? void 0 : _b.product) == null ? void 0 : _c.discount_list) || ((_d = product._origin) == null ? void 0 : _d.discount_list) || [];
|
|
236
236
|
const mainDiscountAmount = getDiscountListAmount(
|
|
237
237
|
mainDiscountList.filter((d) => {
|
|
@@ -46,7 +46,7 @@ export declare const formatScheduleResult: (schedule: ScheduleItem) => {
|
|
|
46
46
|
};
|
|
47
47
|
export declare const calcScheduleDateRange: (schedule: ScheduleItem) => any[];
|
|
48
48
|
export declare const calcCalendarDataBySchedules: (schedules: ScheduleItem[]) => unknown[];
|
|
49
|
-
export declare const calcMinTimeMaxTimeBySchedules: (schedules: ScheduleItem[], scheduleAllMap?: ScheduleAllMap, selectDate?: string) =>
|
|
49
|
+
export declare const calcMinTimeMaxTimeBySchedules: (schedules: ScheduleItem[], scheduleAllMap?: ScheduleAllMap, selectDate?: string) => ScheduleAllMap;
|
|
50
50
|
/**
|
|
51
51
|
* @title: 格式化日程数据
|
|
52
52
|
* @description:
|
|
@@ -27,6 +27,8 @@ export declare class ScanOrderImpl extends BaseModule implements Module {
|
|
|
27
27
|
private itemRuleConfigsPromise;
|
|
28
28
|
private itemRulePrefillApplied;
|
|
29
29
|
private itemRuleRuntimeConfig;
|
|
30
|
+
/** 最近一次 checkResourceAvailable 从预约规则 link 拉取的商品快照 */
|
|
31
|
+
private enabledReservationRuleProducts;
|
|
30
32
|
private getScanOrderLoggerContext;
|
|
31
33
|
private serializeError;
|
|
32
34
|
private addScanOrderLog;
|
|
@@ -50,10 +52,17 @@ export declare class ScanOrderImpl extends BaseModule implements Module {
|
|
|
50
52
|
};
|
|
51
53
|
getTempOrder(): import("./types").ScanOrderTempOrder | null;
|
|
52
54
|
updateTempOrderNote(note: string): string;
|
|
55
|
+
setPickupReferenceMode(mode: 'counter_pickup' | 'table_service'): {
|
|
56
|
+
service_type: 'dine_in';
|
|
57
|
+
pickup_reference_mode: 'counter_pickup' | 'table_service';
|
|
58
|
+
};
|
|
59
|
+
setPickupRef(buzzer: string): string;
|
|
53
60
|
private ensureTempOrder;
|
|
54
61
|
addNewOrder(): Promise<import("./types").ScanOrderTempOrder>;
|
|
62
|
+
restoreOrder(): Promise<import("./types").ScanOrderTempOrder>;
|
|
55
63
|
getOrderProducts(): ScanOrderOrderProduct[];
|
|
56
64
|
getSummary(): Promise<import("./types").ScanOrderSummary>;
|
|
65
|
+
private buildReservationRuleEnhancer;
|
|
57
66
|
submitScanOrder<T = any>(): Promise<T>;
|
|
58
67
|
addProductToOrder(product: Partial<ScanOrderOrderProduct> & ScanOrderOrderProductIdentity): Promise<ScanOrderOrderProduct[]>;
|
|
59
68
|
updateProductInOrder(params: {
|
|
@@ -87,4 +96,17 @@ export declare class ScanOrderImpl extends BaseModule implements Module {
|
|
|
87
96
|
}>;
|
|
88
97
|
getProductList(): Promise<any>;
|
|
89
98
|
getOtherParams(): Record<string, any>;
|
|
99
|
+
setOtherParams(params: Record<string, any>, { cover }?: {
|
|
100
|
+
cover?: boolean;
|
|
101
|
+
}): Promise<void>;
|
|
102
|
+
setEntryPaxNumber(number: number): Promise<void>;
|
|
103
|
+
getEntryPaxNumber(): number | null;
|
|
104
|
+
getFulfillmentModes(): {
|
|
105
|
+
enablePickup: boolean;
|
|
106
|
+
enableTableService: boolean;
|
|
107
|
+
};
|
|
108
|
+
checkManualPickupRef(): {
|
|
109
|
+
enabled: boolean;
|
|
110
|
+
manualInputType?: string;
|
|
111
|
+
};
|
|
90
112
|
}
|