业绩明细:冲减金额按行金额取数(收入侧-支出侧,负数表示净扣减);修复补行列数缺 planting_amount 导致同步中断

This commit is contained in:
yueyang 2026-10-08 13:15:07 +08:00
parent 2cf181f1bf
commit 09907d63f8

View File

@ -5,6 +5,7 @@ namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
use InvalidArgumentException;
use App\Business\JstOrderLabelPlantingRules;
use Modules\EcommerceFinance\Services\AccountLedgerRemarkMap;
@ -211,6 +212,10 @@ class SyncStoreReceiptOrderMatches extends Command
}
$select = ['store_name', 'bill_item', $orderColumn, $timeColumn, $amountColumn];
// 「冲减金额」按行金额(收入侧 − 支出侧)取数,账单表有支出列时一并取出。
if (Schema::connection($connection)->hasColumn($billTable, 'expense_amount')) {
$select[] = 'expense_amount';
}
if ($realStoreColumn !== '') {
$select[] = $realStoreColumn;
}
@ -333,6 +338,9 @@ class SyncStoreReceiptOrderMatches extends Command
}
$amount = (float) $bill->{$amountColumn};
// 「冲减金额」按行金额取数=收入侧 − 支出侧(负数表示净扣减)。
// 得物/天猫这类平台把「卖家承担优惠 / 扣回」记在支出侧,只取收入侧会漏掉扣减、并把退款冲回当成冲减。
$offsetAmount = $amount - (float) ($bill->expense_amount ?? 0);
if ($bucket === 'income') {
$groups[$key]['payment_count']++;
$groups[$key]['income_amount'] += $amount;
@ -345,8 +353,8 @@ class SyncStoreReceiptOrderMatches extends Command
$promoRowsByKey[$key] = ($promoRowsByKey[$key] ?? 0) + 1;
} else {
$groups[$key]['offset_seen'] = true;
$groups[$key]['offset_amount'] += $amount;
$offsetTotal += $amount;
$groups[$key]['offset_amount'] += $offsetAmount;
$offsetTotal += $offsetAmount;
$promoRowsByKey[$key] = ($promoRowsByKey[$key] ?? 0) + 1;
}
@ -884,6 +892,8 @@ class SyncStoreReceiptOrderMatches extends Command
'income_amount' => 0,
'discount_amount' => ! empty($group['discount_seen']) ? round((float) $group['discount_amount'], 2) : null,
'offset_amount' => ! empty($group['offset_seen']) ? round((float) $group['offset_amount'], 2) : null,
// 补行没有订单侧商品金额,种菜金额同样留空(列必须与其它行一致,否则批量插入会因列数不匹配失败)。
'planting_amount' => null,
'product_amount' => null,
'difference' => null,
'match_status' => self::STATUS_UNMATCHED,