All checks were successful
ERP-Deploy-Demo / deploy-demo (push) Successful in 57s
- 依循跨模組通訊規範,將 Sales 與 Production 模組中對 Inventory 的直接模型關聯改為透過 InventoryServiceInterface 取得 - 於 InventoryService 實作獲取最高庫存價值、即將過期商品等方法,供儀表板使用 - 確保所有跨模組調用皆採用手動水和(Manual Hydration)方式組合資料 - 移除本地已歸檔的 .agent 規範檔案
64 lines
2.2 KiB
PHP
64 lines
2.2 KiB
PHP
<?php
|
|
|
|
namespace App\Modules\Sales\Services;
|
|
|
|
use App\Modules\Sales\Contracts\SalesServiceInterface;
|
|
use App\Modules\Sales\Models\SalesImportItem;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class SalesService implements SalesServiceInterface
|
|
{
|
|
public function getThisMonthRevenue(): float
|
|
{
|
|
return (float) SalesImportItem::whereMonth('transaction_at', now()->month)
|
|
->whereYear('transaction_at', now()->year)
|
|
->sum('amount');
|
|
}
|
|
|
|
public function getSalesTrend(int $days = 30): array
|
|
{
|
|
$startDate = now()->subDays($days - 1)->startOfDay();
|
|
$salesData = SalesImportItem::where('transaction_at', '>=', $startDate)
|
|
->selectRaw('DATE(transaction_at) as date, SUM(amount) as total')
|
|
->groupBy('date')
|
|
->orderBy('date')
|
|
->get()
|
|
->mapWithKeys(function ($item) {
|
|
return [$item->date => (int)$item->total];
|
|
});
|
|
|
|
$salesTrend = [];
|
|
for ($i = 0; $i < $days; $i++) {
|
|
$date = $startDate->copy()->addDays($i)->format('Y-m-d');
|
|
$salesTrend[] = [
|
|
'date' => $startDate->copy()->addDays($i)->format('m/d'),
|
|
'amount' => $salesData[$date] ?? 0,
|
|
];
|
|
}
|
|
|
|
return $salesTrend;
|
|
}
|
|
|
|
public function getTopSellingProducts(int $limit = 5): \Illuminate\Support\Collection
|
|
{
|
|
return SalesImportItem::whereMonth('transaction_at', now()->month)
|
|
->whereYear('transaction_at', now()->year)
|
|
->select('product_code', 'product_id', DB::raw('SUM(amount) as total_amount'))
|
|
->groupBy('product_code', 'product_id')
|
|
->orderByDesc('total_amount')
|
|
->limit($limit)
|
|
->get();
|
|
}
|
|
|
|
public function getTopSellingByQuantity(int $limit = 5): \Illuminate\Support\Collection
|
|
{
|
|
return SalesImportItem::whereMonth('transaction_at', now()->month)
|
|
->whereYear('transaction_at', now()->year)
|
|
->select('product_code', 'product_id', DB::raw('SUM(quantity) as total_quantity'))
|
|
->groupBy('product_code', 'product_id')
|
|
->orderByDesc('total_quantity')
|
|
->limit($limit)
|
|
->get();
|
|
}
|
|
}
|