瀏覽代碼

契約者単位の集計機能 追加

develop
sosuke.iwabuchi 2 年之前
父節點
當前提交
4e5a637bdc
共有 9 個檔案被更改,包括 343 行新增131 行删除
  1. +56
    -0
      app/Http/Controllers/Web/UseSummary/UseSummariesByContractController.php
  2. +29
    -0
      app/Http/Controllers/Web/UseSummary/UseSummariesByContractParam.php
  3. +11
    -129
      app/Repositories/Custom/HelloTechno/UseSummaryRepository.php
  4. +2
    -2
      app/Repositories/Custom/HelloTechno/UseSummaryRepositoryData.php
  5. +72
    -0
      app/Repositories/UseSummaryByContractRepository.php
  6. +10
    -0
      app/Repositories/UseSummaryByContractRepositoryData.php
  7. +152
    -0
      app/Repositories/UseSummaryRepository.php
  8. +10
    -0
      app/Repositories/UseSummaryRepositoryData.php
  9. +1
    -0
      routes/api.php

+ 56
- 0
app/Http/Controllers/Web/UseSummary/UseSummariesByContractController.php 查看文件

@@ -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
]);
}
}

+ 29
- 0
app/Http/Controllers/Web/UseSummary/UseSummariesByContractParam.php 查看文件

@@ -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(),
);
}
}

+ 11
- 129
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;
}


+ 2
- 2
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
{
}

+ 72
- 0
app/Repositories/UseSummaryByContractRepository.php 查看文件

@@ -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;
}
}

+ 10
- 0
app/Repositories/UseSummaryByContractRepositoryData.php 查看文件

@@ -0,0 +1,10 @@
<?php

namespace App\Repositories;


/**
*/
class UseSummaryByContractRepositoryData extends BaseRepositoryData
{
}

+ 152
- 0
app/Repositories/UseSummaryRepository.php 查看文件

@@ -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;
}
}

+ 10
- 0
app/Repositories/UseSummaryRepositoryData.php 查看文件

@@ -0,0 +1,10 @@
<?php

namespace App\Repositories;


/**
*/
class UseSummaryRepositoryData extends BaseRepositoryData
{
}

+ 1
- 0
routes/api.php 查看文件

@@ -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('/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);


Loading…
取消
儲存