@pisell/pisellos 2.3.74 → 2.3.75
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/core/index.js +6 -10
- package/dist/model/strategy/adapter/promotion/index.js +9 -0
- package/dist/model/strategy/adapter/walletPass/example.js +3 -26
- package/dist/model/strategy/strategy-example.js +5 -19
- package/dist/modules/Cart/index.js +0 -3
- package/dist/modules/Cart/utils/cartProduct.js +0 -1
- package/dist/modules/Date/index.js +1 -5
- package/dist/modules/Discount/index.js +2 -4
- package/dist/modules/OpenData/index.js +0 -2
- package/dist/modules/Order/index.js +36 -64
- package/dist/modules/Payment/index.js +97 -162
- package/dist/modules/Rules/index.js +1 -4
- package/dist/modules/Schedule/index.js +0 -1
- package/dist/modules/Schedule/utils.js +0 -1
- package/dist/modules/Step/index.js +0 -1
- package/dist/plugins/request.js +1 -4
- package/dist/plugins/window.js +2 -6
- package/dist/server/index.js +97 -129
- package/dist/server/modules/menu/index.js +32 -41
- package/dist/server/modules/order/index.js +2 -4
- package/dist/server/modules/products/index.js +24 -42
- package/dist/server/modules/quotation/index.js +29 -38
- package/dist/server/modules/resource/index.js +3 -4
- package/dist/server/modules/schedule/index.js +27 -35
- package/dist/server/utils/product.js +0 -1
- package/dist/solution/BaseSales/index.js +38 -41
- package/dist/solution/BookingByStep/index.js +7 -59
- package/dist/solution/BookingByStep/utils/capacity.js +1 -11
- package/dist/solution/BookingByStep/utils/resources.js +1 -3
- package/dist/solution/BookingByStep/utils/timeslots.js +2 -43
- package/dist/solution/BookingTicket/index.js +0 -2
- package/dist/solution/BookingTicket/utils/scan/cloudSearch.js +6 -7
- package/dist/solution/BookingTicket/utils/scan/handleScan.js +25 -31
- package/dist/solution/BookingTicket/utils/scan/index.js +6 -10
- package/dist/solution/BuyTickets/index.js +9 -12
- package/dist/solution/Checkout/index.js +177 -252
- package/dist/solution/Checkout/utils/index.js +4 -16
- package/dist/solution/RegisterAndLogin/index.js +30 -76
- package/dist/solution/ScanOrder/index.js +50 -60
- package/dist/solution/ShopDiscount/index.js +2 -7
- package/dist/solution/VenueBooking/index.js +45 -55
- package/dist/utils/task.js +15 -18
- package/dist/utils/watch.js +0 -1
- package/lib/apis/picoding.js +2 -0
- package/lib/core/index.js +134 -134
- package/lib/effects/index.js +46 -57
- package/lib/index.js +82 -49
- package/lib/model/index.js +14 -21
- package/lib/model/strategy/adapter/dataVariant/adapter.js +38 -50
- package/lib/model/strategy/adapter/dataVariant/evaluator.js +162 -236
- package/lib/model/strategy/adapter/dataVariant/examples.js +229 -237
- package/lib/model/strategy/adapter/dataVariant/index.js +39 -34
- package/lib/model/strategy/adapter/dataVariant/type.js +57 -28
- package/lib/model/strategy/adapter/index.js +100 -64
- package/lib/model/strategy/adapter/itemRule/adapter.js +156 -144
- package/lib/model/strategy/adapter/itemRule/evaluator.js +36 -48
- package/lib/model/strategy/adapter/itemRule/examples.js +295 -225
- package/lib/model/strategy/adapter/itemRule/index.js +83 -57
- package/lib/model/strategy/adapter/itemRule/type.js +97 -36
- package/lib/model/strategy/adapter/promotion/adapter.js +91 -69
- package/lib/model/strategy/adapter/promotion/evaluator.js +444 -310
- package/lib/model/strategy/adapter/promotion/examples.js +222 -234
- package/lib/model/strategy/adapter/promotion/index.js +1 -0
- package/lib/model/strategy/adapter/promotion/type.js +243 -36
- package/lib/model/strategy/adapter/type.js +4 -16
- package/lib/model/strategy/adapter/walletPass/evaluator.js +180 -150
- package/lib/model/strategy/adapter/walletPass/example.js +217 -190
- package/lib/model/strategy/adapter/walletPass/index.js +75 -51
- package/lib/model/strategy/adapter/walletPass/locales.js +36 -58
- package/lib/model/strategy/adapter/walletPass/type.js +4 -16
- package/lib/model/strategy/adapter/walletPass/utils.js +588 -378
- package/lib/model/strategy/engine.js +270 -168
- package/lib/model/strategy/index.js +49 -34
- package/lib/model/strategy/strategy-example.js +243 -239
- package/lib/model/strategy/type.js +100 -40
- package/lib/modules/Account/index.js +39 -53
- package/lib/modules/Account/types.js +20 -33
- package/lib/modules/AccountList/index.js +116 -154
- package/lib/modules/AccountList/types.js +30 -31
- package/lib/modules/AccountList/utils.js +18 -30
- package/lib/modules/BaseModule.js +23 -42
- package/lib/modules/BookingContext/index.js +158 -136
- package/lib/modules/BookingContext/types.js +46 -32
- package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +138 -146
- package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +78 -83
- package/lib/modules/BookingContext/utils/cacheItemToBookingInput.js +170 -150
- package/lib/modules/BookingContext/utils/flexible.js +38 -55
- package/lib/modules/BookingContext/utils/formatResourceList.js +19 -34
- package/lib/modules/BookingContext/utils/index.js +124 -41
- package/lib/modules/BookingContext/utils/noResource.js +58 -70
- package/lib/modules/BookingContext/utils/orderLineDisplay.js +14 -41
- package/lib/modules/BookingContext/utils/productExtend.js +202 -155
- package/lib/modules/BookingContext/utils/resourceErrors.js +53 -53
- package/lib/modules/BookingContext/utils/resourceSelection.js +19 -41
- package/lib/modules/BookingContext/utils/resources.js +209 -167
- package/lib/modules/BookingContext/utils/serviceTimes.js +115 -116
- package/lib/modules/BookingContext/utils/timeSlices.js +76 -86
- package/lib/modules/Cart/index.js +170 -124
- package/lib/modules/Cart/types.js +46 -51
- package/lib/modules/Cart/utils/cartAccount.js +40 -39
- package/lib/modules/Cart/utils/cartDate.js +56 -61
- package/lib/modules/Cart/utils/cartDiscount.js +28 -33
- package/lib/modules/Cart/utils/cartNote.js +27 -32
- package/lib/modules/Cart/utils/cartProduct.js +321 -251
- package/lib/modules/Cart/utils/cartRelationForms.js +29 -35
- package/lib/modules/Cart/utils/cartResource.js +70 -78
- package/lib/modules/Cart/utils/changePrice.js +22 -50
- package/lib/modules/Cart/utils/index.js +106 -48
- package/lib/modules/Customer/constants.js +13 -34
- package/lib/modules/Customer/index.js +235 -172
- package/lib/modules/Customer/types.js +38 -35
- package/lib/modules/Date/index.js +116 -115
- package/lib/modules/Date/types.js +16 -28
- package/lib/modules/Date/utils.js +174 -123
- package/lib/modules/Discount/index.js +122 -127
- package/lib/modules/Discount/types.js +9 -31
- package/lib/modules/Guests/index.js +30 -56
- package/lib/modules/Guests/types.js +23 -33
- package/lib/modules/Holder/index.js +209 -189
- package/lib/modules/Holder/types.js +4 -16
- package/lib/modules/Holder/utils.js +20 -49
- package/lib/modules/OpenData/index.js +70 -76
- package/lib/modules/OpenData/types.js +4 -16
- package/lib/modules/OpenData/utils.js +44 -78
- package/lib/modules/Order/index.js +1713 -2118
- package/lib/modules/Order/payment-utils.js +77 -120
- package/lib/modules/Order/types.js +88 -35
- package/lib/modules/Order/utils/bundleDiscountHydration.js +41 -74
- package/lib/modules/Order/utils/discountProductLineIdentity.js +142 -100
- package/lib/modules/Order/utils/manualProductDiscount.js +124 -123
- package/lib/modules/Order/utils/orderCollectionIdentity.js +184 -244
- package/lib/modules/Order/utils.js +814 -647
- package/lib/modules/Payment/cash.js +20 -33
- package/lib/modules/Payment/cashRecommendationAlgorithm.js +145 -76
- package/lib/modules/Payment/eftpos.js +16 -30
- package/lib/modules/Payment/index.js +532 -399
- package/lib/modules/Payment/mx51.js +1 -0
- package/lib/modules/Payment/types.js +230 -108
- package/lib/modules/Payment/utils.js +52 -51
- package/lib/modules/Payment/walletpass.js +485 -660
- package/lib/modules/Product/index.js +51 -46
- package/lib/modules/Product/types.js +4 -16
- package/lib/modules/Product/utils.js +32 -33
- package/lib/modules/ProductList/index.js +113 -123
- package/lib/modules/ProductList/types.js +9 -31
- package/lib/modules/Quotation/index.js +81 -118
- package/lib/modules/Quotation/types.js +4 -16
- package/lib/modules/Resource/index.js +27 -59
- package/lib/modules/Resource/types.js +22 -32
- package/lib/modules/Resource/utils.js +30 -38
- package/lib/modules/ResourcePlanner/index.js +25 -23
- package/lib/modules/ResourcePlanner/localClock.js +54 -119
- package/lib/modules/ResourcePlanner/planner.js +589 -770
- package/lib/modules/ResourcePlanner/types.js +10 -29
- package/lib/modules/Rules/index.js +1218 -959
- package/lib/modules/Rules/types.js +17 -40
- package/lib/modules/SalesSummary/index.js +85 -90
- package/lib/modules/SalesSummary/types.js +4 -16
- package/lib/modules/SalesSummary/utils.js +355 -430
- package/lib/modules/ScanOrderLogger/index.js +59 -79
- package/lib/modules/ScanOrderLogger/providers/feishu.js +54 -78
- package/lib/modules/ScanOrderLogger/providers/grafana.js +13 -36
- package/lib/modules/ScanOrderLogger/types.js +4 -16
- package/lib/modules/Schedule/getDateIsInSchedule.js +334 -163
- package/lib/modules/Schedule/index.js +100 -114
- package/lib/modules/Schedule/type.js +4 -16
- package/lib/modules/Schedule/types.js +4 -16
- package/lib/modules/Schedule/utils.js +433 -291
- package/lib/modules/Step/index.js +40 -52
- package/lib/modules/Step/tyeps.js +4 -16
- package/lib/modules/Summary/index.js +66 -71
- package/lib/modules/Summary/types.js +4 -16
- package/lib/modules/Summary/utils.js +773 -418
- package/lib/modules/SurchargeList/index.js +46 -60
- package/lib/modules/SurchargeList/types.js +4 -16
- package/lib/modules/index.js +245 -63
- package/lib/plugins/app.js +4 -16
- package/lib/plugins/index.js +36 -25
- package/lib/plugins/request.js +137 -126
- package/lib/plugins/shopStore.js +4 -16
- package/lib/plugins/user.js +4 -16
- package/lib/plugins/window.js +171 -179
- package/lib/server/index.js +3050 -2665
- package/lib/server/modules/floor-plan/index.js +118 -134
- package/lib/server/modules/floor-plan/types.js +15 -30
- package/lib/server/modules/index.js +106 -68
- package/lib/server/modules/menu/index.js +142 -122
- package/lib/server/modules/menu/types.js +18 -31
- package/lib/server/modules/order/index.js +784 -1002
- package/lib/server/modules/order/types.js +122 -33
- package/lib/server/modules/order/utils/filterBookings.js +219 -194
- package/lib/server/modules/order/utils/filterOrders.js +118 -92
- package/lib/server/modules/payment/index.js +59 -83
- package/lib/server/modules/payment/types.js +4 -16
- package/lib/server/modules/products/index.js +583 -471
- package/lib/server/modules/products/types.js +44 -34
- package/lib/server/modules/quotation/index.js +137 -172
- package/lib/server/modules/quotation/types.js +21 -31
- package/lib/server/modules/resource/index.js +220 -186
- package/lib/server/modules/resource/types.js +42 -33
- package/lib/server/modules/schedule/index.js +135 -123
- package/lib/server/modules/schedule/types.js +14 -21
- package/lib/server/modules/schedule/utils.js +334 -163
- package/lib/server/types.js +4 -16
- package/lib/server/utils/index.js +25 -23
- package/lib/server/utils/product.js +196 -139
- package/lib/server/utils/schedule.js +34 -41
- package/lib/server/utils/small-ticket.js +479 -456
- package/lib/server/utils/time.js +40 -49
- package/lib/solution/BaseSales/index.js +1186 -1410
- package/lib/solution/BaseSales/types.js +42 -38
- package/lib/solution/BaseSales/utils/cartPromotion.js +642 -498
- package/lib/solution/BaseSales/utils/parseSalesResponse.js +85 -105
- package/lib/solution/BaseSales/utils/quotationPrice.js +56 -114
- package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +108 -145
- package/lib/solution/BaseSales/utils.js +158 -143
- package/lib/solution/BookingByStep/index.js +1527 -1340
- package/lib/solution/BookingByStep/types.js +40 -99
- package/lib/solution/BookingByStep/utils/capacity.js +192 -160
- package/lib/solution/BookingByStep/utils/products.js +42 -52
- package/lib/solution/BookingByStep/utils/resources.js +527 -330
- package/lib/solution/BookingByStep/utils/stock.js +65 -44
- package/lib/solution/BookingByStep/utils/timeslots.js +129 -131
- package/lib/solution/BookingTicket/index.js +607 -522
- package/lib/solution/BookingTicket/types.js +99 -77
- package/lib/solution/BookingTicket/utils/addProductDecision.js +226 -189
- package/lib/solution/BookingTicket/utils/addTimeAvailability.js +58 -89
- package/lib/solution/BookingTicket/utils/bookingStatus.js +107 -78
- package/lib/solution/BookingTicket/utils/cartView.js +114 -99
- package/lib/solution/BookingTicket/utils/exampleData.js +185 -0
- package/lib/solution/BookingTicket/utils/orderCustomer.js +18 -41
- package/lib/solution/BookingTicket/utils/resolveBestAddTimePlan.js +219 -86
- package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +168 -116
- package/lib/solution/BookingTicket/utils/scan/cloudSearch.js +79 -91
- package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.js +54 -41
- package/lib/solution/BookingTicket/utils/scan/handleScan.js +84 -81
- package/lib/solution/BookingTicket/utils/scan/index.js +98 -104
- package/lib/solution/BookingTicket/utils/scan/scanCache.js +90 -43
- package/lib/solution/BookingTicket/utils/scan/scanProductValues.js +52 -64
- package/lib/solution/BookingTicket/utils/sessionCatalogStale.js +56 -58
- package/lib/solution/BookingTicket/utils/weighingProductSku.js +34 -48
- package/lib/solution/BuyTickets/index.js +67 -70
- package/lib/solution/BuyTickets/types.js +22 -38
- package/lib/solution/Checkout/index.js +1451 -1158
- package/lib/solution/Checkout/types.js +91 -61
- package/lib/solution/Checkout/utils/index.js +228 -156
- package/lib/solution/PlaceOrder/index.js +55 -0
- package/lib/solution/RegisterAndLogin/config.js +493 -460
- package/lib/solution/RegisterAndLogin/index.js +633 -630
- package/lib/solution/RegisterAndLogin/types.js +189 -76
- package/lib/solution/RegisterAndLogin/utils.js +183 -125
- package/lib/solution/Sales/index.js +328 -324
- package/lib/solution/Sales/types.js +27 -33
- package/lib/solution/ScanOrder/index.js +832 -864
- package/lib/solution/ScanOrder/types.js +33 -34
- package/lib/solution/ScanOrder/utils.js +409 -374
- package/lib/solution/ShopDiscount/index.js +226 -232
- package/lib/solution/ShopDiscount/types.js +15 -37
- package/lib/solution/ShopDiscount/utils.js +300 -172
- package/lib/solution/UnifiedBookingSales/index.js +1035 -1201
- package/lib/solution/UnifiedBookingSales/remoteOccupancyCache.js +99 -159
- package/lib/solution/UnifiedBookingSales/types.js +10 -32
- package/lib/solution/VenueBooking/index.js +811 -879
- package/lib/solution/VenueBooking/types.js +19 -39
- package/lib/solution/VenueBooking/utils/dateSummary.js +27 -56
- package/lib/solution/VenueBooking/utils/resource.js +31 -54
- package/lib/solution/VenueBooking/utils/slotMerge.js +94 -107
- package/lib/solution/VenueBooking/utils/timeSlot.js +132 -132
- package/lib/solution/VenueBooking/utils.js +130 -67
- package/lib/solution/index.js +124 -41
- package/lib/store/createStore.js +32 -29
- package/lib/types/index.js +4 -16
- package/lib/utils/payment-number.js +26 -46
- package/lib/utils/task.js +36 -36
- package/lib/utils/watch.js +81 -47
- package/package.json +2 -1
|
@@ -1,67 +1,74 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
for (let key of __getOwnPropNames(from))
|
|
12
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
-
}
|
|
15
|
-
return to;
|
|
16
|
-
};
|
|
17
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
-
|
|
19
|
-
// src/server/modules/resource/index.ts
|
|
20
|
-
var resource_exports = {};
|
|
21
|
-
__export(resource_exports, {
|
|
22
|
-
ResourceHooks: () => import_types2.ResourceHooks,
|
|
23
|
-
ResourceModule: () => ResourceModule,
|
|
24
|
-
resourceModule: () => resourceModule
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "ResourceHooks", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _types.ResourceHooks;
|
|
10
|
+
}
|
|
25
11
|
});
|
|
26
|
-
|
|
27
|
-
var
|
|
28
|
-
var
|
|
29
|
-
var
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
12
|
+
exports.resourceModule = exports.ResourceModule = void 0;
|
|
13
|
+
var _lodashEs = require("lodash-es");
|
|
14
|
+
var _BaseModule = require("../../../modules/BaseModule");
|
|
15
|
+
var _types = require("./types");
|
|
16
|
+
/**
|
|
17
|
+
* SQLite 存储名称
|
|
18
|
+
*/
|
|
19
|
+
const RESOURCE_STORE_NAME = 'resources';
|
|
20
|
+
// const BOOKING_STORE_NAME = 'resource_bookings'
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* 默认分页大小
|
|
24
|
+
*/
|
|
25
|
+
const DEFAULT_PAGE_SIZE = 999;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* 同步防抖超时(毫秒)
|
|
29
|
+
*/
|
|
30
|
+
const RESOURCE_SYNC_DEBOUNCE_MS = 10_000;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Resource 模块
|
|
34
|
+
*/
|
|
35
|
+
class ResourceModule extends _BaseModule.BaseModule {
|
|
36
|
+
defaultName = 'resource';
|
|
37
|
+
defaultVersion = '1.0.0';
|
|
38
|
+
store;
|
|
39
|
+
dbManager;
|
|
40
|
+
logger; // LoggerManager 实例
|
|
41
|
+
resourceDataSource;
|
|
42
|
+
|
|
43
|
+
/** 倒排索引: resourceId -> ResourceBooking[] */
|
|
44
|
+
resourceIdIndex = new Map();
|
|
45
|
+
|
|
46
|
+
/** 待处理的同步消息队列 */
|
|
47
|
+
pendingSyncMessages = [];
|
|
48
|
+
syncTimer;
|
|
35
49
|
constructor(name, version) {
|
|
36
50
|
super(name, version);
|
|
37
|
-
this.defaultName = "resource";
|
|
38
|
-
this.defaultVersion = "1.0.0";
|
|
39
|
-
/** 倒排索引: resourceId -> ResourceBooking[] */
|
|
40
|
-
this.resourceIdIndex = /* @__PURE__ */ new Map();
|
|
41
|
-
/** 待处理的同步消息队列 */
|
|
42
|
-
this.pendingSyncMessages = [];
|
|
43
51
|
}
|
|
52
|
+
|
|
44
53
|
// ─────────────────────────────────────────────────────────────────
|
|
45
54
|
// 初始化 & 生命周期
|
|
46
55
|
// ─────────────────────────────────────────────────────────────────
|
|
56
|
+
|
|
47
57
|
async initialize(core, options) {
|
|
48
|
-
var _a, _b;
|
|
49
58
|
this.core = core;
|
|
50
|
-
this.store = options
|
|
51
|
-
if (Array.isArray(
|
|
52
|
-
this.store.list = (
|
|
53
|
-
(item) => this.normalizeResource(item)
|
|
54
|
-
);
|
|
59
|
+
this.store = options?.store;
|
|
60
|
+
if (Array.isArray(options?.initialState?.list)) {
|
|
61
|
+
this.store.list = (options?.initialState?.list).map(item => this.normalizeResource(item));
|
|
55
62
|
this.syncResourcesMap();
|
|
56
|
-
this.core.effects.emit(
|
|
63
|
+
this.core.effects.emit(_types.ResourceHooks.onResourcesChanged, this.store.list);
|
|
57
64
|
} else {
|
|
58
65
|
this.store.list = [];
|
|
59
|
-
this.store.map =
|
|
66
|
+
this.store.map = new Map();
|
|
60
67
|
}
|
|
61
68
|
if (!Array.isArray(this.store.bookings)) {
|
|
62
69
|
this.store.bookings = [];
|
|
63
70
|
}
|
|
64
|
-
const appPlugin = core.getPlugin(
|
|
71
|
+
const appPlugin = core.getPlugin('app');
|
|
65
72
|
if (appPlugin) {
|
|
66
73
|
const app = appPlugin.getApp();
|
|
67
74
|
this.dbManager = app.sqlite || app.dbManager;
|
|
@@ -72,7 +79,7 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
72
79
|
logInfo(title, metadata) {
|
|
73
80
|
if (this.logger) {
|
|
74
81
|
this.logger.addLog({
|
|
75
|
-
type:
|
|
82
|
+
type: 'info',
|
|
76
83
|
title: `[ResourceModule] ${title}`,
|
|
77
84
|
metadata: metadata || {}
|
|
78
85
|
});
|
|
@@ -81,7 +88,7 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
81
88
|
logError(title, error, metadata) {
|
|
82
89
|
if (this.logger) {
|
|
83
90
|
this.logger.addLog({
|
|
84
|
-
type:
|
|
91
|
+
type: 'error',
|
|
85
92
|
title: `[ResourceModule] ${title}`,
|
|
86
93
|
metadata: metadata || {}
|
|
87
94
|
});
|
|
@@ -90,117 +97,136 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
90
97
|
async preload() {
|
|
91
98
|
const cachedResources = await this.loadResourcesFromSQLite();
|
|
92
99
|
if (cachedResources.length > 0) {
|
|
93
|
-
this.store.list = (0,
|
|
100
|
+
this.store.list = (0, _lodashEs.cloneDeep)(cachedResources).map(item => this.normalizeResource(item));
|
|
94
101
|
this.syncResourcesMap();
|
|
95
|
-
await this.safeEmit(
|
|
96
|
-
|
|
97
|
-
|
|
102
|
+
await this.safeEmit(_types.ResourceHooks.onResourcesChanged, this.store.list);
|
|
103
|
+
|
|
104
|
+
// 二次启动优先使用 SQLite。pubsub 注册及远端校准继续在后台执行,
|
|
105
|
+
// setupResourceSync 完成后会合并最新数据并回写 SQLite。
|
|
106
|
+
void this.setupResourceSync().catch(error => {
|
|
107
|
+
this.logError('后台初始化资源同步失败', error);
|
|
98
108
|
});
|
|
99
109
|
return;
|
|
100
110
|
}
|
|
111
|
+
|
|
112
|
+
// 首次启动没有本地数据时仍等待远端结果,保证进入业务页面前资源可用。
|
|
101
113
|
await this.setupResourceSync();
|
|
102
114
|
if (this.store.list.length === 0) {
|
|
103
115
|
const resources = await this.loadResourcesByServer();
|
|
104
116
|
if (resources.length > 0) {
|
|
105
|
-
this.store.list = (0,
|
|
117
|
+
this.store.list = (0, _lodashEs.cloneDeep)(resources).map(item => this.normalizeResource(item));
|
|
106
118
|
this.syncResourcesMap();
|
|
107
|
-
await this.safeEmit(
|
|
119
|
+
await this.safeEmit(_types.ResourceHooks.onResourcesChanged, this.store.list);
|
|
108
120
|
}
|
|
109
121
|
}
|
|
122
|
+
|
|
123
|
+
// const cachedBookings = await this.loadBookingsFromSQLite()
|
|
124
|
+
// if (cachedBookings.length > 0) {
|
|
125
|
+
// this.store.bookings = cloneDeep(cachedBookings)
|
|
126
|
+
// this.syncBookingsIndex()
|
|
127
|
+
// }
|
|
110
128
|
}
|
|
111
129
|
getRoutes() {
|
|
112
130
|
return [];
|
|
113
131
|
}
|
|
114
132
|
destroy() {
|
|
115
|
-
var _a;
|
|
116
133
|
if (this.syncTimer) {
|
|
117
134
|
clearTimeout(this.syncTimer);
|
|
118
|
-
this.syncTimer =
|
|
135
|
+
this.syncTimer = undefined;
|
|
119
136
|
}
|
|
120
137
|
this.pendingSyncMessages = [];
|
|
121
|
-
if (
|
|
122
|
-
this.resourceDataSource.destroy();
|
|
138
|
+
if (this.resourceDataSource?.destroy) this.resourceDataSource.destroy();
|
|
123
139
|
super.destroy();
|
|
124
140
|
}
|
|
141
|
+
|
|
125
142
|
// ─────────────────────────────────────────────────────────────────
|
|
126
143
|
// Resource CRUD
|
|
127
144
|
// ─────────────────────────────────────────────────────────────────
|
|
145
|
+
|
|
128
146
|
/**
|
|
129
147
|
* 获取所有资源(支持 includeBookings 附加预订信息)
|
|
130
148
|
*/
|
|
131
149
|
getResources(queryOptions) {
|
|
132
|
-
this.logInfo(
|
|
150
|
+
this.logInfo('getResources', {
|
|
133
151
|
queryOptions
|
|
134
152
|
});
|
|
135
|
-
if (!
|
|
153
|
+
if (!queryOptions?.includeBookings) {
|
|
136
154
|
return this.store.list;
|
|
137
155
|
}
|
|
138
|
-
return this.store.list.map(
|
|
156
|
+
return this.store.list.map(resource => this.attachBookingsToResource(resource));
|
|
139
157
|
}
|
|
158
|
+
|
|
140
159
|
/**
|
|
141
160
|
* 根据 ID 获取单个资源
|
|
142
161
|
*/
|
|
143
162
|
getResourceById(id, queryOptions) {
|
|
144
163
|
const resource = this.store.map.get(id);
|
|
145
|
-
if (!resource)
|
|
146
|
-
|
|
147
|
-
if (queryOptions == null ? void 0 : queryOptions.includeBookings) {
|
|
164
|
+
if (!resource) return undefined;
|
|
165
|
+
if (queryOptions?.includeBookings) {
|
|
148
166
|
return this.attachBookingsToResource(resource);
|
|
149
167
|
}
|
|
150
168
|
return resource;
|
|
151
169
|
}
|
|
170
|
+
|
|
152
171
|
/**
|
|
153
172
|
* 创建资源
|
|
154
173
|
*/
|
|
155
174
|
createResource(data) {
|
|
156
|
-
const id =
|
|
157
|
-
const resource = this.normalizeResource({
|
|
175
|
+
const id = data?.id ?? data?.form_record_id ?? Date.now();
|
|
176
|
+
const resource = this.normalizeResource({
|
|
177
|
+
...data,
|
|
178
|
+
id
|
|
179
|
+
});
|
|
158
180
|
this.store.list.push(resource);
|
|
159
181
|
this.store.map.set(resource.id, resource);
|
|
160
|
-
this.saveResourcesToSQLite(this.store.list).catch(() => {
|
|
161
|
-
|
|
162
|
-
this.safeEmit(import_types.ResourceHooks.onResourcesChanged, this.store.list);
|
|
182
|
+
this.saveResourcesToSQLite(this.store.list).catch(() => {});
|
|
183
|
+
this.safeEmit(_types.ResourceHooks.onResourcesChanged, this.store.list);
|
|
163
184
|
return resource;
|
|
164
185
|
}
|
|
186
|
+
|
|
165
187
|
/**
|
|
166
188
|
* 更新资源
|
|
167
189
|
*/
|
|
168
190
|
updateResource(id, data) {
|
|
169
|
-
const index = this.store.list.findIndex(
|
|
170
|
-
if (index === -1)
|
|
171
|
-
|
|
172
|
-
|
|
191
|
+
const index = this.store.list.findIndex(r => this.getIdKey(r.id) === this.getIdKey(id));
|
|
192
|
+
if (index === -1) return undefined;
|
|
193
|
+
const updated = this.normalizeResource({
|
|
194
|
+
...this.store.list[index],
|
|
195
|
+
...data,
|
|
196
|
+
id
|
|
197
|
+
});
|
|
173
198
|
this.store.list[index] = updated;
|
|
174
199
|
this.store.map.set(updated.id, updated);
|
|
175
|
-
this.saveResourcesToSQLite(this.store.list).catch(() => {
|
|
176
|
-
|
|
177
|
-
this.safeEmit(import_types.ResourceHooks.onResourcesChanged, this.store.list);
|
|
200
|
+
this.saveResourcesToSQLite(this.store.list).catch(() => {});
|
|
201
|
+
this.safeEmit(_types.ResourceHooks.onResourcesChanged, this.store.list);
|
|
178
202
|
return updated;
|
|
179
203
|
}
|
|
204
|
+
|
|
180
205
|
/**
|
|
181
206
|
* 删除资源
|
|
182
207
|
*/
|
|
183
208
|
deleteResource(id) {
|
|
184
209
|
const key = this.getIdKey(id);
|
|
185
|
-
const index = this.store.list.findIndex(
|
|
186
|
-
if (index === -1)
|
|
187
|
-
return false;
|
|
210
|
+
const index = this.store.list.findIndex(r => this.getIdKey(r.id) === key);
|
|
211
|
+
if (index === -1) return false;
|
|
188
212
|
this.store.list.splice(index, 1);
|
|
189
213
|
this.store.map.delete(id);
|
|
190
|
-
this.saveResourcesToSQLite(this.store.list).catch(() => {
|
|
191
|
-
|
|
192
|
-
this.safeEmit(import_types.ResourceHooks.onResourcesChanged, this.store.list);
|
|
214
|
+
this.saveResourcesToSQLite(this.store.list).catch(() => {});
|
|
215
|
+
this.safeEmit(_types.ResourceHooks.onResourcesChanged, this.store.list);
|
|
193
216
|
return true;
|
|
194
217
|
}
|
|
218
|
+
|
|
195
219
|
// ─────────────────────────────────────────────────────────────────
|
|
196
220
|
// Booking CRUD
|
|
197
221
|
// ─────────────────────────────────────────────────────────────────
|
|
222
|
+
|
|
198
223
|
/**
|
|
199
224
|
* 根据资源 ID 获取预订列表
|
|
200
225
|
*/
|
|
201
226
|
getBookingsByResourceId(resourceId) {
|
|
202
227
|
return this.resourceIdIndex.get(resourceId) || [];
|
|
203
228
|
}
|
|
229
|
+
|
|
204
230
|
/**
|
|
205
231
|
* 创建预订
|
|
206
232
|
*/
|
|
@@ -210,43 +236,52 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
210
236
|
// id,
|
|
211
237
|
// ...booking,
|
|
212
238
|
// } as ResourceBooking
|
|
239
|
+
|
|
213
240
|
// this.store.bookings.push(normalized)
|
|
241
|
+
|
|
214
242
|
// const rid = normalized.resource_id ?? normalized.resourceId
|
|
215
243
|
// if (rid !== undefined) {
|
|
216
244
|
// const existing = this.resourceIdIndex.get(rid) || []
|
|
217
245
|
// existing.push(normalized)
|
|
218
246
|
// this.resourceIdIndex.set(rid, existing)
|
|
219
247
|
// }
|
|
248
|
+
|
|
220
249
|
// this.saveBookingsToSQLite(this.store.bookings).catch(() => {})
|
|
221
250
|
// this.safeEmit(ResourceHooks.onBookingsChanged, this.store.bookings)
|
|
222
251
|
// return normalized
|
|
223
252
|
// }
|
|
253
|
+
|
|
224
254
|
/**
|
|
225
255
|
* 更新预订
|
|
226
256
|
*/
|
|
227
257
|
// updateBooking(id: ResourceId, data: Partial<ResourceBooking>): ResourceBooking | undefined {
|
|
228
258
|
// const index = this.store.bookings.findIndex(b => this.getIdKey(b.id) === this.getIdKey(id))
|
|
229
259
|
// if (index === -1) return undefined
|
|
260
|
+
|
|
230
261
|
// const old = this.store.bookings[index]
|
|
231
262
|
// const updated: ResourceBooking = { ...old, ...data, id: old.id } as ResourceBooking
|
|
232
263
|
// this.store.bookings[index] = updated
|
|
264
|
+
|
|
233
265
|
// this.rebuildBookingsIndex()
|
|
234
266
|
// this.saveBookingsToSQLite(this.store.bookings).catch(() => {})
|
|
235
267
|
// this.safeEmit(ResourceHooks.onBookingsChanged, this.store.bookings)
|
|
236
268
|
// return updated
|
|
237
269
|
// }
|
|
270
|
+
|
|
238
271
|
/**
|
|
239
272
|
* 删除预订
|
|
240
273
|
*/
|
|
241
274
|
// deleteBooking(id: ResourceId): boolean {
|
|
242
275
|
// const index = this.store.bookings.findIndex(b => this.getIdKey(b.id) === this.getIdKey(id))
|
|
243
276
|
// if (index === -1) return false
|
|
277
|
+
|
|
244
278
|
// this.store.bookings.splice(index, 1)
|
|
245
279
|
// this.rebuildBookingsIndex()
|
|
246
280
|
// this.saveBookingsToSQLite(this.store.bookings).catch(() => {})
|
|
247
281
|
// this.safeEmit(ResourceHooks.onBookingsChanged, this.store.bookings)
|
|
248
282
|
// return true
|
|
249
283
|
// }
|
|
284
|
+
|
|
250
285
|
/**
|
|
251
286
|
* 清空缓存
|
|
252
287
|
*/
|
|
@@ -258,15 +293,19 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
258
293
|
if (this.dbManager) {
|
|
259
294
|
try {
|
|
260
295
|
await this.dbManager.clear(RESOURCE_STORE_NAME);
|
|
296
|
+
// await this.dbManager.clear(BOOKING_STORE_NAME)
|
|
261
297
|
} catch {
|
|
298
|
+
// 清理失败不影响调用方
|
|
262
299
|
}
|
|
263
300
|
}
|
|
264
|
-
await this.safeEmit(
|
|
265
|
-
await this.safeEmit(
|
|
301
|
+
await this.safeEmit(_types.ResourceHooks.onResourcesChanged, this.store.list);
|
|
302
|
+
await this.safeEmit(_types.ResourceHooks.onBookingsChanged, this.store.bookings);
|
|
266
303
|
}
|
|
304
|
+
|
|
267
305
|
// ─────────────────────────────────────────────────────────────────
|
|
268
306
|
// 内部工具方法
|
|
269
307
|
// ─────────────────────────────────────────────────────────────────
|
|
308
|
+
|
|
270
309
|
attachBookingsToResource(resource) {
|
|
271
310
|
return {
|
|
272
311
|
...resource,
|
|
@@ -274,25 +313,23 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
274
313
|
};
|
|
275
314
|
}
|
|
276
315
|
normalizeIntegerIdValue(value) {
|
|
277
|
-
if (typeof value !==
|
|
278
|
-
return value;
|
|
316
|
+
if (typeof value !== 'string') return value;
|
|
279
317
|
const matched = value.match(/^(-?\d+)\.0+$/);
|
|
280
|
-
if (!matched)
|
|
281
|
-
return value;
|
|
318
|
+
if (!matched) return value;
|
|
282
319
|
return matched[1];
|
|
283
320
|
}
|
|
284
321
|
normalizeResourceIdFields(resource) {
|
|
285
322
|
resource.id = this.normalizeIntegerIdValue(resource.id);
|
|
286
|
-
if (resource.form_record_id !==
|
|
323
|
+
if (resource.form_record_id !== undefined) {
|
|
287
324
|
resource.form_record_id = this.normalizeIntegerIdValue(resource.form_record_id);
|
|
288
325
|
}
|
|
289
|
-
if (resource.form_id !==
|
|
326
|
+
if (resource.form_id !== undefined) {
|
|
290
327
|
resource.form_id = this.normalizeIntegerIdValue(resource.form_id);
|
|
291
328
|
}
|
|
292
|
-
if (resource.resource_form_id !==
|
|
329
|
+
if (resource.resource_form_id !== undefined) {
|
|
293
330
|
resource.resource_form_id = this.normalizeIntegerIdValue(resource.resource_form_id);
|
|
294
331
|
}
|
|
295
|
-
if (resource.resource_id !==
|
|
332
|
+
if (resource.resource_id !== undefined) {
|
|
296
333
|
resource.resource_id = this.normalizeIntegerIdValue(resource.resource_id);
|
|
297
334
|
}
|
|
298
335
|
return resource;
|
|
@@ -300,21 +337,20 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
300
337
|
normalizeResource(resource) {
|
|
301
338
|
const normalized = this.normalizeResourceIdFields({
|
|
302
339
|
...resource,
|
|
303
|
-
id: this.normalizeIntegerIdValue(
|
|
340
|
+
id: this.normalizeIntegerIdValue(resource?.id ?? resource?.form_record_id ?? '')
|
|
304
341
|
});
|
|
305
|
-
if (normalized.form_record_id ===
|
|
342
|
+
if (normalized.form_record_id === undefined && normalized.id !== '') {
|
|
306
343
|
normalized.form_record_id = normalized.id;
|
|
307
344
|
}
|
|
308
|
-
if (normalized.resource_form_id ===
|
|
309
|
-
normalized.resource_form_id =
|
|
345
|
+
if (normalized.resource_form_id === undefined || normalized.resource_form_id === null) {
|
|
346
|
+
normalized.resource_form_id = '';
|
|
310
347
|
}
|
|
311
|
-
if (normalized.schedule ===
|
|
312
|
-
normalized.schedule =
|
|
348
|
+
if (normalized.schedule === undefined || normalized.schedule === null) {
|
|
349
|
+
normalized.schedule = '';
|
|
313
350
|
}
|
|
314
351
|
if (Array.isArray(normalized.times)) {
|
|
315
|
-
normalized.times = normalized.times.map(
|
|
316
|
-
if (!timeSlot || typeof timeSlot !==
|
|
317
|
-
return timeSlot;
|
|
352
|
+
normalized.times = normalized.times.map(timeSlot => {
|
|
353
|
+
if (!timeSlot || typeof timeSlot !== 'object') return timeSlot;
|
|
318
354
|
const startAt = timeSlot.start_at ?? timeSlot.start;
|
|
319
355
|
const endAt = timeSlot.end_at ?? timeSlot.end;
|
|
320
356
|
return {
|
|
@@ -327,7 +363,7 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
327
363
|
});
|
|
328
364
|
}
|
|
329
365
|
if (Array.isArray(normalized.children)) {
|
|
330
|
-
normalized.children = normalized.children.map(
|
|
366
|
+
normalized.children = normalized.children.map(child => this.normalizeResource(child));
|
|
331
367
|
}
|
|
332
368
|
return normalized;
|
|
333
369
|
}
|
|
@@ -335,11 +371,12 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
335
371
|
try {
|
|
336
372
|
await this.core.effects.emit(event, payload);
|
|
337
373
|
} catch (error) {
|
|
374
|
+
// 不让外部监听器异常影响资源模块预加载或清理流程
|
|
338
375
|
console.error(`[ResourceModule] 事件派发失败: ${event}`, error);
|
|
339
376
|
}
|
|
340
377
|
}
|
|
341
378
|
syncResourcesMap() {
|
|
342
|
-
this.store.map =
|
|
379
|
+
this.store.map = new Map();
|
|
343
380
|
for (const resource of this.store.list) {
|
|
344
381
|
this.store.map.set(resource.id, resource);
|
|
345
382
|
}
|
|
@@ -348,8 +385,7 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
348
385
|
this.resourceIdIndex.clear();
|
|
349
386
|
for (const booking of this.store.bookings) {
|
|
350
387
|
const rid = booking.resource_id ?? booking.resourceId;
|
|
351
|
-
if (rid ===
|
|
352
|
-
continue;
|
|
388
|
+
if (rid === undefined) continue;
|
|
353
389
|
const existing = this.resourceIdIndex.get(rid) || [];
|
|
354
390
|
existing.push(booking);
|
|
355
391
|
this.resourceIdIndex.set(rid, existing);
|
|
@@ -361,32 +397,34 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
361
397
|
getIdKey(id) {
|
|
362
398
|
return String(id);
|
|
363
399
|
}
|
|
400
|
+
|
|
364
401
|
// ─────────────────────────────────────────────────────────────────
|
|
365
402
|
// 数据加载
|
|
366
403
|
// ─────────────────────────────────────────────────────────────────
|
|
404
|
+
|
|
367
405
|
async loadResourcesByServer() {
|
|
368
|
-
if (!this.resourceDataSource)
|
|
369
|
-
return [];
|
|
406
|
+
if (!this.resourceDataSource) return [];
|
|
370
407
|
try {
|
|
371
408
|
const response = await this.resourceDataSource.getResourcePage({
|
|
372
409
|
num: DEFAULT_PAGE_SIZE,
|
|
373
410
|
skip: 1
|
|
374
411
|
});
|
|
375
|
-
const resourceList = Array.isArray(response
|
|
376
|
-
const normalizedList = resourceList.map(
|
|
412
|
+
const resourceList = Array.isArray(response?.list) ? response.list : [];
|
|
413
|
+
const normalizedList = resourceList.map(item => this.normalizeResource(item));
|
|
377
414
|
await this.saveResourcesToSQLite(normalizedList);
|
|
378
|
-
await this.safeEmit(
|
|
415
|
+
await this.safeEmit(_types.ResourceHooks.onResourcesLoaded, normalizedList);
|
|
379
416
|
return normalizedList;
|
|
380
417
|
} catch {
|
|
381
418
|
return [];
|
|
382
419
|
}
|
|
383
420
|
}
|
|
421
|
+
|
|
384
422
|
// ─────────────────────────────────────────────────────────────────
|
|
385
423
|
// SQLite 持久化
|
|
386
424
|
// ─────────────────────────────────────────────────────────────────
|
|
425
|
+
|
|
387
426
|
async loadResourcesFromSQLite() {
|
|
388
|
-
if (!this.dbManager)
|
|
389
|
-
return [];
|
|
427
|
+
if (!this.dbManager) return [];
|
|
390
428
|
try {
|
|
391
429
|
const resources = await this.dbManager.getAll(RESOURCE_STORE_NAME);
|
|
392
430
|
return resources || [];
|
|
@@ -395,25 +433,24 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
395
433
|
}
|
|
396
434
|
}
|
|
397
435
|
async saveResourcesToSQLite(resourceList) {
|
|
398
|
-
if (!this.dbManager)
|
|
399
|
-
return;
|
|
436
|
+
if (!this.dbManager) return;
|
|
400
437
|
try {
|
|
401
438
|
await this.dbManager.clear(RESOURCE_STORE_NAME);
|
|
402
|
-
if (resourceList.length === 0)
|
|
403
|
-
return;
|
|
439
|
+
if (resourceList.length === 0) return;
|
|
404
440
|
if (this.dbManager.bulkAdd) {
|
|
405
441
|
await this.dbManager.bulkAdd(RESOURCE_STORE_NAME, resourceList);
|
|
406
442
|
return;
|
|
407
443
|
}
|
|
408
|
-
await Promise.all(resourceList.map(
|
|
444
|
+
await Promise.all(resourceList.map(r => this.dbManager.add(RESOURCE_STORE_NAME, r)));
|
|
409
445
|
} catch (error) {
|
|
410
|
-
console.error(
|
|
411
|
-
this.logError(
|
|
446
|
+
console.error('saveResourcesToSQLite error', error);
|
|
447
|
+
this.logError('保存资源到 SQLite 失败', {
|
|
412
448
|
error: error instanceof Error ? error.message : String(error),
|
|
413
449
|
resourceList: resourceList.length
|
|
414
450
|
});
|
|
415
451
|
}
|
|
416
452
|
}
|
|
453
|
+
|
|
417
454
|
// private async loadBookingsFromSQLite(): Promise<ResourceBooking[]> {
|
|
418
455
|
// if (!this.dbManager) return []
|
|
419
456
|
// try {
|
|
@@ -423,6 +460,7 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
423
460
|
// return []
|
|
424
461
|
// }
|
|
425
462
|
// }
|
|
463
|
+
|
|
426
464
|
// private async saveBookingsToSQLite(bookings: ResourceBooking[]): Promise<void> {
|
|
427
465
|
// if (!this.dbManager) return
|
|
428
466
|
// try {
|
|
@@ -437,97 +475,95 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
437
475
|
// // 忽略 SQLite 异常
|
|
438
476
|
// }
|
|
439
477
|
// }
|
|
478
|
+
|
|
440
479
|
// ─────────────────────────────────────────────────────────────────
|
|
441
480
|
// pubsub 同步
|
|
442
481
|
// ─────────────────────────────────────────────────────────────────
|
|
482
|
+
|
|
443
483
|
initResourceDataSource() {
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
if (!ResourceDataSourceClass)
|
|
447
|
-
return;
|
|
484
|
+
const ResourceDataSourceClass = this.core.serverOptions?.All_DATA_SOURCES?.ResourceDataSource;
|
|
485
|
+
if (!ResourceDataSourceClass) return;
|
|
448
486
|
this.resourceDataSource = new ResourceDataSourceClass();
|
|
449
487
|
}
|
|
450
488
|
async setupResourceSync() {
|
|
451
|
-
|
|
452
|
-
if (!this.resourceDataSource)
|
|
453
|
-
return;
|
|
489
|
+
if (!this.resourceDataSource) return;
|
|
454
490
|
const result = await this.resourceDataSource.run({
|
|
455
491
|
pubsub: {
|
|
456
|
-
callback:
|
|
457
|
-
const data =
|
|
458
|
-
if (!data)
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
492
|
+
callback: res => {
|
|
493
|
+
const data = res?.data || res;
|
|
494
|
+
if (!data) return;
|
|
495
|
+
const channelKey = data.module || 'resource';
|
|
496
|
+
this.pendingSyncMessages.push({
|
|
497
|
+
...data,
|
|
498
|
+
_channelKey: channelKey
|
|
499
|
+
});
|
|
500
|
+
if (this.syncTimer) clearTimeout(this.syncTimer);
|
|
464
501
|
this.syncTimer = setTimeout(() => {
|
|
465
502
|
this.processSyncMessages();
|
|
466
503
|
}, RESOURCE_SYNC_DEBOUNCE_MS);
|
|
467
504
|
}
|
|
468
505
|
}
|
|
469
506
|
}).catch(() => {
|
|
507
|
+
// 忽略同步初始化异常
|
|
508
|
+
});
|
|
509
|
+
this.logInfo('setupResourceSync: 资源列表查询结果', {
|
|
510
|
+
result
|
|
470
511
|
});
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
if ((_b = (_a = result == null ? void 0 : result.data) == null ? void 0 : _a.list) == null ? void 0 : _b.length) {
|
|
474
|
-
await this.mergeResourcesToStore((_c = result == null ? void 0 : result.data) == null ? void 0 : _c.list);
|
|
512
|
+
if (result?.data?.list?.length) {
|
|
513
|
+
await this.mergeResourcesToStore(result?.data?.list);
|
|
475
514
|
}
|
|
476
515
|
}
|
|
477
516
|
async processSyncMessages() {
|
|
478
|
-
var _a, _b, _c;
|
|
479
517
|
const messages = [...this.pendingSyncMessages];
|
|
480
518
|
this.pendingSyncMessages = [];
|
|
481
|
-
if (messages.length === 0)
|
|
482
|
-
return;
|
|
519
|
+
if (messages.length === 0) return;
|
|
483
520
|
const deleteIds = [];
|
|
484
|
-
const bodyUpdates =
|
|
521
|
+
const bodyUpdates = new Map();
|
|
485
522
|
const sseRefreshIds = [];
|
|
486
523
|
for (const msg of messages) {
|
|
487
|
-
if (msg.operation ===
|
|
488
|
-
if ((
|
|
489
|
-
deleteIds.push(...msg.ids);
|
|
490
|
-
else if (msg.id !== void 0)
|
|
491
|
-
deleteIds.push(msg.id);
|
|
524
|
+
if (msg.operation === 'delete' || msg.action === 'delete') {
|
|
525
|
+
if (msg.ids?.length) deleteIds.push(...msg.ids);else if (msg.id !== undefined) deleteIds.push(msg.id);
|
|
492
526
|
continue;
|
|
493
527
|
}
|
|
494
528
|
if (msg.body) {
|
|
495
529
|
const bodyId = msg.body.id ?? msg.id;
|
|
496
|
-
if (bodyId ===
|
|
497
|
-
|
|
498
|
-
|
|
530
|
+
if (bodyId === undefined) continue;
|
|
531
|
+
bodyUpdates.set(this.getIdKey(bodyId), {
|
|
532
|
+
...msg.body,
|
|
533
|
+
id: bodyId
|
|
534
|
+
});
|
|
499
535
|
continue;
|
|
500
536
|
}
|
|
501
|
-
if (
|
|
537
|
+
if (msg.ids?.length) {
|
|
502
538
|
sseRefreshIds.push(...msg.ids);
|
|
503
|
-
} else if (msg.id !==
|
|
539
|
+
} else if (msg.id !== undefined) {
|
|
504
540
|
sseRefreshIds.push(msg.id);
|
|
505
|
-
} else if (
|
|
541
|
+
} else if (msg.relation_resource_ids?.length) {
|
|
506
542
|
sseRefreshIds.push(...msg.relation_resource_ids);
|
|
507
543
|
}
|
|
508
544
|
}
|
|
509
545
|
const uniqueDeleteIds = this.uniqueResourceIds(deleteIds);
|
|
510
546
|
const uniqueSSEIds = this.uniqueResourceIds(sseRefreshIds);
|
|
511
547
|
const bodyList = [...bodyUpdates.values()];
|
|
512
|
-
if (uniqueDeleteIds.length > 0)
|
|
513
|
-
|
|
514
|
-
if (bodyList.length > 0)
|
|
515
|
-
await this.mergeResourcesToStore(bodyList);
|
|
548
|
+
if (uniqueDeleteIds.length > 0) await this.removeResourcesByIds(uniqueDeleteIds);
|
|
549
|
+
if (bodyList.length > 0) await this.mergeResourcesToStore(bodyList);
|
|
516
550
|
if (uniqueSSEIds.length > 0) {
|
|
517
551
|
const freshResources = await this.fetchResourcesBySSE(uniqueSSEIds);
|
|
518
|
-
if (freshResources.length > 0)
|
|
519
|
-
await this.mergeResourcesToStore(freshResources);
|
|
552
|
+
if (freshResources.length > 0) await this.mergeResourcesToStore(freshResources);
|
|
520
553
|
}
|
|
521
|
-
if (uniqueDeleteIds.length === 0 && bodyList.length === 0 && uniqueSSEIds.length === 0)
|
|
522
|
-
|
|
523
|
-
await this.core.effects.emit(import_types.ResourceHooks.onResourcesSyncCompleted, null);
|
|
554
|
+
if (uniqueDeleteIds.length === 0 && bodyList.length === 0 && uniqueSSEIds.length === 0) return;
|
|
555
|
+
await this.core.effects.emit(_types.ResourceHooks.onResourcesSyncCompleted, null);
|
|
524
556
|
}
|
|
525
557
|
async fetchResourcesBySSE(ids) {
|
|
526
|
-
if (!this.resourceDataSource)
|
|
527
|
-
return [];
|
|
558
|
+
if (!this.resourceDataSource) return [];
|
|
528
559
|
try {
|
|
529
560
|
const list = await this.resourceDataSource.run({
|
|
530
|
-
sse: {
|
|
561
|
+
sse: {
|
|
562
|
+
query: {
|
|
563
|
+
type: 'resource',
|
|
564
|
+
ids
|
|
565
|
+
}
|
|
566
|
+
}
|
|
531
567
|
});
|
|
532
568
|
return list || [];
|
|
533
569
|
} catch {
|
|
@@ -535,8 +571,8 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
535
571
|
}
|
|
536
572
|
}
|
|
537
573
|
async removeResourcesByIds(ids) {
|
|
538
|
-
const keySet = new Set(ids.map(
|
|
539
|
-
this.store.list = this.store.list.filter(
|
|
574
|
+
const keySet = new Set(ids.map(id => this.getIdKey(id)));
|
|
575
|
+
this.store.list = this.store.list.filter(r => !keySet.has(this.getIdKey(r.id)));
|
|
540
576
|
this.syncResourcesMap();
|
|
541
577
|
if (this.dbManager) {
|
|
542
578
|
try {
|
|
@@ -544,21 +580,20 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
544
580
|
await this.dbManager.delete(RESOURCE_STORE_NAME, id);
|
|
545
581
|
}
|
|
546
582
|
} catch {
|
|
583
|
+
// 忽略 SQLite 异常
|
|
547
584
|
}
|
|
548
585
|
}
|
|
549
|
-
await this.safeEmit(
|
|
586
|
+
await this.safeEmit(_types.ResourceHooks.onResourcesChanged, this.store.list);
|
|
550
587
|
}
|
|
551
588
|
async mergeResourcesToStore(freshResources) {
|
|
552
|
-
const freshMap =
|
|
589
|
+
const freshMap = new Map();
|
|
553
590
|
for (const r of freshResources) {
|
|
554
|
-
if (
|
|
555
|
-
continue;
|
|
591
|
+
if (r?.id === undefined) continue;
|
|
556
592
|
freshMap.set(this.getIdKey(r.id), this.normalizeResource(r));
|
|
557
593
|
}
|
|
558
|
-
const updatedList = this.store.list.map(
|
|
594
|
+
const updatedList = this.store.list.map(r => {
|
|
559
595
|
const key = this.getIdKey(r.id);
|
|
560
|
-
if (!freshMap.has(key))
|
|
561
|
-
return r;
|
|
596
|
+
if (!freshMap.has(key)) return r;
|
|
562
597
|
const fresh = freshMap.get(key);
|
|
563
598
|
freshMap.delete(key);
|
|
564
599
|
return fresh;
|
|
@@ -569,20 +604,19 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
569
604
|
this.store.list = updatedList;
|
|
570
605
|
this.syncResourcesMap();
|
|
571
606
|
await this.saveResourcesToSQLite(this.store.list);
|
|
572
|
-
await this.safeEmit(
|
|
607
|
+
await this.safeEmit(_types.ResourceHooks.onResourcesChanged, this.store.list);
|
|
573
608
|
}
|
|
574
609
|
uniqueResourceIds(ids) {
|
|
575
|
-
const idMap =
|
|
610
|
+
const idMap = new Map();
|
|
576
611
|
for (const id of ids) {
|
|
577
612
|
idMap.set(this.getIdKey(id), id);
|
|
578
613
|
}
|
|
579
614
|
return [...idMap.values()];
|
|
580
615
|
}
|
|
581
|
-
}
|
|
582
|
-
|
|
583
|
-
//
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
});
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
// ─────────────────────────────────────────────────────────────────
|
|
619
|
+
// 导出
|
|
620
|
+
// ─────────────────────────────────────────────────────────────────
|
|
621
|
+
exports.ResourceModule = ResourceModule;
|
|
622
|
+
const resourceModule = exports.resourceModule = new ResourceModule();
|