新增功能页面: - 货款对账 (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 动态视图解析
71 lines
1.7 KiB
PHP
71 lines
1.7 KiB
PHP
<?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;
|
||
}
|
||
}
|