value('id') ?? 1); $shops = [ '淘宝-亿家达家居鞋柜电脑桌', '天猫-亿家达旗舰店', '天猫-卓禾家具旗舰店', '拼多多-亿家达家居旗舰店', '京东-亿家达旗舰店', '抖音-亿家达旗舰店', '得物-亿家达旗舰店', ]; $items = ['交易收款', '退款', '提现到银行卡', '服务费', '红包补贴', '佣金扣款', '平台补贴', '以旧换新自补平台过桥']; $now = now(); $seq = 3000000000000000000; foreach (AccountBillColumns::types() as $billType) { $config = AccountBillColumns::for($billType); DB::table('ec_account_bills') ->where('company_id', $companyId) ->where('bill_type', $billType) ->delete(); $balance = 50000.00; for ($i = 0; $i < 6; $i++) { $real = [ 'company_id' => $companyId, 'bill_type' => $billType, 'modifier' => 'api', 'created_by' => null, 'created_from' => 'ecommerce-finance', 'created_at' => $now, 'updated_at' => $now, ]; $payload = []; $income = $i % 2 === 0 ? round(60 + ($i * 37 % 600), 2) : 0.00; $expense = $i % 2 === 1 ? round(8 + ($i * 13 % 120), 2) : 0.00; $balance += $income - $expense; $day = str_pad((string) (1 + ($i % 15)), 2, '0', STR_PAD_LEFT); $hh = str_pad((string) (8 + ($i % 12)), 2, '0', STR_PAD_LEFT); $mm = str_pad((string) (($i * 7) % 60), 2, '0', STR_PAD_LEFT); $occurred = '2026-07-' . $day . ' ' . $hh . ':' . $mm . ':11'; foreach ($config['columns'] as $col) { [$label, $field, $kind] = [$col['label'], $col['field'], $col['kind']]; $value = $this->valueFor($field, $kind, $label, [ 'i' => $i, 'shop' => $shops[($i + crc32($billType)) % count($shops)], 'item' => $items[$i % count($items)], 'income' => $income, 'expense' => $expense, 'balance' => round($balance, 2), 'occurred' => $occurred, 'seq' => $seq, ]); if (strpos($field, 'payload.') === 0) { $payload[substr($field, 8)] = $value; } else { $real[$field] = $value; } } $real['payload'] = json_encode($payload, JSON_UNESCAPED_UNICODE); $seq++; DB::table('ec_account_bills')->insert($this->normalizeRow($real)); } } } private function valueFor($field, $kind, $label, array $c) { // 真实列优先按字段定值 switch ($field) { case 'record_code': return (string) ($c['seq']); case 'store_name': return $c['shop']; case 'bill_item': return $c['item']; case 'occurred_at': return $c['occurred']; case 'income': return $c['income']; case 'expense': return $c['expense']; case 'balance': return $c['balance']; case 'amount': return $c['income'] + $c['expense']; case 'order_no': return (string) (1570700000000000000 + $c['i']); case 'finance_remark': case 'custom_remark': return $c['i'] % 3 === 0 ? '财务备注-' . $c['i'] : null; case 'remark': return $c['item'] . ' 演示备注'; case 'modifier': return 'api'; case 'created_at': case 'updated_at': return now(); } // payload 列按 kind 推断 switch ($kind) { case 'date': return $c['occurred']; case 'num': return (string) (3300000000000000 + $c['i'] + crc32($field)); case 'money': case 'balance': return $c['amount'] ?? 0; case 'money_in': return $c['income']; case 'money_out': return $c['expense']; case 'tag': return $c['item']; default: return $label . '-' . $c['i']; } } /** * 保证插入行类型与表结构一致(decimal/null)。 */ private function normalizeRow(array $real): array { $decimals = ['amount', 'income', 'expense', 'balance']; foreach ($decimals as $k) { if (isset($real[$k])) { $real[$k] = (float) $real[$k]; } } if (empty($real['finance_remark'])) { $real['finance_remark'] = null; } if (empty($real['custom_remark'])) { $real['custom_remark'] = null; } return $real; } }