*/ 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')), ]); $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]), ); } ); // 顧客名解決 $name = HtCustomParkingName::getBuilder()->select([ HtCustomParkingName::COL_NAME_CUSTOMER_CODE, HtCustomParkingName::COL_NAME_CUSTOMER_NAME, DB::raw('RANK() OVER(PARTITION BY customer_code ORDER BY updated_at DESC) as rank') ]); $main = $summary ->leftJoinSub($name, static::TABLE_NAME, function (JoinClause $join) { $join->on( $this->makeColumnName([static::TABLE_SUMMARY, UseByKeySummary::COL_NAME_SUMMARY_KEY1]), $this->makeColumnName([static::TABLE_NAME, HtCustomParkingName::COL_NAME_CUSTOMER_CODE]) )->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()); } private 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'), 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; } }