@pisell/pisellos 2.3.24 → 2.3.26
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/index.d.ts +0 -4
- package/dist/model/strategy/adapter/index.js +1 -5
- package/dist/modules/Discount/index.d.ts +2 -5
- package/dist/modules/Discount/index.js +7 -30
- package/dist/modules/Discount/types.d.ts +0 -4
- package/dist/modules/Order/index.d.ts +4 -2
- package/dist/modules/Order/index.js +725 -647
- package/dist/modules/Order/types.d.ts +0 -2
- package/dist/modules/Product/types.d.ts +0 -22
- package/dist/modules/ProductList/index.d.ts +1 -1
- package/dist/modules/ProductList/index.js +2 -4
- package/dist/modules/ProductList/types.d.ts +0 -2
- package/dist/server/index.d.ts +0 -50
- package/dist/server/index.js +749 -995
- package/dist/server/modules/products/index.d.ts +7 -26
- package/dist/server/modules/products/index.js +76 -167
- package/dist/server/modules/products/types.d.ts +0 -14
- package/dist/solution/BaseSales/index.d.ts +0 -2
- package/dist/solution/BaseSales/index.js +50 -36
- package/dist/solution/BookingByStep/index.d.ts +1 -1
- package/dist/solution/BookingTicket/index.d.ts +1 -13
- package/dist/solution/BookingTicket/index.js +21 -5
- package/dist/solution/BookingTicket/types.d.ts +0 -2
- package/dist/solution/ShopDiscount/index.js +14 -15
- package/lib/model/strategy/adapter/index.d.ts +0 -4
- package/lib/model/strategy/adapter/index.js +2 -13
- package/lib/modules/Discount/index.d.ts +2 -5
- package/lib/modules/Discount/index.js +3 -23
- package/lib/modules/Discount/types.d.ts +0 -4
- package/lib/modules/Order/index.d.ts +4 -2
- package/lib/modules/Order/index.js +80 -34
- package/lib/modules/Order/types.d.ts +0 -2
- package/lib/modules/Product/types.d.ts +0 -22
- package/lib/modules/ProductList/index.d.ts +1 -1
- package/lib/modules/ProductList/index.js +2 -4
- package/lib/modules/ProductList/types.d.ts +0 -2
- package/lib/server/index.d.ts +0 -50
- package/lib/server/index.js +29 -206
- package/lib/server/modules/products/index.d.ts +7 -26
- package/lib/server/modules/products/index.js +35 -114
- package/lib/server/modules/products/types.d.ts +0 -14
- package/lib/solution/BaseSales/index.d.ts +0 -2
- package/lib/solution/BaseSales/index.js +22 -12
- package/lib/solution/BookingByStep/index.d.ts +1 -1
- package/lib/solution/BookingTicket/index.d.ts +1 -13
- package/lib/solution/BookingTicket/index.js +18 -1
- package/lib/solution/BookingTicket/types.d.ts +0 -2
- package/lib/solution/ShopDiscount/index.js +1 -2
- package/package.json +1 -1
- package/dist/model/strategy/adapter/dataVariant/adapter.d.ts +0 -50
- package/dist/model/strategy/adapter/dataVariant/adapter.js +0 -167
- package/dist/model/strategy/adapter/dataVariant/evaluator.d.ts +0 -89
- package/dist/model/strategy/adapter/dataVariant/evaluator.js +0 -780
- package/dist/model/strategy/adapter/dataVariant/examples.d.ts +0 -39
- package/dist/model/strategy/adapter/dataVariant/examples.js +0 -277
- package/dist/model/strategy/adapter/dataVariant/index.d.ts +0 -4
- package/dist/model/strategy/adapter/dataVariant/index.js +0 -4
- package/dist/model/strategy/adapter/dataVariant/type.d.ts +0 -148
- package/dist/model/strategy/adapter/dataVariant/type.js +0 -54
- package/lib/model/strategy/adapter/dataVariant/adapter.d.ts +0 -50
- package/lib/model/strategy/adapter/dataVariant/adapter.js +0 -149
- package/lib/model/strategy/adapter/dataVariant/evaluator.d.ts +0 -89
- package/lib/model/strategy/adapter/dataVariant/evaluator.js +0 -583
- package/lib/model/strategy/adapter/dataVariant/examples.d.ts +0 -39
- package/lib/model/strategy/adapter/dataVariant/examples.js +0 -293
- package/lib/model/strategy/adapter/dataVariant/index.d.ts +0 -4
- package/lib/model/strategy/adapter/dataVariant/index.js +0 -38
- package/lib/model/strategy/adapter/dataVariant/type.d.ts +0 -148
- package/lib/model/strategy/adapter/dataVariant/type.js +0 -31
package/lib/server/index.js
CHANGED
|
@@ -76,8 +76,6 @@ var Server = class {
|
|
|
76
76
|
};
|
|
77
77
|
// ---- 商品查询订阅者 ----
|
|
78
78
|
this.productQuerySubscribers = /* @__PURE__ */ new Map();
|
|
79
|
-
/** subscriberId → 智能定价变价时间点定时器句柄(与 subscriber 分离存储,便于 clear) */
|
|
80
|
-
this.productQueryScheduleTimers = /* @__PURE__ */ new Map();
|
|
81
79
|
// ---- 订单 / 预约列表查询订阅者 ----
|
|
82
80
|
this.orderQuerySubscribers = /* @__PURE__ */ new Map();
|
|
83
81
|
this.bookingQuerySubscribers = /* @__PURE__ */ new Map();
|
|
@@ -210,7 +208,7 @@ var Server = class {
|
|
|
210
208
|
*/
|
|
211
209
|
this.handleProductQuery = async ({ url, method, data, config }) => {
|
|
212
210
|
console.log("[Server] handleProductQuery:", url, method, data, config);
|
|
213
|
-
const { menu_list_ids, schedule_datetime, schedule_date, customer_id, ids, extension_type
|
|
211
|
+
const { menu_list_ids, schedule_datetime, schedule_date, customer_id, ids, extension_type } = data;
|
|
214
212
|
const { callback, subscriberId } = config || {};
|
|
215
213
|
this.logInfo("handleProductQuery: 开始处理商品查询请求", {
|
|
216
214
|
menu_list_ids,
|
|
@@ -218,32 +216,19 @@ var Server = class {
|
|
|
218
216
|
schedule_datetime,
|
|
219
217
|
schedule_date,
|
|
220
218
|
customer_id,
|
|
221
|
-
extension_type
|
|
222
|
-
strategyContextKeys: strategy_context ? Object.keys(strategy_context) : []
|
|
219
|
+
extension_type
|
|
223
220
|
});
|
|
224
221
|
if (subscriberId && typeof callback === "function") {
|
|
225
222
|
this.productQuerySubscribers.set(subscriberId, {
|
|
226
223
|
callback,
|
|
227
|
-
context: { menu_list_ids, ids, schedule_date, schedule_datetime, customer_id, extension_type
|
|
224
|
+
context: { menu_list_ids, ids, schedule_date, schedule_datetime, customer_id, extension_type }
|
|
228
225
|
});
|
|
229
226
|
this.logInfo("handleProductQuery: 已注册订阅者", {
|
|
230
227
|
subscriberId,
|
|
231
228
|
totalSubscribers: this.productQuerySubscribers.size
|
|
232
229
|
});
|
|
233
230
|
}
|
|
234
|
-
|
|
235
|
-
menu_list_ids,
|
|
236
|
-
ids,
|
|
237
|
-
schedule_date,
|
|
238
|
-
schedule_datetime,
|
|
239
|
-
customer_id,
|
|
240
|
-
extension_type,
|
|
241
|
-
strategy_context
|
|
242
|
-
});
|
|
243
|
-
if (subscriberId && typeof callback === "function") {
|
|
244
|
-
this.syncProductQueryScheduleTimers(subscriberId, strategy_context);
|
|
245
|
-
}
|
|
246
|
-
return result;
|
|
231
|
+
return this.computeProductQueryResult({ menu_list_ids, ids, schedule_date, schedule_datetime, customer_id, extension_type });
|
|
247
232
|
};
|
|
248
233
|
/**
|
|
249
234
|
* 按商品 id 查询单条(GET /shop/product/query/:productId)
|
|
@@ -1926,7 +1911,6 @@ var Server = class {
|
|
|
1926
1911
|
*/
|
|
1927
1912
|
removeProductQuerySubscriber(subscriberId) {
|
|
1928
1913
|
if (subscriberId) {
|
|
1929
|
-
this.clearSubscriberScheduleTimers(subscriberId);
|
|
1930
1914
|
this.productQuerySubscribers.delete(subscriberId);
|
|
1931
1915
|
this.logInfo("removeProductQuerySubscriber: 已移除订阅者", {
|
|
1932
1916
|
subscriberId,
|
|
@@ -1934,156 +1918,6 @@ var Server = class {
|
|
|
1934
1918
|
});
|
|
1935
1919
|
}
|
|
1936
1920
|
}
|
|
1937
|
-
/**
|
|
1938
|
-
* 构建商品 query 响应 data 段,附带智能定价 schedule_time_points 元数据。
|
|
1939
|
-
*/
|
|
1940
|
-
buildProductQueryResultPayload(list, count) {
|
|
1941
|
-
var _a, _b;
|
|
1942
|
-
return {
|
|
1943
|
-
list,
|
|
1944
|
-
count: count ?? list.length,
|
|
1945
|
-
schedule_time_points: ((_b = (_a = this.products) == null ? void 0 : _a.getLastScheduleTimePoints) == null ? void 0 : _b.call(_a)) ?? []
|
|
1946
|
-
};
|
|
1947
|
-
}
|
|
1948
|
-
/**
|
|
1949
|
-
* 是否启用商品 query 订阅的 schedule 时间点定时重算。
|
|
1950
|
-
* strategy_context.enable_schedule_reload === false 时关闭。
|
|
1951
|
-
*/
|
|
1952
|
-
shouldScheduleProductQueryReload(strategy_context) {
|
|
1953
|
-
return (strategy_context == null ? void 0 : strategy_context.enable_schedule_reload) !== false;
|
|
1954
|
-
}
|
|
1955
|
-
/**
|
|
1956
|
-
* 清除指定 subscriber 的全部 schedule 定时器,防止重复 query 或 unsubscribe 后泄漏。
|
|
1957
|
-
*/
|
|
1958
|
-
clearSubscriberScheduleTimers(subscriberId) {
|
|
1959
|
-
const timers = this.productQueryScheduleTimers.get(subscriberId);
|
|
1960
|
-
if (timers == null ? void 0 : timers.length) {
|
|
1961
|
-
timers.forEach((timerId) => clearTimeout(timerId));
|
|
1962
|
-
}
|
|
1963
|
-
this.productQueryScheduleTimers.delete(subscriberId);
|
|
1964
|
-
const subscriber = this.productQuerySubscribers.get(subscriberId);
|
|
1965
|
-
if (subscriber) {
|
|
1966
|
-
subscriber.scheduleTimerIds = [];
|
|
1967
|
-
}
|
|
1968
|
-
}
|
|
1969
|
-
/**
|
|
1970
|
-
* 从 productQueryScheduleTimers 移除已触发的 timer 引用。
|
|
1971
|
-
*/
|
|
1972
|
-
removeScheduleTimerRef(subscriberId, timerId) {
|
|
1973
|
-
const timers = this.productQueryScheduleTimers.get(subscriberId);
|
|
1974
|
-
if (!(timers == null ? void 0 : timers.length))
|
|
1975
|
-
return;
|
|
1976
|
-
const next = timers.filter((id) => id !== timerId);
|
|
1977
|
-
if (next.length === 0) {
|
|
1978
|
-
this.productQueryScheduleTimers.delete(subscriberId);
|
|
1979
|
-
} else {
|
|
1980
|
-
this.productQueryScheduleTimers.set(subscriberId, next);
|
|
1981
|
-
}
|
|
1982
|
-
const subscriber = this.productQuerySubscribers.get(subscriberId);
|
|
1983
|
-
if (subscriber) {
|
|
1984
|
-
subscriber.scheduleTimerIds = next;
|
|
1985
|
-
}
|
|
1986
|
-
}
|
|
1987
|
-
/**
|
|
1988
|
-
* 计算 schedule 变价时间点到当前时刻的延迟(ms)。已过期返回 -1。
|
|
1989
|
-
*/
|
|
1990
|
-
computeScheduleTimePointDelayMs(scheduleDate, timePoint) {
|
|
1991
|
-
const parts = timePoint.split(":");
|
|
1992
|
-
if (parts.length < 2)
|
|
1993
|
-
return -1;
|
|
1994
|
-
const hours = parseInt(parts[0], 10);
|
|
1995
|
-
const minutes = parseInt(parts[1], 10);
|
|
1996
|
-
if (!Number.isFinite(hours) || !Number.isFinite(minutes))
|
|
1997
|
-
return -1;
|
|
1998
|
-
const target = (0, import_dayjs.default)(scheduleDate).hour(hours).minute(minutes).second(4).millisecond(0);
|
|
1999
|
-
const delayMs = target.diff((0, import_dayjs.default)());
|
|
2000
|
-
return delayMs >= 0 ? delayMs : -1;
|
|
2001
|
-
}
|
|
2002
|
-
/**
|
|
2003
|
-
* 定时重算前刷新 subscriber schedule 上下文:使用执行瞬间时间,禁止沿用首次 query 的 schedule_datetime。
|
|
2004
|
-
*/
|
|
2005
|
-
refreshSubscriberScheduleAtExecution(subscriber) {
|
|
2006
|
-
const executedAt = (0, import_dayjs.default)();
|
|
2007
|
-
const bookingDate = subscriber.context.schedule_date || executedAt.format("YYYY-MM-DD");
|
|
2008
|
-
subscriber.context.schedule_date = bookingDate;
|
|
2009
|
-
subscriber.context.schedule_datetime = `${bookingDate} ${executedAt.format("HH:mm:ss")}`;
|
|
2010
|
-
}
|
|
2011
|
-
/**
|
|
2012
|
-
* 为 subscriber 注册智能定价 scheduleTimePoints 定时重算。
|
|
2013
|
-
* 必须先 clearSubscriberScheduleTimers,再调用本方法。
|
|
2014
|
-
*/
|
|
2015
|
-
scheduleSubscriberTimePointReloads(subscriberId, timePoints) {
|
|
2016
|
-
const subscriber = this.productQuerySubscribers.get(subscriberId);
|
|
2017
|
-
if (!subscriber || !timePoints.length)
|
|
2018
|
-
return;
|
|
2019
|
-
const scheduleDate = subscriber.context.schedule_date || (0, import_dayjs.default)().format("YYYY-MM-DD");
|
|
2020
|
-
const timerIds = [];
|
|
2021
|
-
for (const timePoint of timePoints) {
|
|
2022
|
-
const delayMs = this.computeScheduleTimePointDelayMs(scheduleDate, timePoint);
|
|
2023
|
-
if (delayMs < 0)
|
|
2024
|
-
continue;
|
|
2025
|
-
const timerId = setTimeout(() => {
|
|
2026
|
-
void this.onScheduleTimePointTimerFire(subscriberId, timerId);
|
|
2027
|
-
}, delayMs);
|
|
2028
|
-
timerIds.push(timerId);
|
|
2029
|
-
}
|
|
2030
|
-
if (timerIds.length > 0) {
|
|
2031
|
-
this.productQueryScheduleTimers.set(subscriberId, timerIds);
|
|
2032
|
-
subscriber.scheduleTimerIds = timerIds;
|
|
2033
|
-
this.logInfo("scheduleSubscriberTimePointReloads: 已注册定时器", {
|
|
2034
|
-
subscriberId,
|
|
2035
|
-
timerCount: timerIds.length,
|
|
2036
|
-
timePoints
|
|
2037
|
-
});
|
|
2038
|
-
}
|
|
2039
|
-
}
|
|
2040
|
-
/**
|
|
2041
|
-
* schedule 变价时间点定时器触发:刷新 schedule_datetime 后重算并 callback。
|
|
2042
|
-
*/
|
|
2043
|
-
async onScheduleTimePointTimerFire(subscriberId, timerId) {
|
|
2044
|
-
this.removeScheduleTimerRef(subscriberId, timerId);
|
|
2045
|
-
if (!this.productQuerySubscribers.has(subscriberId))
|
|
2046
|
-
return;
|
|
2047
|
-
const subscriber = this.productQuerySubscribers.get(subscriberId);
|
|
2048
|
-
this.refreshSubscriberScheduleAtExecution(subscriber);
|
|
2049
|
-
await this.recomputeAndNotifySubscriber(subscriberId);
|
|
2050
|
-
}
|
|
2051
|
-
/**
|
|
2052
|
-
* 对单个商品 query 订阅者重算并推送(定时路径;不新建 schedule timer)。
|
|
2053
|
-
*/
|
|
2054
|
-
async recomputeAndNotifySubscriber(subscriberId) {
|
|
2055
|
-
const subscriber = this.productQuerySubscribers.get(subscriberId);
|
|
2056
|
-
if (!subscriber)
|
|
2057
|
-
return;
|
|
2058
|
-
try {
|
|
2059
|
-
const result = await this.computeProductQueryResult(subscriber.context);
|
|
2060
|
-
subscriber.callback(result);
|
|
2061
|
-
this.logInfo("recomputeAndNotifySubscriber: 已推送", {
|
|
2062
|
-
subscriberId,
|
|
2063
|
-
schedule_datetime: subscriber.context.schedule_datetime
|
|
2064
|
-
});
|
|
2065
|
-
} catch (error) {
|
|
2066
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
2067
|
-
this.logError("recomputeAndNotifySubscriber: 推送失败", {
|
|
2068
|
-
subscriberId,
|
|
2069
|
-
error: errorMessage
|
|
2070
|
-
});
|
|
2071
|
-
}
|
|
2072
|
-
}
|
|
2073
|
-
/**
|
|
2074
|
-
* query 完成后为 subscriber 同步 schedule 定时器(先 clear 再 schedule)。
|
|
2075
|
-
*/
|
|
2076
|
-
syncProductQueryScheduleTimers(subscriberId, strategy_context) {
|
|
2077
|
-
var _a, _b;
|
|
2078
|
-
this.clearSubscriberScheduleTimers(subscriberId);
|
|
2079
|
-
if (!this.shouldScheduleProductQueryReload(strategy_context)) {
|
|
2080
|
-
return;
|
|
2081
|
-
}
|
|
2082
|
-
const timePoints = ((_b = (_a = this.products) == null ? void 0 : _a.getLastScheduleTimePoints) == null ? void 0 : _b.call(_a)) ?? [];
|
|
2083
|
-
if (timePoints.length > 0) {
|
|
2084
|
-
this.scheduleSubscriberTimePointReloads(subscriberId, timePoints);
|
|
2085
|
-
}
|
|
2086
|
-
}
|
|
2087
1921
|
/**
|
|
2088
1922
|
* 执行 sales 搜索并登记可见订单号。
|
|
2089
1923
|
* 搜索参数完全透传后端,OS 不做过滤、筛选、排序。
|
|
@@ -4277,14 +4111,8 @@ var Server = class {
|
|
|
4277
4111
|
*/
|
|
4278
4112
|
async computeProductQueryResult(context, options) {
|
|
4279
4113
|
const tTotal = performance.now();
|
|
4280
|
-
const { menu_list_ids, ids, schedule_date, schedule_datetime, customer_id, extension_type, product_id
|
|
4114
|
+
const { menu_list_ids, ids, schedule_date, schedule_datetime, customer_id, extension_type, product_id } = context;
|
|
4281
4115
|
const queryIds = Array.isArray(ids) ? ids.map((id) => Number(id)).filter((id) => Number.isFinite(id)) : [];
|
|
4282
|
-
const formatterContext = this.buildProductFormatterContext({
|
|
4283
|
-
schedule_date,
|
|
4284
|
-
schedule_datetime,
|
|
4285
|
-
customer_id,
|
|
4286
|
-
strategy_context
|
|
4287
|
-
});
|
|
4288
4116
|
this.logInfo("computeProductQueryResult 开始", {
|
|
4289
4117
|
menuListIdsCount: (menu_list_ids == null ? void 0 : menu_list_ids.length) ?? 0,
|
|
4290
4118
|
ids: queryIds,
|
|
@@ -4293,17 +4121,20 @@ var Server = class {
|
|
|
4293
4121
|
customer_id,
|
|
4294
4122
|
extension_type,
|
|
4295
4123
|
product_id,
|
|
4296
|
-
strategyContextKeys: strategy_context ? Object.keys(strategy_context) : [],
|
|
4297
4124
|
changedIds: options == null ? void 0 : options.changedIds
|
|
4298
4125
|
});
|
|
4299
4126
|
if (!this.products) {
|
|
4300
4127
|
this.logError("computeProductQueryResult: Products 模块未注册");
|
|
4301
|
-
return { message: "Products 模块未注册", data:
|
|
4128
|
+
return { message: "Products 模块未注册", data: { list: [], count: 0 } };
|
|
4302
4129
|
}
|
|
4303
4130
|
if (queryIds.length > 0) {
|
|
4304
4131
|
const uniqueIds = Array.from(new Set(queryIds));
|
|
4305
4132
|
const tPrice2 = performance.now();
|
|
4306
|
-
const productsWithPrice = await this.products.getProductsWithPrice(schedule_date,
|
|
4133
|
+
const productsWithPrice = await this.products.getProductsWithPrice(schedule_date, {
|
|
4134
|
+
scheduleModule: this.getSchedule(),
|
|
4135
|
+
schedule_datetime,
|
|
4136
|
+
customer_id
|
|
4137
|
+
}, {
|
|
4307
4138
|
changedIds: options == null ? void 0 : options.changedIds,
|
|
4308
4139
|
productIds: uniqueIds
|
|
4309
4140
|
});
|
|
@@ -4324,7 +4155,7 @@ var Server = class {
|
|
|
4324
4155
|
});
|
|
4325
4156
|
return {
|
|
4326
4157
|
code: 200,
|
|
4327
|
-
data:
|
|
4158
|
+
data: { list: extensionFilteredProducts, count: extensionFilteredProducts.length },
|
|
4328
4159
|
message: "",
|
|
4329
4160
|
status: true
|
|
4330
4161
|
};
|
|
@@ -4332,7 +4163,9 @@ var Server = class {
|
|
|
4332
4163
|
if (product_id != null && Number.isFinite(Number(product_id))) {
|
|
4333
4164
|
const pid = Number(product_id);
|
|
4334
4165
|
const tPrice2 = performance.now();
|
|
4335
|
-
const allProductsWithPrice = await this.products.getProductsWithPrice(schedule_date,
|
|
4166
|
+
const allProductsWithPrice = await this.products.getProductsWithPrice(schedule_date, {
|
|
4167
|
+
scheduleModule: this.getSchedule()
|
|
4168
|
+
}, {
|
|
4336
4169
|
changedIds: options == null ? void 0 : options.changedIds
|
|
4337
4170
|
});
|
|
4338
4171
|
(0, import_product.perfMark)("computeQuery.getProductsWithPrice(single)", performance.now() - tPrice2, {
|
|
@@ -4362,7 +4195,11 @@ var Server = class {
|
|
|
4362
4195
|
}
|
|
4363
4196
|
if (this.shouldQueryProductsByExtensionTypes(extension_type)) {
|
|
4364
4197
|
const tPrice2 = performance.now();
|
|
4365
|
-
let filteredProducts2 = await this.products.getProductsWithPrice(schedule_date,
|
|
4198
|
+
let filteredProducts2 = await this.products.getProductsWithPrice(schedule_date, {
|
|
4199
|
+
scheduleModule: this.getSchedule(),
|
|
4200
|
+
schedule_datetime,
|
|
4201
|
+
customer_id
|
|
4202
|
+
}, {
|
|
4366
4203
|
changedIds: options == null ? void 0 : options.changedIds
|
|
4367
4204
|
});
|
|
4368
4205
|
(0, import_product.perfMark)("computeQuery.getProductsWithPrice(extensionType)", performance.now() - tPrice2, {
|
|
@@ -4402,18 +4239,18 @@ var Server = class {
|
|
|
4402
4239
|
});
|
|
4403
4240
|
return {
|
|
4404
4241
|
code: 200,
|
|
4405
|
-
data:
|
|
4242
|
+
data: { list: filteredProducts2, count: filteredProducts2.length },
|
|
4406
4243
|
message: "",
|
|
4407
4244
|
status: true
|
|
4408
4245
|
};
|
|
4409
4246
|
}
|
|
4410
4247
|
if (!this.menu) {
|
|
4411
4248
|
this.logError("computeProductQueryResult: Menu 模块未注册");
|
|
4412
|
-
return { message: "Menu 模块未注册", data:
|
|
4249
|
+
return { message: "Menu 模块未注册", data: { list: [], count: 0 } };
|
|
4413
4250
|
}
|
|
4414
4251
|
if (!this.schedule) {
|
|
4415
4252
|
this.logError("computeProductQueryResult: Schedule 模块未注册");
|
|
4416
|
-
return { message: "Schedule 模块未注册", data:
|
|
4253
|
+
return { message: "Schedule 模块未注册", data: { list: [], count: 0 } };
|
|
4417
4254
|
}
|
|
4418
4255
|
let activeMenuList = [];
|
|
4419
4256
|
if (menu_list_ids && Array.isArray(menu_list_ids) && menu_list_ids.length > 0) {
|
|
@@ -4437,7 +4274,11 @@ var Server = class {
|
|
|
4437
4274
|
isAllProducts: !!productScope.isAllProducts
|
|
4438
4275
|
});
|
|
4439
4276
|
const tPrice = performance.now();
|
|
4440
|
-
let filteredProducts = scopedProductIds.length > 0 ? await this.products.getProductsWithPrice(schedule_date,
|
|
4277
|
+
let filteredProducts = scopedProductIds.length > 0 ? await this.products.getProductsWithPrice(schedule_date, {
|
|
4278
|
+
scheduleModule: this.getSchedule(),
|
|
4279
|
+
schedule_datetime,
|
|
4280
|
+
customer_id
|
|
4281
|
+
}, {
|
|
4441
4282
|
changedIds: options == null ? void 0 : options.changedIds,
|
|
4442
4283
|
productIds: productScope.isAllProducts ? void 0 : scopedProductIds
|
|
4443
4284
|
}) : [];
|
|
@@ -4480,29 +4321,11 @@ var Server = class {
|
|
|
4480
4321
|
});
|
|
4481
4322
|
return {
|
|
4482
4323
|
code: 200,
|
|
4483
|
-
data:
|
|
4324
|
+
data: { list: filteredProducts, count: filteredProducts.length },
|
|
4484
4325
|
message: "",
|
|
4485
4326
|
status: true
|
|
4486
4327
|
};
|
|
4487
4328
|
}
|
|
4488
|
-
/**
|
|
4489
|
-
* 构建商品格式化上下文。
|
|
4490
|
-
*
|
|
4491
|
-
* 智能定价条件使用全量 menuList/scheduleList;Product Query 顶层参数只保留筛选商品集合所需字段。
|
|
4492
|
-
*/
|
|
4493
|
-
buildProductFormatterContext(context) {
|
|
4494
|
-
var _a, _b, _c, _d;
|
|
4495
|
-
const scheduleModule = this.getSchedule();
|
|
4496
|
-
return {
|
|
4497
|
-
scheduleModule,
|
|
4498
|
-
schedule_datetime: context.schedule_datetime,
|
|
4499
|
-
customer_id: context.customer_id,
|
|
4500
|
-
strategy_context: context.strategy_context,
|
|
4501
|
-
menuList: ((_b = (_a = this.menu) == null ? void 0 : _a.getMenuList) == null ? void 0 : _b.call(_a)) || [],
|
|
4502
|
-
scheduleList: ((_c = scheduleModule == null ? void 0 : scheduleModule.getScheduleList) == null ? void 0 : _c.call(scheduleModule)) || [],
|
|
4503
|
-
dataVariantEvaluator: (_d = this.core.context) == null ? void 0 : _d.dataVariantEvaluator
|
|
4504
|
-
};
|
|
4505
|
-
}
|
|
4506
4329
|
/**
|
|
4507
4330
|
* 数据变更后,遍历所有订阅者重新计算查询结果并通过 callback 推送
|
|
4508
4331
|
* 由 ProductsModule 的 onProductsSyncCompleted 事件触发
|
|
@@ -18,8 +18,7 @@ export declare class ProductsModule extends BaseModule implements Module {
|
|
|
18
18
|
private productsPriceCache;
|
|
19
19
|
private readonly CACHE_MAX_DAYS;
|
|
20
20
|
private formatters;
|
|
21
|
-
private
|
|
22
|
-
private isLegacyPriceFormatterEnabled;
|
|
21
|
+
private isPriceFormatterRegistered;
|
|
23
22
|
private quotationPriceBridge?;
|
|
24
23
|
private quotationBridgeChannel?;
|
|
25
24
|
private quotationBridgeLoadedKey?;
|
|
@@ -37,8 +36,6 @@ export declare class ProductsModule extends BaseModule implements Module {
|
|
|
37
36
|
private lastPreloadCompletedAtMs;
|
|
38
37
|
/** IndexDB 写入串行队列,避免快照与 patch 并发交错 */
|
|
39
38
|
private productIndexDBSaveQueue;
|
|
40
|
-
/** 最近一次智能定价评估提取的 schedule 变价时间点(HH:mm),供 Server 订阅定时刷新使用 */
|
|
41
|
-
private lastScheduleTimePoints;
|
|
42
39
|
constructor(name?: string, version?: string);
|
|
43
40
|
initialize(core: PisellCore, options: any): Promise<void>;
|
|
44
41
|
/**
|
|
@@ -111,10 +108,6 @@ export declare class ProductsModule extends BaseModule implements Module {
|
|
|
111
108
|
*/
|
|
112
109
|
private prepareProductsWithPrice;
|
|
113
110
|
private getProductsPriceCacheKey;
|
|
114
|
-
/**
|
|
115
|
-
* 稳定序列化策略上下文,避免对象 key 顺序不同导致缓存 key 抖动。
|
|
116
|
-
*/
|
|
117
|
-
private stringifyStable;
|
|
118
111
|
private normalizeProductIds;
|
|
119
112
|
/**
|
|
120
113
|
* 按轻量范围返回商品 ID,不做 structuredClone。
|
|
@@ -129,26 +122,14 @@ export declare class ProductsModule extends BaseModule implements Module {
|
|
|
129
122
|
*/
|
|
130
123
|
private applyFormatters;
|
|
131
124
|
/**
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
* 智能定价默认替代报价单逻辑;报价单 formatter 仅在 enableLegacyPriceFormatter=true 时启用。
|
|
125
|
+
* 注册内置的价格格式化器
|
|
126
|
+
* 这个格式化器负责将价格数据应用到商品上
|
|
135
127
|
* @private
|
|
136
128
|
*/
|
|
137
|
-
private
|
|
138
|
-
/**
|
|
139
|
-
* 是否启用旧报价单价格 formatter。
|
|
140
|
-
*
|
|
141
|
-
* 默认关闭,避免报价单逻辑覆盖智能定价结果。
|
|
142
|
-
*/
|
|
143
|
-
private shouldEnableLegacyPriceFormatter;
|
|
144
|
-
/**
|
|
145
|
-
* 返回最近一次 prepareProductsWithPrice / DataVariant 评估提取的变价时间点(HH:mm)。
|
|
146
|
-
* 供 OS Server 商品 query 订阅定时刷新使用。
|
|
147
|
-
*/
|
|
148
|
-
getLastScheduleTimePoints(): string[];
|
|
129
|
+
private registerBuiltinPriceFormatter;
|
|
149
130
|
/**
|
|
150
131
|
* 注册商品格式化器
|
|
151
|
-
*
|
|
132
|
+
* 格式化器会按注册顺序依次执行(内置价格格式化器始终是第一个)
|
|
152
133
|
* @param formatter 格式化函数
|
|
153
134
|
* @param prepend 是否插入到队列开头(默认 false,追加到末尾)
|
|
154
135
|
* @example
|
|
@@ -163,8 +144,8 @@ export declare class ProductsModule extends BaseModule implements Module {
|
|
|
163
144
|
*/
|
|
164
145
|
registerFormatter(formatter: ProductFormatter, prepend?: boolean): void;
|
|
165
146
|
/**
|
|
166
|
-
*
|
|
167
|
-
* @param keepBuiltin
|
|
147
|
+
* 清空所有格式化器(包括内置价格格式化器)
|
|
148
|
+
* @param keepBuiltin 是否保留内置价格格式化器(默认 true)
|
|
168
149
|
*/
|
|
169
150
|
clearFormatters(keepBuiltin?: boolean): void;
|
|
170
151
|
/**
|