@pisell/pisellos 2.2.282 → 2.2.284
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 -9
- 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.d.ts +2 -2
- package/dist/modules/Order/index.js +75 -91
- package/dist/modules/Order/types.d.ts +3 -1
- 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/modules/Summary/utils.d.ts +1 -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 +100 -72
- package/dist/solution/BaseSales/utils/cartPromotion.d.ts +5 -0
- package/dist/solution/BaseSales/utils/cartPromotion.js +15 -6
- package/dist/solution/BookingByStep/index.d.ts +1 -1
- 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 +8 -4
- 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 +131 -131
- 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 -51
- 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.d.ts +2 -2
- package/lib/modules/Order/index.js +1733 -2121
- package/lib/modules/Order/payment-utils.js +77 -120
- package/lib/modules/Order/types.d.ts +3 -1
- package/lib/modules/Order/types.js +87 -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 +66 -100
- 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 +60 -61
- package/lib/modules/ResourcePlanner/planner.js +346 -384
- package/lib/modules/ResourcePlanner/types.js +4 -16
- 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.d.ts +1 -1
- 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 +3027 -2655
- package/lib/server/modules/floor-plan/index.js +102 -123
- 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 +146 -122
- package/lib/server/modules/menu/types.js +18 -31
- package/lib/server/modules/order/index.js +758 -956
- 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 +575 -459
- 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 +213 -184
- 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 +1209 -1412
- package/lib/solution/BaseSales/types.js +42 -38
- package/lib/solution/BaseSales/utils/cartPromotion.d.ts +5 -0
- package/lib/solution/BaseSales/utils/cartPromotion.js +652 -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.d.ts +1 -1
- 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 +598 -514
- package/lib/solution/BookingTicket/types.js +99 -77
- package/lib/solution/BookingTicket/utils/addProductDecision.js +225 -187
- 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 +437 -487
- package/lib/solution/UnifiedBookingSales/types.js +12 -31
- 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
|
});
|
|
@@ -91,111 +98,125 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
91
98
|
await this.setupResourceSync();
|
|
92
99
|
const cachedResources = await this.loadResourcesFromSQLite();
|
|
93
100
|
if (cachedResources.length > 0) {
|
|
94
|
-
this.store.list = (0,
|
|
101
|
+
this.store.list = (0, _lodashEs.cloneDeep)(cachedResources).map(item => this.normalizeResource(item));
|
|
95
102
|
this.syncResourcesMap();
|
|
96
|
-
await this.safeEmit(
|
|
103
|
+
await this.safeEmit(_types.ResourceHooks.onResourcesChanged, this.store.list);
|
|
97
104
|
} else {
|
|
98
105
|
const resources = await this.loadResourcesByServer();
|
|
99
106
|
if (resources.length > 0) {
|
|
100
|
-
this.store.list = (0,
|
|
107
|
+
this.store.list = (0, _lodashEs.cloneDeep)(resources).map(item => this.normalizeResource(item));
|
|
101
108
|
this.syncResourcesMap();
|
|
102
|
-
await this.safeEmit(
|
|
109
|
+
await this.safeEmit(_types.ResourceHooks.onResourcesChanged, this.store.list);
|
|
103
110
|
}
|
|
104
111
|
}
|
|
112
|
+
|
|
113
|
+
// const cachedBookings = await this.loadBookingsFromSQLite()
|
|
114
|
+
// if (cachedBookings.length > 0) {
|
|
115
|
+
// this.store.bookings = cloneDeep(cachedBookings)
|
|
116
|
+
// this.syncBookingsIndex()
|
|
117
|
+
// }
|
|
105
118
|
}
|
|
106
119
|
getRoutes() {
|
|
107
120
|
return [];
|
|
108
121
|
}
|
|
109
122
|
destroy() {
|
|
110
|
-
var _a;
|
|
111
123
|
if (this.syncTimer) {
|
|
112
124
|
clearTimeout(this.syncTimer);
|
|
113
|
-
this.syncTimer =
|
|
125
|
+
this.syncTimer = undefined;
|
|
114
126
|
}
|
|
115
127
|
this.pendingSyncMessages = [];
|
|
116
|
-
if (
|
|
117
|
-
this.resourceDataSource.destroy();
|
|
128
|
+
if (this.resourceDataSource?.destroy) this.resourceDataSource.destroy();
|
|
118
129
|
super.destroy();
|
|
119
130
|
}
|
|
131
|
+
|
|
120
132
|
// ─────────────────────────────────────────────────────────────────
|
|
121
133
|
// Resource CRUD
|
|
122
134
|
// ─────────────────────────────────────────────────────────────────
|
|
135
|
+
|
|
123
136
|
/**
|
|
124
137
|
* 获取所有资源(支持 includeBookings 附加预订信息)
|
|
125
138
|
*/
|
|
126
139
|
getResources(queryOptions) {
|
|
127
|
-
this.logInfo(
|
|
140
|
+
this.logInfo('getResources', {
|
|
128
141
|
queryOptions
|
|
129
142
|
});
|
|
130
|
-
if (!
|
|
143
|
+
if (!queryOptions?.includeBookings) {
|
|
131
144
|
return this.store.list;
|
|
132
145
|
}
|
|
133
|
-
return this.store.list.map(
|
|
146
|
+
return this.store.list.map(resource => this.attachBookingsToResource(resource));
|
|
134
147
|
}
|
|
148
|
+
|
|
135
149
|
/**
|
|
136
150
|
* 根据 ID 获取单个资源
|
|
137
151
|
*/
|
|
138
152
|
getResourceById(id, queryOptions) {
|
|
139
153
|
const resource = this.store.map.get(id);
|
|
140
|
-
if (!resource)
|
|
141
|
-
|
|
142
|
-
if (queryOptions == null ? void 0 : queryOptions.includeBookings) {
|
|
154
|
+
if (!resource) return undefined;
|
|
155
|
+
if (queryOptions?.includeBookings) {
|
|
143
156
|
return this.attachBookingsToResource(resource);
|
|
144
157
|
}
|
|
145
158
|
return resource;
|
|
146
159
|
}
|
|
160
|
+
|
|
147
161
|
/**
|
|
148
162
|
* 创建资源
|
|
149
163
|
*/
|
|
150
164
|
createResource(data) {
|
|
151
|
-
const id =
|
|
152
|
-
const resource = this.normalizeResource({
|
|
165
|
+
const id = data?.id ?? data?.form_record_id ?? Date.now();
|
|
166
|
+
const resource = this.normalizeResource({
|
|
167
|
+
...data,
|
|
168
|
+
id
|
|
169
|
+
});
|
|
153
170
|
this.store.list.push(resource);
|
|
154
171
|
this.store.map.set(resource.id, resource);
|
|
155
|
-
this.saveResourcesToSQLite(this.store.list).catch(() => {
|
|
156
|
-
|
|
157
|
-
this.safeEmit(import_types.ResourceHooks.onResourcesChanged, this.store.list);
|
|
172
|
+
this.saveResourcesToSQLite(this.store.list).catch(() => {});
|
|
173
|
+
this.safeEmit(_types.ResourceHooks.onResourcesChanged, this.store.list);
|
|
158
174
|
return resource;
|
|
159
175
|
}
|
|
176
|
+
|
|
160
177
|
/**
|
|
161
178
|
* 更新资源
|
|
162
179
|
*/
|
|
163
180
|
updateResource(id, data) {
|
|
164
|
-
const index = this.store.list.findIndex(
|
|
165
|
-
if (index === -1)
|
|
166
|
-
|
|
167
|
-
|
|
181
|
+
const index = this.store.list.findIndex(r => this.getIdKey(r.id) === this.getIdKey(id));
|
|
182
|
+
if (index === -1) return undefined;
|
|
183
|
+
const updated = this.normalizeResource({
|
|
184
|
+
...this.store.list[index],
|
|
185
|
+
...data,
|
|
186
|
+
id
|
|
187
|
+
});
|
|
168
188
|
this.store.list[index] = updated;
|
|
169
189
|
this.store.map.set(updated.id, updated);
|
|
170
|
-
this.saveResourcesToSQLite(this.store.list).catch(() => {
|
|
171
|
-
|
|
172
|
-
this.safeEmit(import_types.ResourceHooks.onResourcesChanged, this.store.list);
|
|
190
|
+
this.saveResourcesToSQLite(this.store.list).catch(() => {});
|
|
191
|
+
this.safeEmit(_types.ResourceHooks.onResourcesChanged, this.store.list);
|
|
173
192
|
return updated;
|
|
174
193
|
}
|
|
194
|
+
|
|
175
195
|
/**
|
|
176
196
|
* 删除资源
|
|
177
197
|
*/
|
|
178
198
|
deleteResource(id) {
|
|
179
199
|
const key = this.getIdKey(id);
|
|
180
|
-
const index = this.store.list.findIndex(
|
|
181
|
-
if (index === -1)
|
|
182
|
-
return false;
|
|
200
|
+
const index = this.store.list.findIndex(r => this.getIdKey(r.id) === key);
|
|
201
|
+
if (index === -1) return false;
|
|
183
202
|
this.store.list.splice(index, 1);
|
|
184
203
|
this.store.map.delete(id);
|
|
185
|
-
this.saveResourcesToSQLite(this.store.list).catch(() => {
|
|
186
|
-
|
|
187
|
-
this.safeEmit(import_types.ResourceHooks.onResourcesChanged, this.store.list);
|
|
204
|
+
this.saveResourcesToSQLite(this.store.list).catch(() => {});
|
|
205
|
+
this.safeEmit(_types.ResourceHooks.onResourcesChanged, this.store.list);
|
|
188
206
|
return true;
|
|
189
207
|
}
|
|
208
|
+
|
|
190
209
|
// ─────────────────────────────────────────────────────────────────
|
|
191
210
|
// Booking CRUD
|
|
192
211
|
// ─────────────────────────────────────────────────────────────────
|
|
212
|
+
|
|
193
213
|
/**
|
|
194
214
|
* 根据资源 ID 获取预订列表
|
|
195
215
|
*/
|
|
196
216
|
getBookingsByResourceId(resourceId) {
|
|
197
217
|
return this.resourceIdIndex.get(resourceId) || [];
|
|
198
218
|
}
|
|
219
|
+
|
|
199
220
|
/**
|
|
200
221
|
* 创建预订
|
|
201
222
|
*/
|
|
@@ -205,43 +226,52 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
205
226
|
// id,
|
|
206
227
|
// ...booking,
|
|
207
228
|
// } as ResourceBooking
|
|
229
|
+
|
|
208
230
|
// this.store.bookings.push(normalized)
|
|
231
|
+
|
|
209
232
|
// const rid = normalized.resource_id ?? normalized.resourceId
|
|
210
233
|
// if (rid !== undefined) {
|
|
211
234
|
// const existing = this.resourceIdIndex.get(rid) || []
|
|
212
235
|
// existing.push(normalized)
|
|
213
236
|
// this.resourceIdIndex.set(rid, existing)
|
|
214
237
|
// }
|
|
238
|
+
|
|
215
239
|
// this.saveBookingsToSQLite(this.store.bookings).catch(() => {})
|
|
216
240
|
// this.safeEmit(ResourceHooks.onBookingsChanged, this.store.bookings)
|
|
217
241
|
// return normalized
|
|
218
242
|
// }
|
|
243
|
+
|
|
219
244
|
/**
|
|
220
245
|
* 更新预订
|
|
221
246
|
*/
|
|
222
247
|
// updateBooking(id: ResourceId, data: Partial<ResourceBooking>): ResourceBooking | undefined {
|
|
223
248
|
// const index = this.store.bookings.findIndex(b => this.getIdKey(b.id) === this.getIdKey(id))
|
|
224
249
|
// if (index === -1) return undefined
|
|
250
|
+
|
|
225
251
|
// const old = this.store.bookings[index]
|
|
226
252
|
// const updated: ResourceBooking = { ...old, ...data, id: old.id } as ResourceBooking
|
|
227
253
|
// this.store.bookings[index] = updated
|
|
254
|
+
|
|
228
255
|
// this.rebuildBookingsIndex()
|
|
229
256
|
// this.saveBookingsToSQLite(this.store.bookings).catch(() => {})
|
|
230
257
|
// this.safeEmit(ResourceHooks.onBookingsChanged, this.store.bookings)
|
|
231
258
|
// return updated
|
|
232
259
|
// }
|
|
260
|
+
|
|
233
261
|
/**
|
|
234
262
|
* 删除预订
|
|
235
263
|
*/
|
|
236
264
|
// deleteBooking(id: ResourceId): boolean {
|
|
237
265
|
// const index = this.store.bookings.findIndex(b => this.getIdKey(b.id) === this.getIdKey(id))
|
|
238
266
|
// if (index === -1) return false
|
|
267
|
+
|
|
239
268
|
// this.store.bookings.splice(index, 1)
|
|
240
269
|
// this.rebuildBookingsIndex()
|
|
241
270
|
// this.saveBookingsToSQLite(this.store.bookings).catch(() => {})
|
|
242
271
|
// this.safeEmit(ResourceHooks.onBookingsChanged, this.store.bookings)
|
|
243
272
|
// return true
|
|
244
273
|
// }
|
|
274
|
+
|
|
245
275
|
/**
|
|
246
276
|
* 清空缓存
|
|
247
277
|
*/
|
|
@@ -253,15 +283,19 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
253
283
|
if (this.dbManager) {
|
|
254
284
|
try {
|
|
255
285
|
await this.dbManager.clear(RESOURCE_STORE_NAME);
|
|
286
|
+
// await this.dbManager.clear(BOOKING_STORE_NAME)
|
|
256
287
|
} catch {
|
|
288
|
+
// 清理失败不影响调用方
|
|
257
289
|
}
|
|
258
290
|
}
|
|
259
|
-
await this.safeEmit(
|
|
260
|
-
await this.safeEmit(
|
|
291
|
+
await this.safeEmit(_types.ResourceHooks.onResourcesChanged, this.store.list);
|
|
292
|
+
await this.safeEmit(_types.ResourceHooks.onBookingsChanged, this.store.bookings);
|
|
261
293
|
}
|
|
294
|
+
|
|
262
295
|
// ─────────────────────────────────────────────────────────────────
|
|
263
296
|
// 内部工具方法
|
|
264
297
|
// ─────────────────────────────────────────────────────────────────
|
|
298
|
+
|
|
265
299
|
attachBookingsToResource(resource) {
|
|
266
300
|
return {
|
|
267
301
|
...resource,
|
|
@@ -269,25 +303,23 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
269
303
|
};
|
|
270
304
|
}
|
|
271
305
|
normalizeIntegerIdValue(value) {
|
|
272
|
-
if (typeof value !==
|
|
273
|
-
return value;
|
|
306
|
+
if (typeof value !== 'string') return value;
|
|
274
307
|
const matched = value.match(/^(-?\d+)\.0+$/);
|
|
275
|
-
if (!matched)
|
|
276
|
-
return value;
|
|
308
|
+
if (!matched) return value;
|
|
277
309
|
return matched[1];
|
|
278
310
|
}
|
|
279
311
|
normalizeResourceIdFields(resource) {
|
|
280
312
|
resource.id = this.normalizeIntegerIdValue(resource.id);
|
|
281
|
-
if (resource.form_record_id !==
|
|
313
|
+
if (resource.form_record_id !== undefined) {
|
|
282
314
|
resource.form_record_id = this.normalizeIntegerIdValue(resource.form_record_id);
|
|
283
315
|
}
|
|
284
|
-
if (resource.form_id !==
|
|
316
|
+
if (resource.form_id !== undefined) {
|
|
285
317
|
resource.form_id = this.normalizeIntegerIdValue(resource.form_id);
|
|
286
318
|
}
|
|
287
|
-
if (resource.resource_form_id !==
|
|
319
|
+
if (resource.resource_form_id !== undefined) {
|
|
288
320
|
resource.resource_form_id = this.normalizeIntegerIdValue(resource.resource_form_id);
|
|
289
321
|
}
|
|
290
|
-
if (resource.resource_id !==
|
|
322
|
+
if (resource.resource_id !== undefined) {
|
|
291
323
|
resource.resource_id = this.normalizeIntegerIdValue(resource.resource_id);
|
|
292
324
|
}
|
|
293
325
|
return resource;
|
|
@@ -295,21 +327,20 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
295
327
|
normalizeResource(resource) {
|
|
296
328
|
const normalized = this.normalizeResourceIdFields({
|
|
297
329
|
...resource,
|
|
298
|
-
id: this.normalizeIntegerIdValue(
|
|
330
|
+
id: this.normalizeIntegerIdValue(resource?.id ?? resource?.form_record_id ?? '')
|
|
299
331
|
});
|
|
300
|
-
if (normalized.form_record_id ===
|
|
332
|
+
if (normalized.form_record_id === undefined && normalized.id !== '') {
|
|
301
333
|
normalized.form_record_id = normalized.id;
|
|
302
334
|
}
|
|
303
|
-
if (normalized.resource_form_id ===
|
|
304
|
-
normalized.resource_form_id =
|
|
335
|
+
if (normalized.resource_form_id === undefined || normalized.resource_form_id === null) {
|
|
336
|
+
normalized.resource_form_id = '';
|
|
305
337
|
}
|
|
306
|
-
if (normalized.schedule ===
|
|
307
|
-
normalized.schedule =
|
|
338
|
+
if (normalized.schedule === undefined || normalized.schedule === null) {
|
|
339
|
+
normalized.schedule = '';
|
|
308
340
|
}
|
|
309
341
|
if (Array.isArray(normalized.times)) {
|
|
310
|
-
normalized.times = normalized.times.map(
|
|
311
|
-
if (!timeSlot || typeof timeSlot !==
|
|
312
|
-
return timeSlot;
|
|
342
|
+
normalized.times = normalized.times.map(timeSlot => {
|
|
343
|
+
if (!timeSlot || typeof timeSlot !== 'object') return timeSlot;
|
|
313
344
|
const startAt = timeSlot.start_at ?? timeSlot.start;
|
|
314
345
|
const endAt = timeSlot.end_at ?? timeSlot.end;
|
|
315
346
|
return {
|
|
@@ -322,7 +353,7 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
322
353
|
});
|
|
323
354
|
}
|
|
324
355
|
if (Array.isArray(normalized.children)) {
|
|
325
|
-
normalized.children = normalized.children.map(
|
|
356
|
+
normalized.children = normalized.children.map(child => this.normalizeResource(child));
|
|
326
357
|
}
|
|
327
358
|
return normalized;
|
|
328
359
|
}
|
|
@@ -330,11 +361,12 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
330
361
|
try {
|
|
331
362
|
await this.core.effects.emit(event, payload);
|
|
332
363
|
} catch (error) {
|
|
364
|
+
// 不让外部监听器异常影响资源模块预加载或清理流程
|
|
333
365
|
console.error(`[ResourceModule] 事件派发失败: ${event}`, error);
|
|
334
366
|
}
|
|
335
367
|
}
|
|
336
368
|
syncResourcesMap() {
|
|
337
|
-
this.store.map =
|
|
369
|
+
this.store.map = new Map();
|
|
338
370
|
for (const resource of this.store.list) {
|
|
339
371
|
this.store.map.set(resource.id, resource);
|
|
340
372
|
}
|
|
@@ -343,8 +375,7 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
343
375
|
this.resourceIdIndex.clear();
|
|
344
376
|
for (const booking of this.store.bookings) {
|
|
345
377
|
const rid = booking.resource_id ?? booking.resourceId;
|
|
346
|
-
if (rid ===
|
|
347
|
-
continue;
|
|
378
|
+
if (rid === undefined) continue;
|
|
348
379
|
const existing = this.resourceIdIndex.get(rid) || [];
|
|
349
380
|
existing.push(booking);
|
|
350
381
|
this.resourceIdIndex.set(rid, existing);
|
|
@@ -356,32 +387,34 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
356
387
|
getIdKey(id) {
|
|
357
388
|
return String(id);
|
|
358
389
|
}
|
|
390
|
+
|
|
359
391
|
// ─────────────────────────────────────────────────────────────────
|
|
360
392
|
// 数据加载
|
|
361
393
|
// ─────────────────────────────────────────────────────────────────
|
|
394
|
+
|
|
362
395
|
async loadResourcesByServer() {
|
|
363
|
-
if (!this.resourceDataSource)
|
|
364
|
-
return [];
|
|
396
|
+
if (!this.resourceDataSource) return [];
|
|
365
397
|
try {
|
|
366
398
|
const response = await this.resourceDataSource.getResourcePage({
|
|
367
399
|
num: DEFAULT_PAGE_SIZE,
|
|
368
400
|
skip: 1
|
|
369
401
|
});
|
|
370
|
-
const resourceList = Array.isArray(response
|
|
371
|
-
const normalizedList = resourceList.map(
|
|
402
|
+
const resourceList = Array.isArray(response?.list) ? response.list : [];
|
|
403
|
+
const normalizedList = resourceList.map(item => this.normalizeResource(item));
|
|
372
404
|
await this.saveResourcesToSQLite(normalizedList);
|
|
373
|
-
await this.safeEmit(
|
|
405
|
+
await this.safeEmit(_types.ResourceHooks.onResourcesLoaded, normalizedList);
|
|
374
406
|
return normalizedList;
|
|
375
407
|
} catch {
|
|
376
408
|
return [];
|
|
377
409
|
}
|
|
378
410
|
}
|
|
411
|
+
|
|
379
412
|
// ─────────────────────────────────────────────────────────────────
|
|
380
413
|
// SQLite 持久化
|
|
381
414
|
// ─────────────────────────────────────────────────────────────────
|
|
415
|
+
|
|
382
416
|
async loadResourcesFromSQLite() {
|
|
383
|
-
if (!this.dbManager)
|
|
384
|
-
return [];
|
|
417
|
+
if (!this.dbManager) return [];
|
|
385
418
|
try {
|
|
386
419
|
const resources = await this.dbManager.getAll(RESOURCE_STORE_NAME);
|
|
387
420
|
return resources || [];
|
|
@@ -390,25 +423,24 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
390
423
|
}
|
|
391
424
|
}
|
|
392
425
|
async saveResourcesToSQLite(resourceList) {
|
|
393
|
-
if (!this.dbManager)
|
|
394
|
-
return;
|
|
426
|
+
if (!this.dbManager) return;
|
|
395
427
|
try {
|
|
396
428
|
await this.dbManager.clear(RESOURCE_STORE_NAME);
|
|
397
|
-
if (resourceList.length === 0)
|
|
398
|
-
return;
|
|
429
|
+
if (resourceList.length === 0) return;
|
|
399
430
|
if (this.dbManager.bulkAdd) {
|
|
400
431
|
await this.dbManager.bulkAdd(RESOURCE_STORE_NAME, resourceList);
|
|
401
432
|
return;
|
|
402
433
|
}
|
|
403
|
-
await Promise.all(resourceList.map(
|
|
434
|
+
await Promise.all(resourceList.map(r => this.dbManager.add(RESOURCE_STORE_NAME, r)));
|
|
404
435
|
} catch (error) {
|
|
405
|
-
console.error(
|
|
406
|
-
this.logError(
|
|
436
|
+
console.error('saveResourcesToSQLite error', error);
|
|
437
|
+
this.logError('保存资源到 SQLite 失败', {
|
|
407
438
|
error: error instanceof Error ? error.message : String(error),
|
|
408
439
|
resourceList: resourceList.length
|
|
409
440
|
});
|
|
410
441
|
}
|
|
411
442
|
}
|
|
443
|
+
|
|
412
444
|
// private async loadBookingsFromSQLite(): Promise<ResourceBooking[]> {
|
|
413
445
|
// if (!this.dbManager) return []
|
|
414
446
|
// try {
|
|
@@ -418,6 +450,7 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
418
450
|
// return []
|
|
419
451
|
// }
|
|
420
452
|
// }
|
|
453
|
+
|
|
421
454
|
// private async saveBookingsToSQLite(bookings: ResourceBooking[]): Promise<void> {
|
|
422
455
|
// if (!this.dbManager) return
|
|
423
456
|
// try {
|
|
@@ -432,97 +465,95 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
432
465
|
// // 忽略 SQLite 异常
|
|
433
466
|
// }
|
|
434
467
|
// }
|
|
468
|
+
|
|
435
469
|
// ─────────────────────────────────────────────────────────────────
|
|
436
470
|
// pubsub 同步
|
|
437
471
|
// ─────────────────────────────────────────────────────────────────
|
|
472
|
+
|
|
438
473
|
initResourceDataSource() {
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
if (!ResourceDataSourceClass)
|
|
442
|
-
return;
|
|
474
|
+
const ResourceDataSourceClass = this.core.serverOptions?.All_DATA_SOURCES?.ResourceDataSource;
|
|
475
|
+
if (!ResourceDataSourceClass) return;
|
|
443
476
|
this.resourceDataSource = new ResourceDataSourceClass();
|
|
444
477
|
}
|
|
445
478
|
async setupResourceSync() {
|
|
446
|
-
|
|
447
|
-
if (!this.resourceDataSource)
|
|
448
|
-
return;
|
|
479
|
+
if (!this.resourceDataSource) return;
|
|
449
480
|
const result = await this.resourceDataSource.run({
|
|
450
481
|
pubsub: {
|
|
451
|
-
callback:
|
|
452
|
-
const data =
|
|
453
|
-
if (!data)
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
482
|
+
callback: res => {
|
|
483
|
+
const data = res?.data || res;
|
|
484
|
+
if (!data) return;
|
|
485
|
+
const channelKey = data.module || 'resource';
|
|
486
|
+
this.pendingSyncMessages.push({
|
|
487
|
+
...data,
|
|
488
|
+
_channelKey: channelKey
|
|
489
|
+
});
|
|
490
|
+
if (this.syncTimer) clearTimeout(this.syncTimer);
|
|
459
491
|
this.syncTimer = setTimeout(() => {
|
|
460
492
|
this.processSyncMessages();
|
|
461
493
|
}, RESOURCE_SYNC_DEBOUNCE_MS);
|
|
462
494
|
}
|
|
463
495
|
}
|
|
464
496
|
}).catch(() => {
|
|
497
|
+
// 忽略同步初始化异常
|
|
465
498
|
});
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
499
|
+
this.logInfo('setupResourceSync: 资源列表查询结果', {
|
|
500
|
+
result
|
|
501
|
+
});
|
|
502
|
+
if (result?.data?.list?.length) {
|
|
503
|
+
await this.mergeResourcesToStore(result?.data?.list);
|
|
470
504
|
}
|
|
471
505
|
}
|
|
472
506
|
async processSyncMessages() {
|
|
473
|
-
var _a, _b, _c;
|
|
474
507
|
const messages = [...this.pendingSyncMessages];
|
|
475
508
|
this.pendingSyncMessages = [];
|
|
476
|
-
if (messages.length === 0)
|
|
477
|
-
return;
|
|
509
|
+
if (messages.length === 0) return;
|
|
478
510
|
const deleteIds = [];
|
|
479
|
-
const bodyUpdates =
|
|
511
|
+
const bodyUpdates = new Map();
|
|
480
512
|
const sseRefreshIds = [];
|
|
481
513
|
for (const msg of messages) {
|
|
482
|
-
if (msg.operation ===
|
|
483
|
-
if ((
|
|
484
|
-
deleteIds.push(...msg.ids);
|
|
485
|
-
else if (msg.id !== void 0)
|
|
486
|
-
deleteIds.push(msg.id);
|
|
514
|
+
if (msg.operation === 'delete' || msg.action === 'delete') {
|
|
515
|
+
if (msg.ids?.length) deleteIds.push(...msg.ids);else if (msg.id !== undefined) deleteIds.push(msg.id);
|
|
487
516
|
continue;
|
|
488
517
|
}
|
|
489
518
|
if (msg.body) {
|
|
490
519
|
const bodyId = msg.body.id ?? msg.id;
|
|
491
|
-
if (bodyId ===
|
|
492
|
-
|
|
493
|
-
|
|
520
|
+
if (bodyId === undefined) continue;
|
|
521
|
+
bodyUpdates.set(this.getIdKey(bodyId), {
|
|
522
|
+
...msg.body,
|
|
523
|
+
id: bodyId
|
|
524
|
+
});
|
|
494
525
|
continue;
|
|
495
526
|
}
|
|
496
|
-
if (
|
|
527
|
+
if (msg.ids?.length) {
|
|
497
528
|
sseRefreshIds.push(...msg.ids);
|
|
498
|
-
} else if (msg.id !==
|
|
529
|
+
} else if (msg.id !== undefined) {
|
|
499
530
|
sseRefreshIds.push(msg.id);
|
|
500
|
-
} else if (
|
|
531
|
+
} else if (msg.relation_resource_ids?.length) {
|
|
501
532
|
sseRefreshIds.push(...msg.relation_resource_ids);
|
|
502
533
|
}
|
|
503
534
|
}
|
|
504
535
|
const uniqueDeleteIds = this.uniqueResourceIds(deleteIds);
|
|
505
536
|
const uniqueSSEIds = this.uniqueResourceIds(sseRefreshIds);
|
|
506
537
|
const bodyList = [...bodyUpdates.values()];
|
|
507
|
-
if (uniqueDeleteIds.length > 0)
|
|
508
|
-
|
|
509
|
-
if (bodyList.length > 0)
|
|
510
|
-
await this.mergeResourcesToStore(bodyList);
|
|
538
|
+
if (uniqueDeleteIds.length > 0) await this.removeResourcesByIds(uniqueDeleteIds);
|
|
539
|
+
if (bodyList.length > 0) await this.mergeResourcesToStore(bodyList);
|
|
511
540
|
if (uniqueSSEIds.length > 0) {
|
|
512
541
|
const freshResources = await this.fetchResourcesBySSE(uniqueSSEIds);
|
|
513
|
-
if (freshResources.length > 0)
|
|
514
|
-
await this.mergeResourcesToStore(freshResources);
|
|
542
|
+
if (freshResources.length > 0) await this.mergeResourcesToStore(freshResources);
|
|
515
543
|
}
|
|
516
|
-
if (uniqueDeleteIds.length === 0 && bodyList.length === 0 && uniqueSSEIds.length === 0)
|
|
517
|
-
|
|
518
|
-
await this.core.effects.emit(import_types.ResourceHooks.onResourcesSyncCompleted, null);
|
|
544
|
+
if (uniqueDeleteIds.length === 0 && bodyList.length === 0 && uniqueSSEIds.length === 0) return;
|
|
545
|
+
await this.core.effects.emit(_types.ResourceHooks.onResourcesSyncCompleted, null);
|
|
519
546
|
}
|
|
520
547
|
async fetchResourcesBySSE(ids) {
|
|
521
|
-
if (!this.resourceDataSource)
|
|
522
|
-
return [];
|
|
548
|
+
if (!this.resourceDataSource) return [];
|
|
523
549
|
try {
|
|
524
550
|
const list = await this.resourceDataSource.run({
|
|
525
|
-
sse: {
|
|
551
|
+
sse: {
|
|
552
|
+
query: {
|
|
553
|
+
type: 'resource',
|
|
554
|
+
ids
|
|
555
|
+
}
|
|
556
|
+
}
|
|
526
557
|
});
|
|
527
558
|
return list || [];
|
|
528
559
|
} catch {
|
|
@@ -530,8 +561,8 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
530
561
|
}
|
|
531
562
|
}
|
|
532
563
|
async removeResourcesByIds(ids) {
|
|
533
|
-
const keySet = new Set(ids.map(
|
|
534
|
-
this.store.list = this.store.list.filter(
|
|
564
|
+
const keySet = new Set(ids.map(id => this.getIdKey(id)));
|
|
565
|
+
this.store.list = this.store.list.filter(r => !keySet.has(this.getIdKey(r.id)));
|
|
535
566
|
this.syncResourcesMap();
|
|
536
567
|
if (this.dbManager) {
|
|
537
568
|
try {
|
|
@@ -539,21 +570,20 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
539
570
|
await this.dbManager.delete(RESOURCE_STORE_NAME, id);
|
|
540
571
|
}
|
|
541
572
|
} catch {
|
|
573
|
+
// 忽略 SQLite 异常
|
|
542
574
|
}
|
|
543
575
|
}
|
|
544
|
-
await this.safeEmit(
|
|
576
|
+
await this.safeEmit(_types.ResourceHooks.onResourcesChanged, this.store.list);
|
|
545
577
|
}
|
|
546
578
|
async mergeResourcesToStore(freshResources) {
|
|
547
|
-
const freshMap =
|
|
579
|
+
const freshMap = new Map();
|
|
548
580
|
for (const r of freshResources) {
|
|
549
|
-
if (
|
|
550
|
-
continue;
|
|
581
|
+
if (r?.id === undefined) continue;
|
|
551
582
|
freshMap.set(this.getIdKey(r.id), this.normalizeResource(r));
|
|
552
583
|
}
|
|
553
|
-
const updatedList = this.store.list.map(
|
|
584
|
+
const updatedList = this.store.list.map(r => {
|
|
554
585
|
const key = this.getIdKey(r.id);
|
|
555
|
-
if (!freshMap.has(key))
|
|
556
|
-
return r;
|
|
586
|
+
if (!freshMap.has(key)) return r;
|
|
557
587
|
const fresh = freshMap.get(key);
|
|
558
588
|
freshMap.delete(key);
|
|
559
589
|
return fresh;
|
|
@@ -564,20 +594,19 @@ var ResourceModule = class extends import_BaseModule.BaseModule {
|
|
|
564
594
|
this.store.list = updatedList;
|
|
565
595
|
this.syncResourcesMap();
|
|
566
596
|
await this.saveResourcesToSQLite(this.store.list);
|
|
567
|
-
await this.safeEmit(
|
|
597
|
+
await this.safeEmit(_types.ResourceHooks.onResourcesChanged, this.store.list);
|
|
568
598
|
}
|
|
569
599
|
uniqueResourceIds(ids) {
|
|
570
|
-
const idMap =
|
|
600
|
+
const idMap = new Map();
|
|
571
601
|
for (const id of ids) {
|
|
572
602
|
idMap.set(this.getIdKey(id), id);
|
|
573
603
|
}
|
|
574
604
|
return [...idMap.values()];
|
|
575
605
|
}
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
//
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
});
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
// ─────────────────────────────────────────────────────────────────
|
|
609
|
+
// 导出
|
|
610
|
+
// ─────────────────────────────────────────────────────────────────
|
|
611
|
+
exports.ResourceModule = ResourceModule;
|
|
612
|
+
const resourceModule = exports.resourceModule = new ResourceModule();
|