Skip to content

Commit 9425d12

Browse files
authored
Merge pull request #76 from DaengPlace/Feat/#67
Feat/#67 영수증 스캔 ocr 기능
2 parents 51abc76 + 6855ad9 commit 9425d12

File tree

12 files changed

+282
-152
lines changed

12 files changed

+282
-152
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"@mui/icons-material": "^6.1.8",
1717
"@mui/material": "^6.1.8",
1818
"@react-google-maps/api": "^2.20.3",
19+
"axios": "^1.7.9",
1920
"jest": "^29.7.0",
2021
"msw-storybook-addon": "^2.0.4",
2122
"next": "15.0.3",
File renamed without changes.

src/app/place/placedetail/page.jsx

Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import { useRouter, useSearchParams } from "next/navigation";
1212
import Header from "@/components/common/Header/Header";
1313
import { WithMapIcon } from "@/components/common/Header/Header.stories";
1414
import { cards } from "@/data/cardsData";
15+
import axios from "axios";
16+
import useReviewStore from "@/stores/reviewStore";
1517

1618
const PlaceDetailPage = () => {
1719
return (
@@ -33,9 +35,9 @@ const ActualPlaceDetailPage = () => {
3335
const [isLiked, setIsLiked] = useState(false);
3436
const [isUploadAction, setIsUploadAction] = useState(false);
3537
const fileInputRef = useRef(null);
36-
38+
const { setPlaceName, setVisitDate, setCategory } = useReviewStore();
3739
const selectedCard = cards.find((card) => card.id === id);
38-
40+
3941
const { isLoaded } = useJsApiLoader({
4042
googleMapsApiKey: process.env.NEXT_PUBLIC_GOOGLE_MAPS_API_KEY,
4143
});
@@ -62,6 +64,8 @@ const ActualPlaceDetailPage = () => {
6264

6365
useEffect(() => {
6466
if (selectedCard) {
67+
setPlaceName(selectedCard.title);
68+
setCategory(selectedCard.category);
6569
setIsClient(true);
6670
setAddress(selectedCard.address);
6771
fetchCoordinates(selectedCard.address);
@@ -91,12 +95,62 @@ const ActualPlaceDetailPage = () => {
9195
fileInputRef.current.click();
9296
};
9397

94-
const handleFileChange = (event) => {
98+
const handleFileChange = async (event) => {
9599
const files = event.target.files;
96100
if (files && files.length > 0) {
97101
const selectedFile = files[0];
98-
setIsReviewBottomSheetOpen(false);
99-
router.push("/reviews/reviewScan");
102+
103+
try {
104+
const formData = new FormData();
105+
formData.append("file", selectedFile, selectedFile.name);
106+
107+
const uploadResponse = await axios.post(
108+
"https://api.daengplace.com/ocr/upload",
109+
formData,
110+
{
111+
headers: {
112+
"Content-Type": "multipart/form-data",
113+
},
114+
}
115+
);
116+
117+
if (uploadResponse.status === 200) {
118+
const filePath = uploadResponse.data;
119+
console.log("File uploaded successfully. Path:", filePath);
120+
121+
const analyzeResponse = await axios.post(
122+
"https://api.daengplace.com/ocr/analyze",
123+
null,
124+
{
125+
params: { filePath: filePath },
126+
}
127+
);
128+
129+
if (analyzeResponse.status === 200) {
130+
const extractedTexts = analyzeResponse.data;
131+
console.log(extractedTexts);
132+
const combinedText = extractedTexts.join("");
133+
const placeName = useReviewStore.getState().placeName;
134+
console.log("Extracted texts:", combinedText);
135+
136+
if (combinedText.includes(placeName)) {
137+
const visitDateMatch = combinedText.match(/\d{4}[./-]\d{2}[./-]\d{2}/);
138+
const visitDate = visitDateMatch ? visitDateMatch[0].replace(/[\/-]/g, ".") : "날짜 없음";
139+
console.log("Extracted visit date:", visitDate);
140+
setVisitDate(visitDate);
141+
router.push("/reviews/reviewScan");
142+
} else {
143+
alert("해당 장소 방문 기록이 확인되지 않았습니다.");
144+
}
145+
} else {
146+
console.error("Failed to analyze text:", analyzeResponse.statusText);
147+
}
148+
} else {
149+
console.error("Failed to upload image:", uploadResponse.statusText);
150+
}
151+
} catch (error) {
152+
console.error("Error during OCR process:", error);
153+
}
100154
}
101155
};
102156

src/app/reviews/page.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ const ReviewPage = () => {
5454
backbuttonPath={`/place/placedetail?id=1`}
5555
/>
5656
<Container ref={containerRef}>
57-
<PageHeader title="92버터샵" reviewCount={reviews.length} />
57+
<PageHeader reviewCount={reviews.length} />
5858
<ReviewSummary
5959
averageRating={averageRating}
6060
reviewCount={reviews.length}

0 commit comments

Comments
 (0)