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