'datetime', 'completed_at' => 'datetime', ]; protected static function boot() { parent::boot(); static::creating(function ($model) { if (empty($model->doc_no)) { $today = date('Ymd'); $prefix = 'CNT-' . $today . '-'; // 查詢當天編號最大的單據 $lastDoc = static::where('doc_no', 'like', $prefix . '%') ->orderBy('doc_no', 'desc') ->first(); if ($lastDoc) { // 取得最後兩位序號並遞增 $lastNumber = substr($lastDoc->doc_no, -2); $nextNumber = str_pad((int)$lastNumber + 1, 2, '0', STR_PAD_LEFT); } else { $nextNumber = '01'; } $model->doc_no = $prefix . $nextNumber; } }); } public function warehouse(): BelongsTo { return $this->belongsTo(Warehouse::class); } public function items(): HasMany { return $this->hasMany(InventoryCountItem::class, 'count_doc_id'); } public function createdBy(): BelongsTo { return $this->belongsTo(User::class, 'created_by'); } public function completedBy(): BelongsTo { return $this->belongsTo(User::class, 'completed_by'); } public function getActivitylogOptions(): \Spatie\Activitylog\LogOptions { return \Spatie\Activitylog\LogOptions::defaults() ->logFillable() ->dontSubmitEmptyLogs(); } public function tapActivity(\Spatie\Activitylog\Contracts\Activity $activity, string $eventName) { // 確保為陣列以進行修改 $properties = $activity->properties instanceof \Illuminate\Support\Collection ? $activity->properties->toArray() : $activity->properties; $snapshot = $properties['snapshot'] ?? []; // Snapshot key information $snapshot['doc_no'] = $this->doc_no; $snapshot['warehouse_name'] = $this->warehouse ? $this->warehouse->name : null; $snapshot['completed_at'] = $this->completed_at ? $this->completed_at->format('Y-m-d H:i:s') : null; $snapshot['status'] = $this->status; $snapshot['created_by_name'] = $this->createdBy ? $this->createdBy->name : null; $snapshot['completed_by_name'] = $this->completedBy ? $this->completedBy->name : null; $properties['snapshot'] = $snapshot; // 全域 ID 轉名稱邏輯 (用於 attributes 與 old) $convertIdsToNames = function (&$data) { if (empty($data) || !is_array($data)) return; // 倉庫 ID 轉換 if (isset($data['warehouse_id']) && is_numeric($data['warehouse_id'])) { $warehouse = \App\Modules\Inventory\Models\Warehouse::find($data['warehouse_id']); if ($warehouse) { $data['warehouse_id'] = $warehouse->name; } } // 使用者 ID 轉換 $userFields = ['created_by', 'updated_by', 'completed_by']; foreach ($userFields as $field) { if (isset($data[$field]) && is_numeric($data[$field])) { $user = \App\Modules\Core\Models\User::find($data[$field]); if ($user) { $data[$field] = $user->name; } } } }; if (isset($properties['attributes'])) { $convertIdsToNames($properties['attributes']); } if (isset($properties['old'])) { $convertIdsToNames($properties['old']); } $activity->properties = $properties; } }