diff --git a/app/Http/Controllers/Web/UseSummary/UseSummariesByContractController.php b/app/Http/Controllers/Web/UseSummary/UseSummariesByContractController.php new file mode 100644 index 0000000..a12a202 --- /dev/null +++ b/app/Http/Controllers/Web/UseSummary/UseSummariesByContractController.php @@ -0,0 +1,56 @@ +roleAllow(UserRole::SUPER_ADMIN); + } + + protected function getParam(): IParam + { + return $this->param; + } + + protected function run(Request $request): JsonResponse + { + $param = $this->param; + + $condition = [ + ...$param->toArray(), + ]; + + $list = $this->repository->get($condition); + + + return $this->successResponse([ + 'records' => $list + ]); + } +} diff --git a/app/Http/Controllers/Web/UseSummary/UseSummariesByContractParam.php b/app/Http/Controllers/Web/UseSummary/UseSummariesByContractParam.php new file mode 100644 index 0000000..5dcac91 --- /dev/null +++ b/app/Http/Controllers/Web/UseSummary/UseSummariesByContractParam.php @@ -0,0 +1,29 @@ + $this->date(), + Repository::CONDITION_ORDER_DATE_TO => $this->date(), + Repository::CONDITION_CONTRACT_NAME => $this->str(true), + ], + $this->sortableRules(), + ); + } +} diff --git a/app/Repositories/Custom/HelloTechno/UseSummaryRepository.php b/app/Repositories/Custom/HelloTechno/UseSummaryRepository.php index 80acd44..b64864c 100644 --- a/app/Repositories/Custom/HelloTechno/UseSummaryRepository.php +++ b/app/Repositories/Custom/HelloTechno/UseSummaryRepository.php @@ -2,40 +2,22 @@ namespace App\Repositories\Custom\HelloTechno; -use App\Exceptions\AppCommonException; use App\Models\HtCustomParkingName; -use App\Models\ReceiptIssuingHTParkingCustomOrder; -use App\Models\ReceiptIssuingOrder; -use App\Models\SMSSendOrder; use App\Models\UseByKeySummary; -use App\Repositories\BaseRepository; +use App\Repositories\UseSummaryRepository as BaseRepository; use App\Util\SelectQueryUtil; +use Illuminate\Database\Query\Builder; use Illuminate\Database\Query\JoinClause; -use Illuminate\Support\Carbon; use Illuminate\Support\Collection; use Illuminate\Support\Facades\DB; -use Illuminate\Support\Facades\Storage; -use LogicException; class UseSummaryRepository extends BaseRepository { // 必須検索項目 - const CONDITION_CONTRACT_ID = 'contract_id'; - const CONDITION_ORDER_DATE_FROM = 'date_from'; - const CONDITION_ORDER_DATE_TO = 'date_to'; - const CONDITION_CUSTOMER_CODE = 'customer_code'; - private const TABLE_TARGET = "target"; - private const TABLE_SMS = "SMS"; - private const TABLE_SUMMARY = "summary"; private const TABLE_NAME = "name"; - - private Carbon $dateFrom; - private Carbon $dateTo; - - /** * コレクションを取得する * @@ -44,87 +26,13 @@ class UseSummaryRepository extends BaseRepository */ public function get(array $condition): Collection { - $contractId = data_get($condition, self::CONDITION_CONTRACT_ID); - - if (!$contractId) { - throw new AppCommonException('契約ID不正'); - } - - $dateFrom = data_get($condition, self::CONDITION_ORDER_DATE_FROM); - $dateTo = data_get($condition, self::CONDITION_ORDER_DATE_TO); - - if (!($dateFrom instanceof Carbon) || !($dateTo instanceof Carbon)) { - throw new AppCommonException('検索日付不正'); - } - $this->dateFrom = $dateFrom; - $this->dateTo = $dateTo->addDay(); - - $target = ReceiptIssuingOrder::getBuilder(self::TABLE_TARGET) - ->where( - $this->makeColumnName([static::TABLE_TARGET, ReceiptIssuingOrder::COL_NAME_CONTRACT_ID]), - $contractId - ) - ->where( - $this->makeColumnName([static::TABLE_TARGET, ReceiptIssuingOrder::COL_NAME_ORDER_DATETIME]), - '>=', - $dateFrom - ) - ->where( - $this->makeColumnName([static::TABLE_TARGET, ReceiptIssuingOrder::COL_NAME_ORDER_DATETIME]), - '<', - $dateTo - ); - - $customerCode = data_get($condition, self::CONDITION_CUSTOMER_CODE); - if ($customerCode) { - $target->where( - $this->makeColumnName([static::TABLE_TARGET, ReceiptIssuingOrder::COL_NAME_SUMMARY_KEY1]), - $customerCode - ); - } - - $smsCount = $target->clone() - ->joinSub( - SMSSendOrder::getBuilder(), - self::TABLE_SMS, - function (JoinClause $join) { - $join->on( - $this->makeColumnName([static::TABLE_SMS, SMSSendOrder::COL_NAME_RECEIPT_ISSUING_ORDER_ID]), - $this->makeColumnName([static::TABLE_TARGET, ReceiptIssuingOrder::COL_NAME_ID]), - ); - } - ) - ->whereNotNull(SMSSendOrder::COL_NAME_SEND_DATETIME) - ->groupBy( - $this->makeColumnName([static::TABLE_TARGET, ReceiptIssuingOrder::COL_NAME_SUMMARY_KEY1]) - ) - ->select([ - $this->makeColumnName([static::TABLE_TARGET, ReceiptIssuingOrder::COL_NAME_SUMMARY_KEY1]), - DB::raw('count(*) as sms_send_count'), - ]); - - $orderCount = $target->clone() - ->groupBy([ - $this->makeColumnName([static::TABLE_TARGET, UseByKeySummary::COL_NAME_SUMMARY_KEY1]) - ]) - ->select([ - ReceiptIssuingOrder::COL_NAME_SUMMARY_KEY1, - DB::raw(sprintf("count(*) as %s", 'receipt_order_count')), - DB::raw(sprintf("count(%s) as %s", ReceiptIssuingOrder::COL_NAME_STATUS_ORDER_MAIL_DATETIME, 'mail_order_count')), - ]); + return UseSummaryRepositoryData::makeList($this->builder($condition)->get()); + } - $summary = DB::table($orderCount, self::TABLE_SUMMARY) - ->joinSub( - $smsCount, - self::TABLE_SMS, - function (JoinClause $join) { - $join->on( - $this->makeColumnName([static::TABLE_SMS, ReceiptIssuingOrder::COL_NAME_SUMMARY_KEY1]), - $this->makeColumnName([static::TABLE_SUMMARY, ReceiptIssuingOrder::COL_NAME_SUMMARY_KEY1]), - ); - } - ); + protected function builder(array $condition): Builder + { + $builder = parent::builder($condition); // 顧客名解決 $name = HtCustomParkingName::getBuilder()->select([ @@ -133,7 +41,7 @@ class UseSummaryRepository extends BaseRepository DB::raw('RANK() OVER(PARTITION BY customer_code ORDER BY updated_at DESC) as rank') ]); - $main = $summary + $builder ->leftJoinSub($name, static::TABLE_NAME, function (JoinClause $join) { $join->on( $this->makeColumnName([static::TABLE_SUMMARY, UseByKeySummary::COL_NAME_SUMMARY_KEY1]), @@ -141,42 +49,16 @@ class UseSummaryRepository extends BaseRepository )->where($this->makeColumnName([static::TABLE_NAME, 'rank']), 1); }); - - - - // $main = DB::table($table, "main"); - - $main->select($this->columns()); - // ソート - $this->sort($main, $condition); - $main->orderBy( - $this->makeColumnName([static::TABLE_SUMMARY, ReceiptIssuingOrder::COL_NAME_SUMMARY_KEY1]), - ); - - // リミット - $this->limit($main, $condition); - - $sql = $main->toSql(); - - Storage::put('summary.sql', $sql); - - return UseSummaryRepositoryData::makeList($main->get()); + return $builder; } - private function columns() + protected function columns() { - - $sms = self::TABLE_SMS; - $summary = self::TABLE_SUMMARY; $name = self::TABLE_NAME; $columns = [ - SelectQueryUtil::value($this->dateFrom->format('Y/m/d'), 'date_from'), - SelectQueryUtil::value($this->dateTo->format('Y/m/d'), 'date_to'), + ...parent::columns(), SelectQueryUtil::select([$name, HtCustomParkingName::COL_NAME_CUSTOMER_CODE])->build(), SelectQueryUtil::select([$name, HtCustomParkingName::COL_NAME_CUSTOMER_NAME])->build(), - SelectQueryUtil::select([$summary, 'receipt_order_count'])->build(), - SelectQueryUtil::select([$summary, 'mail_order_count'])->build(), - SelectQueryUtil::select([$sms, 'sms_send_count'])->nullValue(0)->build(), ]; return $columns; } diff --git a/app/Repositories/Custom/HelloTechno/UseSummaryRepositoryData.php b/app/Repositories/Custom/HelloTechno/UseSummaryRepositoryData.php index b8c82a8..05c08be 100644 --- a/app/Repositories/Custom/HelloTechno/UseSummaryRepositoryData.php +++ b/app/Repositories/Custom/HelloTechno/UseSummaryRepositoryData.php @@ -2,10 +2,10 @@ namespace App\Repositories\Custom\HelloTechno; -use App\Repositories\BaseRepositoryData; +use App\Repositories\UseSummaryRepositoryData as BaseData; /** */ -class UseSummaryRepositoryData extends BaseRepositoryData +class UseSummaryRepositoryData extends BaseData { } diff --git a/app/Repositories/UseSummaryByContractRepository.php b/app/Repositories/UseSummaryByContractRepository.php new file mode 100644 index 0000000..bff21f0 --- /dev/null +++ b/app/Repositories/UseSummaryByContractRepository.php @@ -0,0 +1,72 @@ + + */ + public function get(array $condition): Collection + { + + + + return UseSummaryByContractRepositoryData::makeList($this->builder($condition)->get()); + } + + protected function builder(array $condition): Builder + { + + $builder = parent::builder($condition); + + // 契約名解決 + $builder + ->leftJoinSub(Contract::getBuilder(), static::TABLE_CONTRACT, function (JoinClause $join) { + $join->on( + $this->makeColumnName([static::TABLE_SUMMARY, UseByKeySummary::COL_NAME_CONTRACT_ID]), + $this->makeColumnName([static::TABLE_CONTRACT, Contract::COL_NAME_ID]) + ); + }); + + + $contractName = data_get($condition, self::CONDITION_CONTRACT_NAME); + if ($contractName) { + $builder->where($this->makeColumnName([self::TABLE_CONTRACT, Contract::COL_NAME_NAME]), 'like', '%' . $contractName . '%'); + } + + return $builder; + } + + protected function columns() + { + $contract = self::TABLE_CONTRACT; + $columns = [ + ...parent::columns(), + SelectQueryUtil::select([$contract, Contract::COL_NAME_ID])->as("contract_id")->build(), + SelectQueryUtil::select([$contract, Contract::COL_NAME_NAME])->as("contract_name")->build(), + ]; + return $columns; + } + + protected function groupByColumn(): string + { + return ReceiptIssuingOrder::COL_NAME_CONTRACT_ID; + } +} diff --git a/app/Repositories/UseSummaryByContractRepositoryData.php b/app/Repositories/UseSummaryByContractRepositoryData.php new file mode 100644 index 0000000..d8ea821 --- /dev/null +++ b/app/Repositories/UseSummaryByContractRepositoryData.php @@ -0,0 +1,10 @@ + + */ + public function get(array $condition): Collection + { + return UseSummaryRepositoryData::makeList($this->builder($condition)->get()); + } + + protected function builder(array $condition): Builder + { + + $contractId = data_get($condition, self::CONDITION_CONTRACT_ID); + + $dateFrom = data_get($condition, self::CONDITION_ORDER_DATE_FROM); + $dateTo = data_get($condition, self::CONDITION_ORDER_DATE_TO); + + if (!($dateFrom instanceof Carbon) || !($dateTo instanceof Carbon)) { + throw new AppCommonException('検索日付不正'); + } + $this->dateFrom = $dateFrom; + $this->dateTo = $dateTo->addDay(); + + $target = ReceiptIssuingOrder::getBuilder(self::TABLE_TARGET); + + if ($contractId) { + $target->where( + $this->makeColumnName([static::TABLE_TARGET, ReceiptIssuingOrder::COL_NAME_CONTRACT_ID]), + $contractId + ); + } + + $target->where( + $this->makeColumnName([static::TABLE_TARGET, ReceiptIssuingOrder::COL_NAME_ORDER_DATETIME]), + '>=', + $dateFrom + ) + ->where( + $this->makeColumnName([static::TABLE_TARGET, ReceiptIssuingOrder::COL_NAME_ORDER_DATETIME]), + '<', + $dateTo + ); + + + $smsCount = $target->clone() + ->joinSub( + SMSSendOrder::getBuilder(), + self::TABLE_SMS, + function (JoinClause $join) { + $join->on( + $this->makeColumnName([static::TABLE_SMS, SMSSendOrder::COL_NAME_RECEIPT_ISSUING_ORDER_ID]), + $this->makeColumnName([static::TABLE_TARGET, ReceiptIssuingOrder::COL_NAME_ID]), + ); + } + ) + ->whereNotNull(SMSSendOrder::COL_NAME_SEND_DATETIME) + ->groupBy( + $this->makeColumnName([static::TABLE_TARGET, $this->groupByColumn()]) + ) + ->select([ + $this->makeColumnName([static::TABLE_TARGET, $this->groupByColumn()]), + DB::raw('count(*) as sms_send_count'), + ]); + + $orderCount = $target->clone() + ->groupBy( + $this->makeColumnName([static::TABLE_TARGET, $this->groupByColumn()]) + ) + ->select([ + $this->groupByColumn(), + DB::raw(sprintf("count(*) as %s", 'receipt_order_count')), + DB::raw(sprintf("count(%s) as %s", ReceiptIssuingOrder::COL_NAME_STATUS_ORDER_MAIL_DATETIME, 'mail_order_count')), + ]); + + $summary = DB::table($orderCount, self::TABLE_SUMMARY) + ->joinSub( + $smsCount, + self::TABLE_SMS, + function (JoinClause $join) { + $join->on( + $this->makeColumnName([static::TABLE_SMS, $this->groupByColumn()]), + $this->makeColumnName([static::TABLE_SUMMARY, $this->groupByColumn()]), + ); + } + ); + + + $main = $summary; + + $main->select($this->columns()); + // ソート + $this->sort($main, $condition); + $main->orderBy( + $this->makeColumnName([static::TABLE_SUMMARY, $this->groupByColumn()]), + ); + + // リミット + $this->limit($main, $condition); + + return $main; + } + + protected function columns() + { + $sms = self::TABLE_SMS; + $summary = self::TABLE_SUMMARY; + $columns = [ + SelectQueryUtil::value($this->dateFrom->format('Y/m/d'), 'date_from'), + SelectQueryUtil::value($this->dateTo->format('Y/m/d'), 'date_to'), + SelectQueryUtil::select([$summary, 'receipt_order_count'])->build(), + SelectQueryUtil::select([$summary, 'mail_order_count'])->build(), + SelectQueryUtil::select([$sms, 'sms_send_count'])->nullValue(0)->build(), + ]; + return $columns; + } + + protected function groupByColumn(): string + { + return ReceiptIssuingOrder::COL_NAME_SUMMARY_KEY1; + } +} diff --git a/app/Repositories/UseSummaryRepositoryData.php b/app/Repositories/UseSummaryRepositoryData.php new file mode 100644 index 0000000..06fd46f --- /dev/null +++ b/app/Repositories/UseSummaryRepositoryData.php @@ -0,0 +1,10 @@ +