From 9f31db99cdeed3d13e3a0b54c2820d4d2bcc1e46 Mon Sep 17 00:00:00 2001 From: OpenClaw Agent Date: Fri, 4 Sep 2026 03:36:39 +0800 Subject: [PATCH] snapshot: index.html @ 20260904_033639 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 由 index.html.bak.20260904_033639 重建的历史快照。 时间取自备份文件名(备份生成时刻,Asia/Shanghai)。 此提交只含 index.html,当时其余文件的状态没有对应备份,无法还原。 --- index.html | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/index.html b/index.html index bbcd68f..8176ea4 100644 --- a/index.html +++ b/index.html @@ -254,7 +254,7 @@ 用归属制打一天卡数字当场就涨;用现金流则毫无反馈(影响的是下一个发薪日)。 -->

- {{ currentMonth + 1 }}月挣得· 干活口径 + {{ currentMonth + 1 }}月挣得

¥ @@ -359,7 +359,7 @@

{{ currentMonth + 1 }}月挣得 - 干活口径 · {{ currentMonth + 1 }}/1–{{ currentMonth + 1 }}/{{ daysInMonth }} + {{ currentMonth + 1 }}/1–{{ currentMonth + 1 }}/{{ daysInMonth }}
@@ -370,12 +370,16 @@
- 奖惩净额 + 奖惩净额(不含满勤奖) {{ monthStats.finalized ? '已定稿' : '预估·待审核' }} - {{ signed(monthStats.adjustNet) }} + {{ signed(monthStats.reviewNet) }}
+
+ 满勤奖(另计,月底定) + {{ monthStats.fullBonus > 0 ? '+' + money(monthStats.fullBonus) : '¥0' }} +
合计应得 {{ money(earnedTotal) }} @@ -1121,12 +1125,15 @@ createApp({ const finalized = !!(adj && adj.status === 'final' && Number.isFinite(Number(adj.finalAmount))); const reviewAmount = finalized ? Number(adj.finalAmount) : rawReview; const reviewDelta = finalized ? reviewAmount - rawReview : 0; + // 奖惩净额(不含满勤奖):用于「挣得」口径——满勤奖月底才确定,不混进已确认的劳动所得。 + const reviewNet = reviewAmount; + // 发放净额(含满勤奖):进账/结转实际会发这笔,满勤奖次月 payDayB 确实到账。 const adjustNet = fullBonus + reviewAmount; return { h1, h2, totalHours, workDays, dayShifts, nightShifts, restDays, leaveDays, foundCount, missedCount, otherPenalties, - fullBonus, foundBonus, missedPenalty, adjustNet, + fullBonus, foundBonus, missedPenalty, adjustNet, reviewNet, rawReview, reviewAmount, reviewDelta, finalized, adjustStatus: adj ? adj.status : null, adjustNote: adj && adj.note ? adj.note : '', @@ -1149,9 +1156,10 @@ createApp({ // ===== 两套记账口径(这是页面之前最主要的歧义源) ===== // 归属制「挣得」:本月 1–月底干出来的钱,不管什么时候发。打一天卡当天就涨。 + // 只含工时 + 已确认奖惩(满勤奖月底才确定,不混入挣得,单独展示)。 // 收付制「进账」:本月卡里实际进的钱,含上月结转部分。 // 两者永远不相等,必须各自具名、分区展示,不能都叫「本月」。 - const earnedTotal = computed(() => monthStats.value.basePay + monthStats.value.adjustNet); + const earnedTotal = computed(() => monthStats.value.basePay + monthStats.value.reviewNet); const cashTotal = computed(() => payoutThisB.value + payoutThisA.value); // 「挣得」拆成两笔落地时间:上半月工时随本月 payDayA;下半月工时 + 奖惩结转次月 payDayB。 // 这一行是两套口径之间唯一的桥,解释了为何挣得 ≠ 进账。 @@ -1399,7 +1407,7 @@ createApp({ `出勤 ${s.workDays}/${c.fullDays} 天(白${s.dayShifts}/夜${s.nightShifts}) | 总工时 ${fmt(s.totalHours)}h`, `上半月 ${fmt(s.h1)}h → ${money(s.h1 * c.rate)} 下半月 ${fmt(s.h2)}h → ${money(s.h2 * c.rate)}`, ``, - `【${m}月挣得·干活口径】${money(earnedTotal.value)}`, + `【${m}月挣得】${money(earnedTotal.value)}`, `工时收入 ${money(s.basePay)}(确定) | 奖惩净额 ${signed(s.adjustNet)}(${s.finalized ? '已定稿' : '预估·待审核'})`, `何时到手:${m}/${settings.payDayA} ${money(earnedSplit.value.paid)}(上半月工时) | ${nm}/${settings.payDayB} ${money(earnedSplit.value.carry)}(结转:下半月工时+奖惩)`, ``,