@pisell/pisellos 2.2.97 → 2.2.99

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.
Files changed (44) hide show
  1. package/dist/model/strategy/adapter/walletPass/type.d.ts +2 -2
  2. package/dist/model/strategy/adapter/walletPass/utils.js +70 -57
  3. package/dist/modules/Order/index.d.ts +1 -1
  4. package/dist/server/index.d.ts +30 -0
  5. package/dist/server/index.js +660 -330
  6. package/dist/server/modules/floor-plan/index.d.ts +39 -0
  7. package/dist/server/modules/floor-plan/index.js +595 -0
  8. package/dist/server/modules/floor-plan/types.d.ts +43 -0
  9. package/dist/server/modules/floor-plan/types.js +13 -0
  10. package/dist/server/modules/index.d.ts +3 -0
  11. package/dist/server/modules/index.js +4 -0
  12. package/dist/server/modules/order/types.d.ts +13 -1
  13. package/dist/server/modules/order/types.js +2 -1
  14. package/dist/server/modules/order/utils/filterBookings.d.ts +7 -1
  15. package/dist/server/modules/order/utils/filterBookings.js +64 -4
  16. package/dist/server/modules/resource/index.d.ts +0 -5
  17. package/dist/server/modules/resource/index.js +186 -269
  18. package/dist/server/types.d.ts +2 -0
  19. package/dist/solution/BookingByStep/index.d.ts +1 -1
  20. package/dist/solution/Sales/index.d.ts +2 -1
  21. package/dist/solution/Sales/index.js +23 -10
  22. package/dist/solution/Sales/types.d.ts +1 -1
  23. package/lib/model/strategy/adapter/walletPass/type.d.ts +2 -2
  24. package/lib/model/strategy/adapter/walletPass/utils.js +58 -51
  25. package/lib/modules/Order/index.d.ts +1 -1
  26. package/lib/server/index.d.ts +30 -0
  27. package/lib/server/index.js +202 -9
  28. package/lib/server/modules/floor-plan/index.d.ts +39 -0
  29. package/lib/server/modules/floor-plan/index.js +327 -0
  30. package/lib/server/modules/floor-plan/types.d.ts +43 -0
  31. package/lib/server/modules/floor-plan/types.js +34 -0
  32. package/lib/server/modules/index.d.ts +3 -0
  33. package/lib/server/modules/index.js +6 -0
  34. package/lib/server/modules/order/types.d.ts +13 -1
  35. package/lib/server/modules/order/utils/filterBookings.d.ts +7 -1
  36. package/lib/server/modules/order/utils/filterBookings.js +69 -3
  37. package/lib/server/modules/resource/index.d.ts +0 -5
  38. package/lib/server/modules/resource/index.js +60 -73
  39. package/lib/server/types.d.ts +2 -0
  40. package/lib/solution/BookingByStep/index.d.ts +1 -1
  41. package/lib/solution/Sales/index.d.ts +2 -1
  42. package/lib/solution/Sales/index.js +11 -4
  43. package/lib/solution/Sales/types.d.ts +1 -1
  44. package/package.json +1 -1
