1919import java .io .IOException ;
2020import java .time .LocalDate ;
2121import java .time .format .DateTimeFormatter ;
22- import java .util .ArrayList ;
23- import java .util .HashMap ;
24- import java .util .List ;
25- import java .util .Map ;
22+ import java .util .*;
2623import java .util .regex .Matcher ;
2724import java .util .regex .Pattern ;
2825
@@ -37,6 +34,8 @@ public class CafeteriaMenuService {
3734 private static final String TABLE_SELECTOR = ".table_1 table" ;
3835 // 식단 메뉴가 없을 때 문구
3936 private static final String NO_MENU_INFO = "등록된 식단내용이(가) 없습니다." ;
37+ // 학생식당 식단 종류 순서 지정
38+ private static final List <String > customOrder = Arrays .asList ("천원의아침" , "천원의아침(테이크아웃)" , "중식(한식반상)" , "중식(일품반상)" );
4039
4140 private final CafeteriaMenuRepository cafeteriaMenuRepository ;
4241 private final PlaceRepository placeRepository ;
@@ -64,7 +63,35 @@ public GetCafeteriaMenuListRes getCafeteriaMenu(Long placeId, LocalDate startDat
6463 menuByKind .put (cafeteriaMenu .getKind (), cafeteriaMenu .getMenu ());
6564 }
6665
67- menuMap .put (date , menuByKind );
66+ if (placeId == 9757 ) {
67+ // 식단 종류에 따라 정렬하기
68+ Comparator <String > customComparator = (key1 , key2 ) -> {
69+ int index1 = customOrder .indexOf (key1 );
70+ int index2 = customOrder .indexOf (key2 );
71+
72+ // 맵에 정의되지 않은 키는 맨 뒤로 보냅니다 (큰 값 부여)
73+ if (index1 == -1 ) index1 = customOrder .size ();
74+ if (index2 == -1 ) index2 = customOrder .size ();
75+
76+ // 순서 비교: index1이 작으면 먼저 옵니다.
77+ int comparison = Integer .compare (index1 , index2 );
78+
79+ // customOrder에 없는 키끼리의 순서는 원래 문자열 비교(알파벳순)를 따릅니다.
80+ if (comparison == 0 && index1 >= customOrder .size ()) {
81+ return key1 .compareTo (key2 );
82+ }
83+ return comparison ;
84+ };
85+
86+ // 정렬된 맵 생성
87+ Map <String , String > sortedMap = new TreeMap <>(customComparator );
88+ sortedMap .putAll (menuByKind );
89+
90+ menuMap .put (date , sortedMap );
91+ }
92+ else {
93+ menuMap .put (date , menuByKind );
94+ }
6895 });
6996
7097 GetCafeteriaMenuListRes res = new GetCafeteriaMenuListRes (placeId , place .getName (), address , place .getDetail (), place .getContact (), menuMap );
@@ -140,7 +167,7 @@ public void scrapeMenu(int page, Long placeId) {
140167 // 6. 분리된 블록을 순회하며 식단 데이터 추출
141168 // 패턴: (조식|중식|석식) (.+?) - 내용물은 하이픈(-) 기준으로 분리됩니다.
142169 Pattern menuItemsPattern = Pattern .compile (
143- "(조식|중식| 석식|식사|요리|파스타/스테이크코스 |천원의밥상) \\ s*(.*?)(?=\\ s*(조식|중식| 석식|식사|요리|파스타/스테이크코스 |천원의밥상)\\ s*|$)" ,
170+ "(조식|석식|식사|요리|파스타/스테이크 코스 |천원의밥상|천원의아침 \\ (테이크아웃 \\ )|천원의아침|중식 \\ (한식반상 \\ )|중식 \\ (일품반상 \\ )|중식 A|중식 B|중식) \\ s*(.*?)(?=\\ s*(조식|석식|식사|요리|파스타/스테이크 코스 |천원의밥상|천원의아침 \\ (테이크아웃 \\ )|천원의아침|중식 \\ (한식반상 \\ )|중식 \\ (일품반상 \\ )|중식 A|중식 B|중식 )\\ s*|$)" ,
144171 Pattern .DOTALL
145172 );
146173
@@ -174,6 +201,27 @@ public void scrapeMenu(int page, Long placeId) {
174201
175202 if (!content .isEmpty ()) {
176203
204+ // 애기능 메뉴 정리
205+ if (placeId == 3103 || placeId == 2490 ) {
206+ content = content .replaceAll ("\\ s*/\\ s*" , "/" );
207+ content = content .replaceAll ("(\\ s+)의(\\ s+)" , "의" );
208+ content = content .replaceAll ("사이드메뉴: " , "사이드메뉴:" );
209+ }
210+
211+ // 안암학사 메뉴 정리
212+ if (placeId == 3654 ) {
213+ if (content .contains ("또는" )) {
214+ content = content .replaceAll (" " , "" );
215+ content = content .replaceAll ("또는" , "/" );
216+ }
217+ content = content .replaceAll ("/" , " " ).trim ();
218+ }
219+
220+ // 학생회관 메뉴 정리
221+ if (placeId == 9757 ) {
222+ content = content .split ("-제공되는 메뉴" )[0 ].trim ();
223+ }
224+
177225 // 애기능 - 학생식당
178226 if (placeId == 3103 ) {
179227 if (!content .contains ("[학생식당]" )) content = NO_MENU_INFO ;
@@ -182,7 +230,7 @@ public void scrapeMenu(int page, Long placeId) {
182230 // 애기능 - 교직원식당
183231 else if (placeId == 2490 ) {
184232 if (!content .contains ("[교직원식당]" )) content = NO_MENU_INFO ;
185- else content = content .substring (content .lastIndexOf ("[교직원식당]" ) + "[교직원식당]" .length ()).trim ();
233+ else content = content .substring (content .lastIndexOf ("[교직원식당]" ) + "[교직원식당]" .length (), content . contains ( "[학생식당]" ) && content . lastIndexOf ( "[학생식당]" ) > content . lastIndexOf ( "[교직원식당]" )? content . lastIndexOf ( "[학생식당]" ) : content . length () ).trim ();
186234 }
187235
188236 CafeteriaMenu savedMenu = cafeteriaMenuRepository .findByDateAndKindAndPlaceId (date , kind , placeId );
@@ -201,15 +249,6 @@ else if(!savedMenu.getMenu().equals(content)) {
201249 savedMenu .setMenu (content );
202250 }
203251
204- // 당일에 해당하는 경우 식당 설명 수정
205- if (date .equals (LocalDate .now ())) {
206- if (!updated ) {
207- place .setDescription (kind + " - " + content );
208- updated = true ;
209- }
210- else place .setDescription (place .getDescription () + "\n " + kind + " - " + content );
211- }
212-
213252 }
214253 }
215254 }
0 commit comments