From d77a71493a2df1a2b7dabd19680b3ba2cd26adff Mon Sep 17 00:00:00 2001 From: Hyungi Ahn Date: Sat, 25 Oct 2025 14:18:24 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=88=98=EC=8B=A0=ED=95=A8=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C=20=EC=82=AC=EC=A7=84=20=EC=97=85=EB=A1=9C=EB=93=9C=20?= =?UTF-8?q?=EB=B0=8F=20=EC=B5=9C=EC=A2=85=20=EB=B6=80=EC=A0=81=ED=95=A9=20?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20DB=20=EA=B5=AC=EC=A1=B0=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ๐Ÿ“ธ Completion Photo Upload: - ์ˆ˜์‹ ํ•จ์—์„œ '์™„๋ฃŒ๋จ' ์ƒํƒœ ์„ ํƒ ์‹œ ์™„๋ฃŒ ์‚ฌ์ง„ ์—…๋กœ๋“œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ (1์žฅ ์ œํ•œ) - Base64 ์ธ์ฝ”๋”ฉ์œผ๋กœ ์‚ฌ์ง„ ์—…๋กœ๋“œ ๋ฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๊ธฐ๋Šฅ - ์™„๋ฃŒ ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ actual_completion_date ์ž๋™ ์„ค์ • ๐Ÿ—„๏ธ Final Issue DB Structure: - ์ตœ์ข… ๋ถ€์ ํ•ฉ ์‚ฌํ•ญ์„ ์œ„ํ•œ ํฌ๊ด„์ ์ธ DB ์Šคํ‚ค๋งˆ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„ - ํ”„๋กœ์ ํŠธ๋ณ„ ์ˆœ๋ฒˆ (project_sequence_no) ์ž๋™ ์ƒ์„ฑ ์‹œ์Šคํ…œ ๐Ÿ“‹ New Database Fields: - completion_photo_path: ์™„๋ฃŒ ์‚ฌ์ง„ ๊ฒฝ๋กœ - solution: ํ•ด๊ฒฐ๋ฐฉ์•ˆ (๊ด€๋ฆฌํ•จ์—์„œ ์ž…๋ ฅ) - responsible_department: ๋‹ด๋‹น๋ถ€์„œ (department_type ENUM) - responsible_person: ๋‹ด๋‹น์ž (VARCHAR 100) - expected_completion_date: ์กฐ์น˜ ์˜ˆ์ƒ์ผ (DATE) - actual_completion_date: ์™„๋ฃŒ ํ™•์ธ์ผ (DATE, ์ž๋™ ์„ค์ •) - cause_department: ์›์ธ๋ถ€์„œ (department_type ENUM) - management_comment: ISSUE์— ๋Œ€ํ•œ ์˜๊ฒฌ (TEXT) - final_description: ์ตœ์ข… ๋‚ด์šฉ (์ˆ˜์ •๋ณธ ๋˜๋Š” ์›๋ณธ) - final_category: ์ตœ์ข… ์นดํ…Œ๊ณ ๋ฆฌ (์ˆ˜์ •๋ณธ ๋˜๋Š” ์›๋ณธ) ๐Ÿ”ง Backend Implementation: - Issue ๋ชจ๋ธ์— 11๊ฐœ ์ƒˆ ํ•„๋“œ ์ถ”๊ฐ€ - IssueStatusUpdateRequest์— completion_photo ํ•„๋“œ ์ถ”๊ฐ€ - ManagementUpdateRequest ์Šคํ‚ค๋งˆ ์‹ ๊ทœ ์ƒ์„ฑ - update_issue_status API์— ์™„๋ฃŒ ์‚ฌ์ง„ ์ฒ˜๋ฆฌ ๋กœ์ง ์ถ”๊ฐ€ - generate_project_sequence_no() ํ•จ์ˆ˜๋กœ ํ”„๋กœ์ ํŠธ๋ณ„ ์ˆœ๋ฒˆ ์ž๋™ ์ƒ์„ฑ ๐ŸŽจ Frontend Implementation: - ์ƒํƒœ ๊ฒฐ์ • ๋ชจ๋‹ฌ์— ์™„๋ฃŒ ์‚ฌ์ง„ ์—…๋กœ๋“œ ์„น์…˜ ์ถ”๊ฐ€ - ์™„๋ฃŒ ์ƒํƒœ ์„ ํƒ ์‹œ์—๋งŒ ์‚ฌ์ง„ ์—…๋กœ๋“œ UI ํ‘œ์‹œ - ํŒŒ์ผ ํฌ๊ธฐ ์ œํ•œ (5MB), ์ด๋ฏธ์ง€ ํŒŒ์ผ ๊ฒ€์ฆ - ์‚ฌ์ง„ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฐ Base64 ๋ณ€ํ™˜ ์ฒ˜๋ฆฌ - ์™„๋ฃŒ ์‚ฌ์ง„ ์—†์ด ์™„๋ฃŒ ์ฒ˜๋ฆฌ ์‹œ ํ™•์ธ ๋‹ค์ด์–ผ๋กœ๊ทธ ๐Ÿš€ User Experience: - ์ง๊ด€์ ์ธ ์™„๋ฃŒ ์‚ฌ์ง„ ์—…๋กœ๋“œ ์›Œํฌํ”Œ๋กœ์šฐ - ์‹ค์‹œ๊ฐ„ ์‚ฌ์ง„ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋กœ ์—…๋กœ๋“œ ํ™•์ธ ๊ฐ€๋Šฅ - ์™„๋ฃŒ ์ฒ˜๋ฆฌ ์‹œ ์ž๋™์œผ๋กœ ์™„๋ฃŒ ํ™•์ธ์ผ ๊ธฐ๋ก - ํ”„๋กœ์ ํŠธ๋ณ„ ์ˆœ๋ฒˆ์œผ๋กœ ์ฒด๊ณ„์ ์ธ ์ด์Šˆ ๊ด€๋ฆฌ ๐Ÿ” Database Migration: - 016_add_management_fields.sql ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰ - ๋ฉฑ๋“ฑ์„ฑ ๋ณด์žฅ ๋ฐ ๊ธฐ์กด ๋ฐ์ดํ„ฐ ๋ณด์กด - ์ธ๋ฑ์Šค ์ตœ์ ํ™” (project_sequence, responsible_department, expected_completion) - ๊ธฐ์กด ์ด์Šˆ๋“ค์˜ final_description/final_category ์ž๋™ ์ดˆ๊ธฐํ™” Expected Result: โœ… ์ˆ˜์‹ ํ•จ์—์„œ ์™„๋ฃŒ ์ƒํƒœ ์„ ํƒ ์‹œ ์™„๋ฃŒ ์‚ฌ์ง„ ์—…๋กœ๋“œ ๊ฐ€๋Šฅ โœ… ์™„๋ฃŒ ์ฒ˜๋ฆฌ ์‹œ ์™„๋ฃŒ ํ™•์ธ์ผ ์ž๋™ ๊ธฐ๋ก โœ… ํ”„๋กœ์ ํŠธ๋ณ„ ์ˆœ๋ฒˆ์œผ๋กœ ์ฒด๊ณ„์ ์ธ ์ด์Šˆ ๋ฒˆํ˜ธ ๊ด€๋ฆฌ โœ… ๊ด€๋ฆฌํ•จ์—์„œ ์‚ฌ์šฉํ•  ๋ชจ๋“  ํ•„๋“œ ์ค€๋น„ ์™„๋ฃŒ โœ… ์ตœ์ข… ๋ถ€์ ํ•ฉ ์‚ฌํ•ญ ๋ฆฌํฌํŠธ ์ƒ์„ฑ์„ ์œ„ํ•œ DB ๊ตฌ์กฐ ์™„์„ฑ --- .../__pycache__/models.cpython-311.pyc | Bin 10491 -> 11240 bytes .../__pycache__/schemas.cpython-311.pyc | Bin 16574 -> 18175 bytes backend/database/models.py | 13 + backend/database/schemas.py | 24 ++ .../migrations/016_add_management_fields.sql | 223 ++++++++++++++++++ .../routers/__pycache__/inbox.cpython-311.pyc | Bin 18454 -> 19283 bytes backend/routers/inbox.py | 15 +- frontend/issues-inbox.html | 97 +++++++- 8 files changed, 365 insertions(+), 7 deletions(-) create mode 100644 backend/migrations/016_add_management_fields.sql diff --git a/backend/database/__pycache__/models.cpython-311.pyc b/backend/database/__pycache__/models.cpython-311.pyc index 72796a919cb9aabb52a86d397ff63a85ba1b41de..e71ab5fc4526d7380eab527c3dd049d36192e360 100644 GIT binary patch delta 1035 zcmZvZO=uHA7=|<3?GH`!)22z9Hk$;JO4YVW6Kzt3UK&INDWos+tw>cjleq`j0=#7wM8?u05uyO7jksE zO^?SKhB;2>vi}FK(HS}c@eq8yG0ej8>@AcW%fj^>%*0_V!)k-8sSJu_U^dRDIQ+$$ zu_?vT$OOyZ70r%wgrQ5m=J*UYDX(;6fH&f zU5YQF`XUN7r&4n@aC7X2DTRE*|GNk?1_Jz&%h)3Db?Er%Hm5;06dXD zc~%IpFNVAqmR_U3$9H4sG45mZVOTNB7)}ft!;G3~Ee*t?rDLViF delta 381 zcmaD6{yUIwIWI340}xCI{ga_Dvytzc5R(q`r5D=x!#E=SeG7PC~>5QowKy!uB zbn2yu1T$!g7Wo6!7fmh`|2Mf(!hunL@<(~8$#Q~Ro9{^!GEO#>_GEHo+FT=jk8!h_ z+!02`sgqyJ&tq)Z+@-+I%s6ZEBxM7}zRib~W0)A{Ojc0yHJ%GHjTJ<2gNQZ|!2u#f zLBuQ&Ap;^3L4*K^m^yi(vIN&s5EDeqpL|H|0^`!nlhs)n8JA9;sUgd_Zu54HY$hW` Z#ze*s4A{vImyckXFUaz4lS8zp002%-T$BI+ diff --git a/backend/database/__pycache__/schemas.cpython-311.pyc b/backend/database/__pycache__/schemas.cpython-311.pyc index 745a75c9d8a0bab6492d9cdccb5867c5bd31314f..459f4134d435bda627f6de018eefd9365f9e784e 100644 GIT binary patch delta 2895 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 STsG+=kD1aR4h|3t`uSf%z%W+; delta 2849 zcmb7GYfMx}6uz^M%Pw!&Wq}2jh2^!nE-Hc%P(gX9vBs+PL1}Ph23WH!WbQ6S#Zqmf zwtp&}#vfH9O%rM(e{^ksHR&U1(!Wicrn#n#P5PrvlLpftP1PnnXD++TLv5VR{dVTe zx!;^QXU>`X-4$}>GRgfYCnr;ZcJ0XHkuO?ja!bg>O#Q`eM4<|`MM_8AeeTh+zA`zs zN6JSl`YMQGQW&9`G;5g5XU~}w+>+rY^8WH%Q;PRn2kA0lQYVE?s8QivCur4 zKVR?!IWAu~@0c?KIXp&_Z#ZcYb`iKeceQSg4z9bwJ0@*A`yQE_d%c6AfS}jA=D%I#a(-+ zbrW<85)bV&Hr0btpO`5;M}orPI8S=T6~_kBB))O1Cj;UiM-OQh9nN0TA}%>=HkE+7 zZVFRwm23#v2y0Mo9SUQwCK%~Ci!Tp^H4Tgz1zAI4(v@Q-&4~-8?u^PUAmObDZ3yiM+YvetI>qPS z9!@R2e8{BeyM7h9)hmFlB2`;O9)T!7(a{?EBw`mGRgTe z_EtIzWmxBUKf)^rxd?*@69Bpju43X+wWl?XGKPTG@L_}z0Nos6QNNu_zeQ1+J|XBf zJ}K^3mo?$*%RJ~cJebYdM3}w0=)l)N>lA99H$$yD=en8r!FSIDr{+%GR?}Te;z8ZN zCdY{>%gI#j8YeXCtSWB%YfQ6ltWJAq_VVO8n?ZA?GOj8#cgl3K49I1Jao!X;i7s6n zUsuoCrc{vUPuZ?2*Uhu#qO-!6XBkMXHD#Wy5Hs#-l_=2lh}(HZVsD_36o`R9DJc}E z0%vj@Q9_{@UsECLT!O6Y`rji!*PXWP02@R>@KiGBmxJXy(9L=lWm+s84aLG^(dRw^ z;?H1t+w&iRRFK67jov1iJjcM6bjXv@o<`}4XupX&dE8jryfj-DW9^8K(@=~Vu^!N3 zp;%nw@4yQ`!J{38>k>kKLHxY_p5Pn*w(@2WCoVMoMW)j!gBi5XZ{`Q#pC3gy1OR19 zom!E}1)LvnR#V}*J zPc#c?V%^|PqNAnQ`YsIJqQB*LC=xxJi!3A{`rGy#USZMlOxCS~WASJ#ovpeBU1{VZ zTB4i7(E)xDZMp;i4l#@nkJ{YiJ>hEK=#>@AIm}|)KC-AWIMub{~4G6Ld$#QoFhpDBxj7A7$yAk9GmBnlNIE;0B_v9cO$BdD| z)Xi{@_-)2w>BvZTZ$y2SGc6v8ajaH4VVVv8F(zE$k93rFzL-E)McY!W177N{;1+Jo)yhk|JLYW;L4~z_vT=8Q?CWf@^p{;#%jK(8u8~+59@EcFNCf@G(LrnLs z{qVD1Q%@^V7ZiXWa|;&C@PFSKSg@i{RUE|&8Q8Na_WT7q_E1s61G8fCeNU์ƒํƒœ ์„ ํƒ
@@ -427,6 +427,21 @@ placeholder="์ฒ˜๋ฆฌ ๋‚ด์šฉ์ด๋‚˜ ํŠน์ด์‚ฌํ•ญ์„ ์ž…๋ ฅํ•˜์„ธ์š”..."> + + +