@pisell/pisellos 2.2.278 → 2.2.280
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/BaseModule.d.ts +1 -0
- package/dist/modules/BaseModule.js +24 -28
- package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +7 -3
- package/dist/modules/BookingContext/utils/productExtend.js +5 -9
- package/dist/modules/BookingContext/utils/timeSlices.js +24 -3
- package/dist/modules/Customer/index.d.ts +4 -0
- package/dist/modules/Customer/index.js +91 -59
- package/dist/modules/Customer/types.d.ts +2 -0
- package/dist/modules/Discount/index.d.ts +1 -0
- package/dist/modules/Discount/index.js +40 -11
- package/dist/modules/Discount/types.d.ts +1 -0
- package/dist/modules/Holder/index.d.ts +48 -0
- package/dist/modules/Holder/index.js +640 -0
- package/dist/modules/Holder/types.d.ts +123 -0
- package/dist/modules/Holder/types.js +1 -0
- package/dist/modules/Holder/utils.d.ts +13 -0
- package/dist/modules/Holder/utils.js +34 -0
- package/dist/modules/OpenData/index.js +2 -2
- package/dist/modules/Order/index.d.ts +32 -4
- package/dist/modules/Order/index.js +868 -675
- package/dist/modules/Order/types.d.ts +22 -1
- package/dist/modules/Order/utils/discountProductLineIdentity.d.ts +45 -0
- package/dist/modules/Order/utils/discountProductLineIdentity.js +227 -0
- package/dist/modules/Order/utils/orderCollectionIdentity.d.ts +15 -0
- package/dist/modules/Order/utils/orderCollectionIdentity.js +75 -0
- package/dist/modules/Order/utils.d.ts +10 -0
- package/dist/modules/Order/utils.js +71 -34
- package/dist/modules/Payment/index.d.ts +4 -0
- package/dist/modules/Payment/index.js +14 -4
- package/dist/modules/Payment/walletpass.js +21 -7
- package/dist/modules/Product/types.d.ts +1 -0
- package/dist/modules/ProductList/index.js +33 -13
- package/dist/modules/Quotation/index.d.ts +1 -1
- package/dist/modules/Quotation/index.js +2 -2
- package/dist/modules/ResourcePlanner/index.d.ts +24 -0
- package/dist/modules/ResourcePlanner/index.js +181 -0
- package/dist/modules/ResourcePlanner/planner.d.ts +14 -0
- package/dist/modules/ResourcePlanner/planner.js +1069 -0
- package/dist/modules/ResourcePlanner/types.d.ts +227 -0
- package/dist/modules/ResourcePlanner/types.js +1 -0
- package/dist/modules/Rules/index.js +153 -56
- package/dist/modules/SalesSummary/index.js +12 -13
- package/dist/modules/ScanOrderLogger/index.d.ts +2 -0
- package/dist/modules/ScanOrderLogger/index.js +15 -2
- package/dist/modules/ScanOrderLogger/providers/feishu.js +45 -27
- package/dist/modules/ScanOrderLogger/types.d.ts +1 -0
- package/dist/modules/Schedule/index.d.ts +3 -1
- package/dist/modules/Schedule/index.js +21 -16
- package/dist/modules/Summary/utils.js +38 -13
- package/dist/modules/index.d.ts +2 -0
- package/dist/modules/index.js +3 -1
- package/dist/plugins/window.d.ts +1 -0
- package/dist/server/index.d.ts +20 -0
- package/dist/server/index.js +1101 -909
- package/dist/server/modules/order/index.d.ts +2 -0
- package/dist/server/modules/order/index.js +261 -96
- package/dist/server/modules/order/types.d.ts +1 -1
- package/dist/solution/BaseSales/index.d.ts +20 -1
- package/dist/solution/BaseSales/index.js +989 -881
- package/dist/solution/BaseSales/utils/cartPromotion.js +19 -1
- package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +6 -3
- package/dist/solution/BaseSales/utils.js +31 -20
- package/dist/solution/BookingByStep/index.d.ts +17 -2
- package/dist/solution/BookingByStep/index.js +294 -215
- package/dist/solution/BookingByStep/types.d.ts +2 -1
- package/dist/solution/BookingByStep/types.js +3 -1
- package/dist/solution/BookingByStep/utils/capacity.js +17 -1
- package/dist/solution/BookingByStep/utils/timeslots.d.ts +3 -1
- package/dist/solution/BookingByStep/utils/timeslots.js +19 -12
- package/dist/solution/BookingTicket/index.d.ts +21 -3
- package/dist/solution/BookingTicket/index.js +312 -226
- package/dist/solution/BookingTicket/utils/scan/handleScan.d.ts +3 -1
- package/dist/solution/BookingTicket/utils/scan/handleScan.js +10 -2
- package/dist/solution/ScanOrder/index.d.ts +26 -14
- package/dist/solution/ScanOrder/index.js +1142 -739
- package/dist/solution/ScanOrder/types.d.ts +21 -1
- package/dist/solution/ScanOrder/utils.d.ts +8 -0
- package/dist/solution/ScanOrder/utils.js +97 -45
- package/dist/solution/ShopDiscount/index.d.ts +1 -0
- package/dist/solution/ShopDiscount/index.js +125 -87
- package/dist/solution/UnifiedBookingSales/index.d.ts +204 -0
- package/dist/solution/UnifiedBookingSales/index.js +2211 -0
- package/dist/solution/UnifiedBookingSales/types.d.ts +150 -0
- package/dist/solution/UnifiedBookingSales/types.js +11 -0
- package/dist/solution/VenueBooking/index.d.ts +39 -11
- package/dist/solution/VenueBooking/index.js +1167 -841
- package/dist/solution/VenueBooking/types.d.ts +3 -0
- package/dist/solution/VenueBooking/utils/resource.js +1 -0
- package/dist/solution/VenueBooking/utils/slotMerge.d.ts +4 -4
- package/dist/solution/VenueBooking/utils/slotMerge.js +10 -5
- package/dist/solution/index.d.ts +1 -0
- package/dist/solution/index.js +2 -1
- package/dist/types/index.d.ts +1 -0
- package/lib/model/strategy/adapter/promotion/index.js +0 -51
- package/lib/modules/BaseModule.d.ts +1 -0
- package/lib/modules/BaseModule.js +24 -37
- package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +3 -0
- package/lib/modules/BookingContext/utils/productExtend.js +4 -3
- package/lib/modules/BookingContext/utils/timeSlices.js +18 -3
- package/lib/modules/Customer/index.d.ts +4 -0
- package/lib/modules/Customer/index.js +11 -0
- package/lib/modules/Customer/types.d.ts +2 -0
- package/lib/modules/Discount/index.d.ts +1 -0
- package/lib/modules/Discount/index.js +9 -0
- package/lib/modules/Discount/types.d.ts +1 -0
- package/lib/modules/Holder/index.d.ts +48 -0
- package/lib/modules/Holder/index.js +402 -0
- package/lib/modules/Holder/types.d.ts +123 -0
- package/lib/modules/Holder/types.js +17 -0
- package/lib/modules/Holder/utils.d.ts +13 -0
- package/lib/modules/Holder/utils.js +71 -0
- package/lib/modules/OpenData/index.js +1 -1
- package/lib/modules/Order/index.d.ts +32 -4
- package/lib/modules/Order/index.js +372 -156
- package/lib/modules/Order/types.d.ts +22 -1
- package/lib/modules/Order/utils/discountProductLineIdentity.d.ts +45 -0
- package/lib/modules/Order/utils/discountProductLineIdentity.js +170 -0
- package/lib/modules/Order/utils/orderCollectionIdentity.d.ts +15 -0
- package/lib/modules/Order/utils/orderCollectionIdentity.js +70 -0
- package/lib/modules/Order/utils.d.ts +10 -0
- package/lib/modules/Order/utils.js +39 -6
- package/lib/modules/Payment/index.d.ts +4 -0
- package/lib/modules/Payment/index.js +7 -0
- package/lib/modules/Payment/walletpass.js +12 -0
- package/lib/modules/Product/types.d.ts +1 -0
- package/lib/modules/ProductList/index.js +49 -31
- package/lib/modules/Quotation/index.d.ts +1 -1
- package/lib/modules/Quotation/index.js +2 -2
- package/lib/modules/ResourcePlanner/index.d.ts +24 -0
- package/lib/modules/ResourcePlanner/index.js +148 -0
- package/lib/modules/ResourcePlanner/planner.d.ts +14 -0
- package/lib/modules/ResourcePlanner/planner.js +933 -0
- package/lib/modules/ResourcePlanner/types.d.ts +227 -0
- package/lib/modules/ResourcePlanner/types.js +17 -0
- package/lib/modules/Rules/index.js +117 -25
- package/lib/modules/SalesSummary/index.js +6 -7
- package/lib/modules/ScanOrderLogger/index.d.ts +2 -0
- package/lib/modules/ScanOrderLogger/index.js +13 -1
- package/lib/modules/ScanOrderLogger/providers/feishu.js +15 -6
- package/lib/modules/ScanOrderLogger/types.d.ts +1 -0
- package/lib/modules/Schedule/index.d.ts +3 -1
- package/lib/modules/Schedule/index.js +10 -8
- package/lib/modules/Summary/utils.js +21 -1
- package/lib/modules/index.d.ts +2 -0
- package/lib/modules/index.js +5 -1
- package/lib/plugins/window.d.ts +1 -0
- package/lib/server/index.d.ts +20 -0
- package/lib/server/index.js +124 -19
- package/lib/server/modules/order/index.d.ts +2 -0
- package/lib/server/modules/order/index.js +75 -5
- package/lib/server/modules/order/types.d.ts +1 -1
- package/lib/solution/BaseSales/index.d.ts +20 -1
- package/lib/solution/BaseSales/index.js +105 -31
- package/lib/solution/BaseSales/utils/cartPromotion.js +18 -0
- package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +1 -0
- package/lib/solution/BaseSales/utils.js +29 -18
- package/lib/solution/BookingByStep/index.d.ts +17 -2
- package/lib/solution/BookingByStep/index.js +60 -18
- package/lib/solution/BookingByStep/types.d.ts +2 -1
- package/lib/solution/BookingByStep/types.js +5 -0
- package/lib/solution/BookingByStep/utils/capacity.js +20 -1
- package/lib/solution/BookingByStep/utils/timeslots.d.ts +3 -1
- package/lib/solution/BookingByStep/utils/timeslots.js +19 -11
- package/lib/solution/BookingTicket/index.d.ts +21 -3
- package/lib/solution/BookingTicket/index.js +75 -16
- package/lib/solution/BookingTicket/utils/scan/handleScan.d.ts +3 -1
- package/lib/solution/BookingTicket/utils/scan/handleScan.js +2 -2
- package/lib/solution/ScanOrder/index.d.ts +26 -14
- package/lib/solution/ScanOrder/index.js +449 -182
- package/lib/solution/ScanOrder/types.d.ts +21 -1
- package/lib/solution/ScanOrder/utils.d.ts +8 -0
- package/lib/solution/ScanOrder/utils.js +60 -18
- package/lib/solution/ShopDiscount/index.d.ts +1 -0
- package/lib/solution/ShopDiscount/index.js +14 -0
- package/lib/solution/UnifiedBookingSales/index.d.ts +204 -0
- package/lib/solution/UnifiedBookingSales/index.js +1273 -0
- package/lib/solution/UnifiedBookingSales/types.d.ts +150 -0
- package/lib/solution/UnifiedBookingSales/types.js +33 -0
- package/lib/solution/VenueBooking/index.d.ts +39 -11
- package/lib/solution/VenueBooking/index.js +322 -110
- package/lib/solution/VenueBooking/types.d.ts +3 -0
- package/lib/solution/VenueBooking/utils/resource.js +1 -0
- package/lib/solution/VenueBooking/utils/slotMerge.d.ts +4 -4
- package/lib/solution/VenueBooking/utils/slotMerge.js +6 -4
- package/lib/solution/index.d.ts +1 -0
- package/lib/solution/index.js +3 -1
- package/lib/types/index.d.ts +1 -0
- package/package.json +1 -1
|
@@ -95,12 +95,12 @@ var ScheduleModule = class extends import_BaseModule.BaseModule {
|
|
|
95
95
|
*
|
|
96
96
|
* @memberof ScheduleModule
|
|
97
97
|
*/
|
|
98
|
-
async loadAllSchedule() {
|
|
98
|
+
async loadAllSchedule(options = {}) {
|
|
99
99
|
var _a;
|
|
100
100
|
const scheduleList = await this.request.get(
|
|
101
101
|
`/schedule`,
|
|
102
102
|
{ num: 999 },
|
|
103
|
-
{ useCache: true }
|
|
103
|
+
{ useCache: options.useCache ?? true }
|
|
104
104
|
);
|
|
105
105
|
this.setScheduleList(((_a = scheduleList.data) == null ? void 0 : _a.list) || []);
|
|
106
106
|
}
|
|
@@ -126,7 +126,6 @@ var ScheduleModule = class extends import_BaseModule.BaseModule {
|
|
|
126
126
|
custom_page_id,
|
|
127
127
|
channel
|
|
128
128
|
}) {
|
|
129
|
-
var _a, _b, _c;
|
|
130
129
|
if ((0, import_dayjs.default)(startDate).isBefore((0, import_dayjs.default)(), "day")) {
|
|
131
130
|
startDate = (0, import_dayjs.default)().format("YYYY-MM-DD");
|
|
132
131
|
}
|
|
@@ -144,17 +143,20 @@ var ScheduleModule = class extends import_BaseModule.BaseModule {
|
|
|
144
143
|
channel
|
|
145
144
|
}
|
|
146
145
|
);
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
146
|
+
const responseData = res.data || {};
|
|
147
|
+
const dateList = Array.isArray(responseData.date_list) ? responseData.date_list : [];
|
|
148
|
+
const otherProductIds = Array.isArray(responseData.other_product_ids) ? responseData.other_product_ids : [];
|
|
149
|
+
this.setAvailabilityScheduleDateList(dateList);
|
|
150
|
+
this.setOtherProductsIds(otherProductIds);
|
|
151
|
+
if (!dateList.length && !otherProductIds.length || (0, import_dayjs.default)(endDate).isBefore((0, import_dayjs.default)(), "day")) {
|
|
150
152
|
return dates;
|
|
151
153
|
}
|
|
152
|
-
if (
|
|
154
|
+
if (otherProductIds.length) {
|
|
153
155
|
dates.forEach((n) => {
|
|
154
156
|
n.status = "available";
|
|
155
157
|
});
|
|
156
158
|
} else {
|
|
157
|
-
|
|
159
|
+
dateList.forEach((n) => {
|
|
158
160
|
const index = dates.findIndex((m) => m.date === n.date);
|
|
159
161
|
if (index !== -1) {
|
|
160
162
|
dates[index].status = "available";
|
|
@@ -437,11 +437,31 @@ var getBundleItemIsDiscountPrice = (item) => {
|
|
|
437
437
|
var getBundleItemIsMarkupOrDiscountPrice = (item) => {
|
|
438
438
|
return getBundleItemIsMarkupPrice(item) || getBundleItemIsDiscountPrice(item);
|
|
439
439
|
};
|
|
440
|
+
var getDiscountAmount = (discounts) => {
|
|
441
|
+
return (discounts || []).reduce((total, discount) => {
|
|
442
|
+
return total.add(new import_decimal.default(discount.amount || 0));
|
|
443
|
+
}, new import_decimal.default(0)).toNumber();
|
|
444
|
+
};
|
|
440
445
|
var getMainProductTotal = (item) => {
|
|
441
|
-
var _a, _b;
|
|
446
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
|
|
442
447
|
let total = new import_decimal.default(
|
|
443
448
|
(item == null ? void 0 : item.main_product_selling_price) ?? ((_a = item == null ? void 0 : item.metadata) == null ? void 0 : _a.main_product_selling_price) ?? ((_b = item == null ? void 0 : item.metadata) == null ? void 0 : _b.main_product_original_price) ?? 0
|
|
444
449
|
);
|
|
450
|
+
const hasMainProductPrice = (item == null ? void 0 : item.main_product_selling_price) != null || ((_c = item == null ? void 0 : item.metadata) == null ? void 0 : _c.main_product_selling_price) != null || ((_d = item == null ? void 0 : item.metadata) == null ? void 0 : _d.main_product_original_price) != null;
|
|
451
|
+
if (!hasMainProductPrice) {
|
|
452
|
+
total = new import_decimal.default((item == null ? void 0 : item.main_product_selling_price) ?? ((_e = item == null ? void 0 : item.metadata) == null ? void 0 : _e.main_product_selling_price) ?? item.price ?? 0);
|
|
453
|
+
const discount = ((_g = (_f = item == null ? void 0 : item._origin) == null ? void 0 : _f.product) == null ? void 0 : _g.discount_list) || ((_j = (_i = (_h = item == null ? void 0 : item._originData) == null ? void 0 : _h.product) == null ? void 0 : _i.discount_list) == null ? void 0 : _j.filter((item2) => {
|
|
454
|
+
var _a2;
|
|
455
|
+
return !((_a2 = item2 == null ? void 0 : item2.metadata) == null ? void 0 : _a2.custom_product_bundle_map_id);
|
|
456
|
+
})) || [];
|
|
457
|
+
const mainProductDiscountAmount = getDiscountAmount(discount);
|
|
458
|
+
total = total.minus(mainProductDiscountAmount);
|
|
459
|
+
if ((item == null ? void 0 : item.option) && Array.isArray(item == null ? void 0 : item.option)) {
|
|
460
|
+
total = total.add(item == null ? void 0 : item.option.reduce((t, option) => {
|
|
461
|
+
return t.add(new import_decimal.default(option.price || 0).mul(option.num || 1));
|
|
462
|
+
}, new import_decimal.default(0)));
|
|
463
|
+
}
|
|
464
|
+
}
|
|
445
465
|
for (let bundleItem of (item == null ? void 0 : item.bundle) || []) {
|
|
446
466
|
if (getBundleItemIsMarkupOrDiscountPrice(bundleItem)) {
|
|
447
467
|
const bundleItemTotal = new import_decimal.default(bundleItem.bundle_selling_price ?? bundleItem.price ?? 0);
|
package/lib/modules/index.d.ts
CHANGED
package/lib/modules/index.js
CHANGED
|
@@ -36,6 +36,8 @@ __reExport(modules_exports, require("./Quotation"), module.exports);
|
|
|
36
36
|
__reExport(modules_exports, require("./ScanOrderLogger"), module.exports);
|
|
37
37
|
__reExport(modules_exports, require("./OpenData"), module.exports);
|
|
38
38
|
__reExport(modules_exports, require("./BookingContext"), module.exports);
|
|
39
|
+
__reExport(modules_exports, require("./Holder"), module.exports);
|
|
40
|
+
__reExport(modules_exports, require("./ResourcePlanner"), module.exports);
|
|
39
41
|
// Annotate the CommonJS export names for ESM import in node:
|
|
40
42
|
0 && (module.exports = {
|
|
41
43
|
...require("./Product"),
|
|
@@ -57,5 +59,7 @@ __reExport(modules_exports, require("./BookingContext"), module.exports);
|
|
|
57
59
|
...require("./Quotation"),
|
|
58
60
|
...require("./ScanOrderLogger"),
|
|
59
61
|
...require("./OpenData"),
|
|
60
|
-
...require("./BookingContext")
|
|
62
|
+
...require("./BookingContext"),
|
|
63
|
+
...require("./Holder"),
|
|
64
|
+
...require("./ResourcePlanner")
|
|
61
65
|
});
|
package/lib/plugins/window.d.ts
CHANGED
package/lib/server/index.d.ts
CHANGED
|
@@ -49,6 +49,10 @@ declare class Server {
|
|
|
49
49
|
private productQuerySubscribers;
|
|
50
50
|
/** subscriberId → 智能定价变价时间点定时器句柄(与 subscriber 分离存储,便于 clear) */
|
|
51
51
|
private productQueryScheduleTimers;
|
|
52
|
+
/** 餐牌筛选为空时才触发的菜单/日程缓存自愈,避免每次商品查询都请求远端。 */
|
|
53
|
+
private menuScheduleRefreshInFlight;
|
|
54
|
+
private lastMenuScheduleRefreshAt;
|
|
55
|
+
private readonly MENU_SCHEDULE_REFRESH_COOLDOWN_MS;
|
|
52
56
|
private orderQuerySubscribers;
|
|
53
57
|
private bookingQuerySubscribers;
|
|
54
58
|
private bookingRemoteQuerySubscribers;
|
|
@@ -160,6 +164,12 @@ declare class Server {
|
|
|
160
164
|
* 不影响当前界面展示,适用于切回前台、定时刷新等场景
|
|
161
165
|
*/
|
|
162
166
|
refreshOrdersInBackground(): Promise<void>;
|
|
167
|
+
/**
|
|
168
|
+
* 编辑正式订单时强制查询 Server 最新快照并覆盖本地缓存。
|
|
169
|
+
* 商品成员增删由 OrderModule 在 SQLite/Store 更新完成后广播,
|
|
170
|
+
* UI 可复用 order:onRemoteProductMembershipChanged 处理冲突。
|
|
171
|
+
*/
|
|
172
|
+
checkRemoteOrderProductMembership(orderId: string | number): Promise<void>;
|
|
163
173
|
/**
|
|
164
174
|
* 清空所有server模块的IndexedDB缓存
|
|
165
175
|
* @returns Promise<void>
|
|
@@ -267,6 +277,16 @@ declare class Server {
|
|
|
267
277
|
* 存储订阅者信息,便于数据变更时推送最新结果
|
|
268
278
|
*/
|
|
269
279
|
private handleProductQuery;
|
|
280
|
+
/**
|
|
281
|
+
* ProductList callers such as standalone retail pages do not always have a selected schedule.
|
|
282
|
+
* In that case query against the current local time so menu availability can still be evaluated.
|
|
283
|
+
*/
|
|
284
|
+
private resolveProductQueryScheduleContext;
|
|
285
|
+
/**
|
|
286
|
+
* OpenData 的关联餐牌可能已更新,而 server_menu/server_schedule 仍命中本地持久化缓存。
|
|
287
|
+
* 仅在当前筛选没有任何生效餐牌时刷新一次,并由调用方重新计算筛选结果。
|
|
288
|
+
*/
|
|
289
|
+
private refreshMenuScheduleCacheAfterEmptyResult;
|
|
270
290
|
/**
|
|
271
291
|
* 按商品 id 查询单条(GET /shop/product/query/:productId)
|
|
272
292
|
* schedule_date 必填:query 或 data;schedule_datetime 可选。不走订阅。
|
package/lib/server/index.js
CHANGED
|
@@ -84,6 +84,10 @@ var Server = class {
|
|
|
84
84
|
this.productQuerySubscribers = /* @__PURE__ */ new Map();
|
|
85
85
|
/** subscriberId → 智能定价变价时间点定时器句柄(与 subscriber 分离存储,便于 clear) */
|
|
86
86
|
this.productQueryScheduleTimers = /* @__PURE__ */ new Map();
|
|
87
|
+
/** 餐牌筛选为空时才触发的菜单/日程缓存自愈,避免每次商品查询都请求远端。 */
|
|
88
|
+
this.menuScheduleRefreshInFlight = null;
|
|
89
|
+
this.lastMenuScheduleRefreshAt = 0;
|
|
90
|
+
this.MENU_SCHEDULE_REFRESH_COOLDOWN_MS = 30 * 1e3;
|
|
87
91
|
// ---- 订单 / 预约列表查询订阅者 ----
|
|
88
92
|
this.orderQuerySubscribers = /* @__PURE__ */ new Map();
|
|
89
93
|
this.bookingQuerySubscribers = /* @__PURE__ */ new Map();
|
|
@@ -217,7 +221,11 @@ var Server = class {
|
|
|
217
221
|
*/
|
|
218
222
|
this.handleProductQuery = async ({ url, method, data, config }) => {
|
|
219
223
|
console.log("[Server] handleProductQuery:", url, method, data, config);
|
|
220
|
-
const { menu_list_ids,
|
|
224
|
+
const { menu_list_ids, customer_id, ids, extension_type, strategy_context } = data;
|
|
225
|
+
const { schedule_date, schedule_datetime } = this.resolveProductQueryScheduleContext({
|
|
226
|
+
schedule_date: data.schedule_date,
|
|
227
|
+
schedule_datetime: data.schedule_datetime
|
|
228
|
+
});
|
|
221
229
|
const { callback, subscriberId } = config || {};
|
|
222
230
|
this.logInfo("handleProductQuery: 开始处理商品查询请求", {
|
|
223
231
|
menu_list_ids,
|
|
@@ -1789,6 +1797,57 @@ var Server = class {
|
|
|
1789
1797
|
});
|
|
1790
1798
|
}
|
|
1791
1799
|
}
|
|
1800
|
+
/**
|
|
1801
|
+
* 编辑正式订单时强制查询 Server 最新快照并覆盖本地缓存。
|
|
1802
|
+
* 商品成员增删由 OrderModule 在 SQLite/Store 更新完成后广播,
|
|
1803
|
+
* UI 可复用 order:onRemoteProductMembershipChanged 处理冲突。
|
|
1804
|
+
*/
|
|
1805
|
+
async checkRemoteOrderProductMembership(orderId) {
|
|
1806
|
+
const normalizedOrderId = String(orderId ?? "").trim();
|
|
1807
|
+
if (!normalizedOrderId || normalizedOrderId.startsWith("local_order")) {
|
|
1808
|
+
this.logInfo("checkRemoteOrderProductMembership: 跳过非正式订单", {
|
|
1809
|
+
orderId
|
|
1810
|
+
});
|
|
1811
|
+
return;
|
|
1812
|
+
}
|
|
1813
|
+
if (!this.order) {
|
|
1814
|
+
const error = new Error("Order 模块未注册");
|
|
1815
|
+
this.logWarning("checkRemoteOrderProductMembership: Order 模块未注册", {
|
|
1816
|
+
orderId: normalizedOrderId
|
|
1817
|
+
});
|
|
1818
|
+
throw error;
|
|
1819
|
+
}
|
|
1820
|
+
this.logInfo("checkRemoteOrderProductMembership 开始", {
|
|
1821
|
+
orderId: normalizedOrderId
|
|
1822
|
+
});
|
|
1823
|
+
const startTime = Date.now();
|
|
1824
|
+
try {
|
|
1825
|
+
const freshOrders = await this.order.fetchOrdersByHttp([
|
|
1826
|
+
normalizedOrderId
|
|
1827
|
+
]);
|
|
1828
|
+
const freshOrder = freshOrders.find(
|
|
1829
|
+
(order) => String(order == null ? void 0 : order.order_id) === normalizedOrderId
|
|
1830
|
+
);
|
|
1831
|
+
if (!freshOrder) {
|
|
1832
|
+
throw new Error("Server 未返回目标订单最新快照");
|
|
1833
|
+
}
|
|
1834
|
+
await this.order.upsertOrdersFromRemote(
|
|
1835
|
+
[freshOrder],
|
|
1836
|
+
"manual.editOpenRemoteCheck"
|
|
1837
|
+
);
|
|
1838
|
+
this.logInfo("checkRemoteOrderProductMembership 完成", {
|
|
1839
|
+
orderId: normalizedOrderId,
|
|
1840
|
+
duration: `${Date.now() - startTime}ms`
|
|
1841
|
+
});
|
|
1842
|
+
} catch (error) {
|
|
1843
|
+
this.logError("checkRemoteOrderProductMembership 失败", {
|
|
1844
|
+
orderId: normalizedOrderId,
|
|
1845
|
+
duration: `${Date.now() - startTime}ms`,
|
|
1846
|
+
error: error instanceof Error ? error.message : String(error)
|
|
1847
|
+
});
|
|
1848
|
+
throw error;
|
|
1849
|
+
}
|
|
1850
|
+
}
|
|
1792
1851
|
/**
|
|
1793
1852
|
* 清空所有server模块的IndexedDB缓存
|
|
1794
1853
|
* @returns Promise<void>
|
|
@@ -2219,15 +2278,12 @@ var Server = class {
|
|
|
2219
2278
|
return;
|
|
2220
2279
|
const scheduleDate = subscriber.context.schedule_date || (0, import_dayjs.default)().format("YYYY-MM-DD");
|
|
2221
2280
|
const timerIds = [];
|
|
2222
|
-
|
|
2223
|
-
const
|
|
2224
|
-
if (
|
|
2225
|
-
|
|
2226
|
-
|
|
2227
|
-
|
|
2228
|
-
}, delayMs);
|
|
2229
|
-
timerIds.push(timerId);
|
|
2230
|
-
}
|
|
2281
|
+
setInterval(() => {
|
|
2282
|
+
const currentTime = (0, import_dayjs.default)().format("hh:mm");
|
|
2283
|
+
if (timePoints.includes(currentTime)) {
|
|
2284
|
+
this.onScheduleTimePointTimerFire(subscriberId);
|
|
2285
|
+
}
|
|
2286
|
+
}, 6e4);
|
|
2231
2287
|
if (timerIds.length > 0) {
|
|
2232
2288
|
this.productQueryScheduleTimers.set(subscriberId, timerIds);
|
|
2233
2289
|
subscriber.scheduleTimerIds = timerIds;
|
|
@@ -2242,7 +2298,7 @@ var Server = class {
|
|
|
2242
2298
|
* schedule 变价时间点定时器触发:刷新 schedule_datetime 后重算并 callback。
|
|
2243
2299
|
*/
|
|
2244
2300
|
async onScheduleTimePointTimerFire(subscriberId, timerId) {
|
|
2245
|
-
this.removeScheduleTimerRef(subscriberId, timerId);
|
|
2301
|
+
timerId && this.removeScheduleTimerRef(subscriberId, timerId);
|
|
2246
2302
|
if (!this.productQuerySubscribers.has(subscriberId))
|
|
2247
2303
|
return;
|
|
2248
2304
|
const subscriber = this.productQuerySubscribers.get(subscriberId);
|
|
@@ -2313,6 +2369,43 @@ var Server = class {
|
|
|
2313
2369
|
this.scheduleSubscriberTimePointReloads(subscriberId, timePoints);
|
|
2314
2370
|
}
|
|
2315
2371
|
}
|
|
2372
|
+
/**
|
|
2373
|
+
* ProductList callers such as standalone retail pages do not always have a selected schedule.
|
|
2374
|
+
* In that case query against the current local time so menu availability can still be evaluated.
|
|
2375
|
+
*/
|
|
2376
|
+
resolveProductQueryScheduleContext(params) {
|
|
2377
|
+
const now = (0, import_dayjs.default)();
|
|
2378
|
+
const schedule_datetime = typeof params.schedule_datetime === "string" && params.schedule_datetime.trim() ? params.schedule_datetime : now.format("YYYY-MM-DD HH:mm:ss");
|
|
2379
|
+
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");
|
|
2380
|
+
return { schedule_date, schedule_datetime };
|
|
2381
|
+
}
|
|
2382
|
+
/**
|
|
2383
|
+
* OpenData 的关联餐牌可能已更新,而 server_menu/server_schedule 仍命中本地持久化缓存。
|
|
2384
|
+
* 仅在当前筛选没有任何生效餐牌时刷新一次,并由调用方重新计算筛选结果。
|
|
2385
|
+
*/
|
|
2386
|
+
async refreshMenuScheduleCacheAfterEmptyResult() {
|
|
2387
|
+
if (!this.menu || !this.schedule)
|
|
2388
|
+
return false;
|
|
2389
|
+
const now = Date.now();
|
|
2390
|
+
if (now - this.lastMenuScheduleRefreshAt < this.MENU_SCHEDULE_REFRESH_COOLDOWN_MS) {
|
|
2391
|
+
return false;
|
|
2392
|
+
}
|
|
2393
|
+
if (!this.menuScheduleRefreshInFlight) {
|
|
2394
|
+
this.lastMenuScheduleRefreshAt = now;
|
|
2395
|
+
this.menuScheduleRefreshInFlight = Promise.all([
|
|
2396
|
+
this.menu.loadMenuList(),
|
|
2397
|
+
this.schedule.loadAllSchedule()
|
|
2398
|
+
]).then(() => void 0).catch((error) => {
|
|
2399
|
+
this.logWarning("刷新菜单/日程缓存失败,继续使用现有缓存", {
|
|
2400
|
+
error: error instanceof Error ? error.message : String(error)
|
|
2401
|
+
});
|
|
2402
|
+
}).finally(() => {
|
|
2403
|
+
this.menuScheduleRefreshInFlight = null;
|
|
2404
|
+
});
|
|
2405
|
+
}
|
|
2406
|
+
await this.menuScheduleRefreshInFlight;
|
|
2407
|
+
return true;
|
|
2408
|
+
}
|
|
2316
2409
|
/**
|
|
2317
2410
|
* 执行 sales 搜索并登记可见订单号。
|
|
2318
2411
|
* 搜索参数完全透传后端,OS 不做过滤、筛选、排序。
|
|
@@ -3763,9 +3856,7 @@ var Server = class {
|
|
|
3763
3856
|
checkoutData,
|
|
3764
3857
|
order: pendingOrder,
|
|
3765
3858
|
response: pendingResult,
|
|
3766
|
-
requireFullyPaid: true
|
|
3767
|
-
// 自动小票固定使用 print_all 的收据类型 0,不随订单 type 改成券/手环类型 99。
|
|
3768
|
-
isManualPrint: true
|
|
3859
|
+
requireFullyPaid: true
|
|
3769
3860
|
});
|
|
3770
3861
|
}
|
|
3771
3862
|
await this.dispatchCheckoutSyncTask({
|
|
@@ -3813,10 +3904,21 @@ var Server = class {
|
|
|
3813
3904
|
data: (normalized == null ? void 0 : normalized.data) ?? null
|
|
3814
3905
|
};
|
|
3815
3906
|
}
|
|
3816
|
-
|
|
3907
|
+
const response = this.withSyncedOrderIdInCheckoutResponse(
|
|
3817
3908
|
syncResult.normalizedResponse,
|
|
3818
3909
|
syncResult.syncedOrder
|
|
3819
3910
|
);
|
|
3911
|
+
const syncedOrder = syncResult.syncedOrder;
|
|
3912
|
+
if (syncedOrder && this.shouldBuildSmallTicketData(syncResult.checkoutData) && this.isSalesOrderFullyPaid(syncedOrder)) {
|
|
3913
|
+
await this.dispatchLocalReceiptPrint({
|
|
3914
|
+
checkoutData: syncResult.checkoutData,
|
|
3915
|
+
order: syncedOrder,
|
|
3916
|
+
response: syncResult.normalizedResponse,
|
|
3917
|
+
requireFullyPaid: true
|
|
3918
|
+
// print_all 的 type=0 是收据打印;不要沿用同步成功后的券/手环打印 type=99。
|
|
3919
|
+
});
|
|
3920
|
+
}
|
|
3921
|
+
return response;
|
|
3820
3922
|
} catch (error) {
|
|
3821
3923
|
const backendError = this.extractBackendErrorResponse(error);
|
|
3822
3924
|
if (backendError) {
|
|
@@ -3990,7 +4092,7 @@ var Server = class {
|
|
|
3990
4092
|
var _a, _b, _c, _d, _e;
|
|
3991
4093
|
if (((_b = (_a = this.core.context) == null ? void 0 : _a.getPlatform) == null ? void 0 : _b.call(_a)) !== "android")
|
|
3992
4094
|
return true;
|
|
3993
|
-
return ((_e = (_d = (_c = this.app) == null ? void 0 : _c.storage) == null ? void 0 : _d.getStorage) == null ? void 0 : _e.call(_d, AUTO_PRINT_STORAGE_KEY))
|
|
4095
|
+
return ((_e = (_d = (_c = this.app) == null ? void 0 : _c.storage) == null ? void 0 : _d.getStorage) == null ? void 0 : _e.call(_d, AUTO_PRINT_STORAGE_KEY)) !== "false";
|
|
3994
4096
|
}
|
|
3995
4097
|
shouldBuildSmallTicketData(order) {
|
|
3996
4098
|
if (!order || typeof order !== "object")
|
|
@@ -5115,13 +5217,16 @@ var Server = class {
|
|
|
5115
5217
|
let activeMenuList = [];
|
|
5116
5218
|
if (menu_list_ids && Array.isArray(menu_list_ids) && menu_list_ids.length > 0) {
|
|
5117
5219
|
const tMenu = performance.now();
|
|
5118
|
-
const
|
|
5119
|
-
activeMenuList = menuList.filter((menu) => {
|
|
5220
|
+
const getActiveMenus = () => this.menu.getMenuByIds(menu_list_ids).filter((menu) => {
|
|
5120
5221
|
var _a;
|
|
5121
5222
|
return ((_a = this.schedule) == null ? void 0 : _a.getDateIsInSchedule(schedule_datetime, menu.schedule)) || false;
|
|
5122
5223
|
});
|
|
5224
|
+
activeMenuList = getActiveMenus();
|
|
5225
|
+
if (!activeMenuList.length && await this.refreshMenuScheduleCacheAfterEmptyResult()) {
|
|
5226
|
+
activeMenuList = getActiveMenus();
|
|
5227
|
+
}
|
|
5123
5228
|
(0, import_product.perfMark)("computeQuery.filterActiveMenu", performance.now() - tMenu, {
|
|
5124
|
-
totalMenu:
|
|
5229
|
+
totalMenu: menu_list_ids.length,
|
|
5125
5230
|
activeMenu: activeMenuList.length
|
|
5126
5231
|
});
|
|
5127
5232
|
}
|
|
@@ -235,6 +235,7 @@ export declare class OrderModule extends BaseModule implements Module {
|
|
|
235
235
|
*/
|
|
236
236
|
private lookupOrderIndexByIdentityKeys;
|
|
237
237
|
private isRemoteEchoMergeSource;
|
|
238
|
+
private isRemoteProductMembershipChangeSource;
|
|
238
239
|
private getProductMembershipKey;
|
|
239
240
|
private doProductsHaveStableMembershipIdentity;
|
|
240
241
|
/**
|
|
@@ -273,6 +274,7 @@ export declare class OrderModule extends BaseModule implements Module {
|
|
|
273
274
|
* // => 'S-1001'
|
|
274
275
|
*/
|
|
275
276
|
private getOrderStorageKey;
|
|
277
|
+
private getPersistedOrderStorageKey;
|
|
276
278
|
private getOrderIdentityMatchKeys;
|
|
277
279
|
private doOrdersShareIdentity;
|
|
278
280
|
private findOrderIndexByIdentity;
|
|
@@ -39,6 +39,7 @@ var import_orderCollectionIdentity = require("../../../modules/Order/utils/order
|
|
|
39
39
|
var import_types = require("./types");
|
|
40
40
|
var import_payment_utils = require("../../../modules/Order/payment-utils");
|
|
41
41
|
var INDEXDB_STORE_NAME = "orders";
|
|
42
|
+
var ORDER_STORAGE_KEY_FIELD = "__order_storage_key";
|
|
42
43
|
var ORDER_LAST_FULL_FETCH_AT_STORAGE_KEY = "server_order_last_full_fetch_at";
|
|
43
44
|
var ORDER_SYNC_THROTTLE_MS_STORAGE_KEY = "order_sync_throttle_ms";
|
|
44
45
|
var DEFAULT_ORDER_SYNC_THROTTLE_MS = 2e3;
|
|
@@ -920,10 +921,13 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
920
921
|
*/
|
|
921
922
|
async upsertOrdersFromRemote(freshOrders, source = "upsertOrdersFromRemote") {
|
|
922
923
|
if (!(freshOrders == null ? void 0 : freshOrders.length)) {
|
|
923
|
-
this.logInfo("upsertOrdersFromRemote-订单列表为空", {});
|
|
924
|
+
this.logInfo("upsertOrdersFromRemote-订单列表为空", { source });
|
|
924
925
|
return;
|
|
925
926
|
}
|
|
926
|
-
this.logInfo("upsertOrdersFromRemote-开始", {
|
|
927
|
+
this.logInfo("upsertOrdersFromRemote-开始", {
|
|
928
|
+
count: freshOrders.length,
|
|
929
|
+
source
|
|
930
|
+
});
|
|
927
931
|
await this.mergeOrdersToStore(freshOrders, source);
|
|
928
932
|
}
|
|
929
933
|
async markOrderSyncedByExternalSaleNumber(params) {
|
|
@@ -1530,6 +1534,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1530
1534
|
const patchedOrders = [];
|
|
1531
1535
|
const remoteProductMembershipChanges = [];
|
|
1532
1536
|
const forceWriteStorageKeys = /* @__PURE__ */ new Set();
|
|
1537
|
+
const storageKeyMigrations = [];
|
|
1533
1538
|
const mergeActions = {};
|
|
1534
1539
|
const existingProductsHaveStableIdentity = this.store.list.map(
|
|
1535
1540
|
(order) => this.doProductsHaveStableMembershipIdentity(
|
|
@@ -1554,6 +1559,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1554
1559
|
const mergeKey = storageKey || (fresh.order_id !== void 0 && fresh.order_id !== null ? this.getIdKey(fresh.order_id) : "");
|
|
1555
1560
|
if (matchIndex >= 0) {
|
|
1556
1561
|
const existingOrder = updatedList[matchIndex];
|
|
1562
|
+
const previousStorageKey = this.getPersistedOrderStorageKey(existingOrder);
|
|
1557
1563
|
if (this.isPendingSyncOrder(existingOrder) && this.isRemoteEchoMergeSource(source)) {
|
|
1558
1564
|
this.logInfo("mergeOrdersToStore-跳过 pending 订单远端覆盖", {
|
|
1559
1565
|
source,
|
|
@@ -1615,6 +1621,14 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1615
1621
|
}
|
|
1616
1622
|
}
|
|
1617
1623
|
}
|
|
1624
|
+
const nextStorageKey = this.getOrderStorageKey(mergedOrder);
|
|
1625
|
+
if (previousStorageKey && nextStorageKey && previousStorageKey !== nextStorageKey) {
|
|
1626
|
+
storageKeyMigrations.push({
|
|
1627
|
+
orderId: mergedOrder.order_id ?? existingOrder.order_id ?? fresh.order_id ?? null,
|
|
1628
|
+
from: previousStorageKey,
|
|
1629
|
+
to: nextStorageKey
|
|
1630
|
+
});
|
|
1631
|
+
}
|
|
1618
1632
|
updatedList[adjustedMatchIndex] = mergedOrder;
|
|
1619
1633
|
existingProductsHaveStableIdentity[adjustedMatchIndex] = mergedProductsHaveStableIdentity;
|
|
1620
1634
|
if (membershipChange) {
|
|
@@ -1652,7 +1666,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1652
1666
|
patchedOrders,
|
|
1653
1667
|
source,
|
|
1654
1668
|
mergeActions,
|
|
1655
|
-
{},
|
|
1669
|
+
{ storageKeyMigrations },
|
|
1656
1670
|
forceWriteStorageKeys
|
|
1657
1671
|
);
|
|
1658
1672
|
this.logInfo("mergeOrdersToStore-结束", {
|
|
@@ -1685,6 +1699,9 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1685
1699
|
isRemoteEchoMergeSource(source) {
|
|
1686
1700
|
return source === "pubsub.bodyUpsert" || source === "pubsub.httpRefresh";
|
|
1687
1701
|
}
|
|
1702
|
+
isRemoteProductMembershipChangeSource(source) {
|
|
1703
|
+
return this.isRemoteEchoMergeSource(source) || source === "manual.editOpenRemoteCheck";
|
|
1704
|
+
}
|
|
1688
1705
|
getProductMembershipKey(product) {
|
|
1689
1706
|
const persistentId = (0, import_orderCollectionIdentity.getOrderCollectionPersistentId)("product", product);
|
|
1690
1707
|
if (persistentId)
|
|
@@ -1717,7 +1734,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1717
1734
|
* 对比合并前后的商品成员集合。商品字段修改与数组重排不会产生 diff。
|
|
1718
1735
|
*/
|
|
1719
1736
|
getRemoteProductMembershipChange(existingOrder, mergedOrder, source) {
|
|
1720
|
-
if (!this.
|
|
1737
|
+
if (!this.isRemoteProductMembershipChangeSource(source))
|
|
1721
1738
|
return null;
|
|
1722
1739
|
const previousProducts = Array.isArray(existingOrder.products) ? existingOrder.products : [];
|
|
1723
1740
|
const currentProducts = Array.isArray(mergedOrder.products) ? mergedOrder.products : [];
|
|
@@ -1854,6 +1871,13 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
1854
1871
|
}
|
|
1855
1872
|
return "";
|
|
1856
1873
|
}
|
|
1874
|
+
getPersistedOrderStorageKey(order) {
|
|
1875
|
+
const persistedStorageKey = order == null ? void 0 : order[ORDER_STORAGE_KEY_FIELD];
|
|
1876
|
+
if (persistedStorageKey !== void 0 && persistedStorageKey !== null && persistedStorageKey !== "") {
|
|
1877
|
+
return String(persistedStorageKey);
|
|
1878
|
+
}
|
|
1879
|
+
return this.getOrderStorageKey(order);
|
|
1880
|
+
}
|
|
1857
1881
|
getOrderIdentityMatchKeys(order) {
|
|
1858
1882
|
return this.getOrderIdentityEntries(order).map((entry) => `${entry.field}:${entry.key}`);
|
|
1859
1883
|
}
|
|
@@ -2284,7 +2308,18 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
2284
2308
|
throw new Error("订单 SQLite 数据库未初始化");
|
|
2285
2309
|
return;
|
|
2286
2310
|
}
|
|
2287
|
-
const
|
|
2311
|
+
const migrationTargetStorageKeys = new Set(
|
|
2312
|
+
(options.storageKeyMigrations || []).map((migration) => migration.to)
|
|
2313
|
+
);
|
|
2314
|
+
const ordersSnapshot = (0, import_lodash_es.cloneDeep)(orders).map((order) => this.normalizeOrderCollectionsForIngress(order, `${source}.sqliteIngress`)).map((order) => {
|
|
2315
|
+
const storageKey = this.getOrderStorageKey(order);
|
|
2316
|
+
if (!storageKey || !migrationTargetStorageKeys.has(storageKey))
|
|
2317
|
+
return order;
|
|
2318
|
+
return {
|
|
2319
|
+
...order,
|
|
2320
|
+
[ORDER_STORAGE_KEY_FIELD]: storageKey
|
|
2321
|
+
};
|
|
2322
|
+
}).filter((order) => this.getOrderStorageKey(order));
|
|
2288
2323
|
if (ordersSnapshot.length === 0) {
|
|
2289
2324
|
return;
|
|
2290
2325
|
}
|
|
@@ -2301,6 +2336,17 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
2301
2336
|
if (compactedToWrite.length === 0) {
|
|
2302
2337
|
return;
|
|
2303
2338
|
}
|
|
2339
|
+
const writtenStorageKeys = new Set(
|
|
2340
|
+
compactedToWrite.map((order) => this.getOrderStorageKey(order)).filter(Boolean)
|
|
2341
|
+
);
|
|
2342
|
+
const storageKeyMigrations = /* @__PURE__ */ new Map();
|
|
2343
|
+
for (const migration of options.storageKeyMigrations || []) {
|
|
2344
|
+
if (!writtenStorageKeys.has(migration.to))
|
|
2345
|
+
continue;
|
|
2346
|
+
if (writtenStorageKeys.has(migration.from))
|
|
2347
|
+
continue;
|
|
2348
|
+
storageKeyMigrations.set(migration.from, migration);
|
|
2349
|
+
}
|
|
2304
2350
|
try {
|
|
2305
2351
|
await this.runInOrderSQLiteSaveQueue(async () => {
|
|
2306
2352
|
let writeMethod = "none";
|
|
@@ -2324,6 +2370,30 @@ var OrderModule = class extends import_BaseModule.BaseModule {
|
|
|
2324
2370
|
throw new Error("订单 SQLite 数据库不支持写入");
|
|
2325
2371
|
}
|
|
2326
2372
|
this.recordRecentSqliteWrite(source, compactedToWrite);
|
|
2373
|
+
if (writeMethod !== "none") {
|
|
2374
|
+
for (const migration of storageKeyMigrations.values()) {
|
|
2375
|
+
try {
|
|
2376
|
+
await this.dbManager.delete(INDEXDB_STORE_NAME, migration.from);
|
|
2377
|
+
this.recentSqliteWriteByStorageKey.delete(migration.from);
|
|
2378
|
+
for (const order of orders) {
|
|
2379
|
+
if (this.getOrderStorageKey(order) !== migration.to)
|
|
2380
|
+
continue;
|
|
2381
|
+
const orderRecord = order;
|
|
2382
|
+
if (String(orderRecord[ORDER_STORAGE_KEY_FIELD] ?? "") !== migration.from)
|
|
2383
|
+
continue;
|
|
2384
|
+
orderRecord[ORDER_STORAGE_KEY_FIELD] = migration.to;
|
|
2385
|
+
}
|
|
2386
|
+
} catch (error) {
|
|
2387
|
+
this.logError("删除订单旧 SQLite storage key 失败", {
|
|
2388
|
+
source,
|
|
2389
|
+
order_id: migration.orderId,
|
|
2390
|
+
oldStorageKey: migration.from,
|
|
2391
|
+
newStorageKey: migration.to,
|
|
2392
|
+
error: error instanceof Error ? error.message : String(error)
|
|
2393
|
+
});
|
|
2394
|
+
}
|
|
2395
|
+
}
|
|
2396
|
+
}
|
|
2327
2397
|
this.logInfo("patchOrdersInSQLite-完成", {
|
|
2328
2398
|
source,
|
|
2329
2399
|
count: compactedToWrite.length,
|
|
@@ -568,7 +568,7 @@ export interface OrderChangedPayload {
|
|
|
568
568
|
/** 触发来源,便于订阅者区分 pubsub / 远端覆盖 / 清空等场景 */
|
|
569
569
|
source?: string;
|
|
570
570
|
}
|
|
571
|
-
export type RemoteProductMembershipChangeSource = 'pubsub.bodyUpsert' | 'pubsub.httpRefresh';
|
|
571
|
+
export type RemoteProductMembershipChangeSource = 'pubsub.bodyUpsert' | 'pubsub.httpRefresh' | 'manual.editOpenRemoteCheck';
|
|
572
572
|
/**
|
|
573
573
|
* 远端订单快照相对本地订单产生商品成员增删时的广播载荷。
|
|
574
574
|
* 只表达商品行成员关系变化,不包含数量、价格、备注等字段级修改。
|
|
@@ -119,6 +119,15 @@ export declare class BaseSalesImpl extends BaseModule implements Module {
|
|
|
119
119
|
* application_code 仅作为接口兼容字段,不能替代 channel / business_code。
|
|
120
120
|
*/
|
|
121
121
|
private getPriceQueryStrategyContext;
|
|
122
|
+
/**
|
|
123
|
+
* 子类可在商品重报价前准备客户维度的策略上下文,例如等待 Wallet/优惠资产加载。
|
|
124
|
+
*/
|
|
125
|
+
protected prepareProductPriceQueryContext(_customerId?: number | string): Promise<void>;
|
|
126
|
+
/**
|
|
127
|
+
* 默认保留 BaseSales 的 legacy quotation 行为;已由 /product/query 统一完成
|
|
128
|
+
* 智能定价与报价合并的业务可在子类中覆盖,避免二次覆盖权威价格。
|
|
129
|
+
*/
|
|
130
|
+
protected preferAuthoritativeProductQueryPrice(): boolean;
|
|
122
131
|
private getPriceQuerySchedule;
|
|
123
132
|
private loadProductsForPriceQuery;
|
|
124
133
|
private loadProductForPriceQuery;
|
|
@@ -141,7 +150,9 @@ export declare class BaseSalesImpl extends BaseModule implements Module {
|
|
|
141
150
|
* const params = this.buildSubModuleOtherParams();
|
|
142
151
|
* this.core.registerModule(orderModule, { otherParams: params });
|
|
143
152
|
*/
|
|
144
|
-
protected
|
|
153
|
+
protected isSessionStoragePersistEnabled(): boolean;
|
|
154
|
+
protected shouldUseSessionStorageForSubModule(_moduleName?: string): boolean;
|
|
155
|
+
protected buildSubModuleOtherParams(moduleName?: string): Record<string, any>;
|
|
145
156
|
/**
|
|
146
157
|
* 将父级 otherParams 的变更显式同步给已注册的子模块。
|
|
147
158
|
*
|
|
@@ -290,6 +301,13 @@ export declare class BaseSalesImpl extends BaseModule implements Module {
|
|
|
290
301
|
confirmPendingVoucherPayments?: boolean;
|
|
291
302
|
enhancePayload?: SubmitPayloadEnhancer;
|
|
292
303
|
}): Promise<T>;
|
|
304
|
+
/**
|
|
305
|
+
* 默认保持 WebPOS 的本地待同步订单模式;需要云端确认后才算成功的渠道可覆盖此策略。
|
|
306
|
+
* otherParams.checkoutSyncTaskEnabled 优先,便于同一 solution 按入口恢复旧行为。
|
|
307
|
+
*/
|
|
308
|
+
protected shouldUseCheckoutSyncTask(): boolean;
|
|
309
|
+
/** 可由特定 solution 为真实 checkout 补充默认收据数据请求。 */
|
|
310
|
+
protected getDefaultCheckoutSmallTicketDataFlag(): number | undefined;
|
|
293
311
|
printLocalOrderReceipt<T = any>(lookup?: BaseSalesPrintLocalOrderReceiptParams): Promise<T>;
|
|
294
312
|
private getSubmitPaymentStatus;
|
|
295
313
|
syncPaymentsToOrder<T = any>(params: SyncPaymentsToOrderParams): Promise<SyncPaymentsToOrderResult<T>>;
|
|
@@ -427,6 +445,7 @@ export declare class BaseSalesImpl extends BaseModule implements Module {
|
|
|
427
445
|
transformBaseProductToOrderProduct(params: TransformBaseProductToOrderProductParams): import("./utils/transformBaseProductToOrderProduct").BaseProductOrderProductInput | null;
|
|
428
446
|
calculateProductBookingPrice(params: BaseSalesCalculateProductBookingPriceParams): Promise<BaseSalesProductBookingPriceResult>;
|
|
429
447
|
getQuotationCustomerScopeInfo(): BaseSalesQuotationCustomerScopeInfo;
|
|
448
|
+
private hasSmartPricingStrategies;
|
|
430
449
|
shouldRecalculateProductBookingPricesForContextChange(params: BaseSalesPriceRecalculationContextChange): boolean;
|
|
431
450
|
calculateProductBookingPrices(paramsList: BaseSalesCalculateProductBookingPriceParams[]): Promise<BaseSalesProductBookingPriceResult[]>;
|
|
432
451
|
addProductToOrder(product: Partial<BaseSalesOrderProduct> & BaseSalesOrderProductIdentity, booking?: AddProductBookingInput, options?: AddProductToOrderOptions): Promise<import("../../modules/Order/types").OrderProduct[]>;
|