@pisell/pisellos 0.0.233 → 0.0.234

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.
@@ -11,7 +11,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
11
11
  initialize(core: PisellCore, options: ModuleOptions): Promise<void>;
12
12
  createOrder(params: CommitOrderParams['query']): {
13
13
  type: "virtual" | "appointment_booking";
14
- platform: "pc" | "h5";
14
+ platform: string;
15
15
  sales_channel: string;
16
16
  order_sales_channel: string;
17
17
  bookings: any[];
@@ -66,7 +66,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
66
66
  var order = {
67
67
  type: (params === null || params === void 0 ? void 0 : params.type) || 'appointment_booking',
68
68
  // 要从外面拿,virtual
69
- platform: (params === null || params === void 0 ? void 0 : params.platform) || 'pc',
69
+ platform: (params === null || params === void 0 ? void 0 : params.platform) === 'pc' ? 'PC' : 'H5',
70
70
  sales_channel: 'my_pisel',
71
71
  order_sales_channel: 'online_store',
72
72
  bookings: [],
@@ -107,29 +107,29 @@ export function findFastestAvailableResource(_ref2) {
107
107
  _step2;
108
108
  try {
109
109
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
110
- var resource = _step2.value;
110
+ var _resource = _step2.value;
111
111
  // 获取资源当天且还在工作时间内的时间段
112
- var todayTimes = resource.times.filter(function (time) {
112
+ var todayTimes = _resource.times.filter(function (time) {
113
113
  var isToday = dayjs(time.start_at).isSame(currentTime, 'day');
114
114
  var isStillWorking = dayjs(time.end_at).isAfter(currentTime);
115
115
  return isToday && isStillWorking;
116
116
  });
117
117
  if (todayTimes.length === 0) {
118
- console.log("[TimeslotUtils] \u8D44\u6E90 ".concat(resource.id, "(").concat(resource.main_field, ") \u4ECA\u65E5\u65E0\u53EF\u7528\u65F6\u95F4\u6BB5"));
118
+ console.log("[TimeslotUtils] \u8D44\u6E90 ".concat(_resource.id, "(").concat(_resource.main_field, ") \u4ECA\u65E5\u65E0\u53EF\u7528\u65F6\u95F4\u6BB5"));
119
119
  continue;
120
120
  }
121
- var _iterator3 = _createForOfIteratorHelper(todayTimes),
122
- _step3;
121
+ var _iterator4 = _createForOfIteratorHelper(todayTimes),
122
+ _step4;
123
123
  try {
124
124
  var _loop = function _loop() {
125
125
  var _time$event_list, _time$event_list2;
126
- var time = _step3.value;
126
+ var time = _step4.value;
127
127
  var workStartTime = dayjs(time.start_at);
128
128
  var workEndTime = dayjs(time.end_at);
129
129
 
130
130
  // 确定检查的起始时间(当前时间 vs 工作开始时间)
131
131
  var nextAvailableTime = currentTime.isBefore(workStartTime) ? workStartTime : currentTime;
132
- console.log("[TimeslotUtils] \u68C0\u67E5\u8D44\u6E90 ".concat(resource.id, "(").concat(resource.main_field, "):"), {
132
+ console.log("[TimeslotUtils] \u68C0\u67E5\u8D44\u6E90 ".concat(_resource.id, "(").concat(_resource.main_field, "):"), {
133
133
  workTime: "".concat(workStartTime.format('HH:mm'), "-").concat(workEndTime.format('HH:mm')),
134
134
  checkStartTime: nextAvailableTime.format('HH:mm:ss'),
135
135
  eventCount: ((_time$event_list = time.event_list) === null || _time$event_list === void 0 ? void 0 : _time$event_list.length) || 0
@@ -148,40 +148,40 @@ export function findFastestAvailableResource(_ref2) {
148
148
 
149
149
  // 检查从 nextAvailableTime 开始的可用性
150
150
  var finalAvailableTime = nextAvailableTime;
151
- var _iterator4 = _createForOfIteratorHelper(relevantEvents),
152
- _step4;
151
+ var _iterator5 = _createForOfIteratorHelper(relevantEvents),
152
+ _step5;
153
153
  try {
154
- for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
155
- var event = _step4.value;
156
- var eventStart = dayjs(event.start_at);
157
- var eventEnd = dayjs(event.end_at);
154
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
155
+ var _event = _step5.value;
156
+ var _eventStart = dayjs(_event.start_at);
157
+ var _eventEnd = dayjs(_event.end_at);
158
158
  console.log("[TimeslotUtils] \u68C0\u67E5\u4E8B\u4EF6\u51B2\u7A81:", {
159
- resourceId: resource.id,
160
- eventTime: "".concat(eventStart.format('HH:mm'), "-").concat(eventEnd.format('HH:mm')),
159
+ resourceId: _resource.id,
160
+ eventTime: "".concat(_eventStart.format('HH:mm'), "-").concat(_eventEnd.format('HH:mm')),
161
161
  checkTime: finalAvailableTime.format('HH:mm:ss'),
162
- pax: event.pax || 1
162
+ pax: _event.pax || 1
163
163
  });
164
164
 
165
165
  // 检查资源类型和容量
166
- if (resource.resourceType === 'single' || (resource.capacity || 1) === 1) {
166
+ if (_resource.resourceType === 'single' || (_resource.capacity || 1) === 1) {
167
167
  // 单人预约资源:检查时间冲突
168
- if (finalAvailableTime.isBefore(eventEnd) && eventStart.isBefore(finalAvailableTime.add(30, 'minute'))) {
168
+ if (finalAvailableTime.isBefore(_eventEnd) && _eventStart.isBefore(finalAvailableTime.add(30, 'minute'))) {
169
169
  // 有冲突,使用事件结束时间
170
- finalAvailableTime = eventEnd;
170
+ finalAvailableTime = _eventEnd;
171
171
  console.log("[TimeslotUtils] \u53D1\u73B0\u65F6\u95F4\u51B2\u7A81\uFF0C\u8C03\u6574\u5230: ".concat(finalAvailableTime.format('HH:mm:ss')));
172
172
  }
173
173
  } else {
174
174
  // 多人预约资源:检查容量
175
- var totalCapacity = resource.capacity || 0;
176
- var currentUsedCapacity = countMap[resource.id] || 0;
177
- var eventUsedCapacity = event.pax || 1;
175
+ var totalCapacity = _resource.capacity || 0;
176
+ var currentUsedCapacity = countMap[_resource.id] || 0;
177
+ var eventUsedCapacity = _event.pax || 1;
178
178
 
179
179
  // 如果在事件时间范围内,检查容量是否足够
180
- if (finalAvailableTime.isBefore(eventEnd) && eventStart.isBefore(finalAvailableTime.add(30, 'minute'))) {
180
+ if (finalAvailableTime.isBefore(_eventEnd) && _eventStart.isBefore(finalAvailableTime.add(30, 'minute'))) {
181
181
  var totalRequiredCapacity = currentUsedCapacity + currentCapacity + eventUsedCapacity;
182
182
  if (totalRequiredCapacity > totalCapacity) {
183
183
  // 容量不足,使用事件结束时间
184
- finalAvailableTime = eventEnd;
184
+ finalAvailableTime = _eventEnd;
185
185
  console.log("[TimeslotUtils] \u5BB9\u91CF\u4E0D\u8DB3\uFF0C\u8C03\u6574\u5230: ".concat(finalAvailableTime.format('HH:mm:ss')));
186
186
  }
187
187
  }
@@ -190,38 +190,38 @@ export function findFastestAvailableResource(_ref2) {
190
190
 
191
191
  // 确保可用时间在工作时间内
192
192
  } catch (err) {
193
- _iterator4.e(err);
193
+ _iterator5.e(err);
194
194
  } finally {
195
- _iterator4.f();
195
+ _iterator5.f();
196
196
  }
197
197
  if (finalAvailableTime.isAfter(workEndTime)) {
198
- console.log("[TimeslotUtils] \u8D44\u6E90 ".concat(resource.id, " \u53EF\u7528\u65F6\u95F4\u8D85\u51FA\u5DE5\u4F5C\u65F6\u95F4\uFF0C\u8DF3\u8FC7"));
198
+ console.log("[TimeslotUtils] \u8D44\u6E90 ".concat(_resource.id, " \u53EF\u7528\u65F6\u95F4\u8D85\u51FA\u5DE5\u4F5C\u65F6\u95F4\uFF0C\u8DF3\u8FC7"));
199
199
  return 0; // continue
200
200
  }
201
- console.log("[TimeslotUtils] \u8D44\u6E90 ".concat(resource.id, "(").concat(resource.main_field, ") \u6700\u5FEB\u53EF\u7528\u65F6\u95F4: ").concat(finalAvailableTime.format('HH:mm:ss')));
201
+ console.log("[TimeslotUtils] \u8D44\u6E90 ".concat(_resource.id, "(").concat(_resource.main_field, ") \u6700\u5FEB\u53EF\u7528\u65F6\u95F4: ").concat(finalAvailableTime.format('HH:mm:ss')));
202
202
 
203
203
  // 更新最快可用时间和资源
204
204
  if (!fastestTime || finalAvailableTime.isBefore(fastestTime)) {
205
205
  fastestTime = finalAvailableTime;
206
- fastestResources = [resource];
207
- console.log("[TimeslotUtils] \u66F4\u65B0\u6700\u5FEB\u65F6\u95F4: ".concat(fastestTime.format('HH:mm:ss'), ", \u8D44\u6E90: ").concat(resource.main_field));
206
+ fastestResources = [_resource];
207
+ console.log("[TimeslotUtils] \u66F4\u65B0\u6700\u5FEB\u65F6\u95F4: ".concat(fastestTime.format('HH:mm:ss'), ", \u8D44\u6E90: ").concat(_resource.main_field));
208
208
  } else if (finalAvailableTime.isSame(fastestTime)) {
209
- fastestResources.push(resource);
210
- console.log("[TimeslotUtils] \u6DFB\u52A0\u76F8\u540C\u65F6\u95F4\u8D44\u6E90: ".concat(resource.main_field));
209
+ fastestResources.push(_resource);
210
+ console.log("[TimeslotUtils] \u6DFB\u52A0\u76F8\u540C\u65F6\u95F4\u8D44\u6E90: ".concat(_resource.main_field));
211
211
  }
212
212
  return 1; // break
213
213
  // 每个资源只需要计算一次
214
214
  },
215
215
  _ret;
216
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
216
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
217
217
  _ret = _loop();
218
218
  if (_ret === 0) continue;
219
219
  if (_ret === 1) break;
220
220
  }
221
221
  } catch (err) {
222
- _iterator3.e(err);
222
+ _iterator4.e(err);
223
223
  } finally {
224
- _iterator3.f();
224
+ _iterator4.f();
225
225
  }
226
226
  }
227
227
 
@@ -243,10 +243,60 @@ export function findFastestAvailableResource(_ref2) {
243
243
  return fastestResources[0];
244
244
  }
245
245
 
246
- // 如果有多个最快可用的资源,选择第一个或根据其他逻辑选择
247
- // 这里简化处理,直接返回第一个
246
+ // 如果有多个最快可用的资源,选择空闲时间最长的资源
248
247
  var selectedResource = fastestResources[0];
249
- console.log("[TimeslotUtils] \u8FD4\u56DE\u591A\u4E2A\u8D44\u6E90\u4E2D\u7684\u7B2C\u4E00\u4E2A: ".concat(selectedResource.main_field));
248
+ var maxIdleTime = 0;
249
+ console.log("[TimeslotUtils] \u6BD4\u8F83 ".concat(fastestResources.length, " \u4E2A\u8D44\u6E90\u7684\u7A7A\u95F2\u65F6\u95F4:"));
250
+ for (var _i2 = 0, _fastestResources = fastestResources; _i2 < _fastestResources.length; _i2++) {
251
+ var _workingTime$event_li;
252
+ var resource = _fastestResources[_i2];
253
+ // 找到该资源当天且还在工作的时间段
254
+ var workingTime = resource.times.find(function (time) {
255
+ var isToday = dayjs(time.start_at).isSame(fastestTime, 'day');
256
+ var isStillWorking = dayjs(time.end_at).isAfter(fastestTime);
257
+ return isToday && isStillWorking;
258
+ });
259
+ if (!workingTime) continue;
260
+ var workEndTime = dayjs(workingTime.end_at);
261
+
262
+ // 计算从最快可用时间到工作结束时间的空闲时长(分钟)
263
+ var totalIdleTime = workEndTime.diff(fastestTime, 'minute');
264
+
265
+ // 减去已有预约占用的时间
266
+ var relevantEvents = ((_workingTime$event_li = workingTime.event_list) === null || _workingTime$event_li === void 0 ? void 0 : _workingTime$event_li.filter(function (event) {
267
+ var eventStart = dayjs(event.start_at);
268
+ var eventEnd = dayjs(event.end_at);
269
+ // 只计算在最快可用时间之后的预约
270
+ return eventEnd.isAfter(fastestTime) && eventStart.isAfter(fastestTime);
271
+ })) || [];
272
+ var _iterator3 = _createForOfIteratorHelper(relevantEvents),
273
+ _step3;
274
+ try {
275
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
276
+ var event = _step3.value;
277
+ var eventStart = dayjs(event.start_at);
278
+ var eventEnd = dayjs(event.end_at);
279
+ var eventDuration = eventEnd.diff(eventStart, 'minute');
280
+ totalIdleTime -= eventDuration;
281
+ }
282
+ } catch (err) {
283
+ _iterator3.e(err);
284
+ } finally {
285
+ _iterator3.f();
286
+ }
287
+ console.log("[TimeslotUtils] \u8D44\u6E90 ".concat(resource.id, "(").concat(resource.main_field, "):"), {
288
+ 工作结束时间: workEndTime.format('HH:mm'),
289
+ 总工作时长: workEndTime.diff(fastestTime, 'minute') + '分钟',
290
+ 预约占用时长: workEndTime.diff(fastestTime, 'minute') - totalIdleTime + '分钟',
291
+ 实际空闲时长: totalIdleTime + '分钟'
292
+ });
293
+ if (totalIdleTime > maxIdleTime) {
294
+ maxIdleTime = totalIdleTime;
295
+ selectedResource = resource;
296
+ console.log("[TimeslotUtils] \u66F4\u65B0\u6700\u4F73\u9009\u62E9: ".concat(resource.main_field, " (\u7A7A\u95F2").concat(totalIdleTime, "\u5206\u949F)"));
297
+ }
298
+ }
299
+ console.log("[TimeslotUtils] \u6700\u7EC8\u9009\u62E9\u8D44\u6E90: ".concat(selectedResource.main_field, " (\u6700\u957F\u7A7A\u95F2").concat(maxIdleTime, "\u5206\u949F)"));
250
300
  return selectedResource;
251
301
  }
252
302
 
@@ -111,7 +111,7 @@ export declare class BookingTicketImpl extends BaseModule implements Module {
111
111
  * 获取当前的客户搜索条件
112
112
  * @returns 当前搜索条件
113
113
  */
114
- getCurrentCustomerSearchParams(): Omit<import("../../modules").ShopGetCustomerListParams, "num" | "skip">;
114
+ getCurrentCustomerSearchParams(): Omit<import("../../modules").ShopGetCustomerListParams, "skip" | "num">;
115
115
  /**
116
116
  * 获取客户列表状态(包含滚动加载相关状态)
117
117
  * @returns 客户状态
@@ -11,7 +11,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
11
11
  initialize(core: PisellCore, options: ModuleOptions): Promise<void>;
12
12
  createOrder(params: CommitOrderParams['query']): {
13
13
  type: "virtual" | "appointment_booking";
14
- platform: "pc" | "h5";
14
+ platform: string;
15
15
  sales_channel: string;
16
16
  order_sales_channel: string;
17
17
  bookings: any[];
@@ -41,7 +41,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
41
41
  const order = {
42
42
  type: (params == null ? void 0 : params.type) || "appointment_booking",
43
43
  // 要从外面拿,virtual
44
- platform: (params == null ? void 0 : params.platform) || "pc",
44
+ platform: (params == null ? void 0 : params.platform) === "pc" ? "PC" : "H5",
45
45
  sales_channel: "my_pisel",
46
46
  order_sales_channel: "online_store",
47
47
  bookings: [],
@@ -79,7 +79,7 @@ function findFastestAvailableResource({
79
79
  currentCapacity = 1,
80
80
  countMap = {}
81
81
  }) {
82
- var _a, _b;
82
+ var _a, _b, _c;
83
83
  const currentTime = (0, import_dayjs.default)();
84
84
  let fastestTime = null;
85
85
  let fastestResources = [];
@@ -168,8 +168,43 @@ function findFastestAvailableResource({
168
168
  console.log(`[TimeslotUtils] 返回唯一最快资源: ${fastestResources[0].main_field}`);
169
169
  return fastestResources[0];
170
170
  }
171
- const selectedResource = fastestResources[0];
172
- console.log(`[TimeslotUtils] 返回多个资源中的第一个: ${selectedResource.main_field}`);
171
+ let selectedResource = fastestResources[0];
172
+ let maxIdleTime = 0;
173
+ console.log(`[TimeslotUtils] 比较 ${fastestResources.length} 个资源的空闲时间:`);
174
+ for (const resource of fastestResources) {
175
+ const workingTime = resource.times.find((time) => {
176
+ const isToday = (0, import_dayjs.default)(time.start_at).isSame(fastestTime, "day");
177
+ const isStillWorking = (0, import_dayjs.default)(time.end_at).isAfter(fastestTime);
178
+ return isToday && isStillWorking;
179
+ });
180
+ if (!workingTime)
181
+ continue;
182
+ const workEndTime = (0, import_dayjs.default)(workingTime.end_at);
183
+ let totalIdleTime = workEndTime.diff(fastestTime, "minute");
184
+ const relevantEvents = ((_c = workingTime.event_list) == null ? void 0 : _c.filter((event) => {
185
+ const eventStart = (0, import_dayjs.default)(event.start_at);
186
+ const eventEnd = (0, import_dayjs.default)(event.end_at);
187
+ return eventEnd.isAfter(fastestTime) && eventStart.isAfter(fastestTime);
188
+ })) || [];
189
+ for (const event of relevantEvents) {
190
+ const eventStart = (0, import_dayjs.default)(event.start_at);
191
+ const eventEnd = (0, import_dayjs.default)(event.end_at);
192
+ const eventDuration = eventEnd.diff(eventStart, "minute");
193
+ totalIdleTime -= eventDuration;
194
+ }
195
+ console.log(`[TimeslotUtils] 资源 ${resource.id}(${resource.main_field}):`, {
196
+ 工作结束时间: workEndTime.format("HH:mm"),
197
+ 总工作时长: workEndTime.diff(fastestTime, "minute") + "分钟",
198
+ 预约占用时长: workEndTime.diff(fastestTime, "minute") - totalIdleTime + "分钟",
199
+ 实际空闲时长: totalIdleTime + "分钟"
200
+ });
201
+ if (totalIdleTime > maxIdleTime) {
202
+ maxIdleTime = totalIdleTime;
203
+ selectedResource = resource;
204
+ console.log(`[TimeslotUtils] 更新最佳选择: ${resource.main_field} (空闲${totalIdleTime}分钟)`);
205
+ }
206
+ }
207
+ console.log(`[TimeslotUtils] 最终选择资源: ${selectedResource.main_field} (最长空闲${maxIdleTime}分钟)`);
173
208
  return selectedResource;
174
209
  }
175
210
  function filterConditionTimeSlots(times, startTime, endTime) {
@@ -111,7 +111,7 @@ export declare class BookingTicketImpl extends BaseModule implements Module {
111
111
  * 获取当前的客户搜索条件
112
112
  * @returns 当前搜索条件
113
113
  */
114
- getCurrentCustomerSearchParams(): Omit<import("../../modules").ShopGetCustomerListParams, "num" | "skip">;
114
+ getCurrentCustomerSearchParams(): Omit<import("../../modules").ShopGetCustomerListParams, "skip" | "num">;
115
115
  /**
116
116
  * 获取客户列表状态(包含滚动加载相关状态)
117
117
  * @returns 客户状态
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "private": false,
3
3
  "name": "@pisell/pisellos",
4
- "version": "0.0.233",
4
+ "version": "0.0.234",
5
5
  "description": "一个可扩展的前端模块化SDK框架,支持插件系统",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",