WuYongJie e5c068036b feat: 供应商应付 - 货款对账 + 5个子功能页面
新增功能页面:
- 货款对账 (payment-reconciliation): 入库+代发合并对账,228K+2.8M条记录
- 退货对账 (return-reconciliation): finance_purchaseReturn, 36791行
- 发票扣款 (invoice-deductions): finance_invoiceDeduction, 195行
- 赔偿明细 (compensation-details): 纸板厂+压板厂 UNION, 98行
- 借支明细 (advance-details): finance_advanceLoans, 4行
- 样品扣款 (sample-deductions): finance_sampleDeduction, 12行

后端:
- JianSunConnection: PDO_ODBC 直连 SQL Server
- SupplierPayableRepository: 5个子页面的数据查询+分页
- GoodsReconciliationRepository: 货款对账数据查询
- 15个新API路由 (supplier-payables/*)
- 12个JianSun Eloquent模型

前端:
- 6个Blade视图 + 6个Vue组件
- webpack.mix.js 新增5个编译入口
- show.blade.php 动态视图解析
2026-07-21 18:40:24 +08:00

71 lines
1.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace Modules\EcommerceFinance\Services;
use PDO;
use PDOException;
/**
* JianSun SQL Server 数据库连接管理
* 使用 PDO_ODBC 直连 SQL Server(无需 sqlsrv 扩展)
*/
class JianSunConnection
{
private static ?PDO $instance = null;
/**
* 获取 PDO 连接实例(单例模式)
*/
public static function get(): PDO
{
if (self::$instance === null) {
self::$instance = self::create();
}
return self::$instance;
}
/**
* 创建新的 PDO 连接
*/
public static function create(): PDO
{
$host = env('DB_JIANSUN_HOST', '218.93.191.21');
$port = env('DB_JIANSUN_PORT', '1433');
$db = env('DB_JIANSUN_DATABASE', 'JianSun');
$user = env('DB_JIANSUN_USERNAME', 'financeReader');
$pass = env('DB_JIANSUN_PASSWORD', '');
$dsn = sprintf(
'odbc:Driver={SQL Server};Server=%s,%s;Database=%s',
$host,
$port,
$db
);
try {
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]);
return $pdo;
} catch (PDOException $e) {
throw new \RuntimeException(
'JianSun 数据库连接失败: ' . $e->getMessage(),
500,
$e
);
}
}
/**
* 重置连接(用于长时间运行或测试场景)
*/
public static function reset(): void
{
self::$instance = null;
}
}