@@ -0,0 +1,43 @@
1
+ /**
2
+ * 平面图(floor-plan)Server 模块类型
3
+ * 与 GET /shop/schedule/floor-plan 系列接口数据结构对齐
4
+ */
5
+ export interface FloorPlanItem {
6
+ id: number;
7
+ shop_id?: number;
8
+ code: string;
9
+ name: string | Record<string, string>;
10
+ layout: unknown[];
11
+ canvas_width: number;
12
+ canvas_height: number;
13
+ sort: number;
14
+ status: number;
15
+ created_at?: string;
16
+ updated_at?: string;
17
+ }
18
+ export interface FloorPlanState {
19
+ list: FloorPlanItem[];
20
+ map: Map<string, FloorPlanItem>;
21
+ codeMap: Map<string, FloorPlanItem>;
22
+ }
23
+ /** pubsub / Ably 推送消息(与《平面图编辑器API文档》Socket 一节一致) */
24
+ export interface FloorPlanSyncMessage {
25
+ module?: string;
26
+ action?: string;
27
+ operation?: string;
28
+ id?: number;
29
+ ids?: number[];
30
+ body?: Partial<FloorPlanItem> & {
31
+ id?: number;
32
+ };
33
+ message_uuid?: string;
34
+ timestamp?: string;
35
+ _channelKey?: string;
36
+ }
37
+ export declare const FloorPlanHooks: {
38
+ /** 本地列表变更(预加载、合并、删除后) */
39
+ readonly onFloorPlansChanged: "server_floor_plan:onFloorPlansChanged";
40
+ /** pubsub 同步处理完成,供 Server 向订阅者推送最新查询结果 */
41
+ readonly onFloorPlanSyncCompleted: "server_floor_plan:onFloorPlanSyncCompleted";
42
+ };
43
+ export type FloorPlanHooksType = (typeof FloorPlanHooks)[keyof typeof FloorPlanHooks];
@@ -0,0 +1,13 @@
1
+ /**
2
+ * 平面图(floor-plan)Server 模块类型
3
+ * 与 GET /shop/schedule/floor-plan 系列接口数据结构对齐
4
+ */
5
+
6
+ /** pubsub / Ably 推送消息(与《平面图编辑器API文档》Socket 一节一致) */
7
+
8
+ export var FloorPlanHooks = {
9
+ /** 本地列表变更(预加载、合并、删除后) */
10
+ onFloorPlansChanged: 'server_floor_plan:onFloorPlansChanged',
11
+ /** pubsub 同步处理完成,供 Server 向订阅者推送最新查询结果 */
12
+ onFloorPlanSyncCompleted: 'server_floor_plan:onFloorPlanSyncCompleted'
13
+ };
@@ -16,6 +16,9 @@ export type { ScheduleState, ScheduleItem } from './schedule/types';
16
16
  export { OrderModule } from './order';
17
17
  export type { OrderState, OrderData, OrderId, OrderSummary, OrderBookingItem, OrderProductLineItem, OrderPaymentItem, OrderSurchargeItem, OrderProductDiscountItem, OrderWithoutBookings, BookingData, OrderFilters, BookingFilters, OrderFilterResult, BookingFilterResult, OrderModulePagedResult, } from './order/types';
18
18
  export { OrderHooks } from './order/types';
19
+ export { FloorPlanModule } from './floor-plan';
20
+ export type { FloorPlanItem, FloorPlanState, FloorPlanSyncMessage } from './floor-plan/types';
21
+ export { FloorPlanHooks } from './floor-plan/types';
19
22
  export { ResourceModule, resourceModule } from './resource';
20
23
  export type { ResourceState, ResourceData, ResourceId, ResourceBooking, ResourcePageQuery, ResourcePageResult, QueryOptions, ScheduleEventResource, } from './resource';
21
24
  export { ResourceHooks } from './resource';
@@ -21,6 +21,10 @@ export { ScheduleModuleEx } from "./schedule";
21
21
  export { OrderModule } from "./order";
22
22
  export { OrderHooks } from "./order/types";
23
23
 
24
+ // 平面图(floor-plan)
25
+ export { FloorPlanModule } from "./floor-plan";
26
+ export { FloorPlanHooks } from "./floor-plan/types";
27
+
24
28
  // Resource 模块
25
29
  export { ResourceModule, resourceModule } from "./resource";
26
30
  export { ResourceHooks } from "./resource";
@@ -121,6 +121,8 @@ export interface OrderProductLineItem {
121
121
  product_bundle?: OrderProductBundleItem[];
122
122
  /** 元数据;含 unique_identification_number。来源:Detail.metadata */
123
123
  metadata?: OrderProductMetadata | null;
124
+ /** 关联子预约 ID(仅输出,预约订单场景)。来源:Detail.schedule_event_id */
125
+ schedule_event_id?: number | null;
124
126
  }
125
127
  /** 预约条目 metadata,常含 unique_identification_number */
