📊 流水修改余额调整逻辑完整展示

涵盖16种场景的余额调整处理逻辑

📝 核心原则

净余额影响 = (-1 × 旧影响) + 新影响

收入为 + 值支出为 - 值

收入
增加账户余额
支出
减少账户余额
:同一账户调整
:分别处理两个账户

🏦 场景一:账户未变更(8种)

旧账户ID = 新账户ID,只需计算净影响,执行一次操作

场景 旧流水 → 新流水 净影响计算 最终操作 账户余额变化 说明
A1 支出100支出200 -(-100)+(-200) = -100 支出100 -100 多支出100元
A2 支出100支出50 -(-100)+(-50) = +50 收入50 +50 少支出50元(退回)
A3 收入200收入500 -(+200)+(+500) = +300 收入300 +300 多收入300元
A4 收入200收入100 -(+200)+(+100) = -100 支出100 -100 少收入100元(扣回)
A5 支出100收入200 -(-100)+(+200) = +300 收入300 +300 从支出变收入,净增300
A6 支出100收入50 -(-100)+(+50) = +150 收入150 +150 从支出变收入,净增150
A7 收入200支出100 -(+200)+(-100) = -300 支出300 -300 从收入变支出,净减300
A8 收入200支出300 -(+200)+(-300) = -500 支出500 -500 从收入变支出,净减500

🔄 场景二:账户变更(8种)

旧账户ID ≠ 新账户ID,需要分别处理两个账户

场景 旧流水 → 新流水 账户变更 旧账户操作 新账户操作 旧账户余额 新账户余额 说明
B1 支出100支出200 收入100(反向) 支出200(新操作) +100 -200 从A账户支出改为从B账户支出
B2 支出100支出50 收入100(反向) 支出50(新操作) +100 -50 从A账户支出改为从B账户支出(金额减少)
B3 收入200收入500 支出200(反向) 收入500(新操作) -200 +500 从A账户收入改为到B账户收入(金额增加)
B4 收入200收入100 支出200(反向) 收入100(新操作) -200 +100 从A账户收入改为到B账户收入(金额减少)
B5 支出100收入200 收入100(反向) 收入200(新操作) +100 +200 从A账户支出改为到B账户收入
B6 支出100收入50 收入100(反向) 收入50(新操作) +100 +50 从A账户支出改为到B账户收入(金额减少)
B7 收入200支出100 支出200(反向) 支出100(新操作) -200 -100 从A账户收入改为从B账户支出
B8 收入200支出300 支出200(反向) 支出300(新操作) -200 -300 从A账户收入改为从B账户支出(金额增加)

💻 PHP代码实现逻辑

核心处理逻辑

// 计算净影响金额 private function calculateNetEffect($oldRecord, $newRecord) { // 旧记录影响:收入为+,支出为- $oldAmount = (float)$oldRecord['money']; $oldAction = (int)$oldRecord['type']; $oldEffect = ($oldAction == 1) ? $oldAmount : -$oldAmount; // 新记录影响:收入为+,支出为- $newAmount = (float)$newRecord['money']; $newAction = (int)$newRecord['action']; $newEffect = ($newAction == 1) ? $newAmount : -$newAmount; // 净影响 = 反向旧操作 + 新操作 return (-1 * $oldEffect) + $newEffect; } // 为编辑操作调整余额(核心逻辑) private function adjustBalanceForEdit($oldRecord, $newRecord, $accountInfo, $moneyLogId) { $cardCommon = new CardComm(); $oldAccountId = $oldRecord['account_id']; $newAccountId = $newRecord['account_id']; // 情况1:账户未变更 if ($oldAccountId == $newAccountId) { // 计算净影响 $netEffect = $this->calculateNetEffect($oldRecord, $newRecord); // 根据净影响执行操作 if (abs($netEffect) > 0.0001) { if ($netEffect > 0) { // 净增加:执行收入操作 $cardCommon->updateAccountBalance($accountInfo, $netEffect, 1, $moneyLogId, 1, '', 1); } else { // 净减少:执行支出操作 $cardCommon->updateAccountBalance($accountInfo, abs($netEffect), 2, $moneyLogId, 1, '', 1); } } } // 情况2:账户变更了 else { // 2.1 反向操作旧账户 $oldAccountInfo = $cardCommon->getAccountInfo($oldAccountId); $reverseAction = ($oldRecord['type'] == 1) ? 2 : 1; $cardCommon->updateAccountBalance( $oldAccountInfo, $oldRecord['money'], $reverseAction, $moneyLogId, 1, '', 1 ); // 2.2 正向操作新账户 $cardCommon->updateAccountBalance( $accountInfo, $newRecord['money'], $newRecord['action'], $moneyLogId, 1, '', 1 ); } }

📋 快速参考决策表

决策1:账户未变更

条件:旧账户ID = 新账户ID

处理:

  1. 计算净影响
  2. 净影响 > 0 → 执行收入操作
  3. 净影响 < 0 → 执行支出操作
  4. 净影响 = 0 → 无需操作
决策2:账户变更

条件:旧账户ID ≠ 新账户ID

处理:

  1. 旧账户:执行反向操作
  2. 新账户:执行新操作

反向操作规则:

  • 旧收入 → 支出
  • 旧支出 → 收入