v68:财务补齐(改一笔/删一笔/账本改名/共享给谁)
用户 2026-10-20:「还有这个财务的显示也有问题」——v65 修的是**显示口径**
(端上按正负号重加 vs 服务端负债取绝对值);这一批补的是**动作**:
设置里「共享给谁」「账本名字」一直是灰条,账目也改不了删不掉。
## 根因:不是端上没写,是服务端没有路由
`Ledger::rename / setShare / unshare / shares / updateEntry / removeEntry`
**一直都有**,`ApiHandler::ledger()` 却只开了「建账本 / 记一笔 / 删账本」
⇒ 端上只能把这两条画成"暂未开放"。
## 端上做了什么
- 点一行账目 → 同一个浮层进**编辑态**(类别 / 金额 / 名称 / 备注 +
删除二次确认)。`aboutToAppear` 里把 @Param 拷进 @Local,
点第二行才不会还是上一笔的内容。
- 设置「账本名字」→ 改名浮层;「共享给谁」→ 共享浮层(列表 + 选人 +
逐个人取消)。列表解析走 `{items:[…]}`(`FbApiResult.data` 是原始 JSON)。
- 三个浮层共用 `recountSheets()` 让悬浮栏让位(原来只有"记一笔"有)。
## 顺手修的两处「对着服务端抄错」
1. `FbLedgerBook.myPerm` 的注释写 `owner / read / write`,
而服务端**从来不给 `owner`**(主人也是 `write`)⇒ 端上"是不是我建的"永远 false。
现在用服务端新补的 `isOwner` 布尔。
2. `FbLedgerEntry` 没有 `note` 字段 ⇒ 编辑时备注框永远是空的。补上类型与解析。
## 顺带
- 撤掉名册家谱那颗「补关系」按钮:从来没有 `onTap`,服务端 `relations`
只有读接口、网页版也没这个功能 ⇒ 留个永远点不动的按钮只会被当成"坏了"。
## 验证
- `hvigorw assembleHap` → BUILD SUCCESSFUL
- `_fb_arkts_guard.js` → 827 / 0(新增 groupV68 29 条)
- `_fb_v59d_falsify.py` → 139 / 0(v68 新增 9 条注入全部变红)
- ⚠️ 设备仍断连(`hdc list targets` → `[Empty]`),真机未验收
This commit is contained in:
@@ -26,6 +26,7 @@ import { fbOnScroll, fbOnTouch, fbOnHScroll } from '../../common/FbScroll';
|
||||
import { fbMaskTransition, fbSheetTransition } from '../../common/FbAnim';
|
||||
import { FbModuleSettingsSheet } from '../../components/FbModuleSettingsSheet';
|
||||
import { FbLedgerEntrySheet } from '../../components/FbLedgerEntrySheet';
|
||||
import { FbLedgerRenameSheet, FbLedgerShareSheet } from '../../components/FbLedgerSettingsSheets';
|
||||
import { FB_BACK } from '../../common/FbBack';
|
||||
import { FB_SET_LEDGER } from '../../model/FbSettingsMenus';
|
||||
|
||||
@@ -77,6 +78,20 @@ export struct FbLedgerPage {
|
||||
@Local debtNow: number = 0;
|
||||
/** 「记一笔」浮层是否打开 */
|
||||
@Local entryOpen: boolean = false;
|
||||
/**
|
||||
* 正在编辑哪一笔(0 = 记新的)。
|
||||
*
|
||||
* 🔴 v68:服务端补了 `PATCH/DELETE /ledger/<id>/entries`(id 走 body),
|
||||
* 端上点一行就能改/删 —— 这四组初值就是点进来的那一行。
|
||||
*/
|
||||
@Local editId: number = 0;
|
||||
@Local editKind: string = 'deposit';
|
||||
@Local editAmount: string = '';
|
||||
@Local editTitle: string = '';
|
||||
@Local editNote: string = '';
|
||||
/** 设置里两条浮层(账本改名 / 共享给谁) */
|
||||
@Local renameOpen: boolean = false;
|
||||
@Local shareOpen: boolean = false;
|
||||
|
||||
/**
|
||||
* 页面出现:**两级加载**。
|
||||
@@ -95,6 +110,14 @@ export struct FbLedgerPage {
|
||||
}
|
||||
|
||||
private backOnce(): boolean {
|
||||
if (this.shareOpen) {
|
||||
this.shareOpen = false;
|
||||
return true;
|
||||
}
|
||||
if (this.renameOpen) {
|
||||
this.renameOpen = false;
|
||||
return true;
|
||||
}
|
||||
if (this.entryOpen) {
|
||||
this.entryOpen = false;
|
||||
return true;
|
||||
@@ -164,7 +187,24 @@ export struct FbLedgerPage {
|
||||
/** 「记一笔」浮层开着 ⇒ 底部悬浮快捷栏让位(与设置浮层不会同时开) */
|
||||
@Monitor('entryOpen')
|
||||
onEntrySheetChanged(): void {
|
||||
fbAppState().sheetCount = this.entryOpen ? 1 : 0;
|
||||
this.recountSheets();
|
||||
}
|
||||
|
||||
/* v68:改名 / 共享两个浮层同样要让底部悬浮快捷栏让位 */
|
||||
@Monitor('renameOpen')
|
||||
onRenameChanged(): void {
|
||||
this.recountSheets();
|
||||
}
|
||||
|
||||
@Monitor('shareOpen')
|
||||
onShareChanged(): void {
|
||||
this.recountSheets();
|
||||
}
|
||||
|
||||
/** 任一浮层开着 ⇒ 悬浮栏让位(三者互斥,最多一个) */
|
||||
private recountSheets(): void {
|
||||
const n: number = (this.entryOpen || this.renameOpen || this.shareOpen) ? 1 : 0;
|
||||
fbAppState().sheetCount = n;
|
||||
}
|
||||
|
||||
build() {
|
||||
@@ -434,9 +474,18 @@ export struct FbLedgerPage {
|
||||
this.settingsOpen = false;
|
||||
},
|
||||
onPick: (action: string): void => {
|
||||
/* 「共享给谁」「账本名字」**都没有 API**(服务端只开了
|
||||
建账本 / 记一笔 / 删账本),所以这里保持"暂未开放"的灰态,
|
||||
不接一个点了报错的入口。 */
|
||||
/* v68:这两条原来都是灰的(服务端没有路由)。
|
||||
现在服务端补齐了 `PATCH /ledger/<id>` 与 `/ledger/<id>/shares`。 */
|
||||
if (action === 'ledgershare') {
|
||||
this.settingsOpen = false;
|
||||
this.shareOpen = true;
|
||||
return;
|
||||
}
|
||||
if (action === 'ledgername') {
|
||||
this.settingsOpen = false;
|
||||
this.renameOpen = true;
|
||||
return;
|
||||
}
|
||||
}
|
||||
})
|
||||
.transition(fbSheetTransition())
|
||||
@@ -448,17 +497,59 @@ export struct FbLedgerPage {
|
||||
accent: this.accent,
|
||||
ledgerId: this.currentId(),
|
||||
ledgerName: this.currentBook().name,
|
||||
editId: this.editId,
|
||||
editKind: this.editKind,
|
||||
editAmount: this.editAmount,
|
||||
editTitle: this.editTitle,
|
||||
editNote: this.editNote,
|
||||
onClose: (): void => {
|
||||
this.entryOpen = false;
|
||||
this.editId = 0;
|
||||
},
|
||||
onSaved: (): void => {
|
||||
this.entryOpen = false;
|
||||
this.editId = 0;
|
||||
// 重拉明细:金额与汇总都在里面,端上拼不出来
|
||||
this.loadEntries(this.currentId());
|
||||
}
|
||||
})
|
||||
.transition(fbSheetTransition())
|
||||
}
|
||||
|
||||
// ---- 账本改名(v68:设置里那条原来是灰的)----
|
||||
if (this.renameOpen) {
|
||||
FbLedgerRenameSheet({
|
||||
accent: this.accent,
|
||||
ledgerId: this.currentId(),
|
||||
currentName: this.currentBook().name,
|
||||
onClose: (): void => {
|
||||
this.renameOpen = false;
|
||||
},
|
||||
onSaved: (): void => {
|
||||
this.renameOpen = false;
|
||||
this.load(); // 名字在 /ledger 列表里,重拉一次
|
||||
}
|
||||
})
|
||||
.transition(fbSheetTransition())
|
||||
}
|
||||
|
||||
// ---- 共享给谁(v68)----
|
||||
if (this.shareOpen) {
|
||||
FbLedgerShareSheet({
|
||||
accent: this.accent,
|
||||
ledgerId: this.currentId(),
|
||||
ledgerName: this.currentBook().name,
|
||||
// 主人才能改共享:`myPerm` 是服务端 `Ledger::find` 给的
|
||||
isOwner: this.currentBook().isOwner,
|
||||
onClose: (): void => {
|
||||
this.shareOpen = false;
|
||||
},
|
||||
onChanged: (): void => {
|
||||
this.load();
|
||||
}
|
||||
})
|
||||
.transition(fbSheetTransition())
|
||||
}
|
||||
}
|
||||
.width('100%')
|
||||
.height('100%')
|
||||
@@ -506,6 +597,31 @@ export struct FbLedgerPage {
|
||||
}
|
||||
}
|
||||
.width('100%')
|
||||
.onClick((): void => {
|
||||
/* v68:点一行 = 改这一笔(金额 / 名称 / 备注 / 类别),按住不动的"删除"
|
||||
放在浮层底部(二次确认)—— 与观影/旅程同一套交互习惯。 */
|
||||
this.editId = e.id;
|
||||
this.editKind = e.kind;
|
||||
this.editAmount = this.amountYuanText(e.amountCent);
|
||||
this.editTitle = e.name;
|
||||
this.editNote = e.note;
|
||||
this.entryOpen = true;
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 分 → 「元」输入框文本(`1250050` → `12500.50`)。
|
||||
*
|
||||
* ⚠️ 不能复用 `fbMoney()`:那个带千分位和「¥」,塞回 `TextInput` 会被
|
||||
* `Ledger::toCents()` 当成非法数字(它只吃数字与小数点)。
|
||||
*/
|
||||
private amountYuanText(cent: number): string {
|
||||
const neg: boolean = cent < 0;
|
||||
const c: number = Math.abs(cent);
|
||||
const y: number = Math.floor(c / 100);
|
||||
const f: number = c % 100;
|
||||
const fs: string = f < 10 ? ('0' + f.toString()) : f.toString();
|
||||
return (neg ? '-' : '') + y.toString() + '.' + fs;
|
||||
}
|
||||
|
||||
private isCurrent(id: number): boolean {
|
||||
@@ -524,7 +640,7 @@ export struct FbLedgerPage {
|
||||
if (hit !== undefined) {
|
||||
return hit;
|
||||
}
|
||||
return { id: 0, name: '账本', netCent: 0, myPerm: 'owner', entryCount: 0 };
|
||||
return { id: 0, name: '账本', netCent: 0, myPerm: 'read', isOwner: false, entryCount: 0 };
|
||||
}
|
||||
|
||||
private netCent(): number {
|
||||
|
||||
@@ -1482,7 +1482,14 @@ export struct FbPeoplePage {
|
||||
// ============================================================
|
||||
|
||||
/**
|
||||
* 家谱的说明条("以我为中心" + 图谱/列表切换 + 补关系按钮)。
|
||||
* 家谱的说明条("以我为中心" + 图谱/列表切换)。
|
||||
*
|
||||
* 🔴 v68:这里原来还有一颗「补关系」按钮,**从来没有 `onTap`** ——
|
||||
* 点了一点反应都没有(全仓库扫过,只剩这一颗)。
|
||||
* 它要的是"选一个还没有亲属关系的人 → 给他挂上父/母/配偶",
|
||||
* 而服务端 `relations` 表**只有读**(没有写接口),网页版也没有这个功能
|
||||
* ⇒ 与其留一个永远点不动的按钮,先撤掉(免得被当成"坏了")。
|
||||
* 要做得先加 `POST /api/v1/persons/<id>/relations`,那是独立一批活。
|
||||
*
|
||||
* ⚠️ 从 `kinView` 里抽出来的原因:**列表模式**要把它**一起放进滚动的 Scroll**
|
||||
* (这样它才跟着内容滚走),而**图谱模式**它是固定的一层。
|
||||
@@ -1511,12 +1518,6 @@ export struct FbPeoplePage {
|
||||
.padding(2)
|
||||
.backgroundColor(FbColors.inputBg)
|
||||
.borderRadius(FbMetric.radiusPill)
|
||||
|
||||
FbPrimaryButton({
|
||||
label: '补关系',
|
||||
bg: '#8A6B4B',
|
||||
icon: $r('app.media.fb_ic_plus')
|
||||
})
|
||||
}
|
||||
.width('100%')
|
||||
.padding({ left: FbMetric.pagePad, right: FbMetric.pagePad, top: 12, bottom: 8 })
|
||||
|
||||
Reference in New Issue
Block a user