| @@ -0,0 +1,56 @@ | |||||
| <?php | |||||
| namespace App\Http\Controllers\Web\UseSummary; | |||||
| use App\Codes\UserRole; | |||||
| use App\Features\LoginUser; | |||||
| use App\Http\Controllers\Web\IParam; | |||||
| use App\Http\Controllers\Web\WebController; | |||||
| use App\Repositories\UseSummaryByContractRepository as Repository; | |||||
| use Illuminate\Http\JsonResponse; | |||||
| use Illuminate\Http\Request; | |||||
| class UseSummariesByContractController extends WebController | |||||
| { | |||||
| use LoginUser; | |||||
| public function name(): string | |||||
| { | |||||
| return "利用実績一覧取得"; | |||||
| } | |||||
| public function description(): string | |||||
| { | |||||
| return "利用実績の一覧を取得する"; | |||||
| } | |||||
| public function __construct( | |||||
| protected UseSummariesByContractParam $param, | |||||
| private Repository $repository | |||||
| ) { | |||||
| parent::__construct(); | |||||
| $this->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 | |||||
| ]); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,29 @@ | |||||
| <?php | |||||
| namespace App\Http\Controllers\Web\UseSummary; | |||||
| use App\Http\Controllers\Web\BaseParam; | |||||
| use App\Repositories\UseSummaryByContractRepository as Repository; | |||||
| use Illuminate\Support\Carbon; | |||||
| /** | |||||
| * @property Carbon $dateFrom | |||||
| * @property Carbon $dateTo | |||||
| * @property ?string $contractName | |||||
| */ | |||||
| class UseSummariesByContractParam extends BaseParam | |||||
| { | |||||
| public function rules(): array | |||||
| { | |||||
| return | |||||
| array_merge( | |||||
| [ | |||||
| Repository::CONDITION_ORDER_DATE_FROM => $this->date(), | |||||
| Repository::CONDITION_ORDER_DATE_TO => $this->date(), | |||||
| Repository::CONDITION_CONTRACT_NAME => $this->str(true), | |||||
| ], | |||||
| $this->sortableRules(), | |||||
| ); | |||||
| } | |||||
| } | |||||
| @@ -2,40 +2,22 @@ | |||||
| namespace App\Repositories\Custom\HelloTechno; | namespace App\Repositories\Custom\HelloTechno; | ||||
| use App\Exceptions\AppCommonException; | |||||
| use App\Models\HtCustomParkingName; | use App\Models\HtCustomParkingName; | ||||
| use App\Models\ReceiptIssuingHTParkingCustomOrder; | |||||
| use App\Models\ReceiptIssuingOrder; | |||||
| use App\Models\SMSSendOrder; | |||||
| use App\Models\UseByKeySummary; | use App\Models\UseByKeySummary; | ||||
| use App\Repositories\BaseRepository; | |||||
| use App\Repositories\UseSummaryRepository as BaseRepository; | |||||
| use App\Util\SelectQueryUtil; | use App\Util\SelectQueryUtil; | ||||
| use Illuminate\Database\Query\Builder; | |||||
| use Illuminate\Database\Query\JoinClause; | use Illuminate\Database\Query\JoinClause; | ||||
| use Illuminate\Support\Carbon; | |||||
| use Illuminate\Support\Collection; | use Illuminate\Support\Collection; | ||||
| use Illuminate\Support\Facades\DB; | use Illuminate\Support\Facades\DB; | ||||
| use Illuminate\Support\Facades\Storage; | |||||
| use LogicException; | |||||
| class UseSummaryRepository extends BaseRepository | 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'; | 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 const TABLE_NAME = "name"; | ||||
| private Carbon $dateFrom; | |||||
| private Carbon $dateTo; | |||||
| /** | /** | ||||
| * コレクションを取得する | * コレクションを取得する | ||||
| * | * | ||||
| @@ -44,87 +26,13 @@ class UseSummaryRepository extends BaseRepository | |||||
| */ | */ | ||||
| public function get(array $condition): Collection | 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([ | $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') | 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) { | ->leftJoinSub($name, static::TABLE_NAME, function (JoinClause $join) { | ||||
| $join->on( | $join->on( | ||||
| $this->makeColumnName([static::TABLE_SUMMARY, UseByKeySummary::COL_NAME_SUMMARY_KEY1]), | $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); | )->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; | $name = self::TABLE_NAME; | ||||
| $columns = [ | $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_CODE])->build(), | ||||
| SelectQueryUtil::select([$name, HtCustomParkingName::COL_NAME_CUSTOMER_NAME])->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; | return $columns; | ||||
| } | } | ||||
| @@ -2,10 +2,10 @@ | |||||
| namespace App\Repositories\Custom\HelloTechno; | namespace App\Repositories\Custom\HelloTechno; | ||||
| use App\Repositories\BaseRepositoryData; | |||||
| use App\Repositories\UseSummaryRepositoryData as BaseData; | |||||
| /** | /** | ||||
| */ | */ | ||||
| class UseSummaryRepositoryData extends BaseRepositoryData | |||||
| class UseSummaryRepositoryData extends BaseData | |||||
| { | { | ||||
| } | } | ||||
| @@ -0,0 +1,72 @@ | |||||
| <?php | |||||
| namespace App\Repositories; | |||||
| use App\Models\Contract; | |||||
| use App\Models\ReceiptIssuingOrder; | |||||
| use App\Models\UseByKeySummary; | |||||
| use App\Util\SelectQueryUtil; | |||||
| use Illuminate\Database\Query\Builder; | |||||
| use Illuminate\Database\Query\JoinClause; | |||||
| use Illuminate\Support\Collection; | |||||
| class UseSummaryByContractRepository extends UseSummaryRepository | |||||
| { | |||||
| const CONDITION_CONTRACT_NAME = 'contract_name'; | |||||
| private const TABLE_CONTRACT = 'contract'; | |||||
| /** | |||||
| * コレクションを取得する | |||||
| * | |||||
| * @param array $condition | |||||
| * @return Collection<UseSummaryByContractRepositoryData> | |||||
| */ | |||||
| 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; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,10 @@ | |||||
| <?php | |||||
| namespace App\Repositories; | |||||
| /** | |||||
| */ | |||||
| class UseSummaryByContractRepositoryData extends BaseRepositoryData | |||||
| { | |||||
| } | |||||
| @@ -0,0 +1,152 @@ | |||||
| <?php | |||||
| namespace App\Repositories; | |||||
| use App\Exceptions\AppCommonException; | |||||
| use App\Models\ReceiptIssuingOrder; | |||||
| use App\Models\SMSSendOrder; | |||||
| use App\Repositories\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; | |||||
| class UseSummaryRepository extends BaseRepository | |||||
| { | |||||
| // 必須検索項目 | |||||
| const CONDITION_CONTRACT_ID = 'contract_id'; | |||||
| const CONDITION_ORDER_DATE_FROM = 'date_from'; | |||||
| const CONDITION_ORDER_DATE_TO = 'date_to'; | |||||
| protected const TABLE_TARGET = "target"; | |||||
| protected const TABLE_SMS = "SMS"; | |||||
| protected const TABLE_SUMMARY = "summary"; | |||||
| protected Carbon $dateFrom; | |||||
| protected Carbon $dateTo; | |||||
| /** | |||||
| * コレクションを取得する | |||||
| * | |||||
| * @param array $condition | |||||
| * @return Collection<UseSummaryRepositoryData> | |||||
| */ | |||||
| 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; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,10 @@ | |||||
| <?php | |||||
| namespace App\Repositories; | |||||
| /** | |||||
| */ | |||||
| class UseSummaryRepositoryData extends BaseRepositoryData | |||||
| { | |||||
| } | |||||
| @@ -27,6 +27,7 @@ RouteHelper::post('/receipt-issuing-order/change-handler', App\Http\Controllers\ | |||||
| RouteHelper::get('/receipt-issuing-order/handlers', App\Http\Controllers\Web\ReceiptIssuingOrder\HandlersController::class); | RouteHelper::get('/receipt-issuing-order/handlers', App\Http\Controllers\Web\ReceiptIssuingOrder\HandlersController::class); | ||||
| RouteHelper::get('/use-summary/yyyymm', App\Http\Controllers\Web\UseSummary\UseSummaryYYYYMMsController::class); | RouteHelper::get('/use-summary/yyyymm', App\Http\Controllers\Web\UseSummary\UseSummaryYYYYMMsController::class); | ||||
| RouteHelper::get('/use-summary/list/by-contract', App\Http\Controllers\Web\UseSummary\UseSummariesByContractController::class); | |||||
| RouteHelper::get('/contracts', App\Http\Controllers\Web\Contract\ContractsController::class); | RouteHelper::get('/contracts', App\Http\Controllers\Web\Contract\ContractsController::class); | ||||