feat(P25-2/P25-3/P26-2/P28-1/P24-2/P29-3): 落地内部OA够用版前端入口与运营页面

关联 Issue: P25-2, P25-3, P25-4, P26-2, P26-4, P28-1, P28-2, P28-3, P28-4, P24-2, P29-3
这个提交包含在:
2026-03-21 18:03:48 +08:00
父节点 e39e41287e
当前提交 9905c1c79d
共修改 44 个文件,包含 2029 行新增和 169 行删除
+38 -4
查看文件
@@ -42,13 +42,47 @@ export function createIndexedDbStore(options: IndexedDbStoreOptions) {
const tx = db.transaction(storeName, mode);
const store = tx.objectStore(storeName);
let executorSettled = false;
let transactionCompleted = false;
let settled = false;
let executorResult!: T;
const resolveIfReady = () => {
if (!settled && executorSettled && transactionCompleted) {
settled = true;
resolve(executorResult);
}
};
const rejectOnce = (error: unknown) => {
if (settled) {
return;
}
settled = true;
reject(error instanceof Error ? error : new Error(String(error)));
};
tx.oncomplete = () => {
transactionCompleted = true;
resolveIfReady();
};
tx.onerror = () => rejectOnce(tx.error ?? new Error("indexeddb_tx_failed"));
tx.onabort = () => rejectOnce(tx.error ?? new Error("indexeddb_tx_aborted"));
Promise.resolve(executor(store))
.then((result) => {
tx.oncomplete = () => resolve(result);
tx.onerror = () => reject(tx.error ?? new Error("indexeddb_tx_failed"));
tx.onabort = () => reject(tx.error ?? new Error("indexeddb_tx_aborted"));
executorResult = result;
executorSettled = true;
resolveIfReady();
})
.catch((error) => reject(error));
.catch((error) => {
try {
tx.abort();
} catch {
// noop
}
rejectOnce(error);
});
});
}