Skip to content

Commit 3cc215f

Browse files
committed
매출 추이 api 구현
1 parent 76bb022 commit 3cc215f

File tree

7 files changed

+117
-9
lines changed

7 files changed

+117
-9
lines changed

src/main/java/com/dduckddak/domain/data/controller/SalesController.java

+10-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package com.dduckddak.domain.data.controller;
22

3-
import com.dduckddak.domain.data.dto.SalesTop10OfIndustryResponse;
4-
import com.dduckddak.domain.data.dto.SalesTop10Response;
5-
import com.dduckddak.domain.data.dto.TimelyDto;
3+
import com.dduckddak.domain.data.dto.*;
64
import com.dduckddak.domain.data.service.SalesService;
75
import com.dduckddak.domain.town.dto.SalesResponse;
86
import com.dduckddak.global.ApiResponse;
@@ -16,6 +14,8 @@
1614

1715
import java.util.List;
1816

17+
import static com.dduckddak.global.ApiResponse.success;
18+
1919
@RestController
2020
@RequiredArgsConstructor
2121
@Tag(name = "매출 추이 요청", description = "매출 API")
@@ -49,4 +49,11 @@ public ApiResponse<List<SalesTop10Response>> getSalesTop10(@RequestParam(value =
4949
public ApiResponse<List<SalesTop10OfIndustryResponse>> getSalesTop10OfIndustry(@RequestParam(value = "orderCriteria", defaultValue = "sales20241") String orderCriteria,@RequestParam(value = "industryName") String name) {
5050
return ApiResponse.success(salesService.getSalesTop10OfIndustry(name, orderCriteria));
5151
}
52+
53+
@Operation(summary = "행정동의 매출 추이")
54+
@GetMapping("/towns/sales/transition")
55+
public ApiResponse<SalesTransitionResponse> getSalesTransition(@RequestParam(value = "code") String code){
56+
SalesTransitionResponse salesTransitionResponse = salesService.getSalesTransition(code);
57+
return success(salesTransitionResponse);
58+
}
5259
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.dduckddak.domain.data.dto;
2+
3+
import com.querydsl.core.annotations.QueryProjection;
4+
import lombok.AccessLevel;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
8+
@Getter
9+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
10+
public class SalesForTransitionData {
11+
private String townName;
12+
private String townCode;
13+
private String quarter;
14+
private Long salesAtTown;
15+
16+
@QueryProjection
17+
public SalesForTransitionData(String townName, String townCode, String quarter, Long salesAtTown) {
18+
this.townName = townName;
19+
this.townCode = townCode;
20+
this.quarter = quarter;
21+
this.salesAtTown = salesAtTown;
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.dduckddak.domain.data.dto;
2+
3+
import java.util.List;
4+
5+
public record SalesTransitionResponse(
6+
List<SalesData> salesList
7+
) {
8+
public record SalesData(
9+
long quarter,
10+
long salesOfTown,
11+
int rankAtCity,
12+
long salesAvgOfCity,
13+
int rankAtDistrict,
14+
long salesAvgOfDistrict
15+
16+
) {
17+
}
18+
19+
public static SalesTransitionResponse from(List<SalesData> sales) {
20+
return new SalesTransitionResponse(sales);
21+
}
22+
}
23+

src/main/java/com/dduckddak/domain/data/repository/sales/SalesRepositoryCustom.java

+3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.dduckddak.domain.data.repository.sales;
22

33
import com.dduckddak.domain.data.dto.RecentlySalesDto;
4+
import com.dduckddak.domain.data.dto.SalesForTransitionData;
45
import com.dduckddak.domain.data.model.Sales;
56
import com.dduckddak.domain.town.dto.SalesVO;
67

@@ -11,4 +12,6 @@ public interface SalesRepositoryCustom {
1112
RecentlySalesDto findAllByTownCodeOrderByQuarterDesc(String code);
1213
SalesVO findByTownAndIndustry(int code, String name);
1314
List<Sales> findByTownAndIndustryInDistrict(String district, String name);
15+
16+
List<SalesForTransitionData> findSalesForTransitionData();
1417
}

src/main/java/com/dduckddak/domain/data/repository/sales/SalesRepositoryImpl.java

+24-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.dduckddak.domain.data.repository.sales;
22

3-
import com.dduckddak.domain.data.dto.QRecentlySalesDto;
4-
import com.dduckddak.domain.data.dto.RecentlySalesDto;
3+
import com.dduckddak.domain.data.dto.*;
54
import com.dduckddak.domain.data.model.Sales;
65
import com.dduckddak.domain.town.dto.QSalesVO;
76
import com.dduckddak.domain.town.dto.SalesVO;
@@ -11,6 +10,7 @@
1110

1211
import java.util.List;
1312

13+
import static com.dduckddak.domain.data.model.QPopulation.population;
1414
import static com.dduckddak.domain.data.model.QSales.sales;
1515
import static com.dduckddak.domain.town.model.QTown.town;
1616
import static com.dduckddak.domain.town.model.QTownIndustry.townIndustry;
@@ -79,4 +79,26 @@ public List<Sales> findByTownAndIndustryInDistrict(String district, String name)
7979
.orderBy(town.quarter.desc())
8080
.fetch();
8181
}
82+
83+
@Override
84+
public List<SalesForTransitionData> findSalesForTransitionData() {
85+
queryFactory
86+
.select(new QSalesForTransitionData(
87+
town.name.stringValue(),
88+
town.code.stringValue(),
89+
town.quarter.stringValue(),
90+
sales.currentMonthlySales.sum()
91+
))
92+
.from(townIndustry)
93+
.innerJoin(townIndustry.town, town)
94+
.innerJoin(sales).on(sales.townIndustry.eq(townIndustry))
95+
.where(
96+
town.quarter.in(20241L, 20234L, 20233L, 20232L, 20231L)
97+
)
98+
.groupBy(town.name, town.quarter, town.code)
99+
.orderBy(town.quarter.desc(), sales.currentMonthlySales.sum().desc())
100+
.fetch();
101+
102+
return List.of();
103+
}
82104
}

src/main/java/com/dduckddak/domain/data/service/SalesService.java

+34-3
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
package com.dduckddak.domain.data.service;
22

3-
import com.dduckddak.domain.data.dto.SalesTop10OfIndustryResponse;
4-
import com.dduckddak.domain.data.dto.SalesTop10Response;
5-
import com.dduckddak.domain.data.dto.TimelyDto;
3+
import com.dduckddak.domain.data.dto.*;
4+
import com.dduckddak.domain.data.model.Population;
65
import com.dduckddak.domain.data.repository.sales.SalesRepository;
76
import com.dduckddak.domain.town.dto.SalesResponse;
87
import lombok.RequiredArgsConstructor;
98
import lombok.extern.slf4j.Slf4j;
109
import org.springframework.stereotype.Service;
1110
import org.springframework.transaction.annotation.Transactional;
1211

12+
import java.util.ArrayList;
1313
import java.util.List;
1414

1515
@Service
@@ -35,4 +35,35 @@ public List<SalesTop10Response> getSalesTop10(String orderCriteria) {
3535
public List<SalesTop10OfIndustryResponse> getSalesTop10OfIndustry(String name, String orderCriteria) {
3636
return salesRepository.findSalesTop10OfIndustry(name, orderCriteria);
3737
}
38+
39+
public SalesTransitionResponse getSalesTransition(String code) {
40+
List<SalesForTransitionData> salesForTransitionData = salesRepository.findSalesForTransitionData();
41+
42+
43+
List<SalesTransitionResponse.SalesData> salesDataList = new ArrayList<>();
44+
45+
long[] quarterArr = new long[]{20241L, 20234L, 20233L, 20232L, 20231L};
46+
for(long quarter : quarterArr){
47+
48+
List<SalesForTransitionData> listOfCity = salesForTransitionData.stream().filter
49+
(s -> s.getQuarter().equals(quarter)).toList();
50+
51+
SalesForTransitionData sales = listOfCity.stream().filter(s -> s.getTownCode().equals(code)).findFirst().get();
52+
Long salesAtTown = sales.getSalesAtTown();
53+
54+
int rankAtCity = listOfCity.indexOf(salesAtTown) + 1; // 20241분기 시 내 등수
55+
long salesAvgOfCity = (long) listOfCity.stream().mapToLong(s -> s.getSalesAtTown()).average().getAsDouble();
56+
57+
58+
List<SalesForTransitionData> listOfDistrict = listOfCity.stream().filter
59+
(s -> s.getTownName().split(" ")[0].equals(sales.getTownName().split(" ")[0])).toList();
60+
61+
int rankAtDistrict = listOfDistrict.indexOf(salesAtTown) + 1; // 20241분기 구 내 등수
62+
long populationAvgOfDistrict = (long) listOfDistrict.stream().mapToLong(s -> s.getSalesAtTown()).average().getAsDouble();
63+
64+
salesDataList.add(new SalesTransitionResponse.SalesData(quarter, sales.getSalesAtTown(), rankAtCity, salesAvgOfCity, rankAtDistrict, populationAvgOfDistrict));
65+
}
66+
67+
return SalesTransitionResponse.from(salesDataList);
68+
}
3869
}

src/main/java/com/dduckddak/global/security/SecurityConfig.java

-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ public class SecurityConfig {
2222
@Bean
2323
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
2424
return http
25-
.formLogin().disable()
2625
.csrf(csrf -> csrf.disable())
2726
.headers((headers) -> headers
2827
.addHeaderWriter(new XFrameOptionsHeaderWriter(

0 commit comments

Comments
 (0)