All checks were successful
star-cloud-deploy-demo / deploy-demo (push) Successful in 1m4s
1. 將 B005 (廣告同步) 從 POST 改為 GET,符合 RESTful 規範。
2. 完善 B009 (庫存回報) 回應規格,加入業務代碼 (200 OK)。
3. API 文件 UI 優化:新增 Method Badge (方法標籤),並修正 JSON 中文/斜線轉義問題。
4. 機台管理介面優化:實作「唯讀庫存與效期」面板,並將日誌圖示改為「👁️」。
5. 標準化 ID 識別邏輯:資料表全面移除對 sku 的依賴,改以 id 為主、barcode 為輔。
6. 新增 Migration:正式移除 sku 欄位並同步 barcode 指向。
7. 更新多語系支援 (zh_TW, en, ja)。
86 lines
2.2 KiB
PHP
86 lines
2.2 KiB
PHP
<?php
|
|
|
|
namespace App\Models\Product;
|
|
|
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
|
use App\Traits\TenantScoped;
|
|
|
|
class Product extends Model
|
|
{
|
|
use HasFactory, SoftDeletes, TenantScoped;
|
|
|
|
protected $fillable = [
|
|
'company_id',
|
|
'category_id',
|
|
'name',
|
|
'name_dictionary_key',
|
|
'barcode',
|
|
'spec',
|
|
'manufacturer',
|
|
'description',
|
|
'price',
|
|
'member_price',
|
|
'cost',
|
|
'track_limit',
|
|
'spring_limit',
|
|
'type',
|
|
'image_url',
|
|
'status',
|
|
'is_active',
|
|
'metadata',
|
|
];
|
|
|
|
protected $casts = [
|
|
'price' => 'decimal:2',
|
|
'member_price' => 'decimal:2',
|
|
'cost' => 'decimal:2',
|
|
'track_limit' => 'integer',
|
|
'spring_limit' => 'integer',
|
|
'is_active' => 'boolean',
|
|
'metadata' => 'array',
|
|
];
|
|
|
|
public function category()
|
|
{
|
|
return $this->belongsTo(ProductCategory::class, 'category_id');
|
|
}
|
|
|
|
/**
|
|
* 自動附加到 JSON/陣列輸出的屬性(供 Alpine.js 等前端使用)
|
|
*/
|
|
protected $appends = ['localized_name'];
|
|
|
|
/**
|
|
* 取得當前語系的商品名稱。
|
|
* 回退順序:當前語系 → zh_TW → name 欄位
|
|
*/
|
|
public function getLocalizedNameAttribute(): string
|
|
{
|
|
if ($this->relationLoaded('translations') && $this->translations->isNotEmpty()) {
|
|
$locale = app()->getLocale();
|
|
// 先找當前語系
|
|
$translation = $this->translations->firstWhere('locale', $locale);
|
|
if ($translation) {
|
|
return $translation->value;
|
|
}
|
|
// 回退至 zh_TW
|
|
$fallback = $this->translations->firstWhere('locale', 'zh_TW');
|
|
if ($fallback) {
|
|
return $fallback->value;
|
|
}
|
|
}
|
|
return $this->name ?? '';
|
|
}
|
|
|
|
/**
|
|
* Get the translations for the product name.
|
|
*/
|
|
public function translations()
|
|
{
|
|
return $this->hasMany(\App\Models\System\Translation::class, 'key', 'name_dictionary_key')
|
|
->where('group', 'product');
|
|
}
|
|
}
|