@pisell/pisellos 2.3.50 → 2.3.53
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/buildCacheItemFromOrderLine.js +12 -10
- package/dist/modules/Discount/index.d.ts +0 -1
- package/dist/modules/Discount/index.js +11 -40
- package/dist/modules/Discount/types.d.ts +0 -1
- package/dist/modules/OpenData/index.js +2 -2
- package/dist/modules/Order/index.d.ts +6 -8
- package/dist/modules/Order/index.js +165 -140
- package/dist/modules/Order/types.d.ts +21 -12
- package/dist/modules/Order/types.js +11 -0
- package/dist/modules/Order/utils.d.ts +0 -10
- package/dist/modules/Order/utils.js +3 -35
- package/dist/modules/Payment/types.d.ts +8 -0
- package/dist/modules/Payment/walletpass.d.ts +7 -1
- package/dist/modules/Payment/walletpass.js +155 -45
- package/dist/modules/Product/types.d.ts +0 -1
- package/dist/modules/ProductList/index.js +14 -33
- package/dist/modules/Quotation/index.d.ts +1 -1
- package/dist/modules/Quotation/index.js +2 -2
- package/dist/modules/Rules/index.js +32 -56
- package/dist/modules/SalesSummary/index.js +13 -12
- package/dist/modules/SalesSummary/utils.js +7 -1
- package/dist/modules/ScanOrderLogger/index.d.ts +0 -2
- package/dist/modules/ScanOrderLogger/index.js +2 -15
- package/dist/modules/ScanOrderLogger/providers/feishu.js +27 -45
- package/dist/modules/ScanOrderLogger/types.d.ts +0 -1
- package/dist/modules/Schedule/index.d.ts +1 -3
- package/dist/modules/Schedule/index.js +16 -21
- package/dist/modules/Summary/utils.js +13 -38
- package/dist/modules/index.d.ts +0 -2
- package/dist/modules/index.js +1 -3
- package/dist/plugins/window.d.ts +0 -1
- package/dist/server/index.d.ts +0 -14
- package/dist/server/index.js +793 -907
- package/dist/server/modules/index.d.ts +1 -1
- package/dist/server/modules/order/index.d.ts +16 -0
- package/dist/server/modules/order/index.js +964 -776
- package/dist/server/modules/order/types.d.ts +14 -0
- package/dist/server/modules/order/types.js +6 -0
- package/dist/solution/BaseSales/index.d.ts +18 -13
- package/dist/solution/BaseSales/index.js +202 -178
- package/dist/solution/BaseSales/utils/cartPromotion.js +5 -3
- package/dist/solution/BookingByStep/index.d.ts +2 -17
- package/dist/solution/BookingByStep/index.js +215 -294
- package/dist/solution/BookingByStep/types.d.ts +1 -2
- package/dist/solution/BookingByStep/types.js +1 -3
- package/dist/solution/BookingByStep/utils/capacity.js +1 -17
- package/dist/solution/BookingByStep/utils/timeslots.d.ts +1 -3
- package/dist/solution/BookingByStep/utils/timeslots.js +12 -19
- package/dist/solution/BookingTicket/index.d.ts +1 -13
- package/dist/solution/BookingTicket/index.js +2 -2
- package/dist/solution/BookingTicket/types.d.ts +3 -0
- package/dist/solution/BookingTicket/utils/cartView.js +44 -32
- package/dist/solution/BookingTicket/utils/scan/handleScan.d.ts +1 -3
- package/dist/solution/BookingTicket/utils/scan/handleScan.js +2 -10
- package/dist/solution/Sales/index.d.ts +1 -0
- package/dist/solution/Sales/index.js +16 -2
- package/dist/solution/ScanOrder/index.d.ts +14 -26
- package/dist/solution/ScanOrder/index.js +739 -1142
- package/dist/solution/ScanOrder/types.d.ts +1 -21
- package/dist/solution/ScanOrder/utils.d.ts +0 -8
- package/dist/solution/ScanOrder/utils.js +25 -66
- package/dist/solution/ShopDiscount/index.d.ts +0 -1
- package/dist/solution/ShopDiscount/index.js +87 -125
- package/dist/solution/VenueBooking/index.d.ts +11 -39
- package/dist/solution/VenueBooking/index.js +841 -1167
- package/dist/solution/VenueBooking/types.d.ts +0 -3
- package/dist/solution/VenueBooking/utils/resource.js +0 -1
- package/dist/solution/VenueBooking/utils/slotMerge.d.ts +4 -4
- package/dist/solution/VenueBooking/utils/slotMerge.js +5 -10
- package/dist/solution/index.d.ts +0 -1
- package/dist/solution/index.js +1 -2
- package/dist/types/index.d.ts +0 -1
- package/lib/model/strategy/adapter/promotion/index.js +0 -51
- package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +3 -1
- package/lib/modules/Discount/index.d.ts +0 -1
- package/lib/modules/Discount/index.js +0 -9
- package/lib/modules/Discount/types.d.ts +0 -1
- package/lib/modules/OpenData/index.js +1 -1
- package/lib/modules/Order/index.d.ts +6 -8
- package/lib/modules/Order/index.js +89 -38
- package/lib/modules/Order/types.d.ts +21 -12
- package/lib/modules/Order/utils.d.ts +0 -10
- package/lib/modules/Order/utils.js +5 -36
- package/lib/modules/Payment/types.d.ts +8 -0
- package/lib/modules/Payment/walletpass.d.ts +7 -1
- package/lib/modules/Payment/walletpass.js +107 -9
- package/lib/modules/Product/types.d.ts +0 -1
- package/lib/modules/ProductList/index.js +31 -40
- package/lib/modules/Quotation/index.d.ts +1 -1
- package/lib/modules/Quotation/index.js +2 -2
- package/lib/modules/Rules/index.js +32 -44
- package/lib/modules/SalesSummary/index.js +7 -6
- package/lib/modules/SalesSummary/utils.js +5 -1
- package/lib/modules/ScanOrderLogger/index.d.ts +0 -2
- package/lib/modules/ScanOrderLogger/index.js +1 -13
- package/lib/modules/ScanOrderLogger/providers/feishu.js +6 -15
- package/lib/modules/ScanOrderLogger/types.d.ts +0 -1
- package/lib/modules/Schedule/index.d.ts +1 -3
- package/lib/modules/Schedule/index.js +8 -10
- package/lib/modules/Summary/utils.js +1 -21
- package/lib/modules/index.d.ts +0 -2
- package/lib/modules/index.js +1 -5
- package/lib/plugins/window.d.ts +0 -1
- package/lib/server/index.d.ts +0 -14
- package/lib/server/index.js +15 -72
- package/lib/server/modules/index.d.ts +1 -1
- package/lib/server/modules/order/index.d.ts +16 -0
- package/lib/server/modules/order/index.js +140 -4
- package/lib/server/modules/order/types.d.ts +14 -0
- package/lib/server/modules/order/types.js +1 -0
- package/lib/solution/BaseSales/index.d.ts +18 -13
- package/lib/solution/BaseSales/index.js +58 -35
- package/lib/solution/BaseSales/utils/cartPromotion.js +5 -2
- package/lib/solution/BookingByStep/index.d.ts +2 -17
- package/lib/solution/BookingByStep/index.js +18 -60
- package/lib/solution/BookingByStep/types.d.ts +1 -2
- package/lib/solution/BookingByStep/types.js +0 -5
- package/lib/solution/BookingByStep/utils/capacity.js +1 -20
- package/lib/solution/BookingByStep/utils/timeslots.d.ts +1 -3
- package/lib/solution/BookingByStep/utils/timeslots.js +11 -19
- package/lib/solution/BookingTicket/index.d.ts +1 -13
- package/lib/solution/BookingTicket/index.js +2 -10
- package/lib/solution/BookingTicket/types.d.ts +3 -0
- package/lib/solution/BookingTicket/utils/cartView.js +43 -30
- package/lib/solution/BookingTicket/utils/scan/handleScan.d.ts +1 -3
- package/lib/solution/BookingTicket/utils/scan/handleScan.js +2 -2
- package/lib/solution/Sales/index.d.ts +1 -0
- package/lib/solution/Sales/index.js +15 -3
- package/lib/solution/ScanOrder/index.d.ts +14 -26
- package/lib/solution/ScanOrder/index.js +182 -449
- package/lib/solution/ScanOrder/types.d.ts +1 -21
- package/lib/solution/ScanOrder/utils.d.ts +0 -8
- package/lib/solution/ScanOrder/utils.js +0 -31
- package/lib/solution/ShopDiscount/index.d.ts +0 -1
- package/lib/solution/ShopDiscount/index.js +0 -14
- package/lib/solution/VenueBooking/index.d.ts +11 -39
- package/lib/solution/VenueBooking/index.js +110 -322
- package/lib/solution/VenueBooking/types.d.ts +0 -3
- package/lib/solution/VenueBooking/utils/resource.js +0 -1
- package/lib/solution/VenueBooking/utils/slotMerge.d.ts +4 -4
- package/lib/solution/VenueBooking/utils/slotMerge.js +4 -6
- package/lib/solution/index.d.ts +0 -1
- package/lib/solution/index.js +1 -3
- package/lib/types/index.d.ts +0 -1
- package/package.json +1 -1
- package/dist/modules/Holder/index.d.ts +0 -48
- package/dist/modules/Holder/index.js +0 -640
- package/dist/modules/Holder/types.d.ts +0 -123
- package/dist/modules/Holder/types.js +0 -1
- package/dist/modules/Holder/utils.d.ts +0 -13
- package/dist/modules/Holder/utils.js +0 -34
- package/dist/modules/ResourcePlanner/index.d.ts +0 -24
- package/dist/modules/ResourcePlanner/index.js +0 -181
- package/dist/modules/ResourcePlanner/planner.d.ts +0 -14
- package/dist/modules/ResourcePlanner/planner.js +0 -1069
- package/dist/modules/ResourcePlanner/types.d.ts +0 -227
- package/dist/modules/ResourcePlanner/types.js +0 -1
- package/dist/solution/UnifiedBookingSales/index.d.ts +0 -183
- package/dist/solution/UnifiedBookingSales/index.js +0 -1891
- package/dist/solution/UnifiedBookingSales/types.d.ts +0 -143
- package/dist/solution/UnifiedBookingSales/types.js +0 -11
- package/lib/modules/Holder/index.d.ts +0 -48
- package/lib/modules/Holder/index.js +0 -402
- package/lib/modules/Holder/types.d.ts +0 -123
- package/lib/modules/Holder/types.js +0 -17
- package/lib/modules/Holder/utils.d.ts +0 -13
- package/lib/modules/Holder/utils.js +0 -71
- package/lib/modules/ResourcePlanner/index.d.ts +0 -24
- package/lib/modules/ResourcePlanner/index.js +0 -148
- package/lib/modules/ResourcePlanner/planner.d.ts +0 -14
- package/lib/modules/ResourcePlanner/planner.js +0 -933
- package/lib/modules/ResourcePlanner/types.d.ts +0 -227
- package/lib/modules/ResourcePlanner/types.js +0 -17
- package/lib/solution/UnifiedBookingSales/index.d.ts +0 -183
- package/lib/solution/UnifiedBookingSales/index.js +0 -1084
- package/lib/solution/UnifiedBookingSales/types.d.ts +0 -143
- package/lib/solution/UnifiedBookingSales/types.js +0 -33
package/lib/server/index.js
CHANGED
|
@@ -82,10 +82,6 @@ var Server = class {
|
|
|
82
82
|
this.productQuerySubscribers = /* @__PURE__ */ new Map();
|
|
83
83
|
/** subscriberId → 智能定价变价时间点定时器句柄(与 subscriber 分离存储,便于 clear) */
|
|
84
84
|
this.productQueryScheduleTimers = /* @__PURE__ */ new Map();
|
|
85
|
-
/** 餐牌筛选为空时才触发的菜单/日程缓存自愈,避免每次商品查询都请求远端。 */
|
|
86
|
-
this.menuScheduleRefreshInFlight = null;
|
|
87
|
-
this.lastMenuScheduleRefreshAt = 0;
|
|
88
|
-
this.MENU_SCHEDULE_REFRESH_COOLDOWN_MS = 30 * 1e3;
|
|
89
85
|
// ---- 订单 / 预约列表查询订阅者 ----
|
|
90
86
|
this.orderQuerySubscribers = /* @__PURE__ */ new Map();
|
|
91
87
|
this.bookingQuerySubscribers = /* @__PURE__ */ new Map();
|
|
@@ -219,11 +215,7 @@ var Server = class {
|
|
|
219
215
|
*/
|
|
220
216
|
this.handleProductQuery = async ({ url, method, data, config }) => {
|
|
221
217
|
console.log("[Server] handleProductQuery:", url, method, data, config);
|
|
222
|
-
const { menu_list_ids, customer_id, ids, extension_type, strategy_context } = data;
|
|
223
|
-
const { schedule_date, schedule_datetime } = this.resolveProductQueryScheduleContext({
|
|
224
|
-
schedule_date: data.schedule_date,
|
|
225
|
-
schedule_datetime: data.schedule_datetime
|
|
226
|
-
});
|
|
218
|
+
const { menu_list_ids, schedule_datetime, schedule_date, customer_id, ids, extension_type, strategy_context } = data;
|
|
227
219
|
const { callback, subscriberId } = config || {};
|
|
228
220
|
this.logInfo("handleProductQuery: 开始处理商品查询请求", {
|
|
229
221
|
menu_list_ids,
|
|
@@ -2219,12 +2211,15 @@ var Server = class {
|
|
|
2219
2211
|
return;
|
|
2220
2212
|
const scheduleDate = subscriber.context.schedule_date || (0, import_dayjs.default)().format("YYYY-MM-DD");
|
|
2221
2213
|
const timerIds = [];
|
|
2222
|
-
|
|
2223
|
-
const
|
|
2224
|
-
if (
|
|
2225
|
-
|
|
2226
|
-
|
|
2227
|
-
|
|
2214
|
+
for (const timePoint of timePoints) {
|
|
2215
|
+
const delayMs = this.computeScheduleTimePointDelayMs(scheduleDate, timePoint);
|
|
2216
|
+
if (delayMs < 0)
|
|
2217
|
+
continue;
|
|
2218
|
+
const timerId = setTimeout(() => {
|
|
2219
|
+
void this.onScheduleTimePointTimerFire(subscriberId, timerId);
|
|
2220
|
+
}, delayMs);
|
|
2221
|
+
timerIds.push(timerId);
|
|
2222
|
+
}
|
|
2228
2223
|
if (timerIds.length > 0) {
|
|
2229
2224
|
this.productQueryScheduleTimers.set(subscriberId, timerIds);
|
|
2230
2225
|
subscriber.scheduleTimerIds = timerIds;
|
|
@@ -2239,7 +2234,7 @@ var Server = class {
|
|
|
2239
2234
|
* schedule 变价时间点定时器触发:刷新 schedule_datetime 后重算并 callback。
|
|
2240
2235
|
*/
|
|
2241
2236
|
async onScheduleTimePointTimerFire(subscriberId, timerId) {
|
|
2242
|
-
|
|
2237
|
+
this.removeScheduleTimerRef(subscriberId, timerId);
|
|
2243
2238
|
if (!this.productQuerySubscribers.has(subscriberId))
|
|
2244
2239
|
return;
|
|
2245
2240
|
const subscriber = this.productQuerySubscribers.get(subscriberId);
|
|
@@ -2282,43 +2277,6 @@ var Server = class {
|
|
|
2282
2277
|
this.scheduleSubscriberTimePointReloads(subscriberId, timePoints);
|
|
2283
2278
|
}
|
|
2284
2279
|
}
|
|
2285
|
-
/**
|
|
2286
|
-
* ProductList callers such as standalone retail pages do not always have a selected schedule.
|
|
2287
|
-
* In that case query against the current local time so menu availability can still be evaluated.
|
|
2288
|
-
*/
|
|
2289
|
-
resolveProductQueryScheduleContext(params) {
|
|
2290
|
-
const now = (0, import_dayjs.default)();
|
|
2291
|
-
const schedule_datetime = typeof params.schedule_datetime === "string" && params.schedule_datetime.trim() ? params.schedule_datetime : now.format("YYYY-MM-DD HH:mm:ss");
|
|
2292
|
-
const schedule_date = typeof params.schedule_date === "string" && params.schedule_date.trim() ? params.schedule_date : (0, import_dayjs.default)(schedule_datetime).isValid() ? (0, import_dayjs.default)(schedule_datetime).format("YYYY-MM-DD") : now.format("YYYY-MM-DD");
|
|
2293
|
-
return { schedule_date, schedule_datetime };
|
|
2294
|
-
}
|
|
2295
|
-
/**
|
|
2296
|
-
* OpenData 的关联餐牌可能已更新,而 server_menu/server_schedule 仍命中本地持久化缓存。
|
|
2297
|
-
* 仅在当前筛选没有任何生效餐牌时刷新一次,并由调用方重新计算筛选结果。
|
|
2298
|
-
*/
|
|
2299
|
-
async refreshMenuScheduleCacheAfterEmptyResult() {
|
|
2300
|
-
if (!this.menu || !this.schedule)
|
|
2301
|
-
return false;
|
|
2302
|
-
const now = Date.now();
|
|
2303
|
-
if (now - this.lastMenuScheduleRefreshAt < this.MENU_SCHEDULE_REFRESH_COOLDOWN_MS) {
|
|
2304
|
-
return false;
|
|
2305
|
-
}
|
|
2306
|
-
if (!this.menuScheduleRefreshInFlight) {
|
|
2307
|
-
this.lastMenuScheduleRefreshAt = now;
|
|
2308
|
-
this.menuScheduleRefreshInFlight = Promise.all([
|
|
2309
|
-
this.menu.loadMenuList(),
|
|
2310
|
-
this.schedule.loadAllSchedule()
|
|
2311
|
-
]).then(() => void 0).catch((error) => {
|
|
2312
|
-
this.logWarning("刷新菜单/日程缓存失败,继续使用现有缓存", {
|
|
2313
|
-
error: error instanceof Error ? error.message : String(error)
|
|
2314
|
-
});
|
|
2315
|
-
}).finally(() => {
|
|
2316
|
-
this.menuScheduleRefreshInFlight = null;
|
|
2317
|
-
});
|
|
2318
|
-
}
|
|
2319
|
-
await this.menuScheduleRefreshInFlight;
|
|
2320
|
-
return true;
|
|
2321
|
-
}
|
|
2322
2280
|
/**
|
|
2323
2281
|
* 执行 sales 搜索并登记可见订单号。
|
|
2324
2282
|
* 搜索参数完全透传后端,OS 不做过滤、筛选、排序。
|
|
@@ -3821,22 +3779,10 @@ var Server = class {
|
|
|
3821
3779
|
data: (normalized == null ? void 0 : normalized.data) ?? null
|
|
3822
3780
|
};
|
|
3823
3781
|
}
|
|
3824
|
-
|
|
3782
|
+
return this.withSyncedOrderIdInCheckoutResponse(
|
|
3825
3783
|
syncResult.normalizedResponse,
|
|
3826
3784
|
syncResult.syncedOrder
|
|
3827
3785
|
);
|
|
3828
|
-
const syncedOrder = syncResult.syncedOrder;
|
|
3829
|
-
if (syncedOrder && this.shouldBuildSmallTicketData(syncResult.checkoutData) && this.isSalesOrderFullyPaid(syncedOrder)) {
|
|
3830
|
-
await this.dispatchLocalReceiptPrint({
|
|
3831
|
-
checkoutData: syncResult.checkoutData,
|
|
3832
|
-
order: syncedOrder,
|
|
3833
|
-
response: syncResult.normalizedResponse,
|
|
3834
|
-
requireFullyPaid: true,
|
|
3835
|
-
// print_all 的 type=0 是收据打印;不要沿用同步成功后的券/手环打印 type=99。
|
|
3836
|
-
isManualPrint: true
|
|
3837
|
-
});
|
|
3838
|
-
}
|
|
3839
|
-
return response;
|
|
3840
3786
|
} catch (error) {
|
|
3841
3787
|
const backendError = this.extractBackendErrorResponse(error);
|
|
3842
3788
|
if (backendError) {
|
|
@@ -5126,16 +5072,13 @@ var Server = class {
|
|
|
5126
5072
|
let activeMenuList = [];
|
|
5127
5073
|
if (menu_list_ids && Array.isArray(menu_list_ids) && menu_list_ids.length > 0) {
|
|
5128
5074
|
const tMenu = performance.now();
|
|
5129
|
-
const
|
|
5075
|
+
const menuList = this.menu.getMenuByIds(menu_list_ids);
|
|
5076
|
+
activeMenuList = menuList.filter((menu) => {
|
|
5130
5077
|
var _a;
|
|
5131
5078
|
return ((_a = this.schedule) == null ? void 0 : _a.getDateIsInSchedule(schedule_datetime, menu.schedule)) || false;
|
|
5132
5079
|
});
|
|
5133
|
-
activeMenuList = getActiveMenus();
|
|
5134
|
-
if (!activeMenuList.length && await this.refreshMenuScheduleCacheAfterEmptyResult()) {
|
|
5135
|
-
activeMenuList = getActiveMenus();
|
|
5136
|
-
}
|
|
5137
5080
|
(0, import_product.perfMark)("computeQuery.filterActiveMenu", performance.now() - tMenu, {
|
|
5138
|
-
totalMenu:
|
|
5081
|
+
totalMenu: menuList.length,
|
|
5139
5082
|
activeMenu: activeMenuList.length
|
|
5140
5083
|
});
|
|
5141
5084
|
}
|
|
@@ -14,7 +14,7 @@ export { QuotationHooks } from './quotation/types';
|
|
|
14
14
|
export { ScheduleModuleEx } from './schedule';
|
|
15
15
|
export type { ScheduleState, ScheduleItem } from './schedule/types';
|
|
16
16
|
export { OrderModule } from './order';
|
|
17
|
-
export type { OrderState, OrderData, OrderId, OrderSummary, OrderBookingItem, OrderProductLineItem, OrderPaymentItem, OrderSurchargeItem, OrderProductDiscountItem, OrderWithoutBookings, BookingData, OrderFilters, BookingFilters, OrderFilterResult, OrderFilterRejectDetail, OrderFilterRejectedEntry, BookingFilterResult, OrderModulePagedResult, } from './order/types';
|
|
17
|
+
export type { OrderState, OrderData, OrderId, OrderSummary, OrderBookingItem, OrderProductLineItem, OrderPaymentItem, OrderSurchargeItem, OrderProductDiscountItem, OrderWithoutBookings, BookingData, OrderFilters, BookingFilters, OrderFilterResult, OrderFilterRejectDetail, OrderFilterRejectedEntry, BookingFilterResult, OrderModulePagedResult, RemoteProductMembershipChangedPayload, RemoteProductMembershipChangeSource, } from './order/types';
|
|
18
18
|
export { OrderHooks } from './order/types';
|
|
19
19
|
export { PaymentServerModule } from './payment';
|
|
20
20
|
export type { PaymentMethod, PaymentMethodsChangedEventData, PaymentServerState } from './payment/types';
|
|
@@ -30,6 +30,10 @@ export declare class OrderModule extends BaseModule implements Module {
|
|
|
30
30
|
* await this.emitOrdersChanged([freshOrder], 'pubsub.bodyUpsert')
|
|
31
31
|
*/
|
|
32
32
|
private emitOrdersChanged;
|
|
33
|
+
/**
|
|
34
|
+
* 广播远端商品成员增删。监听器异常必须与订单落库和原有订单广播隔离。
|
|
35
|
+
*/
|
|
36
|
+
private emitRemoteProductMembershipChanges;
|
|
33
37
|
initialize(core: PisellCore, options?: ModuleOptions): Promise<void>;
|
|
34
38
|
/**
|
|
35
39
|
* 记录信息日志
|
|
@@ -231,6 +235,18 @@ export declare class OrderModule extends BaseModule implements Module {
|
|
|
231
235
|
*/
|
|
232
236
|
private lookupOrderIndexByIdentityKeys;
|
|
233
237
|
private isRemoteEchoMergeSource;
|
|
238
|
+
private getProductMembershipKey;
|
|
239
|
+
private doProductsHaveStableMembershipIdentity;
|
|
240
|
+
/**
|
|
241
|
+
* 冲突提示关注逻辑商品行,而不是服务端 checkout 过程中可能被重建的 detail 记录。
|
|
242
|
+
* 通用集合合并仍以 order_detail_id 为事实主键;这里只允许相同稳定 UID 跨 detail id 对齐,
|
|
243
|
+
* 避免本机 checkout 回声被误判成“一删一增”。
|
|
244
|
+
*/
|
|
245
|
+
private isSameProductMembershipItem;
|
|
246
|
+
/**
|
|
247
|
+
* 对比合并前后的商品成员集合。商品字段修改与数组重排不会产生 diff。
|
|
248
|
+
*/
|
|
249
|
+
private getRemoteProductMembershipChange;
|
|
234
250
|
/**
|
|
235
251
|
* 将订单的全部身份键登记到索引并指向其在列表中的下标。
|
|
236
252
|
* 合并后订单新增的身份字段(如挂单同步后拿到 order_id)也会被登记。
|
|
@@ -89,6 +89,24 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
89
89
|
};
|
|
90
90
|
await this.core.effects.emit(import_types.OrderHooks.onOrdersChanged, payload);
|
|
91
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* 广播远端商品成员增删。监听器异常必须与订单落库和原有订单广播隔离。
|
|
94
|
+
*/
|
|
95
|
+
async emitRemoteProductMembershipChanges(changes) {
|
|
96
|
+
for (const payload of changes) {
|
|
97
|
+
try {
|
|
98
|
+
await this.core.effects.emit(import_types.OrderHooks.onRemoteProductMembershipChanged, payload);
|
|
99
|
+
} catch (error) {
|
|
100
|
+
this.logError("广播远端订单商品成员变更失败", {
|
|
101
|
+
order_id: payload.order_id,
|
|
102
|
+
source: payload.source,
|
|
103
|
+
added_product_count: payload.added_product_keys.length,
|
|
104
|
+
removed_product_count: payload.removed_product_keys.length,
|
|
105
|
+
error: error instanceof Error ? error.message : String(error)
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
92
110
|
async initialize(core, options) {
|
|
93
111
|
var _a;
|
|
94
112
|
this.core = core;
|
|
@@ -314,7 +332,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
314
332
|
* @example
|
|
315
333
|
* const { toWrite, skipped } = this.filterRedundantPatchOrders('pubsub.bodyUpsert', orders, mergeActions)
|
|
316
334
|
*/
|
|
317
|
-
filterRedundantPatchOrders(source, orders, mergeActions) {
|
|
335
|
+
filterRedundantPatchOrders(source, orders, mergeActions, forceWriteStorageKeys = /* @__PURE__ */ new Set()) {
|
|
318
336
|
const eligibleSkipSources = /* @__PURE__ */ new Set(["pubsub.bodyUpsert", "pubsub.httpRefresh"]);
|
|
319
337
|
if (!eligibleSkipSources.has(source)) {
|
|
320
338
|
return { toWrite: orders, skipped: [] };
|
|
@@ -334,6 +352,10 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
334
352
|
toWrite.push(order);
|
|
335
353
|
continue;
|
|
336
354
|
}
|
|
355
|
+
if (forceWriteStorageKeys.has(storageKey)) {
|
|
356
|
+
toWrite.push(order);
|
|
357
|
+
continue;
|
|
358
|
+
}
|
|
337
359
|
const recent = this.recentSqliteWriteByStorageKey.get(storageKey);
|
|
338
360
|
if (recent && ORDER_BUSINESS_WRITE_SOURCES.has(recent.source) && now - recent.ts < ORDER_SQLITE_DEDUPE_MS) {
|
|
339
361
|
skipped.push({
|
|
@@ -1484,10 +1506,20 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1484
1506
|
});
|
|
1485
1507
|
this.logDuplicateOrders(`${source}.beforeMerge`, this.store.list);
|
|
1486
1508
|
const normalizedFreshOrders = [];
|
|
1509
|
+
const incomingProductsHaveStableIdentity = /* @__PURE__ */ new Map();
|
|
1487
1510
|
for (const order of freshOrders) {
|
|
1488
1511
|
const id = order == null ? void 0 : order.order_id;
|
|
1489
1512
|
if (id === void 0 || id === null)
|
|
1490
1513
|
continue;
|
|
1514
|
+
const rawProducts = order.products;
|
|
1515
|
+
if (Array.isArray(rawProducts)) {
|
|
1516
|
+
const allProductsHaveStableIdentity = this.doProductsHaveStableMembershipIdentity(rawProducts);
|
|
1517
|
+
const orderIdKey = this.getIdKey(id);
|
|
1518
|
+
incomingProductsHaveStableIdentity.set(
|
|
1519
|
+
orderIdKey,
|
|
1520
|
+
(incomingProductsHaveStableIdentity.get(orderIdKey) ?? true) && allProductsHaveStableIdentity
|
|
1521
|
+
);
|
|
1522
|
+
}
|
|
1491
1523
|
normalizedFreshOrders.push(this.normalizeRemoteSyncedOrder(order));
|
|
1492
1524
|
}
|
|
1493
1525
|
const uniqueFreshOrders = this.compactOrderListByIdentity(
|
|
@@ -1496,7 +1528,14 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1496
1528
|
).list;
|
|
1497
1529
|
const uniqueFreshCount = uniqueFreshOrders.length;
|
|
1498
1530
|
const patchedOrders = [];
|
|
1531
|
+
const remoteProductMembershipChanges = [];
|
|
1532
|
+
const forceWriteStorageKeys = /* @__PURE__ */ new Set();
|
|
1499
1533
|
const mergeActions = {};
|
|
1534
|
+
const existingProductsHaveStableIdentity = this.store.list.map(
|
|
1535
|
+
(order) => this.doProductsHaveStableMembershipIdentity(
|
|
1536
|
+
order.products
|
|
1537
|
+
)
|
|
1538
|
+
);
|
|
1500
1539
|
const updatedList = this.store.list.map(
|
|
1501
1540
|
(order) => this.normalizeOrderForMemoryList(order, `${source}.existingMemory`)
|
|
1502
1541
|
);
|
|
@@ -1540,6 +1579,17 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1540
1579
|
continue;
|
|
1541
1580
|
}
|
|
1542
1581
|
let mergedOrder = this.mergeOrderRecords(existingOrder, fresh);
|
|
1582
|
+
const freshOrderId = fresh.order_id;
|
|
1583
|
+
const incomingProductsAreStable = freshOrderId !== void 0 && freshOrderId !== null && incomingProductsHaveStableIdentity.get(this.getIdKey(freshOrderId)) !== false;
|
|
1584
|
+
let membershipChange = null;
|
|
1585
|
+
if (Array.isArray(fresh.products) && freshOrderId !== void 0 && freshOrderId !== null && existingProductsHaveStableIdentity[matchIndex] !== false && incomingProductsAreStable) {
|
|
1586
|
+
membershipChange = this.getRemoteProductMembershipChange(
|
|
1587
|
+
existingOrder,
|
|
1588
|
+
mergedOrder,
|
|
1589
|
+
source
|
|
1590
|
+
);
|
|
1591
|
+
}
|
|
1592
|
+
let mergedProductsHaveStableIdentity = existingProductsHaveStableIdentity[matchIndex] !== false && incomingProductsAreStable;
|
|
1543
1593
|
let adjustedMatchIndex = matchIndex;
|
|
1544
1594
|
const duplicateIndexes = /* @__PURE__ */ new Set();
|
|
1545
1595
|
for (const key of freshIdentityKeys) {
|
|
@@ -1551,7 +1601,9 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1551
1601
|
if (duplicateIndexes.size > 0) {
|
|
1552
1602
|
for (const duplicateIndex of [...duplicateIndexes].sort((left, right) => right - left)) {
|
|
1553
1603
|
mergedOrder = this.mergeOrderRecords(mergedOrder, updatedList[duplicateIndex]);
|
|
1604
|
+
mergedProductsHaveStableIdentity = mergedProductsHaveStableIdentity && existingProductsHaveStableIdentity[duplicateIndex] !== false;
|
|
1554
1605
|
updatedList.splice(duplicateIndex, 1);
|
|
1606
|
+
existingProductsHaveStableIdentity.splice(duplicateIndex, 1);
|
|
1555
1607
|
if (duplicateIndex < adjustedMatchIndex)
|
|
1556
1608
|
adjustedMatchIndex -= 1;
|
|
1557
1609
|
}
|
|
@@ -1564,6 +1616,13 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1564
1616
|
}
|
|
1565
1617
|
}
|
|
1566
1618
|
updatedList[adjustedMatchIndex] = mergedOrder;
|
|
1619
|
+
existingProductsHaveStableIdentity[adjustedMatchIndex] = mergedProductsHaveStableIdentity;
|
|
1620
|
+
if (membershipChange) {
|
|
1621
|
+
remoteProductMembershipChanges.push(membershipChange);
|
|
1622
|
+
const mergedStorageKey = this.getOrderStorageKey(mergedOrder);
|
|
1623
|
+
if (mergedStorageKey)
|
|
1624
|
+
forceWriteStorageKeys.add(mergedStorageKey);
|
|
1625
|
+
}
|
|
1567
1626
|
this.registerOrderIdentityKeys(identityKeyToIndex, mergedOrder, adjustedMatchIndex);
|
|
1568
1627
|
patchedOrders.push(mergedOrder);
|
|
1569
1628
|
if (mergeKey)
|
|
@@ -1572,6 +1631,9 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1572
1631
|
}
|
|
1573
1632
|
const insertIndex = updatedList.length;
|
|
1574
1633
|
updatedList.push(fresh);
|
|
1634
|
+
existingProductsHaveStableIdentity.push(
|
|
1635
|
+
fresh.order_id !== void 0 && fresh.order_id !== null && incomingProductsHaveStableIdentity.get(this.getIdKey(fresh.order_id)) !== false
|
|
1636
|
+
);
|
|
1575
1637
|
this.registerOrderIdentityKeys(identityKeyToIndex, fresh, insertIndex);
|
|
1576
1638
|
patchedOrders.push(fresh);
|
|
1577
1639
|
if (mergeKey)
|
|
@@ -1586,13 +1648,20 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1586
1648
|
});
|
|
1587
1649
|
this.store.list = this.runOrderStoreSelfCheck(updatedList, `${source}.store`);
|
|
1588
1650
|
this.syncOrdersMap();
|
|
1589
|
-
await this.patchOrdersInSQLite(
|
|
1651
|
+
await this.patchOrdersInSQLite(
|
|
1652
|
+
patchedOrders,
|
|
1653
|
+
source,
|
|
1654
|
+
mergeActions,
|
|
1655
|
+
{},
|
|
1656
|
+
forceWriteStorageKeys
|
|
1657
|
+
);
|
|
1590
1658
|
this.logInfo("mergeOrdersToStore-结束", {
|
|
1591
1659
|
uniqueFreshCount,
|
|
1592
1660
|
storeOrderCountAfter: this.store.list.length,
|
|
1593
1661
|
insertCount,
|
|
1594
1662
|
updateCount
|
|
1595
1663
|
});
|
|
1664
|
+
await this.emitRemoteProductMembershipChanges(remoteProductMembershipChanges);
|
|
1596
1665
|
await this.emitOrdersChanged(patchedOrders, source);
|
|
1597
1666
|
}
|
|
1598
1667
|
/**
|
|
@@ -1616,6 +1685,72 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1616
1685
|
isRemoteEchoMergeSource(source) {
|
|
1617
1686
|
return source === "pubsub.bodyUpsert" || source === "pubsub.httpRefresh";
|
|
1618
1687
|
}
|
|
1688
|
+
getProductMembershipKey(product) {
|
|
1689
|
+
const persistentId = (0, import_orderCollectionIdentity.getOrderCollectionPersistentId)("product", product);
|
|
1690
|
+
if (persistentId)
|
|
1691
|
+
return `order_detail_id:${persistentId}`;
|
|
1692
|
+
const uid = (0, import_orderCollectionIdentity.getOrderCollectionUid)("product", product);
|
|
1693
|
+
return uid ? `unique_identification_number:${uid}` : "";
|
|
1694
|
+
}
|
|
1695
|
+
doProductsHaveStableMembershipIdentity(products) {
|
|
1696
|
+
if (!Array.isArray(products))
|
|
1697
|
+
return true;
|
|
1698
|
+
return products.every(
|
|
1699
|
+
(product) => Boolean(
|
|
1700
|
+
(0, import_orderCollectionIdentity.getOrderCollectionPersistentId)("product", product) || (0, import_orderCollectionIdentity.getOrderCollectionUid)("product", product)
|
|
1701
|
+
)
|
|
1702
|
+
);
|
|
1703
|
+
}
|
|
1704
|
+
/**
|
|
1705
|
+
* 冲突提示关注逻辑商品行,而不是服务端 checkout 过程中可能被重建的 detail 记录。
|
|
1706
|
+
* 通用集合合并仍以 order_detail_id 为事实主键;这里只允许相同稳定 UID 跨 detail id 对齐,
|
|
1707
|
+
* 避免本机 checkout 回声被误判成“一删一增”。
|
|
1708
|
+
*/
|
|
1709
|
+
isSameProductMembershipItem(left, right) {
|
|
1710
|
+
if ((0, import_orderCollectionIdentity.isSameOrderCollectionItem)("product", left, right))
|
|
1711
|
+
return true;
|
|
1712
|
+
const leftUid = (0, import_orderCollectionIdentity.getOrderCollectionUid)("product", left);
|
|
1713
|
+
const rightUid = (0, import_orderCollectionIdentity.getOrderCollectionUid)("product", right);
|
|
1714
|
+
return Boolean(leftUid && rightUid && leftUid === rightUid);
|
|
1715
|
+
}
|
|
1716
|
+
/**
|
|
1717
|
+
* 对比合并前后的商品成员集合。商品字段修改与数组重排不会产生 diff。
|
|
1718
|
+
*/
|
|
1719
|
+
getRemoteProductMembershipChange(existingOrder, mergedOrder, source) {
|
|
1720
|
+
if (!this.isRemoteEchoMergeSource(source))
|
|
1721
|
+
return null;
|
|
1722
|
+
const previousProducts = Array.isArray(existingOrder.products) ? existingOrder.products : [];
|
|
1723
|
+
const currentProducts = Array.isArray(mergedOrder.products) ? mergedOrder.products : [];
|
|
1724
|
+
const unmatchedCurrentIndexes = new Set(currentProducts.map((_, index) => index));
|
|
1725
|
+
const removedProductKeys = [];
|
|
1726
|
+
for (const previousProduct of previousProducts) {
|
|
1727
|
+
const matchedIndex = currentProducts.findIndex(
|
|
1728
|
+
(currentProduct, index) => unmatchedCurrentIndexes.has(index) && this.isSameProductMembershipItem(previousProduct, currentProduct)
|
|
1729
|
+
);
|
|
1730
|
+
if (matchedIndex >= 0) {
|
|
1731
|
+
unmatchedCurrentIndexes.delete(matchedIndex);
|
|
1732
|
+
continue;
|
|
1733
|
+
}
|
|
1734
|
+
const productKey = this.getProductMembershipKey(previousProduct);
|
|
1735
|
+
if (productKey)
|
|
1736
|
+
removedProductKeys.push(productKey);
|
|
1737
|
+
}
|
|
1738
|
+
const addedProductKeys = [...unmatchedCurrentIndexes].map((index) => this.getProductMembershipKey(currentProducts[index])).filter(Boolean);
|
|
1739
|
+
if (addedProductKeys.length === 0 && removedProductKeys.length === 0) {
|
|
1740
|
+
return null;
|
|
1741
|
+
}
|
|
1742
|
+
const orderId = mergedOrder.order_id ?? existingOrder.order_id;
|
|
1743
|
+
if (orderId === void 0 || orderId === null)
|
|
1744
|
+
return null;
|
|
1745
|
+
return {
|
|
1746
|
+
order_id: orderId,
|
|
1747
|
+
source,
|
|
1748
|
+
added_product_keys: addedProductKeys,
|
|
1749
|
+
removed_product_keys: removedProductKeys,
|
|
1750
|
+
previous_product_count: previousProducts.length,
|
|
1751
|
+
current_product_count: currentProducts.length
|
|
1752
|
+
};
|
|
1753
|
+
}
|
|
1619
1754
|
/**
|
|
1620
1755
|
* 将订单的全部身份键登记到索引并指向其在列表中的下标。
|
|
1621
1756
|
* 合并后订单新增的身份字段(如挂单同步后拿到 order_id)也会被登记。
|
|
@@ -2140,7 +2275,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
2140
2275
|
* @example
|
|
2141
2276
|
* await this.patchOrdersInSQLite(freshOrders)
|
|
2142
2277
|
*/
|
|
2143
|
-
async patchOrdersInSQLite(orders, source, mergeActions = {}, options = {}) {
|
|
2278
|
+
async patchOrdersInSQLite(orders, source, mergeActions = {}, options = {}, forceWriteStorageKeys = /* @__PURE__ */ new Set()) {
|
|
2144
2279
|
if (orders.length === 0) {
|
|
2145
2280
|
return;
|
|
2146
2281
|
}
|
|
@@ -2156,7 +2291,8 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
2156
2291
|
const { toWrite, skipped } = this.filterRedundantPatchOrders(
|
|
2157
2292
|
source,
|
|
2158
2293
|
ordersSnapshot,
|
|
2159
|
-
mergeActions
|
|
2294
|
+
mergeActions,
|
|
2295
|
+
forceWriteStorageKeys
|
|
2160
2296
|
);
|
|
2161
2297
|
if (toWrite.length === 0) {
|
|
2162
2298
|
return;
|
|
@@ -568,6 +568,19 @@ export interface OrderChangedPayload {
|
|
|
568
568
|
/** 触发来源,便于订阅者区分 pubsub / 远端覆盖 / 清空等场景 */
|
|
569
569
|
source?: string;
|
|
570
570
|
}
|
|
571
|
+
export type RemoteProductMembershipChangeSource = 'pubsub.bodyUpsert' | 'pubsub.httpRefresh';
|
|
572
|
+
/**
|
|
573
|
+
* 远端订单快照相对本地订单产生商品成员增删时的广播载荷。
|
|
574
|
+
* 只表达商品行成员关系变化,不包含数量、价格、备注等字段级修改。
|
|
575
|
+
*/
|
|
576
|
+
export interface RemoteProductMembershipChangedPayload {
|
|
577
|
+
order_id: OrderId;
|
|
578
|
+
source: RemoteProductMembershipChangeSource;
|
|
579
|
+
added_product_keys: string[];
|
|
580
|
+
removed_product_keys: string[];
|
|
581
|
+
previous_product_count: number;
|
|
582
|
+
current_product_count: number;
|
|
583
|
+
}
|
|
571
584
|
/**
|
|
572
585
|
* OrderSyncMessage - pubsub 同步消息结构
|
|
573
586
|
*/
|
|
@@ -605,5 +618,6 @@ export interface OrderState {
|
|
|
605
618
|
export declare enum OrderHooks {
|
|
606
619
|
onOrdersLoaded = "order:onOrdersLoaded",
|
|
607
620
|
onOrdersChanged = "order:onOrdersChanged",
|
|
621
|
+
onRemoteProductMembershipChanged = "order:onRemoteProductMembershipChanged",
|
|
608
622
|
onOrdersSyncCompleted = "order:onOrdersSyncCompleted"
|
|
609
623
|
}
|
|
@@ -25,6 +25,7 @@ module.exports = __toCommonJS(types_exports);
|
|
|
25
25
|
var OrderHooks = /* @__PURE__ */ ((OrderHooks2) => {
|
|
26
26
|
OrderHooks2["onOrdersLoaded"] = "order:onOrdersLoaded";
|
|
27
27
|
OrderHooks2["onOrdersChanged"] = "order:onOrdersChanged";
|
|
28
|
+
OrderHooks2["onRemoteProductMembershipChanged"] = "order:onRemoteProductMembershipChanged";
|
|
28
29
|
OrderHooks2["onOrdersSyncCompleted"] = "order:onOrdersSyncCompleted";
|
|
29
30
|
return OrderHooks2;
|
|
30
31
|
})(OrderHooks || {});
|
|
@@ -2,14 +2,14 @@ import { Module, ModuleOptions, PisellCore } from '../../types';
|
|
|
2
2
|
import { BaseModule } from '../../modules/BaseModule';
|
|
3
3
|
import { BaseSalesOrderProduct, BaseSalesOrderProductIdentity, BaseSalesPaymentStatus, BaseSalesUpdateOrderProductQuantityParams, BaseSalesCalculateProductBookingPriceParams, BaseSalesPriceRecalculationContextChange, BaseSalesProductBookingPriceResult, BaseSalesQuotationCustomerScopeInfo, BaseSalesScanCodeResult, BaseSalesCashPaymentConfig, BaseSalesPayCashParams, BaseSalesPayCashResult, BaseSalesCommitPaymentMethodParams, BaseSalesCommitPaymentMethodResult, BaseSalesConfirmWalletPaymentResult } from './types';
|
|
4
4
|
import { OrderModule } from '../../modules/Order';
|
|
5
|
-
import type { AddProductBookingInput, LoadSalesDetailParams, OrderPaymentData, OrderPaymentUpdateOptions, OrderPaymentUpdateResult, OrderPaymentSource, SendCustomerPayLinkParams, SyncPaymentsToOrderParams, SyncPaymentsToOrderResult, UpdateTempOrderCustomerInput, UpdateOrderBookingParams, UpdateOrderProductParams, OrderTempOrder, OrderSummary, OrderPromotionEvaluator, OrderGiftSelectResolver, OrderUnfulfilledPromotion, OrderLastGiftActions } from '../../modules/Order/types';
|
|
5
|
+
import type { AddProductBookingInput, AddProductToOrderOptions, LoadSalesDetailParams, OrderPaymentData, OrderPaymentUpdateOptions, OrderPaymentUpdateResult, OrderPaymentSource, SendCustomerPayLinkParams, SyncPaymentsToOrderParams, SyncPaymentsToOrderResult, UpdateTempOrderCustomerInput, UpdateOrderBookingParams, UpdateOrderProductParams, OrderTempOrder, OrderSummary, OrderPromotionEvaluator, OrderGiftSelectResolver, OrderUnfulfilledPromotion, OrderLastGiftActions, RemoveProductsFromOrderOptions, ReplaceTempOrderOptions } from '../../modules/Order/types';
|
|
6
6
|
import type { SubmitPayloadEnhancer } from '../../modules/Order/utils';
|
|
7
7
|
import type { Discount } from '../../modules/Discount/types';
|
|
8
8
|
import { RequestPlugin, WindowPlugin } from '../../plugins';
|
|
9
9
|
export * from './types';
|
|
10
10
|
import { ProductList } from '../../modules/ProductList';
|
|
11
11
|
import { PaymentModule } from '../../modules/Payment';
|
|
12
|
-
import type { PaymentMethod, RoundingResult, WalletAssetId, WalletAssetsSnapshot, WalletAssetsState, WalletAssetSelectionSource, ScanWalletAssetResult } from '../../modules/Payment/types';
|
|
12
|
+
import type { PaymentMethod, RoundingResult, WalletAssetId, WalletAssetsBehaviorOptions, WalletAssetsSnapshot, WalletAssetsState, WalletAssetSelectionSource, ScanWalletAssetResult } from '../../modules/Payment/types';
|
|
13
13
|
import type { SalesSummaryModule } from '../../modules/SalesSummary';
|
|
14
14
|
import type { ScheduleModule } from '../../modules/Schedule';
|
|
15
15
|
import { QuotationModule } from '../../modules/Quotation';
|
|
@@ -109,6 +109,16 @@ export declare class BaseSalesImpl extends BaseModule implements Module {
|
|
|
109
109
|
private applyQuotationScheduleResolver;
|
|
110
110
|
private loadQuotationForPriceQuery;
|
|
111
111
|
private getPriceQueryProductId;
|
|
112
|
+
/**
|
|
113
|
+
* Change Time / customer reprice 必须沿用商品列表的渠道口径。
|
|
114
|
+
* SalesSdk Provider 通常将渠道存为 platform,因此不能只读取 otherParams.channel。
|
|
115
|
+
*/
|
|
116
|
+
private getPriceQueryChannel;
|
|
117
|
+
/**
|
|
118
|
+
* /product/query 的智能定价评估只读取 strategy_context;
|
|
119
|
+
* application_code 仅作为接口兼容字段,不能替代 channel / business_code。
|
|
120
|
+
*/
|
|
121
|
+
private getPriceQueryStrategyContext;
|
|
112
122
|
private getPriceQuerySchedule;
|
|
113
123
|
private loadProductsForPriceQuery;
|
|
114
124
|
private loadProductForPriceQuery;
|
|
@@ -180,7 +190,7 @@ export declare class BaseSalesImpl extends BaseModule implements Module {
|
|
|
180
190
|
/** 获取附加费用(运费/服务费/税费等)。 */
|
|
181
191
|
getSurcharges(): ISalesSurcharge[];
|
|
182
192
|
getTempOrder(): OrderTempOrder | null;
|
|
183
|
-
replaceTempOrder(tempOrder: OrderTempOrder): Promise<OrderTempOrder>;
|
|
193
|
+
replaceTempOrder(tempOrder: OrderTempOrder, options?: ReplaceTempOrderOptions): Promise<OrderTempOrder>;
|
|
184
194
|
getOrderIdentity(): import("../../modules/Order/types").OrderIdentitySnapshot | null;
|
|
185
195
|
getOrderSnapshot(): import("../../modules/Order/types").OrderSnapshot | null;
|
|
186
196
|
getOrderSyncState(): import("../../modules/Order/types").OrderSyncState;
|
|
@@ -280,13 +290,6 @@ export declare class BaseSalesImpl extends BaseModule implements Module {
|
|
|
280
290
|
confirmPendingVoucherPayments?: boolean;
|
|
281
291
|
enhancePayload?: SubmitPayloadEnhancer;
|
|
282
292
|
}): Promise<T>;
|
|
283
|
-
/**
|
|
284
|
-
* 默认保持 WebPOS 的本地待同步订单模式;需要云端确认后才算成功的渠道可覆盖此策略。
|
|
285
|
-
* otherParams.checkoutSyncTaskEnabled 优先,便于同一 solution 按入口恢复旧行为。
|
|
286
|
-
*/
|
|
287
|
-
protected shouldUseCheckoutSyncTask(): boolean;
|
|
288
|
-
/** 可由特定 solution 为真实 checkout 补充默认收据数据请求。 */
|
|
289
|
-
protected getDefaultCheckoutSmallTicketDataFlag(): number | undefined;
|
|
290
293
|
printLocalOrderReceipt<T = any>(lookup?: BaseSalesPrintLocalOrderReceiptParams): Promise<T>;
|
|
291
294
|
private getSubmitPaymentStatus;
|
|
292
295
|
syncPaymentsToOrder<T = any>(params: SyncPaymentsToOrderParams): Promise<SyncPaymentsToOrderResult<T>>;
|
|
@@ -333,6 +336,8 @@ export declare class BaseSalesImpl extends BaseModule implements Module {
|
|
|
333
336
|
getWalletAssetsState(): WalletAssetsState;
|
|
334
337
|
/** 导出 Shared Checkout 跨运行时恢复所需的钱包状态与搜索缓存。 */
|
|
335
338
|
exportWalletAssetsSnapshot(): WalletAssetsSnapshot;
|
|
339
|
+
/** 配置仅影响 Wallet Assets,不改变 Promotion/Voucher 选择流程。 */
|
|
340
|
+
configureWalletAssetsBehavior(options: WalletAssetsBehaviorOptions): void;
|
|
336
341
|
/**
|
|
337
342
|
* 恢复 Shared Checkout 钱包快照,并把选择重新同步为订单 pending payment。
|
|
338
343
|
*/
|
|
@@ -419,7 +424,7 @@ export declare class BaseSalesImpl extends BaseModule implements Module {
|
|
|
419
424
|
getQuotationCustomerScopeInfo(): BaseSalesQuotationCustomerScopeInfo;
|
|
420
425
|
shouldRecalculateProductBookingPricesForContextChange(params: BaseSalesPriceRecalculationContextChange): boolean;
|
|
421
426
|
calculateProductBookingPrices(paramsList: BaseSalesCalculateProductBookingPriceParams[]): Promise<BaseSalesProductBookingPriceResult[]>;
|
|
422
|
-
addProductToOrder(product: Partial<BaseSalesOrderProduct> & BaseSalesOrderProductIdentity, booking?: AddProductBookingInput): Promise<import("../../modules/Order/types").OrderProduct[]>;
|
|
427
|
+
addProductToOrder(product: Partial<BaseSalesOrderProduct> & BaseSalesOrderProductIdentity, booking?: AddProductBookingInput, options?: AddProductToOrderOptions): Promise<import("../../modules/Order/types").OrderProduct[]>;
|
|
423
428
|
updateOrderProduct(params: UpdateOrderProductParams): Promise<import("../../modules/Order/types").OrderProduct[]>;
|
|
424
429
|
updateOrderProducts(paramsList: UpdateOrderProductParams[]): Promise<import("../../modules/Order/types").OrderProduct[]>;
|
|
425
430
|
updateOrderProductQuantity(params: BaseSalesUpdateOrderProductQuantityParams): Promise<import("../../modules/Order/types").OrderProduct[]>;
|
|
@@ -435,8 +440,8 @@ export declare class BaseSalesImpl extends BaseModule implements Module {
|
|
|
435
440
|
* @example
|
|
436
441
|
* await baseSales.removeProductsFromOrder([identityA, identityB]);
|
|
437
442
|
*/
|
|
438
|
-
removeProductsFromOrder(identities: BaseSalesOrderProductIdentity[]): Promise<import("../../modules/Order/types").OrderProduct[]>;
|
|
439
|
-
removeProductFromOrder(identity: BaseSalesOrderProductIdentity): Promise<import("../../modules/Order/types").OrderProduct[]>;
|
|
443
|
+
removeProductsFromOrder(identities: BaseSalesOrderProductIdentity[], options?: RemoveProductsFromOrderOptions): Promise<import("../../modules/Order/types").OrderProduct[]>;
|
|
444
|
+
removeProductFromOrder(identity: BaseSalesOrderProductIdentity, options?: RemoveProductsFromOrderOptions): Promise<import("../../modules/Order/types").OrderProduct[]>;
|
|
440
445
|
/**
|
|
441
446
|
* 注入促销评估器到底层 OrderModule。
|
|
442
447
|
*
|