端上:#47~#55 打包 —— 行程双轨、动态类型、表单全局规范 (#53)
#48 计划/实际双轨:nodeAction(start/done/cancel),完成即转实际行程, 实际行程不再显示状态;新增 actualStartedAt/actualEndedAt #49 类型/出行方式/车辆 chip 改内部读状态(@Builder 值传参不刷新) #50 类型点击立即变色、出行方式平铺、参与人显示已选头像 #51 节点类型动态加载(原硬编码5种)、地址 onPick 拿详细地址与坐标 #52 标签改主题色 Bold、必填红无星号、编辑行程标题同步 #53 表单两排版式(标签独占一行解决左右对不齐);电影弹层 layoutWeight 修滚动 #54 地址联想框加时间窗抑制(600ms 内不搜)、候选限高 180 含附件回填诊断日志(DIAG-ATTACH/FILL),待真机确认后移除
This commit is contained in:
@@ -52,6 +52,9 @@ import { FB_KEY_STORE } from '../data/FbKeyStore';
|
||||
import { FbDb } from '../data/FbDb';
|
||||
import { FB_MODULE_TOKEN } from '../data/FbModuleRepo';
|
||||
import { FbSyncAllResult, syncAll } from '../data/FbSyncAll';
|
||||
import { FB_CAL_SETTINGS } from '../data/FbCalSettings';
|
||||
import { FbCalMirror, FbMirrorResult } from '../data/FbCalMirror';
|
||||
import { FbCalInbound, FbInboundResult } from '../data/FbCalInbound';
|
||||
|
||||
const DOMAIN: number = 0x0000;
|
||||
const TAG: string = 'FbBgSync';
|
||||
@@ -364,6 +367,39 @@ class FbBackgroundSyncImpl {
|
||||
*
|
||||
* @param tag 触发来源(`deferred` / `transient` / `cardTick` / `foreground` / `netRecover`)
|
||||
*/
|
||||
/**
|
||||
* 跑一次「系统日历镜像」(入站 → 出站)。
|
||||
*
|
||||
* 🔴 2026-11-03 新增。用户要求把日历镜像到系统日历,
|
||||
* 这样小艺 / 桌面卡片 / 手表能看到日程。
|
||||
*
|
||||
* ⚠️ **整段吞异常**:镜像是附加能力,失败不能让同步算失败。
|
||||
* (与上面「后台路径必须吞掉所有异常」同一条纪律。)
|
||||
* ⚠️ 只在用户开着开关、且已授权时才跑。
|
||||
*/
|
||||
private async runMirror(ctx: common.Context, tag: string): Promise<void> {
|
||||
try {
|
||||
if (!FB_CAL_SETTINGS.getMirror()) {
|
||||
return;
|
||||
}
|
||||
if (!await FbCalMirror.hasPermission()) {
|
||||
return;
|
||||
}
|
||||
// ① 入站:系统日历里的改动 → 服务器(必须在出站之前)
|
||||
const inb: FbInboundResult = await FbCalInbound.reconcile(ctx);
|
||||
// ② 出站:最新数据 → 系统日历
|
||||
const r: FbMirrorResult = await FbCalMirror.syncNow(ctx);
|
||||
hilog.info(DOMAIN, TAG,
|
||||
'镜像[%{public}s]:入站 改=%{public}d 删=%{public}d 增=%{public}d;'
|
||||
+ '出站 增=%{public}d 更=%{public}d 删=%{public}d 失败=%{public}d',
|
||||
tag, inb.updated, inb.deleted, inb.created,
|
||||
r.added, r.updated, r.deleted, r.failed);
|
||||
} catch (err) {
|
||||
const e: BusinessError = err as BusinessError;
|
||||
hilog.warn(DOMAIN, TAG, '镜像[%{public}s] 失败(不影响同步):%{public}s', tag, e.message);
|
||||
}
|
||||
}
|
||||
|
||||
async runOnce(ctx: common.Context, tag: string): Promise<FbBgSyncResult> {
|
||||
const r: FbBgSyncResult = new FbBgSyncResult();
|
||||
const t0: number = Date.now();
|
||||
@@ -384,6 +420,13 @@ class FbBackgroundSyncImpl {
|
||||
r.done = res.done;
|
||||
r.total = res.total;
|
||||
r.note = res.note;
|
||||
|
||||
/* 🔴 2026-11-03:同步成功后接着跑「系统日历镜像」(用户要求的功能)。
|
||||
⚠️ 顺序:先入站(把用户在系统日历里的改动收回服务器),再出站(写回系统日历)。
|
||||
反了的话出站会把系统日历里的旧值当"期望值",覆盖掉用户的改动。
|
||||
⚠️ 整段 try/catch 包住:镜像失败**绝不能**让同步算失败 ——
|
||||
同步是主业,镜像是附加能力,坏了不该拖累数据对齐。 */
|
||||
await this.runMirror(ctx, tag);
|
||||
await this.writeNum(ctx, K_LAST_ANY, Date.now());
|
||||
hilog.info(DOMAIN, TAG, '后台同步[%{public}s] 完成:%{public}d/%{public}d,耗时 %{public}d 秒',
|
||||
tag, res.done, res.total, Math.round((Date.now() - t0) / 1000));
|
||||
|
||||
Reference in New Issue
Block a user