v91 观影/任务卡加 4x4/6x4(滚动列表+新建+卡上完成任务);修任务卡无数据(解析器用错:看板嵌套需 parseTasks)

This commit is contained in:
2026-10-25 09:29:41 +08:00
parent 6711197a94
commit 7ae34e6e23
12 changed files with 1042 additions and 9 deletions
@@ -24,7 +24,7 @@ import { FormExtensionAbility, formBindingData, formProvider, formInfo } from '@
import { Want } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { fbCardDataByKind } from '../data/FbCardMediaData';
import { fbCardDataByKind, fbTaskCardComplete, FbTaskCardData } from '../data/FbCardMediaData';
import { FB_CARD_FORMS } from '../data/FbCardForms';
import { FB_BG_SYNC } from '../common/FbBackgroundSync';
@@ -147,13 +147,49 @@ export default class FbFormAbility extends FormExtensionAbility {
});
}
/**
* 🔴 v91:任务卡上点「完成」—— 把任务标成 done,重算后**推给所有任务卡**。
*
* ⚠️ 推所有任务卡而不是只推这一张:还有别的任务卡(2×2 的待办数、别的 4×4)
* 也显示这条任务,只推一张会出现"这张没了、那张还挂着"。
* ⚠️ message 里的 id 用正则抠:`{"taskDone":"12"}` / 嵌套 `{params:{…}}`
* 两种形态都能命中(与既有"子串匹配"取舍一致)。
*/
private markTaskDone(formId: string, message: string): void {
const m: RegExpMatchArray | null = message.match(/"taskDone"\s*:\s*"?(\d+)/);
const id: number = m !== null ? parseInt(m[1], 10) : 0;
if (id <= 0 || isNaN(id)) {
hilog.warn(DOMAIN, TAG, '任务卡「完成」消息里没有可用 id:%{public}s', message);
return;
}
fbTaskCardComplete(this.context, id).then((data: FbTaskCardData): void => {
const binding: formBindingData.FormBindingData = formBindingData.createFormBindingData(data);
// 先回这张卡(用户手指点的那张,必须立刻看到变化)
formProvider.updateForm(formId, binding).catch((err: BusinessError): void => {
hilog.warn(DOMAIN, TAG, '任务卡 %{public}s 回推失败:%{public}s', formId, err.message);
});
// 其余任务卡重算重推(数量不多,构建走同一份缓存口径)
FB_CARD_FORMS.pushAll(this.context).catch((err: BusinessError): void => {
hilog.warn(DOMAIN, TAG, '任务完成后全量重推失败:%{public}s', err.message);
});
}).catch((err: BusinessError): void => {
hilog.error(DOMAIN, TAG, '完成任务 %{public}d 流程失败:%{public}s', id, err.message);
});
}
onFormEvent(formId: string, message: string): void {
/* 卡片上的按钮都走 `action: 'message'`,`message` 是 JSON 字符串。
⚠️ 不解析 JSON:不同版本系统给的形态可能是 `{params:{...}}` 或直接 `{...}`,
子串匹配更稳(与 SyncCalendar 同一个取舍)。
⚠️ v90:只有日程卡有 ‹ / › / 今 三个按钮;观影/任务卡不发 message 事件,
收到也直接忽略(不把 message 撞进偏移量里)。 */
收到也直接忽略(不把 message 撞进偏移量里)。
🔴 v91:任务卡多了「完成」按钮(`taskDone`),**必须最先分流**——
它不认卡片类型也不认偏移量,认不出类型时也不能丢。 */
hilog.info(DOMAIN, TAG, '卡片事件:%{public}s %{public}s', formId, message);
if (message.indexOf('taskDone') >= 0) {
this.markTaskDone(formId, message);
return;
}
FB_CARD_FORMS.kindOf(this.context, formId).then((kind: string): void => {
if (kind !== 'calendar') {
return;