v24 第 10 批:名册真性能(根因是每卡内联表单)等九条
- #6 名册线上真实数据(1184 人)卡顿:根因是**每张卡片内联一整份分组弹层**—— 全页 2369 个 form / 27234 个 input / 22496 个 radio / 98100 DOM 节点, 密码管理器(Bitwarden 等)逐个扫描 form 把主线程占死(用户报的就是这个冲突)。 改为卡片只带 data 属性 + 全页**唯一一份**共享浮层 #rosterMenus。 实测:form 2369→3、input 27234→25、DOM 98100→17659、解压 7694→2306 KB、 长任务 1/52ms → 0。新增哨兵 _fb_formbloat_check.py(含反向验证)。 - #5 日视图翻页失效:day_columns() 无条件吸到周一,天视图只有 1 列 → 永远显示那周周一。 改为仅 span>1 时吸附(周视图行为不变)。 - #2 财务「欠款」类别(负债);并修一个真 bug:负债填负数会让净资产**反向变大**。 写入口 normalizeAmount 归一化 + summary/timeline 侧 abs 防御 + Schema v17 纠正老数据。 - #3 账目行「盘点」「修改」两个并列按钮(各自就地弹面板);图移到账目上方, 总金额图跨整行 + 每个账目一条线 + 类别筛选条;charts() 改为覆盖全部账目。 - #4 日程新增「农历」「节假日」两本不可删除只读日历(app/Holiday.php): 两级自动更新 —— 内置规则(公历固定 + 清明节气 + 农历节日)保证断网也有; 官方 JSON 镜像自动抓取补齐调休。抓取**不在渲染路径联网**(响应后 fastcgi_finish_request + 频率闸门),缓存落 storage/cache。仅派生本不可写日程。 - #6 日程页设置按钮前加「跳到某一天」(选中即跳)。 - #7 起止范围改用一个 Semi dateTimeRange 控件(观影/旅程/节点/日程共 4 处); 新增 window.fbSetDT / fbUpgradeRange;修范围重挂(React 非受控组件须 unmount 再 createRoot) 与范围里 required 未摘除导致表单无法提交两个真实问题。 验证:e2e 786/0、batch10 44/0、batch9 38/0、batch_e 91/0、upgrade 126/0、picker 28/0、 semi_integrate 27/0、formbloat 5/0(+反向 3 红)、mobile 688/0、interact 97/0、drag 5/0、geom 5/5; 线上自检 19/19 + 线上真实账号巡检 28/0(含 Firefox 实测)。
This commit is contained in:
+45
-2
@@ -71,7 +71,7 @@ final class Schema
|
||||
* ⚠️ 它**不再**作为"要不要跑升级"的判据 —— 见 fingerprint() 的说明。
|
||||
* 它仍然要手工维护,因为它给人看(排查时一眼知道代码到哪一版了)。
|
||||
*/
|
||||
public const VERSION = '16';
|
||||
public const VERSION = '17';
|
||||
|
||||
/**
|
||||
* 「源码指纹」:拿**本文件自身的内容**算一个哈希,作为"要不要跑升级"的判据。
|
||||
@@ -484,7 +484,7 @@ CREATE TABLE IF NOT EXISTS `calendars` (
|
||||
`owner_id` INT UNSIGNED NOT NULL COMMENT '这本日历是谁的',
|
||||
`name` VARCHAR(50) NOT NULL,
|
||||
`color` CHAR(7) NOT NULL DEFAULT '#4A7C82' COMMENT '日历本的颜色(日程按本子的颜色显示)',
|
||||
`kind` ENUM('custom','movie','trip') NOT NULL DEFAULT 'custom' COMMENT 'movie/trip = 系统给每人预置的默认本,内容从 events 派生',
|
||||
`kind` ENUM('custom','movie','trip','lunar','holiday') NOT NULL DEFAULT 'custom' COMMENT 'movie/trip/lunar/holiday = 系统预置的派生只读本(农历与节假日为 v24 第 10 批新增,不可删除)',
|
||||
`position` INT NOT NULL DEFAULT 100,
|
||||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
@@ -850,6 +850,49 @@ SQL,
|
||||
self::tryStep('老地址拆成国家/省/市/区', static function () use ($db) {
|
||||
self::backfillAddress($db);
|
||||
});
|
||||
// ---- v24 第 10 批 #4:日历本 kind 枚举加 lunar / holiday ----
|
||||
// ⚠️ 与上面 widenEventKindEnum 同一类坑:建表语句里的 ENUM 对**已存在的表**
|
||||
// 不会更新(CREATE TABLE IF NOT EXISTS 直接跳过),必须显式 MODIFY。
|
||||
// 不改的后果:给老库插 kind='lunar' 会被严格模式整条拒掉 →
|
||||
// "农历日历本建不出来",而新装的库一切正常(最难查的那种)。
|
||||
$db->exec("ALTER TABLE `calendars` MODIFY COLUMN `kind`
|
||||
ENUM('custom','movie','trip','lunar','holiday') NOT NULL DEFAULT 'custom'
|
||||
COMMENT 'movie/trip/lunar/holiday = 系统预置的派生只读本'");
|
||||
// 给每个家庭里的每个人都补上农历/节假日这两本(幂等)
|
||||
self::tryStep('补建每人的农历 / 节假日日历本', static function () use ($db) {
|
||||
foreach ($db->query('SELECT id FROM families')->fetchAll() as $fam) {
|
||||
\App\Calendar::seedDefaultsForFamily((int)$fam['id']);
|
||||
}
|
||||
});
|
||||
|
||||
// ---- v24 第 10 批 #2:负债类账目一律存正数 ----
|
||||
// 用户原话:「类别,增加一个欠款,用来记录别人的钱,属于负债,是负的。」
|
||||
// 也就是说用户会把欠款填成 **-500**。旧的 summary() 用 `net = 资产 − 负债`,
|
||||
// 负的负债会让净资产**反向变大**(1000 − (−500) = 1500,欠钱反而更有钱)。
|
||||
// 写入口已加 normalizeAmount 归一化;这里把**库里已有的**负数负债也纠正过来,
|
||||
// 否则老数据的净资产会一直错下去。
|
||||
self::tryStep('负债类账目金额取绝对值(纠正负数欠款)', static function () use ($db) {
|
||||
$kinds = [];
|
||||
foreach (\App\Ledger::KINDS as $k => $v) {
|
||||
if (($v[1] ?? 'asset') === 'debt') {
|
||||
$kinds[] = $k;
|
||||
}
|
||||
}
|
||||
if (!$kinds) {
|
||||
return;
|
||||
}
|
||||
$in = implode(',', array_fill(0, count($kinds), '?'));
|
||||
// 账目表自己带 kind,直接筛
|
||||
$db->prepare("UPDATE `ledger_entries` SET amount_cents = -amount_cents
|
||||
WHERE amount_cents < 0 AND kind IN ($in)")->execute($kinds);
|
||||
// ⚠️ 快照表**没有 kind 列**(它只有 entry_id)—— 必须回表 ledger_entries 判类别,
|
||||
// 不能凭"金额为负"就取反:负的**资产**(透支、欠款记账前的误录)是合法值。
|
||||
$db->prepare("UPDATE `ledger_entry_snapshots` s
|
||||
JOIN `ledger_entries` e ON e.id = s.entry_id
|
||||
SET s.amount_cents = -s.amount_cents
|
||||
WHERE s.amount_cents < 0 AND e.kind IN ($in)")->execute($kinds);
|
||||
});
|
||||
|
||||
// 老头像(v11 之前传的)补算一次:回读已存的图算主色。
|
||||
// 纯数据步骤 → 容错跑:某张图读不回来(OSS 权限、对象丢了)只影响那一个人,
|
||||
// 他会自动落到「按姓名取色」的兜底上,不该把后面的升级步骤挡住。
|
||||
|
||||
Reference in New Issue
Block a user