krgm.so-manager-dev.com/app/Console/Commands/ShjElevenCommand.php
Your Name 50bb8543a5
All checks were successful
Deploy preview (main_xxx) / Deploy ${{ github.ref_name }} (push) Successful in 13s
feat: SHJ-11とSHJ-12バッチ処理コマンドを追加
- SHJ-11: 現在契約台数集計処理を実装
- SHJ-12: 未払い者通知処理を実装
2025-08-29 12:04:27 +09:00

183 lines
6.5 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;
use App\Services\ShjElevenService;
/**
* SHJ-11 現在契約台数集計コマンド
*
* 集計単位每个の契約台数を算出し、ゾーンマスタとの管理処理を実行する
* バックグラウンドで実行される定期バッチ処理
*/
class ShjElevenCommand extends Command
{
/**
* コンソールコマンドの名前とシグネチャ
*
* 引数: なし
* オプション: なし
*
* @var string
*/
protected $signature = 'shj:11';
/**
* コンソールコマンドの説明
*
* @var string
*/
protected $description = 'SHJ-11 現在契約台数集計 - 集計単位每个契約台数を算出しゾーンマスタ管理を実行';
/**
* SHJ-11サービスクラス
*
* @var ShjElevenService
*/
protected $shjElevenService;
/**
* コンストラクタ
*
* @param ShjElevenService $shjElevenService
*/
public function __construct(ShjElevenService $shjElevenService)
{
parent::__construct();
$this->shjElevenService = $shjElevenService;
}
/**
* コンソールコマンドを実行
*
* 処理フロー:
* 1. 集計単位每个の契約台数を算出する
* 2. 取得件数判定
* 3. ゾーンマスタを取得する
* 4. 取得判定とゾーンマスタ登録
* 5. 契約台数チェック(限界台数超過判定)
* 6. 契約台数を反映する
* 7. バッチ処理ログを作成する
*
* @return int
*/
public function handle()
{
try {
// 開始ログ出力
$startTime = now();
$this->info('SHJ-11 現在契約台数集計を開始します。');
Log::info('SHJ-11 現在契約台数集計開始', [
'start_time' => $startTime
]);
// 【処理1】集計単位每个の契約台数を算出する
$this->info('【処理1】集計単位每个の契約台数を算出しています...');
$contractCounts = $this->shjElevenService->calculateContractCounts();
// 【判断1】取得件数判定
$countResults = count($contractCounts);
$this->info("取得件数: {$countResults}");
if ($countResults === 0) {
// 対象なしの結果を設定する
$this->info('契約台数算出対象なしのため処理を終了します。');
// バッチ処理ログを作成
$this->shjElevenService->createBatchLog(
'success',
[],
'契約台数算出対象なし',
0,
0,
0
);
Log::info('SHJ-11 現在契約台数集計完了(対象なし)', [
'end_time' => now(),
'duration_seconds' => $startTime->diffInSeconds(now())
]);
return self::SUCCESS;
}
// 【処理2・3】ゾーンマスタ処理取得・登録・更新
$this->info('【処理2】ゾーンマスタ処理を実行しています...');
$processResult = $this->shjElevenService->processZoneManagement($contractCounts);
// 処理結果確認
if ($processResult['success']) {
$endTime = now();
$this->info('SHJ-11 現在契約台数集計が正常に完了しました。');
$this->info("処理時間: {$startTime->diffInSeconds($endTime)}");
$this->info("処理対象件数: {$countResults}");
$this->info("ゾーン新規作成件数: {$processResult['created_zones']}");
$this->info("ゾーン更新件数: {$processResult['updated_zones']}");
$this->info("限界台数超過件数: {$processResult['over_capacity_count']}");
// 【処理4】バッチ処理ログを作成する
$this->shjElevenService->createBatchLog(
'success',
$processResult['parameters'],
'現在契約台数集計処理完了',
$countResults,
$processResult['created_zones'] + $processResult['updated_zones'],
0
);
Log::info('SHJ-11 現在契約台数集計完了', [
'end_time' => $endTime,
'duration_seconds' => $startTime->diffInSeconds($endTime),
'processed_count' => $countResults,
'created_zones' => $processResult['created_zones'],
'updated_zones' => $processResult['updated_zones'],
'over_capacity_count' => $processResult['over_capacity_count']
]);
return self::SUCCESS;
} else {
$this->error('SHJ-11 現在契約台数集計でエラーが発生しました: ' . $processResult['message']);
// エラー時のバッチログ作成
$this->shjElevenService->createBatchLog(
'error',
$processResult['parameters'] ?? [],
$processResult['message'],
$countResults,
$processResult['created_zones'] ?? 0,
1
);
Log::error('SHJ-11 現在契約台数集計エラー', [
'error' => $processResult['message'],
'details' => $processResult['details'] ?? null
]);
return self::FAILURE;
}
} catch (\Exception $e) {
$this->error('SHJ-11 現在契約台数集計で予期しないエラーが発生しました: ' . $e->getMessage());
// 例外時のバッチログ作成
$this->shjElevenService->createBatchLog(
'error',
[],
'システムエラー: ' . $e->getMessage(),
0,
0,
1
);
Log::error('SHJ-11 現在契約台数集計例外エラー', [
'exception' => $e->getMessage(),
'trace' => $e->getTraceAsString()
]);
return self::FAILURE;
}
}
}