更新 app/Models/OperatorQue.php
All checks were successful
Deploy main / deploy (push) Successful in 21s

This commit is contained in:
gitadmin 2025-08-22 23:59:23 +09:00
parent a7b58b0339
commit 8c44c467d0

View File

@ -4,290 +4,81 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
/**
* オペレータキューモデル - operator_queテーブル
*
* バッチ処理結果の通知や作業指示を管理
*/
class OperatorQue extends Model class OperatorQue extends Model
{ {
/**
* テーブル名
*
* @var string
*/
protected $table = 'operator_que'; protected $table = 'operator_que';
/**
* プライマリキー
*
* @var string
*/
protected $primaryKey = 'que_id'; protected $primaryKey = 'que_id';
public $timestamps = true;
/**
* 一括代入可能な属性
*
* @var array
*/
protected $fillable = [ protected $fillable = [
'que_class', // キュークラス 'que_class',
'user_id', // ユーザーID 'user_id',
'contract_id', // 契約ID 'contract_id',
'park_id', // 駐輪場ID 'park_id',
'que_comment', // キューコメント 'que_comment',
'que_status', // キューステータス 'que_status',
'que_status_comment', // キューステータスコメント 'que_status_comment',
'work_instructions', // 作業指示 'work_instructions',
'created_at', // 作成日時 'operator_id',
'updated_at' // 更新日時
]; ];
/** // 定数
* キャストする属性 /** キュー種別 */
* public const QueClass = [
* @var array 1 => '本人確認(社会人)',
*/ 2 => '本人確認(学生)',
protected $casts = [ 3 => 'タグ発送',
'que_id' => 'integer', 4 => '予約告知電話',
'que_class' => 'integer', 5 => '定期更新電話',
'user_id' => 'integer', 6 => '返金',
'contract_id' => 'integer', 7 => '再発行リミット超過',
'park_id' => 'integer', 8 => '支払い催促',
'que_status' => 'integer', 9 => 'シール発行催促',
'created_at' => 'datetime', 10 => 'シール再発行許可',
'updated_at' => 'datetime' 101 => 'サーバーエラー',
102 => 'プリンタエラー',
103 => 'スキャナーエラー',
104 => 'プリンタ用紙残少警告',
]; ];
/** /** キューステータス */
* キュークラスの定数 public const QueStatus = [
*/ 1 => 'キュー発生',
const CLASS_SHJ4C = 4; // SHJ-4C室割当処理 2 => 'キュー作業中',
const CLASS_SHJ6 = 6; // SHJ-6サーバ死活監視処理 3 => 'キュー作業済',
const CLASS_SHJ8 = 8; // SHJ-8バッチログ処理 4 => '返金済',
const CLASS_SHJ9 = 9; // SHJ-9売上集計処理 ];
const CLASS_SHJ10 = 10; // SHJ-10財政年度売上集計処理
const CLASS_MAIL_SEND = 11; // メール送信処理
/** public function getQueClassLabel(): string
* キューステータスの定数
*/
const STATUS_PENDING = 0; // 待機中
const STATUS_COMPLETED = 1; // 完了
const STATUS_ERROR = 2; // エラー
const STATUS_CANCELLED = 3; // キャンセル
/**
* 駐輪場との関連
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function park()
{ {
return $this->belongsTo(Park::class, 'park_id', 'park_id'); return self::QueClass[$this->que_class] ?? (string)$this->que_class;
}
public function getQueStatusLabel(): string
{
return self::QueStatus[$this->que_status] ?? (string)$this->que_status;
} }
/**
* ユーザーとの関連
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function user() public function user()
{ {
return $this->belongsTo(User::class, 'user_id', 'user_id'); return $this->belongsTo(User::class, 'user_id');
}
public function park()
{
return $this->belongsTo(Park::class, 'park_id');
} }
/**
* 契約との関連
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function contract() public function contract()
{ {
return $this->belongsTo(RegularContract::class, 'contract_id', 'contract_id'); return $this->belongsTo(Contract::class, 'contract_id');
} }
/** public function operator()
* バッチ処理用キューを作成
*
* @param int $queClass キュークラス
* @param string $comment コメント
* @param int $status ステータス
* @param string|null $workInstructions 作業指示
* @param int|null $parkId 駐輪場ID
* @return OperatorQue 作成されたキュー
*/
public static function createBatchQueue(
int $queClass,
string $comment,
int $status = self::STATUS_COMPLETED,
?string $workInstructions = null,
?int $parkId = null
): OperatorQue {
return self::create([
'que_class' => $queClass,
'user_id' => null,
'contract_id' => null,
'park_id' => $parkId,
'que_comment' => $comment,
'que_status' => $status,
'que_status_comment' => self::getStatusComment($status),
'work_instructions' => $workInstructions
]);
}
/**
* SHJ-9用キューを作成
*
* @param string $message メッセージ
* @param int $batchLogId バッチログID
* @param int $status ステータス
* @return OperatorQue 作成されたキュー
*/
public static function createShjNineQueue(
string $message,
int $batchLogId,
int $status = self::STATUS_COMPLETED
): OperatorQue {
return self::createBatchQueue(
self::CLASS_SHJ9,
$message,
$status,
"SHJ-9売上集計処理 BatchLogID: {$batchLogId}"
);
}
/**
* 指定期間のキューを取得
*
* @param string $startDate 開始日
* @param string $endDate 終了日
* @param int|null $queClass キュークラス
* @return \Illuminate\Database\Eloquent\Collection
*/
public static function getQueuesByPeriod(string $startDate, string $endDate, ?int $queClass = null)
{ {
$query = self::whereBetween('created_at', [$startDate, $endDate]); return $this->belongsTo(User::class, 'operator_id');
if ($queClass) {
$query->where('que_class', $queClass);
} }
return $query->with(['park', 'user', 'contract']) public function getUser() { return $this->user; }
->orderBy('created_at', 'desc') public function getPark() { return $this->park; }
->get();
}
/**
* 未完了のキューを取得
*
* @param int|null $queClass キュークラス
* @return \Illuminate\Database\Eloquent\Collection
*/
public static function getPendingQueues(?int $queClass = null)
{
$query = self::where('que_status', self::STATUS_PENDING);
if ($queClass) {
$query->where('que_class', $queClass);
}
return $query->with(['park', 'user', 'contract'])
->orderBy('created_at')
->get();
}
/**
* キューを完了状態に更新
*
* @param string|null $comment 完了コメント
* @return bool 更新結果
*/
public function markAsCompleted(?string $comment = null): bool
{
return $this->update([
'que_status' => self::STATUS_COMPLETED,
'que_status_comment' => $comment ?? self::getStatusComment(self::STATUS_COMPLETED),
'updated_at' => now()
]);
}
/**
* キューをエラー状態に更新
*
* @param string $errorMessage エラーメッセージ
* @return bool 更新結果
*/
public function markAsError(string $errorMessage): bool
{
return $this->update([
'que_status' => self::STATUS_ERROR,
'que_status_comment' => $errorMessage,
'updated_at' => now()
]);
}
/**
* ステータスコメントを取得
*
* @param int $status ステータス
* @return string ステータスコメント
*/
public static function getStatusComment(int $status): string
{
switch ($status) {
case self::STATUS_PENDING:
return '待機中';
case self::STATUS_COMPLETED:
return '完了';
case self::STATUS_ERROR:
return 'エラー';
case self::STATUS_CANCELLED:
return 'キャンセル';
default:
return '不明';
}
}
/**
* キュークラス名を取得
*
* @param int $queClass キュークラス
* @return string クラス名
*/
public static function getClassName(int $queClass): string
{
switch ($queClass) {
case self::CLASS_SHJ4C:
return 'SHJ-4C室割当処理';
case self::CLASS_SHJ6:
return 'SHJ-6サーバ死活監視処理';
case self::CLASS_SHJ8:
return 'SHJ-8バッチログ処理';
case self::CLASS_SHJ9:
return 'SHJ-9売上集計処理';
case self::CLASS_SHJ10:
return 'SHJ-10財政年度売上集計処理';
case self::CLASS_MAIL_SEND:
return 'メール送信処理';
default:
return "クラス{$queClass}";
}
}
/**
* 文字列表現
*
* @return string
*/
public function __toString(): string
{
return sprintf(
'OperatorQue[ID:%d, Class:%s, Status:%s, Date:%s]',
$this->que_id,
self::getClassName($this->que_class),
self::getStatusComment($this->que_status),
$this->created_at ? $this->created_at->format('Y-m-d H:i:s') : 'N/A'
);
}
} }