126
128
  export interface OrderBookingMetadata {
@@ -188,6 +190,14 @@ export interface OrderBookingItem {
188
190
  holder?: Record<string, unknown> | null;
189
191
  /** 元数据;含 unique_identification_number。来源:ScheduleEvent.metadata */
190
192
  metadata?: OrderBookingMetadata | null;
193
+ /**
194
+ * 与订单明细等资源的关联(如 resource_type 为订单 Detail 时 resource_id 对应 order_detail_id)。
195
+ * 来源:服务端 ScheduleEvent 关联表。
196
+ */
197
+ relation_items?: {
198
+ resource_id?: number | null;
199
+ [key: string]: unknown;
200
+ }[];
191
201
  }
192
202
  /** 支付记录 metadata,常含 unique_payment_number */
193
203
  export interface OrderPaymentMetadata {
@@ -391,10 +401,12 @@ export interface OrderData {
391
401
  /** 去掉 bookings 后的订单快照;展开预约行时挂在 {@link BookingData.order} 上 */
392
402
  export type OrderWithoutBookings = Omit<OrderData, 'bookings'>;
393
403
  /**
394
- * 展开后的单条预约视图:协议 {@link OrderBookingItem} 平铺字段 + 所属订单(不含 bookings
404
+ * 展开后的单条预约视图:协议 {@link OrderBookingItem} 平铺字段 + 所属订单(不含 bookings)+
405
+ * 当前预约归属的商品行(由订单 products 按 schedule_event_id / relation_items 归集,不修改 order)
395
406
  */
396
407
  export type BookingData = OrderBookingItem & {
397
408
  order: OrderWithoutBookings;
409
+ products: OrderProductLineItem[];
398
410
  };
399
411
  /**
400
412
  * 订单列表筛选条件(与 order.ts getFilterButtonList 等 UI 对齐)
@@ -97,7 +97,8 @@
97
97
  /** 去掉 bookings 后的订单快照;展开预约行时挂在 {@link BookingData.order} 上 */
98
98
 
99
99
  /**
100
- * 展开后的单条预约视图:协议 {@link OrderBookingItem} 平铺字段 + 所属订单(不含 bookings
100
+ * 展开后的单条预约视图:协议 {@link OrderBookingItem} 平铺字段 + 所属订单(不含 bookings)+
101
+ * 当前预约归属的商品行(由订单 products 按 schedule_event_id / relation_items 归集,不修改 order)
101
102
  */
102
103
 
103
104
  /**
@@ -1,5 +1,11 @@
1
- import type { BookingData, BookingFilters, BookingFilterResult, OrderData } from '../types';
1
+ import type { BookingData, BookingFilters, BookingFilterResult, OrderBookingItem, OrderData, OrderProductLineItem } from '../types';
2
2
  export type { BookingData, BookingFilters, BookingFilterResult } from '../types';
3
+ /**
4
+ * 从整单 `order.products` 中归集属于指定 `booking` 的明细行。
5
+ * - 第一遍:`product.schedule_event_id === booking.schedule_event_id`(保持 products 原顺序)
6
+ * - 第二遍:按 `relation_items` 顺序追加 `resource_id` 与 `order_detail_id` 匹配且尚未收录的行
7
+ */
8
+ export declare function productsForBooking(order: OrderData, booking: OrderBookingItem): OrderProductLineItem[];
3
9
  export declare function flattenOrdersToBookings(orders: OrderData[]): BookingData[];
4
10
  export declare function filterBookingsFromOrders(orders: OrderData[], filters: BookingFilters): BookingFilterResult;
5
11
  export declare function sortBookings(result: BookingFilterResult, filters: BookingFilters): BookingFilterResult;
@@ -180,6 +180,61 @@ function matchBooking(booking, orderInfo, ctx) {
180
180
  return true;
181
181
  }
182
182
 
183
+ // ─────────────────────────────────────────────────────────────────
184
+ // 当前预约归属商品:先按 schedule_event_id 命中,再按 relation_items.resource_id 追加(去重保序)
185
+ // ─────────────────────────────────────────────────────────────────
186
+
187
+ /**
188
+ * 从整单 `order.products` 中归集属于指定 `booking` 的明细行。
189
+ * - 第一遍:`product.schedule_event_id === booking.schedule_event_id`(保持 products 原顺序)
190
+ * - 第二遍:按 `relation_items` 顺序追加 `resource_id` 与 `order_detail_id` 匹配且尚未收录的行
191
+ */
192
+ export function productsForBooking(order, booking) {
193
+ var products = order.products;
194
+ if (!Array.isArray(products) || products.length === 0) return [];
195
+ var bookingEventId = booking.schedule_event_id;
196
+ var byDetailId = new Map();
197
+ for (var i = 0, len = products.length; i < len; i++) {
198
+ var p = products[i];
199
+ var oid = p.order_detail_id;
200
+ if (oid === undefined || oid === null) continue;
201
+ var detailId = Number(oid);
202
+ if (Number.isNaN(detailId)) continue;
203
+ byDetailId.set(detailId, p);
204
+ }
205
+ var seen = new Set();
206
+ var out = [];
207
+ for (var _i = 0, _len = products.length; _i < _len; _i++) {
208
+ var _p = products[_i];
209
+ var _oid = _p.order_detail_id;
210
+ if (_oid === undefined || _oid === null) continue;
211
+ var _detailId = Number(_oid);
212
+ if (Number.isNaN(_detailId)) continue;
213
+ if (bookingEventId !== undefined && bookingEventId !== null && _p.schedule_event_id !== undefined && _p.schedule_event_id !== null && Number(_p.schedule_event_id) === Number(bookingEventId)) {
214
+ if (!seen.has(_detailId)) {
215
+ seen.add(_detailId);
216
+ out.push(_p);
217
+ }
218
+ }
219
+ }
220
+ var relationItems = booking.relation_items;
221
+ if (Array.isArray(relationItems) && relationItems.length > 0) {
222
+ for (var r = 0, rLen = relationItems.length; r < rLen; r++) {
223
+ var _relationItems$r;
224
+ var rid = (_relationItems$r = relationItems[r]) === null || _relationItems$r === void 0 ? void 0 : _relationItems$r.resource_id;
225
+ if (rid === undefined || rid === null) continue;
226
+ var _detailId2 = Number(rid);
227
+ if (Number.isNaN(_detailId2) || seen.has(_detailId2)) continue;
228
+ var line = byDetailId.get(_detailId2);
229
+ if (line) {
230
+ seen.add(_detailId2);
231
+ out.push(line);
232
+ }
233
+ }
234
+ }
235
+ return out;
236
+ }
237
+
183
238
  // ─────────────────────────────────────────────────────────────────
184
239
  // 转换:OrderData[] → BookingData[](独立导出,供其他场景使用)
185
240
  // ─────────────────────────────────────────────────────────────────
@@ -194,8 +249,10 @@ export function flattenOrdersToBookings(orders) {
194
249
  var _omit = order.bookings,
195
250
  orderInfo = _objectWithoutProperties(order, _excluded);
196
251
  for (var j = 0, bLen = bookings.length; j < bLen; j++) {
197
- result.push(_objectSpread(_objectSpread({}, bookings[j]), {}, {
198
- order: orderInfo
252
+ var booking = bookings[j];
253
+ result.push(_objectSpread(_objectSpread({}, booking), {}, {
254
+ order: orderInfo,
255
+ products: productsForBooking(order, booking)
199
256
  }));
200
257
  }
201
258
  }
@@ -256,7 +313,8 @@ export function filterBookingsFromOrders(orders, filters) {
256
313
  orderInfo = _rest;
257
314
  }
258
315
  paginatedList.push(_objectSpread(_objectSpread({}, booking), {}, {
259
- order: orderInfo
316
+ order: orderInfo,
317
+ products: productsForBooking(order, booking)
260
318
  }));
261
319
  }
262
320
  totalCount++;
@@ -337,7 +395,9 @@ export function filterBookings(bookings, filters) {
337
395
  if (!matchOrder(order, ctx)) continue;
338
396
  if (!matchBooking(booking, order, ctx)) continue;
339
397
  if (totalCount >= startIndex && paginatedList.length < size) {
340
- paginatedList.push(booking);
398
+ paginatedList.push(_objectSpread(_objectSpread({}, booking), {}, {
399
+ products: productsForBooking(booking.order, booking)
400
+ }));
341
401
  }
342
402
  totalCount++;
343
403
  }
@@ -50,15 +50,12 @@ export declare class ResourceModule extends BaseModule implements Module {
50
50
  /**
51
51
  * 创建预订
52
52
  */
53
- createBooking(booking: Partial<ResourceBooking>): ResourceBooking;
54
53
  /**
55
54
  * 更新预订
56
55
  */
57
- updateBooking(id: ResourceId, data: Partial<ResourceBooking>): ResourceBooking | undefined;
58
56
  /**
59
57
  * 删除预订
60
58
  */
61
- deleteBooking(id: ResourceId): boolean;
62
59
  /**
63
60
  * 清空缓存
64
61
  */
@@ -73,8 +70,6 @@ export declare class ResourceModule extends BaseModule implements Module {
73
70
  private loadResourcesByServer;
74
71
  private loadResourcesFromSQLite;
75
72
  private saveResourcesToSQLite;
76
- private loadBookingsFromSQLite;
77
- private saveBookingsToSQLite;
78
73
  private initResourceDataSource;
79
74
  private setupResourceSync;
80
75
  private processSyncMessages;