49 lines
1.7 KiB
PHP
49 lines
1.7 KiB
PHP
<?php
|
|
|
|
namespace Modules\EcommerceFinance\Repositories;
|
|
|
|
use Modules\EcommerceFinance\Services\UpstreamReadOnlyQueryFactory;
|
|
|
|
class ProductPurchasePriceRepository
|
|
{
|
|
private const SOURCE = 'jiansun';
|
|
|
|
public function __construct(private readonly UpstreamReadOnlyQueryFactory $queries)
|
|
{
|
|
}
|
|
|
|
/**
|
|
* @param array{updated_at:string,item_id:int}|null $cursor
|
|
* @return list<array<string,mixed>>
|
|
*/
|
|
public function mirrorBatch(?array $cursor, string $since, string $until, int $limit): array
|
|
{
|
|
$limit = min(max($limit, 1), 5000);
|
|
$where = [
|
|
'p.[updateTime] >= ?',
|
|
'p.[updateTime] < ?',
|
|
];
|
|
$bindings = [$since, $until];
|
|
|
|
if ($cursor !== null) {
|
|
$where[] = '(p.[updateTime] > ? OR (p.[updateTime] = ? AND i.[Id] > ?))';
|
|
$bindings[] = $cursor['updated_at'];
|
|
$bindings[] = $cursor['updated_at'];
|
|
$bindings[] = $cursor['item_id'];
|
|
}
|
|
|
|
$sql = 'SELECT TOP (' . $limit . ') '
|
|
. 'i.[Id] AS item_id, p.[po_id] AS purchase_order_id, '
|
|
. 'i.[sku_id] AS sku_id, i.[i_id] AS style_id, i.[price] AS unit_price, '
|
|
. 'p.[status] AS document_status, p.[labels] AS labels, '
|
|
. 'CONVERT(varchar(27), p.[finish_time], 126) AS finished_at, '
|
|
. 'CONVERT(varchar(27), p.[updateTime], 126) AS purchase_updated_at '
|
|
. 'FROM [dbo].[jst_purchase] p '
|
|
. 'INNER JOIN [dbo].[jst_purchaseItem] i ON i.[po_id] = p.[po_id] '
|
|
. 'WHERE (' . implode(') AND (', $where) . ') '
|
|
. 'ORDER BY p.[updateTime], i.[Id]';
|
|
|
|
return $this->queries->forSource(self::SOURCE)->select($sql, $bindings);
|
|
}
|
|
}
|