해당 게시글은 개인 프로젝트인 "광고 관리 플랫폼 대행사 센터 제작" 중
#135 "대시보드 기능 구현 - 대행사 대시보드" 이슈를 다루고 있습니다.
    // 상위 광고주별 소진액 차트 출력
    @Transactional(readOnly = true)
    public List<DashboardStatisticsDto> setTestDashboard2(LocalDate startDate, LocalDate lastDate) {
        LocalDate defaultLastDate = LocalDate.parse(LocalDate.now().minusDays(1)
                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        LocalDate startDateBeforeSevenDays = defaultLastDate.minusDays(6);
        LocalDate startDateBeforeThirtyDays = defaultLastDate.minusDays(30);
        if (lastDate == null) {
            lastDate = defaultLastDate;
        }
        if (startDate == null) {
            startDate = startDateBeforeThirtyDays;
        }
        return statisticsQueryRepository.dashboardTestQuery3(startDate, lastDate).stream().limit(10).collect(Collectors.toList());
    }
            options: {
              
              ....
              
                scales: {
                  ....
                  
                    x: {
                        grid: {
                            display: false,
                            drawBorder: false,
                            drawTicks: false
                        },
                        ticks: {
                            padding: 10,
                            font: {
                                size: 9
                            },
                            autoSkip: true, // x축 데이터 갯수 제한
                            maxTicksLimit: 10 // x축 데이터 갯수 제한
    // 광고주별 소진액 차트 출력
    public List<DashboardStatisticsDto> dashboardTestQuery3(@Param("startDate") LocalDate startDate,
                                                            @Param("lastDate") LocalDate lastDate
    ) {
        List<DashboardStatisticsDto> results = jpaQueryFactory
                .select(Projections.fields(DashboardStatisticsDto.class,
                        clientUser.userId.as("clientId"),
                        clientUser.nickname.as("clientName"),
                        performance.spend.sum().as("spend"),
                        category.name.as("category")
                ))
                .from(performance)
                .leftJoin(performance.creative, creative)
                .leftJoin(creative.campaign, campaign)
                .leftJoin(campaign.clientUser, clientUser)
                .leftJoin(clientUser.category, category)
                .where(
                        performance.createdAt.between(startDate, lastDate),
                        creative.deleted.eq(false)
                )
                .groupBy(clientUser.userId)
                .fetch();
        for (DashboardStatisticsDto result : results) {
            Long spend = result.getSpend();
            result.setSpendIndicator(spend);
            result.setStartDateAndLastDate(startDate, lastDate);
        }
        results = results.stream()
                .sorted(Comparator.comparing(DashboardStatisticsDto::getSpend).reversed())
                .collect(Collectors.toList()); // Collections의 comparing을 사용, 내림차순 정렬
        return results;
    }
      <ul class="nav nav-pills">
        <li class="nav-item">
          <a class="nav-link disabled">대행사 대시보드</a>
        </li>
        <li class="nav-item dropdown">
          <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">그룹-에이전트 대시보드</a>
          <ul class="dropdown-menu">
            <li><a class="dropdown-item" href="/dashboard/groups">그룹별 소진액</a></li>
            <li><a class="dropdown-item" href="/dashboard/agents">에이전트별 소진액</a></li>
          </ul>
        </li>
        <li class="nav-item dropdown">
          <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">업종별 대시보드</a>
          <ul class="dropdown-menu">
            <li><a class="dropdown-item" href="/dashboard/category">업종별 소진액</a></li>
            <li><a class="dropdown-item" href="/dashboard/category_clients">업종-광고주별 소진액</a></li>
          </ul>
        </li>
      </ul>





