From 49acd32502b1eaa9f252f6d4b0230d7abc6e4e01 Mon Sep 17 00:00:00 2001 From: "Lim\\jun" Date: Thu, 7 Mar 2024 14:18:17 +0900 Subject: [PATCH 1/5] =?UTF-8?q?=EC=83=81=EB=8B=A8=20=ED=95=98=EB=8B=A8=20?= =?UTF-8?q?=EA=B0=84=EB=8B=A8=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../public/assets/images/banner_m_01.png | Bin 8551 -> 0 bytes .../public/assets/images/banner_m_02.png | Bin 9308 -> 0 bytes .../public/assets/images/banner_w_01.png | Bin 3890 -> 0 bytes .../public/assets/images/banner_w_02.png | Bin 4289 -> 0 bytes .../public/assets/images/copy.png | Bin 0 -> 2703 bytes .../public/assets/images/copy2.png | Bin 0 -> 11861 bytes .../public/assets/images/copy3.png | Bin 0 -> 4683 bytes .../public/assets/images/f-logo.png | Bin 0 -> 6963 bytes .../public/assets/images/logo.png | Bin 0 -> 14371 bytes .../public/assets/images/logo_footer_m.png | Bin 7592 -> 0 bytes .../public/assets/images/logo_footer_w.png | Bin 5809 -> 0 bytes .../public/assets/images/logo_m.png | Bin 7158 -> 2173 bytes .../public/assets/images/logo_w.png | Bin 13784 -> 0 bytes .../public/assets/images/search.png | Bin 0 -> 1628 bytes .../src/components/EgovFooter.jsx | 38 ++++++++++-------- .../src/components/EgovHeader.jsx | 33 ++++++++++----- .../src/css/layout.css | 23 +++++++---- 17 files changed, 60 insertions(+), 34 deletions(-) delete mode 100644 egovframe-template-simple-react-contribution/public/assets/images/banner_m_01.png delete mode 100644 egovframe-template-simple-react-contribution/public/assets/images/banner_m_02.png delete mode 100644 egovframe-template-simple-react-contribution/public/assets/images/banner_w_01.png delete mode 100644 egovframe-template-simple-react-contribution/public/assets/images/banner_w_02.png create mode 100644 egovframe-template-simple-react-contribution/public/assets/images/copy.png create mode 100644 egovframe-template-simple-react-contribution/public/assets/images/copy2.png create mode 100644 egovframe-template-simple-react-contribution/public/assets/images/copy3.png create mode 100644 egovframe-template-simple-react-contribution/public/assets/images/f-logo.png create mode 100644 egovframe-template-simple-react-contribution/public/assets/images/logo.png delete mode 100644 egovframe-template-simple-react-contribution/public/assets/images/logo_footer_m.png delete mode 100644 egovframe-template-simple-react-contribution/public/assets/images/logo_footer_w.png delete mode 100644 egovframe-template-simple-react-contribution/public/assets/images/logo_w.png create mode 100644 egovframe-template-simple-react-contribution/public/assets/images/search.png diff --git a/egovframe-template-simple-react-contribution/public/assets/images/banner_m_01.png b/egovframe-template-simple-react-contribution/public/assets/images/banner_m_01.png deleted file mode 100644 index 41619c7989657ab6fdaa57337ba1d3ec75ffaedc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8551 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 diff --git a/egovframe-template-simple-react-contribution/public/assets/images/banner_m_02.png b/egovframe-template-simple-react-contribution/public/assets/images/banner_m_02.png deleted file mode 100644 index 247f7bcb2497ad660deb2a941237fe26c69e485f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9308 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 Pe;+w1WyvaW(}4d2i>8Bv diff --git a/egovframe-template-simple-react-contribution/public/assets/images/banner_w_01.png b/egovframe-template-simple-react-contribution/public/assets/images/banner_w_01.png deleted file mode 100644 index 0b65d27ae7f839877b340a0cb9d351444afc4b83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3890 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 diff --git a/egovframe-template-simple-react-contribution/public/assets/images/banner_w_02.png b/egovframe-template-simple-react-contribution/public/assets/images/banner_w_02.png deleted file mode 100644 index a53ee85c4148141b09ab1f11a855844a890aea87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4289 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 diff --git a/egovframe-template-simple-react-contribution/public/assets/images/copy.png b/egovframe-template-simple-react-contribution/public/assets/images/copy.png new file mode 100644 index 0000000000000000000000000000000000000000..f393326be97046f8040be2d9f135f40643fa654a GIT binary patch literal 2703 zcmX|@c{mhWAIHZ&$dWY%?-)`yW@Rj6XJYJL*|Ic^F&JYV!wj-VT@iE3NQ=0IY~wbv zMMSBwgk)EdLZvLDdo3fqy6=7NInP;s=lq_}_xb*w^T+ws-PK-7LRA6)07yCDupS3% z!@*DiiXP1N0;%c%fPfR()0gJ!;*23iN5Tlf(Lp2_BQoaT9sn@2WW*4N6cP;_L<%KG znM2mvyC7h4usOsB?SgQLu_c9(aYjTVD}!|8N7jIIxhriQ|i zCMG6u1PYEqK@T#Zafwkh0s|Tqr}Y!@e+HHmN2HQtXyoW9@J}WoC_0{I4uQabiopL- zIj{%+*WW?#Z-q!v2W6oi_y;?%F#rJYhXdBylX3H_|19%{qpW#Cq~J_}xD`kcl<9d= zFaih>{^g(pt+lPjRX_1GUTXyC%fPSx6n^vxq(Z zk9CjMtK*9}3r3-PkQM_|v^XiX5oYw84z+~Vk4{%ltykLsv zv_9`^*zNJt&3c`BZf&1{9z_YROFdR0m*jOQCUzBso0f!aDw%-plCFi4ccj5Wh3T!W zB8adp%KR(Q0*&=!g2`2LVt(uNk<2A|Z!ep!U4cjqCTp&cWoccyllx#Vp=#`q!DU$q zfO6sFc2Anjx@Fo@a8J@?>@QFt`}6 zb;*BiUldy^l`eStrf8>&mC_2*(T+ECZhXD#jga;+z|8y=y`f^@k;V?A?jwymTy3|Y zSmNMxdl&jyKt9qk4{4c?Bwp8>O7H0RTU0RGiWRTd3cFVj>i&ZQNLi>{%&32-xFzS) zPUC!u29z>;;W2TDh7Rq}DP@V|bR-Xk5TIpJr@+EhaGWhy`o)ar8{dD_5T4Uy1x_X#%ib%Qe5?dbWWk&kkVdeEBur z`OF9UaQtc+aP6=Yy)`=;DLB7Y{$UIEWR*Y2bKU!LD7Wa`Y5!E6yTB&p3sc=M%d z)(LOK{bWH*t+r$x{_!Xgf5wBpfb#RTZ>$1g|>EW9?%M&w_@;*8t5lm1j z%bx-w4$^<5pewU>EA6IsL(EFwTpMNgjGXBIo*+BPywNHBwj$Ji#7uFIFGO}Yir|Fd z1?vm)y@LCbJhP_!Mp{@4Cn>=jE6%-|bqJUS{>+Qt6Pa6DiqtW;4({AL+;sXyWz7h} zUd~BhA%JtG`BljfiWC6-yupU0>dGIA5D0ybW+ewrFZ5HzNepKj)%qji9U>%7?qbdS z)hVADbRnjK%gT=1bi5Ro1EOCluaFZ_SX2Evt5&ZiR5|<%%Cm*0Vjv!D#F=TajnkT z#5q*4Hw^bIiiQGs+k3)*iJ7S7Oz2Cc$Gv|3wcET>9!|K7G~jCsl^qzK*Yg~jyxyT{ zBgBrNd7wOCS&tZNJ%0X2hz}_`X~JdiLgTzGgG>hAb5jR@Aqwx7z8mfB4vs(9kq8S= zFt_IJN>pFK)>;YoPcQt(?k(uDCbagf|5#}QKrR<(67M1PXA~Exu*d!uKjwa3&akAz zrVSsvArjW3TpZ-doj;Ze!WlYp>zh6SGoFdcc4rGaDb{(XY`h;R%l7f@+Wc5|m#ZV9 zF=23FwcRb?q3eJuM;cp782XI`Bid(wg6uVK${XXO0z;YQ{`8GxK|$vuAVMKiQ^^uEhT)Gj}CabOD2O68$n&JE4td209KaKNXPS~ z`ed4`FY5BDKDYWC4_u84D_=~|c;;v74bvTQQ;q6owQ(XC*RUXm&Vd5?$x>;UKgMN5%>CH07t8ekao``{y>q- zzZ{j0xGy=#4A&@!&e2CYoK|C1I*dee;T4^_n!<>{My2z4uF}+v*)xM}F|!Gxfs5qD ztp%4PWCIXt{NGvu?0%H0<%(VwWOkuXnmO@Aqo$_2Z!C4GT>_@?(t*jQ;l4JWGPvBR z>u#g++uY&X%Y;aAm*|%8oA0O+>!vG1F5g!AJ@IY>FK{+GE9gAk_}4qQ!VBf$&s*)U z**`KKv%LzM^B7Qel$1MD$X+QD1VtW=h}<+ z@cW!mpA=Fb=(sdsCCzl{&)PcO^e*S(>^LZDSkC&DoKcI@;-h>=K=cNd{hJL{oBq4h zk+lx?Bzx>vQ`!g8=+fthXHnYwzp_DYo{NQ;MKRmry=}jQ1p}qEt=c!XDbZre9&h|m zn{#g9V^6t`{VBIzM7J7Z#8NbDW*lWXb!<0EUF{hD`{!&BsJF>fR&()C&LC);|29Xc zGVg}zq-GyM=)4o@(J)vn!zW}u$>>Yk#no@}lU?y&%q|xASY0K40TOXLJ!Mm4U@A5t|y9m317oy(hXeBgc<~M07`EqMypo;57OB2S|4ek6`4K2Ohyin*`=+nKo z7+Wu`1n}?i_cv{=CU}QKkE?Na)va>DAjwti)J*V*b->nmJKp+)*XFV|D@eviega7q zIPa#F5{^^jyUXqWQa0rt{&BaphLOJ)<>b5(AxiJBPjnZLWCxm5y5o}5)Dtbyqdc)5 zan)NYJBr%;>}}AKoZ&+|!;QSO7h&yx5#^iba()2rNyreKchuE>{v#bux?Y;O+zxAP_ugBaOSePv_qM z{_oAqy|dn$UaPw7+xu)gyY@a+Q5tFr*ccQT003YsDavZW_w(?L4GjhU|KkI)7<`8g zQ8aJ^08GL^8v>A?Nd^GOU3S{~?)s`K!j@nsc5^GR1&H0-2?9q0fT)Bw#N5&WfLd2#7-q%==GEpB5a#0*<`Q_xDJ0Cv`A?`S*vih@ z=l_5TXmjxhb8`yw3I1e%mfW2D z@Tg?7=HnD%u%*Wz^Zkq73Qo@_!zafh zB_u7)CB?A>bKHhVd_e}^ap_mrLa`;FX zhEfOxq3=)L6D6q9zd|;Vx~M@1aV%_Qf3ZupZXLW-IAF8OXn3)6+a72dG?M(R+0AD7 zSLP=ko8eDxV6?c^(NK~)Sm%?IN6#mQqoI#Eqx29q+iyYmc@pZOPgcJcZrRH)uGXP& zd%hNQ;)zhw&J`fSUx?RUe-KagnAQ34<~3{5HK`^+iY6m2EB%ie2~!VD!z0|D91_8Z z7ex#Eri)El#;#EodT?i2xB4wYV{#@W?csru! zYB_swL~ZzL7nd3yJvy*rax)f6a>oFx#qJX<|FC>AB~Tlb9k5`|9!WHgo@9ZRCr)0? zE!aqBh{S{-r4<8lVtdF}zc?_M9-8fp-PCU(9|B8ZJ{TM+^$4jnR}1+qHCc27=yzB1 zzL`2Pac?zT4Ai>Nn| zosO<7e$d`;+cc^FjQp5ys}0jnqY58{Zjj#Dj3L_Sn5(u3iO9Gz1h~q%uPDgKodhF- z5ubHIQ4)!i5JIg~^e)>H(zrN=%!gNZ%j9R@9j=r`a|jz^``Xw`-r_$!C^zylFDXr$ zAMTip29eoKG&|%66b(nLxnAd#292mgP1LWqdek#N%+IUrQP2%1AF^vr;$0o-rK=-jMJ;WY;PXPGCse2A-mr_ zZ=9WR02q{}@oazQyd(K?PCUHucxaAed@7*%207^q=YGMbvO=|>W8&qGN&DOy@cdR^ zjbm*9TFBhz`Tngf$IxPlTF1%BVonMMA;<^i0`~LM%SN9?^;`e-o7a8uOqxVLe)(*+ zHz?rT8zwebPxb-UBe$@g=KN=jY@KNj7*}QonS_4l5|;?U$gfh{1uf1POs9q>AQ3`1 zl)Itp!*)}4FG~Cfb&&g90tVN@mIF)>+8kdzeIoThTVkhc*RZqu(Z^^BglI5!PL)dXZ#!ssA7$Nnf9=yXU_djK&L_mZrM<2 z=@O>U*qo`hv4w%F_X< z30_u`XcBBB4na!K$;+j$IRUqx{Gp*?T>jtte}^Lt+wy*%*T4Zj8?#3xnCK_axZO^b zo2Z@(<>{1_In6b+Vl|bY?%0p}R%q{U8o`3yHr!FCW9K4_#w3pHS_DkO| z+nr$jGda!k11gCV=mh4H-=auwaYHWbN)fl3;Po~P z%2y(g&Bk>oQy@N#9Ik1dBIES?X!Y{!k@0#GtR_~uehFS0%D$<5DLmP*-jCZY)P)Wb zVXGf~FJ)^aWwDKdyW;YfhM^LN0y?tYab4`ITIe<6VF4lf^wr47s4|5bS09!%OmODb zOVbWqo2&ef^I}#Nf*iEg%av|@=QtONE7J#Tc*!i-GsU2`)KRjC$=}FkZ42d>N#x^J zyId%l?i!$_FVd~;KMvF^zVkfH&e{CJdS_<+x?Uyc_~c-EDeEzkgN-2iM;r`>H$zpA zJnUSXJMM_m=aQgYaDb?9}!+W3Qd+T-%U6jowp_;YV zb0)c^DUZ~dl$1t6(ocfFbCl-A9!x|K(PgP`9{5G`yjjEuqxTNhCr;X*wuZ%7>mk89 zsKt23y$*HIlFMJHP)ii<%%yzw-9|!qp7I_eHmA3&OUIxTwt_r44Qc)(h;QIrG`YtF zd1^r%)xA@HeVLwr-UJ?5c<$FJdmwmlTQ;SD1rLCy1KmQ_1;2}5+so36D@hiWykE3R zYl{hyCiEdwPCVKT#m)68BB$gCrcHN)x;*tsXfEE!Ivi zo29Rrf+=EOCMr5E))~o|*-|v@*rTI%t-D@Z(Li8uU%&&+_iPV2vADw|Nx6U|wzKfp zX82LDLJ9Zb%vELrv_)h2e?eeR&QiV$3A zOc2qdX^A_*%T{7k$SxSya~Odup=WZCO~{{tT@**-m*?Q$$iUi1CvfRG5=}ZXy=L?A zrWG3?;|W~34U538w220~yzCr04LY6o6AIx0bHL@2^Q{IeY-h)QW&GN$DDdh4YHB;z z9&CEEy3&$jGTdt+8;eZR}aF$THpVz@tzc=ip1B1#LlWGOh zQ6rr$-X6evf7{pX+}WgY@9#clnl8>LLl4I{^+}aS0`6Iy1QsJHPZrbT)c0sz zFNPODFGR(VVA|);r-FkyZ0wPwzIC=c>z$3_X1nNQ+*N?HlI)t@N{fmlTfY|ciyaMb zH>|?5Xw>-auPaPg6?ECPB`cpG3W+|kxc9X(9#UwiObpP*ZOWXSf#9u&j2%piR*85( z57f?5_PS8oruT-Qo3hOmEuFSNI=>VvP9y{aKwq_>+sa$#>y>voRbTyD4_%v&Cew9z zLS>|D2o-j;o~iiKcYr%l6)-?kU+>QN!p26M+1XMI_q9tVP2#=pcqtC;tI;8p5j*xT zJ;Yu*^e6U2mC8fdTWHl`(!?L2m5Y5QrJh5$_5^a0voh(cBy}`4zXZH1(F51W~ ztmk?Nah7IHH39VtkXoDh8IO@Z@tT{&r$$A0eY$}lGnu#Oi~CE@(GWwjdJ7t1P=1Ep#sYKuHe4M-7yA|tfu=P+E8 zAA!r3!2=FFs!D9}kZz7$`WiHB<~S;PGpJ$CYpYwSxDa^rJ&Mk!S*WPZf>sk z!;iGIy2F|4wO;TPhv3KRPH2`0@=S{lVc=r57#kxik@4ZKE~nkeYw#J3DC0shdk^PK ztKal4V!4A}&4bPx?e9Mt9Bh=bJ7J)3^Y74!Ab;lFlLF@;9aGknl%%`)dFpPDg62G> z2t&4z*Ka+=r+s!7vl~5!1&xed@$2)Y^z~n{iw26_SKrRX8A()4tWkwIA7pwKa$hzg zflauj8EXMRO4$+Ev6Bw{j5p(R7th6@MP2zzOq|zmI>waTCO{^IR&KP8dc~2)UM^Fg zd@Z@Enl)NtIE%`Hn<6jZC&%ZyFN_T}##jStdU8rh|oqoi}H54ZEauf-8)(| z#QnK?h3@-+;e@pXqjojQ$1H+6QkcmyCMJf(xNiA;+jT^2fNeU8oF*BUtM*1K zCTaZjzFF_u%iN~2k!O$ zARLb-pZhsj+x(jkM5GGhJWlfE#wh!)%NcbXd*=pPX7hMVHWgIYuT{Wjr?&6r((mXttx)XtUF8|T!JkS0<+S-CIWVRl`si7B zJXZnveId!RS7>y(G@wsB1Yjb(~GDkjM(`6fZ*2l4K?Q7L?sC zDo;hJm>8Ml^mFt`8Ywt!vX2KU`dlyCn}3#7X==%e9_=(7p_=&Q385}ysWR|^jzcUJ z;(7g;(O+5_7?5xL%5IibT*`8}a_t*79`+u592}+srye&X^{R)d9UtGejq#IV!1sZt)BaHtI3n57yG{pc9qn@3vp*dKa13;O;=t( z;8iZ>Qo!wACF%vTD`muIm|5G&T;^pTlURdFuJ&A?gt(7^bWVp~hkjy<^>kbgN-7a) z1UdG))X;i-@UC9PS<77?GBFVO!vc${S{Z-KnoPbWTH?O1!E) zOA^54WdJ~ad$}@Ni5mXvlrQk(Hm*NLHIe0@NkJtKL zsQ0DBkKZ0k(19Ar`mHANesbX6lziGvlRohdukkESuMT$NFPg-#jdnWR18*E!y!n8W z)`l8~`E5320sUVl_?rVgS!BkdD z0~AK3m7gUe2O7`Ypr5Ej+`FIP;t0xW5=~Ud^f53ebFJ-dzmBiCcU&hmFi5kfBxR|m z2t&agGR|ztYu8$bN;Bv^Kl)Wi{+h$Mt?DH&D^_%BQK^XMwmm*hBzmZ1MpHvtTE&(B zC_{W4O-@>JStjrL_94|4 zd1DD83;$NK+8NFA@}*te>J}<0?(CD$@7Hdh#5umWPzh@X%lybS#RULij{|z+tQ(h& zxSR%0b25}%b94Qsv(=IS8p%vg+m8_>*s+vnshO6x z=ya)uipt$YlqTK8IfmG&F5XULOuF5!n`a;QvNq)rWn=yEKYS+{dyI8Cp}nLl6MzRW z>&?}~1y&Dl@p9l|gU7eFHK9|$tUtjVIa<$uv4u` zceF|b0XG*t$s=MC3r0jp!1v2Nm*b(!MH-ewWtY>r`m3L-y&u-r*MrT;@DAh$gWd?@#;xL!ki^ZpE&9r`>+#yxwq~la z-ox&3IZPk&y=sLg(F#=pJg*P3psk!(VN*^Pi8U*=5q@VaK{QH9A3FsLjG#DFo%*di zwdBUDtHim>%W}XCZ-lsCZbSpsi9D30=9c8legynCbECs0MRM;JG6pDZ*mb((v+&_zR2&mmc?6 zbV{IqKE^fyLF?1kUOIY$s7&RQfoF%$208mXe0Uy`nWAy-Jg>|mdzJyEq^(=YAZwSM zfhJgjMvngoyb*g7V@v#PZF5r#AHSS)V+{SH;B`q;Rb-@N)EA}7PCY!vsNv&Mckqp_Ob zO6@n|Rjs*l8_rO)x8d*3`Sf&oy<;RNcn6eUedEM}m(}ocjY6~#Az0~k;V?Ele?pGB z9*QKCjmOw3jBlf*MbORz&XI@@Cr$nuCUo{uVE-vLA1TTH1dG*Olq?P&2 zPb*&eY>9wNJbg(GMMY056%~E}!WuoEv~pA~@ldt5v=n%1Wmh6Huey2|e@sX-=)GMp z(936|!9;*g!mhsWe(-C%`W^*qjyCycDO?{5Ojoy-eqsza@3MYGQ#-!5!^Q`GCMDVz zr%Z>jWqKkMG2wwgm&+ScKmqt%TBDUzt@n5{Z5mj;wlm2Jp+t?6eJ>>wPPUYJ`Or1v z8O!01$Vl))t5aX(L+(?PX^azB&_s6NxUQB~Or&mk)de(GOh&qgLex*^_S#@&t|3GC zdUms@MKTq61Fy-vc0M5>LKw~Vi-jDXmV$S|5d@b;i~=fm+|Ig zh8DaOMp54_j0OgD$^&AXi4lSeVD9mS-26yB8VZ<9=MGa*c`P;4Y9-7pL)J}!>K-+9 zGV2$g`2&W%*x*I;Q;v}t%j&6A@Qsy2=OdjLtc8HR`5Gai^?ckkKr$x~ zck#-7Xzl_#CI9)ri{zh@6Loq}tu7Hvk_sC#cnj?G>2&;T5*63_H{ozRDchA3G<7Io z&r<{~R8m&Ylv30Mn_k-5P&^MX1 zUi=~^R+ExRWJIo)fBn_Y0-xap221q}I?yaME4J~=f7{W(;Kj=^3ukB=Z%b8draIi@hM4k zM_Uh{Y!|6#DPo|b|M*~&b9-~0W+SHHdt9-A3128nA17#>;>}Qr?Ny7TmZ0-EyFyp> zMHUFSJ-`1{q^|1BLIb?%xKq#rZ_6meylHm3ZJ_y}%tTGicXN^ncPIrV#Z+5DtZVvi6j^zNBE~q%f&|3^e!wLtoP9r!X?-2^ob5$OCo{lm!DuET5EL#PB}$}7X$d@qt`Y#&B_2ijx)%uUmkroL-K*aXOloOpCEGaxynoJbi-fZZ*8{R`phF zLDN8Gos{h3;C1)~h#86$QH~K3XikNYLGND8(Y#f zc!Gw7!F~8}ezY{Dgb)1E2hZHxeZ10BIEytXN#K(Z|0)C%#9>c=m)lL9o%l&$bxUq*J45{15gVU^gk%?UXy$^-8ME_;1v-4mw(0JW zfH!Ux-k?u&(OI~KTd;Xrc6#BjXL@DVAbUW#IUj|I%S9;2^>OA@ z-pcP6jqwWC4!nA01ip{GI~e(`X`<8pYbNNGp#XcnDnqRAHBiNL*p-f}^acVUq|w<=j?_EKjR# z`)2VeK9L#5QgWA|DRaHkXeLrF=~p2@TD8z`9+DdzbW+o|Me#%pV<{t)FQckJp|*Eq zXK_^f;wYBEU!|~yQm=K=*s;q5BV%#@RDEXBl`OT2KQ!PlL52#PN-C;`$Q zX?pr^E(iDCjtLa(sd5$H5YyLbi8UiJwR%<{%W=&VSc6h8h;w6gvGXTGR+KZQoj}IV zzY}>5(VTy;dRweI1e2;YFRKV&u$}-8dR*R}9Qsji9ftQfqsmMS#XVzs@jh|D>M>>i z^brh?tEx`XMw?yQD;7wiA#sPV9Vbg!mVWapB8l2|m{v0OdJ4ZNPbm*ss*L@O&)1m% zgdDL)+NAJ$1)X|Ka3Pgk?+--($2rJZG;T!6K!`zEP*3V=WBR|0WK&rc1H7EA{WflX>L2nisnz#_U2CZbxT0n)Tclp5nVF5~HYFN` zG-y72Qx-@iouQ*Io4B>WheeMc zh3SJ5`Gc`yQyXSqfv;79h99CFDa**dNv5IU93oFA^+g^5v1^&<8Zw4;_klp;1Fm}b z6Es{+6DFeuA+{^j{NB(st)eBb1jjr z=E{9;8lXpN|Bj619a%Vrh}x2?!fg{7%BeuMbjP<)GYO%MbjPh(ak2=WL)f{80#|+K zEk2)RJ)xz<@6~w9C#T#UvUx{*b%5br0Tm7uI~E{kC|^c9b{vu1!={PNBz^ zllFFs?YWL}ox>6We4VpdNT>?B4{vbr@$ofECi{nn!;^6j$8C9SiOJF7eQnWaAjFXE zgEFZ6240FZd7iTf0xnKa>9WagTTWPS?9&8AM%$&_Cqx*?7$>Lr#goznTHh?HyDX|{ z70Z6?LmM@<-oylVNy_$p|9mu@m2R`DnDn-@Q$j_aK@iX?A<`ThD{e6SR>fLp$VL_} zB_)MG&%mJRRKKz@lu-qBjC>y#uFo3&4RSe&?%F(0mG?zgrd*dnV3Qx?kceJT5Xou9 zVxbN`@I*^}tD}#Qm8*|xjw&;u^I{WD>N?)jra(?v~Uf5{#3P3KWO;0q{E7tPz@+ zoctu!oR%aSk8pxQEe-Sf`WmKBLQsOFsW}FJl~T-`;j+J@1J8&br^@lE@iiy-lgA== zrz^ui26awQ5{v=@xUqrx?8(tljhQ{qeh@d3eLZ{?_xTHU6e+wa!^0ba-}WBmc#3~xiY}%GXGH_sqt{Wo=6fghtHsL+GfXH zc%+WE-K4WX&9Km4%$XE?zsO%J&g{i09v90n0Qx)J!Rpxz8{7*d^mpNW15x2M>vCl7asiL5)()? zBGP{Pwl994z&l_9`hf&27#l9dCu%3<@!fOg4ioR+`%a=qKTp=9z{6QDk-9Q~FMG4K z&uY~^-2`ncSEkO22iTe2N>TNs$LP9`v6k-hu2|gR6K;tM5NRS=Zy)q<(8To?Q;(5J zRIycTq-$8zEH7t|B}C5a+$jCf7jpuphRLu}e)|cME8&qrTVtJOU*UQtE2nQRY?wBt zc40!bfEQ4&17A!@$(xO#D4_6(;wCCx2+a&506q@O`aHc$cpXpc*t1NXY4~e%;@Qsm zjR`=2z`8zBc+8s&sGL2Qh^>4A!3?7njDn~qVVUQB6Ei1V&X(*x)DNUbI-)^9_YWFh z&gOIxy|-#YegZ$)SyR3EI0HWBeFpbmZVtM%m^97Rosnpu4ch(&@>ljsiZ9zz4&|t( z%qRC}tfq~R=>DBa0MZenep*`gvg0-c(}OZdT^~ubPbj$PHdUb=0Xw$O=A|BU;OY5v zR5$)WAx)s-+O_d6lLBH}c6S4YCb7SO02hlmeHV0};$!JvQ=%!td&bcWuck;Pf|fcSvoK^h3-I#0>8EYSrF7|VBJ$#LzP6OhxuER6&<6XMv}%7b*dcmrOv`HK z&*@3+J-hC&v$YWtr+c+MLXB?pu;XXhcpHh+$99~-Y~0$$Rm~fsro&H;;fR$fM zL#kNVlPm|@ns~ADPrPk`W@#Lt8rldR;n&mdS`O5VNB82BMST28!d#|c7#hL+3rJY5 zKEb%&;clwX_z3Z;AA0LIj)MvWju&>78{-~%_{gvx*oXJN?Vo-|zN7jkoB`24z*#pI~B=| z;LtUFa0-5Kq^>#qm^eyDR=pf}C02%ZGlp_Cb6X6M(umN&4$Mrx zT50?l^k2xS`jNKD5y*9xgC&tg7{I$dA=#?_VTbN>U_R!8s7b|pM(OTtsY3+1XIStyOwTXS??d_YZnC%G1dPh)O2;P})yZ5M zJ(;_w)=4PP3VmP}`#5RZ9X%Uys~YALS35e4<=t2yRt;Lok1za{F2wT=cXn{G-pyv<#$z{0 zBZw5KE8;QYRPU9O8};G!_tAqy(;+Bi1(xXW<2h?Rtz8E-d-#t6X+qbeGT0aL5887_ znH89OI22`;6fNo@eQAo(z#WUa|gWb-U7t$uaIY{*_`~sgaxC<+5x`Dm+-_@>mh865<~?w zE<98DVnx$Jj(PdkuykS@xCCsDE|Q}fZEBWD>?750C>ob`R|UdZ zYIv03m)Ektmx=8i7}e9OMdRPfnPUbwUO6?>DsKDxE<8MOZq=wFPKIrm%CxD3K-GR7 zZ8W5}@oumB^MiNWrEIjz*Smt3L4ZZ#xxLnZ)6w zjF8d8INs4ysCFGew$S@sK)~%PcSWQ*%%jNjq3K)I_I-#S z*=NW-PMk|l{V;PlqBzo+XBgWwbADdFF4o&hwvkxQMMs2@5PVA|a2&_#pn*RUC$5E& zW1oz0V;`~PBcxAUAM$<+Gl*!M^*7o*?^N^6GpQVLe47^Psai5I-Lm?o=UF@#(T$Fm zXoL3${9awj_Qx3D3bww{eegL^Piqncx@jIltt9ez@wKY^z-sjOER_<#U5!T3Oh!e| z>kYEHD+}{g2zdHAHT`k;svrJ2T@dmmBLq<}F05ocx8=3-zUzTu6nj~*MP$i1zV+8C zIm6N{*VJ`MO~$&1lW`#StDp))=UAuPRpHcf;AVIIfTI$R@%^7K;HZL>VLPF#f}An8 z#28qETCn+pfW$}(S)%RNzpUWj**$VUXoWaPVH%DKKH%!bEWySJ#>W4A_^l+TCR-tG H7W%&cQBEuT literal 0 HcmV?d00001 diff --git a/egovframe-template-simple-react-contribution/public/assets/images/copy3.png b/egovframe-template-simple-react-contribution/public/assets/images/copy3.png new file mode 100644 index 0000000000000000000000000000000000000000..27bd17893e175841b6f0389481d5c2d338c1778e GIT binary patch literal 4683 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 XT=NFgU$-{>`n`iUvo&or_D=jCJhw>j literal 0 HcmV?d00001 diff --git a/egovframe-template-simple-react-contribution/public/assets/images/f-logo.png b/egovframe-template-simple-react-contribution/public/assets/images/f-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..37742e63451ed14d966ebe3516747ca92c2f66b9 GIT binary patch literal 6963 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 literal 0 HcmV?d00001 diff --git a/egovframe-template-simple-react-contribution/public/assets/images/logo.png b/egovframe-template-simple-react-contribution/public/assets/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5821b04ea3cbee70a5b9db5e383e9e64b1672fc7 GIT binary patch literal 14371 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 diff --git a/egovframe-template-simple-react-contribution/public/assets/images/logo_footer_w.png b/egovframe-template-simple-react-contribution/public/assets/images/logo_footer_w.png deleted file mode 100644 index f153be32a8c4518ff570a2482bf051ea541ffb17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5809 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 diff --git a/egovframe-template-simple-react-contribution/public/assets/images/logo_m.png b/egovframe-template-simple-react-contribution/public/assets/images/logo_m.png index 6af6761c1e8766c282da6f1bae50100f8a306ff5..a16dd4c4471b38769ebce741aee5d821061b9844 100644 GIT binary patch delta 1591 zcmcIje>Bqz6yN+TuOZZXByA<>W%_Q0ZM}Mo&09sD6?xS`W2_Zvm{PWtqF#)I{3sNX z48>vjowQKo_mBBaB)_&a4BL7;@4Y|Yd#8WiJ@s&0CMm-AO9et{r>Ht z=gymZQ@ycX)<}xaX$u4#MW%ScQAiXLej1ITz>$C#;A25XTUuFJZHFq@3Y~xIN1{-8 zJ2VOhV9*2v0*^;ya0HC4J%G0$SfZ^lU_!j9k|FeOmhHc=2=S}n9hyj#xh2%pjq2|m zz@YDr&rkx4zh%34k&@xJ5zUlw%&>)&#~=`x<$U-kezY?D)a{Do($4W3c2kso<8|Hp zFS_>8x!q&)^wfH}T$)hQvGG`{P*D1?s#nc1Nw&7U@_9m&lrma=shMN4Fj}v4Fkz-G z8+rDLYvhZL)cyShUcHZx8k|fgUMW7C_|ooTQ5v_27FA+$B2B!s($+V5g_%%!{1TT} z-}`BHVQ_r*b;~f0mOa7?+2xb9CY42JzN&mbE?p6?e)-rEXFA_oJoPqZwln|zU31Z3 zwfJM((oD~2MVR2}$<_o!SZ2f0Oz+y#{BRk4c~-EpChg90Bt?{o#4D3;;u@}Lb!9j- z$Lx^I5BGCD+LJMDNtT`WnYOo{wovZWL>IizsTDLue*a0hG*IL-x3KKUDq&|gNtZ?2 zJTm)o-8hA<%&f-HbiP#bdEzyvkUw}m_uYqCu|zZ`9H?j?p0!~VmNbq?grlaEY%{+c z+3MoT!sPlR_oOnpOfDaPc?0U1X-t09mv`c2$Hby!?efEh&XGB0Dz6JfyxVY1^Xs3+ z7`F>nTskYr#fkJ+<^M(If5?N-s)u|*Af*VRz3tIZL486bT>$9un}398LpuZ4HS1XM zXYUhTiy1hFa<}qjBinHg&UN+8_X=iC4Fx93s)fE;j62&L=z*N4 z(f6|)g0*l-ST+{Ne6YH8pJ!Bn`vtRD8blhqb%aWty0xj*DE9G|k?CrE>obv>exnay z)z~*6L)?xD_aUPZU*bg-Sc?+R?||#Y5Knc(N|S^issfW)he$b$q_PV3oX_)p+`;k< zo-Q7HYxEunRVH6~6Vvm2+tb=dVx00Nicw$UHVxKT__>RjHir+nsy9q-zM>Bkdz4un zdy+?d2F}SJCBv&cOh`ZdHnl6OlqK1X8=9ll1@@ZFgn36-#WaT`|GGzS%GV{AFQMg2 z(v;Hs24KpD&&S9b17y0t8n5NnuxV{^c*w>ue*#zDpB$2SY3An?U4}An$74C5gk30V z?%EPEk9)%0$R?;W~jCYNb5*dOIMEsXJy@;j<&m3kA~Z&6-gZ2 z`fI0)G;^&WEStLH6qfGH&9&ZE(9Y;$gN$ws-~8HFF-ImIma4U`wuJ?|>JxP!UqgF( z)~apTW=^}P@Dr-4`j7HqHI7Uk)L0jvYdj?;LD@U;?@WM}+;Abj|HjyczJQyTMYbeP z;$j_*%u)NUW-74IMCGY_XhrC1MUJH8Q&dd2v)1A8eBp;l3~I>&tOlYbBqR8F0%ygC OfQWb}`vRQj)jt3!dNQB@ delta 6666 zcmZ{pWl$SHl*fTm2%g|jD8T|0OR%6pixntPTubrdrMLul3DN?^ibJvD#a$ZQi?mQI z#oZ}fZ|-jH%iWiqoj32d|D89xJ8$3n3%r0cM{8;*kr2`oVqsyCs3FdvlH5-I`(i@^9`f*s6Uws9UefUUuiEySS<s;)cIE2AoYdm_tjo@+HBpPU;cSYU~%_mr33h@A0<)h<@hU0IB-?+jq_>O{P3Ae zveJ;o}gO{mfRAz9%2?`aL#~)Nscu3a}yvJVhym+%VyKk+F`FJ~Is?4~&w< zk)3K(-En1Kcq7xHfh)y4NIGr7DG@S0i90aN9XEacZ7-HSt2%q)qtxn| z!wwEt;zS04SeBm+9b&8gc+7<@(KX3ZtKd3aFl(~|H%Sv9fKcO=iN~R|qyk7xJJBp> zDj{f^oqTd;Vk=EN`UrV-9+d`W*&6}bot231EaBnE0ZfYo)oSR*eJbqchkteD&9_&m zh@hY@N;&3&MX*y(chr*t(>E>KFs72=#Ij^E-pp-_vAJ-Ed=Tx5K%ZjVFOEv zj<#M5*+t8SLT499^6@~c{&G4ChH`i$o?&umK0yH5P7py_cp_fJWdI_~Dt9ZL6-FUy zs1Ex4Ka^Hg%@L^B5K~YErT0M&8t?^mKcbCgWL^iqvW$U$e?#B z`Gw𝔙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 KC{)S44*3t-M2@on diff --git a/egovframe-template-simple-react-contribution/public/assets/images/logo_w.png b/egovframe-template-simple-react-contribution/public/assets/images/logo_w.png deleted file mode 100644 index 12e87f61b78b624989c5fde796df8ccfa964c7f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13784 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 +
+
+
건설기준코드
건설기준위원회
정보제공
센터소개
+
건설기준코드 안내 | 건설기준코드 검색 | (구)건설기준 검색
+ 진행현황 | 위원회 일정
+ 공지사항 | Q&A | 수요조사 | 주요행사 | 건설교육안내 | 기술자료 | 보도자료 | 관련사이트 | API서비스 | 영문기준 제공 | 건설기준용어 | 건설기준 연구
+ 인사말 | 연혁 | 홍보자료 | 주요업무 | 찾아오시는길 +
+
+

- - 국가건설 기준센터 - {/* - */} - +

- 대표문의메일 : kcsc@kict.re.kr |
대표전화 : 0000-0000 (000-0000-0000)
- 호환성확인 : 000-0000-0000 | 교육문의 : 0000-0000-0000 + 상호명 : 한국건설기술연구원 | 대표자 : 김병석 | 대표메일 : kcsc@kict.re.kr
+ 사업자등록번호 : 229-82-01135 | 주소 : 경기도 고양시 일산서구 고양대로 283(대화동)

-

Copyright © 2021 Ministry Of The Interior And Safety. All Rights Reserved.

+

Copyright © 2011 KOREA INSTITUTE of CIVIL ENGINEERING and BUILDING TECHNOLOGY. All Rights Reserved.

- - - - - - - - + {/**/} + {/* */} + {/* */} + {/**/} + {/**/} + {/* */} + {/* */} + {/**/}
diff --git a/egovframe-template-simple-react-contribution/src/components/EgovHeader.jsx b/egovframe-template-simple-react-contribution/src/components/EgovHeader.jsx index 2b4ff7a..ef899bb 100644 --- a/egovframe-template-simple-react-contribution/src/components/EgovHeader.jsx +++ b/egovframe-template-simple-react-contribution/src/components/EgovHeader.jsx @@ -71,21 +71,34 @@ function EgovHeader({ loginUser, onChangeLogin }) {

- 국가건설기준센터{/*국가건설기준센터*/} - 국가건설기준센터{/*국가건설기준센터*/} + +
국가건설기준센터
국가건설기준센터 + 국가건설기준센터{/*국가건설기준센터*/}

주메뉴

    -
  • (isActive ? "cur" : "")}>건설기준코드
  • - {/*
  • (isActive ? "cur" : "")}>사이트소개
  • */} -
  • (isActive ? "cur" : "")}>정보마당
  • -
  • (isActive ? "cur" : "")}>고객지원
  • -
  • (isActive ? "cur" : "")}>알림마당
  • - {sessionUserSe ==='ACC_TP01' && -
  • (isActive ? "cur" : "")}>사이트관리
  • - } +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + {/*
  • (isActive ? "cur" : "")}>건설기준코드
  • */} + {/*/!*
  • (isActive ? "cur" : "")}>사이트소개
  • *!/*/} + {/*
  • (isActive ? "cur" : "")}>정보마당
  • */} + {/*
  • (isActive ? "cur" : "")}>고객지원
  • */} + {/*
  • (isActive ? "cur" : "")}>알림마당
  • */} + {/*{sessionUserSe ==='ACC_TP01' &&*/} + {/*
  • (isActive ? "cur" : "")}>사이트관리
  • */} + {/*}*/}
diff --git a/egovframe-template-simple-react-contribution/src/css/layout.css b/egovframe-template-simple-react-contribution/src/css/layout.css index f4781f8..e669895 100644 --- a/egovframe-template-simple-react-contribution/src/css/layout.css +++ b/egovframe-template-simple-react-contribution/src/css/layout.css @@ -5,16 +5,17 @@ body {min-width: 1400px;} .header {position: relative;} .header::after {content: ""; display: block; position: absolute; left: 0; bottom: 0; width: 100%; height: 1px; background: #dedede;} .header > .inner {position: relative; width: 1400px; height: 150px; margin: 0 auto; padding: 0 50px;} -.header h1 {display: inline-block; margin-top: 62px;} +.header h1 {display: inline-block; margin-top: 32px;} .header h1 a, .header h1 img {display: block;} .header .logo .m {display: none;} -.header .user_info {position: absolute; right: 50px; top: 20px; line-height: 30px;} +.header .logo .logotop {display: flex; width: 220px; justify-content: flex-end;} +.header .user_info {position: absolute; right: 50px; top: 10px; line-height: 30px;} .header .user_info .person {display: inline-block; color: #169bd5; font-weight: 500;} .header .user_info .person::before {content: ""; display: inline-block; width: 22px; height: 22px; margin-right: 7px; background: url(css/images/ico_person.png) no-repeat; background-size: contain; vertical-align: -4px;} .header .user_info .btn {margin-left: 14px; padding: 0 20px; border-radius: 15px; color: #fff; font-size: 14px; line-height: 30px; background: #169bd5;} -.header .gnb {position: absolute; left: 430px; top: 78px; width: 920px;} +.header .gnb {position: absolute; left: 430px; top: 50px; width: 920px;} .header .gnb ul {font-size: 0; text-align: center;} .header .gnb ul::after {content: ""; display: block; clear: both;} .header .gnb ul li {float: left;} @@ -22,11 +23,13 @@ body {min-width: 1400px;} .header .gnb ul li a {color: #666; font-size: 20px; font-weight: 700; letter-spacing: -0.25px;} .header .gnb ul li a.cur {color: #222;} -.header .right_a {position: absolute; right: 50px; top: 75px;} +.header .right_a {position: absolute; right: 50px; top: 65px;} .header .right_a .btn {width: 30px; height: 30px; font-size: 0; background: url(css/images/ico_allmenu.png) no-repeat right; background-size: 22px 18px;} .header .right_a .btn.active {background: url(css/images/ico_allmenu_close.png) no-repeat right; background-size: 22px 18px;} .header .right_a .btn.mobile {display: none;} +.header .topsearch {width: 25px; height: 27px; background: url(css/images/ico_search_b.png) no-repeat; margin: 5px;} + /* All menu */ .all_menu {transition: transform .2s ease-in-out, opacity .2s ease-in-out; transform-origin: top; z-index: 10;} .all_menu.Mobile {display: none;} @@ -75,14 +78,18 @@ body {min-width: 1400px;} .location ul li a.home::before {content: ""; display: block; position: absolute; left: 0; top: 3px; width: 14px; height: 13px; background: url(css/images/ico_home.png) no-repeat;} -.footer {position: relative; height: 180px;} +.footer {position: relative; background-color: #2c394b; } +.footer .upper {width: 100%; background-color: #384556; font-size: 12px;} +.footer .upper .up {width: 1400px; margin: 0 auto; padding: 10px 50px; } +.footer .upper .up .left {text-align: right; color: #B4B5B7; font-weight: 700;} +.footer .upper .up .right {color: #96A1AE; } .footer::before {content: ""; display: block; position: absolute; left: 0; top: 0; width: 100%; height: 1px; background: #ccc;} .footer .inner {position: relative; width: 1400px; margin: 0 auto; padding: 0 50px;} .footer .inner::after {content: ""; display: block; clear: both;} -.footer h1 {float: left; width: 220px; padding-top: 50px;} +.footer h1 {float: left; width: 220px; padding-top: 20px;} .footer h1 .m {display: none;} -.footer .info {float: left; padding-top: 44px; color: #888; font-size: 16px; line-height: 26px;} -.footer .info .copy {margin-top: 12px;} +.footer .info {float: left; padding: 14px 10px; color: #888; font-size: 13px; } +.footer .info .copy {padding-top: 5px;} .footer .info .m_show {display: none;} .footer .right_col {position: absolute; right: 0; top: 73px; font-size: 0;} .footer .right_col a {display: inline-block; margin-right: 60px; vertical-align: top;} From d97a49340c8c31f1eef9d6fa98f1223f67fde47d Mon Sep 17 00:00:00 2001 From: thkim Date: Thu, 7 Mar 2024 15:17:44 +0900 Subject: [PATCH 2/5] =?UTF-8?q?feat:=20=EA=B4=80=EB=A6=AC=EC=9E=90=20-=20?= =?UTF-8?q?=EC=9C=84=EC=9B=90=ED=9A=8C=EA=B4=80=EB=A6=AC=20-=20=EC=A7=84?= =?UTF-8?q?=ED=96=89=ED=98=84=ED=99=A9=20=EA=B4=80=EB=A6=AC=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EB=AA=A9=EB=A1=9D=20=EA=B5=AC=ED=98=84=20=EA=B1=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/admin/committee/ProgressStatus.jsx | 136 +++- .../committee/AdminCommitteeController.java | 606 ++++++++++++++++++ .../admin/committee/entity/TnCmtDraft.java | 39 ++ .../committee/entity/TnCmtDraftAttend.java | 93 +++ .../committee/entity/TnCmtDraftDetail.java | 46 ++ .../AdminCommitteeProgressStatusService.java | 23 + ...minCommitteeProgressStatusServiceImpl.java | 209 ++++++ .../TnCmtDraftAttendRepository.java | 100 +++ .../TnCmtDraftDetailRepository.java | 100 +++ .../repository/TnCmtDraftRepository.java | 102 +++ 10 files changed, 1443 insertions(+), 11 deletions(-) create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/AdminCommitteeController.java create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/entity/TnCmtDraft.java create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/entity/TnCmtDraftAttend.java create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/entity/TnCmtDraftDetail.java create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/service/AdminCommitteeProgressStatusService.java create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/service/impl/AdminCommitteeProgressStatusServiceImpl.java create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnCmtDraftAttendRepository.java create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnCmtDraftDetailRepository.java create mode 100644 kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnCmtDraftRepository.java diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/committee/ProgressStatus.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/committee/ProgressStatus.jsx index 40ad06d..94ff4e8 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/committee/ProgressStatus.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/committee/ProgressStatus.jsx @@ -8,6 +8,102 @@ import URL from 'constants/url'; import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin'; import EgovPagingPaginationInfo from 'components/EgovPagingPaginationInfo'; +import styled from "styled-components"; + +const StyledDiv = styled.div` +.BRD008 { + .head { + span { + text-align: left; + &:nth-child(1) { + width: 32px; + text-align: center; + } + &:nth-child(2) { + width: 60px; + text-align: center; + } + &:nth-child(3) { + width: 300px; + } + &:nth-child(4) { + width: 120px; + } + &:nth-child(5) { + width: 80px; + } + &:nth-child(6) { + width: 70px; + } + &:nth-child(7) { + width: 50px; + text-align: center; + } + &:nth-child(8) { + width: 50px; + text-align: center; + } + } + } + .result .list_item { + & > div { + text-align: left; + &:nth-child(1) { + width: 32px; + text-align: center; + } + &:nth-child(2) { + width: 60px; + text-align: center; + } + &:nth-child(3) { + width: 300px; + } + &:nth-child(4) { + width: 120px; + } + &:nth-child(5) { + width: 80px; + } + &:nth-child(6) { + width: 70px; + } + &:nth-child(7) { + width: 50px; + text-align: center; + } + &:nth-child(8) { + width: 50px; + text-align: center; + } + } + } +} + +.board-bot { + margin-top: 20px; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-start; + align-items: stretch; + justify-content: center; + + & > *:nth-child(1) { + width: 16%; + justify-content: left; + } + & > *:nth-child(2) { + width: 68%; + justify-content: center; + } + & > *:nth-child(3) { + width: 16%; + justify-content: right; + } +} +`; + function ProgressStatus(props) { const location = useLocation(); @@ -16,6 +112,11 @@ function ProgressStatus(props) { const [paginationInfo, setPaginationInfo] = useState({}); const [searchCondition, setSearchCondition] = useState(location.state?.searchCondition || { pageIndex: 1, searchCnd: '0', searchWrd: '' }); + useEffect(function () { + getList(searchCondition); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + const requestOptions = { method: "GET", headers: { @@ -25,11 +126,11 @@ function ProgressStatus(props) { const getList = (searchCondition) => { - EgovNet.requestFetch(`/contents/api/popup-manage/list?page=${searchCondition.pageIndex-1}&size=10&sort=popupSeq,desc`, + EgovNet.requestFetch(`/admin/committee/progress-status/list?page=${searchCondition.pageIndex-1}&size=10&sort=popupSeq,desc`, requestOptions, function (resp) { console.log('%o', resp); - setListItem(resp.result.listPopup); + setListItem(resp.result.list); setPaginationInfo({...resp.result.paginationInfo}); } ); @@ -63,17 +164,22 @@ function ProgressStatus(props) {
{/* */} -
-

진행현황 관리

-
+ +
+

진행현황 관리

+
- {/* */} -
+ {/* */} +
- 번호 - 제목 - 기간 - 사용여부 + # + 구분 + 제목 / 코드명 + 진행위원회 + 진행단계 + 등록일 + 수정 + 삭제
{/* */} @@ -83,6 +189,13 @@ function ProgressStatus(props) { {listItem.map((it)=>(
{it.number}
+
{it.drftTypeNm}
+
{it.categoryNm}
{it.title}
+
{it.orgNm}
+
진행단계표시
+
{it.regDate}
+
+
))}
@@ -105,6 +218,7 @@ function ProgressStatus(props) {
{/* */} + {/* */}
diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/AdminCommitteeController.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/AdminCommitteeController.java new file mode 100644 index 0000000..92412e5 --- /dev/null +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/AdminCommitteeController.java @@ -0,0 +1,606 @@ +package com.dbnt.kcscbackend.admin.config; + +import com.dbnt.kcscbackend.admin.config.entity.TcMenu; +import com.dbnt.kcscbackend.admin.config.entity.TnPartnerSite; +import com.dbnt.kcscbackend.admin.config.model.CreateCommitteeCodeManagementVO; +import com.dbnt.kcscbackend.admin.config.model.SetCommitteeCodeManagementVO; +import com.dbnt.kcscbackend.admin.config.service.AdminCommitteeCodeManagementService; +import com.dbnt.kcscbackend.commonCode.entity.TcCodeGrp; +import com.dbnt.kcscbackend.commonCode.entity.TcCodeItem; +import com.dbnt.kcscbackend.admin.config.service.AdminConfigService; +import com.dbnt.kcscbackend.auth.entity.LoginVO; +import com.dbnt.kcscbackend.commonCode.service.CommonCodeService; +import com.dbnt.kcscbackend.config.common.BaseController; +import com.dbnt.kcscbackend.config.common.ResponseCode; +import com.dbnt.kcscbackend.config.common.ResultVO; +import io.swagger.annotations.ApiParam; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.validation.Errors; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/admin/config") +@Tag(name="AdminConfigController", description = "사이트관리 환결설정 메뉴 컨트롤러") +public class AdminConfigController extends BaseController { + + private final AdminConfigService adminConfigService; + private final CommonCodeService commonCodeService; + + @Resource(name = "adminCommitteeCodeManagementService") + private AdminCommitteeCodeManagementService adminCommitteeCodeManagementService; + + @Operation( + summary = "기본코드 그룹 조회", + description = "기본코드 그룹 조회", + tags = {"AdminConfigController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "조회 성공"), + @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") + }) + @RequestMapping(method = RequestMethod.GET, value = "/code-grp") + public ResultVO getCodeGrp() throws Exception{ + ResultVO resultVO = new ResultVO(); + Map resultMap = new HashMap<>(); + resultMap.put("codeGrpList", adminConfigService.selectCodeGrpList()); + resultVO.setResult(resultMap); + return resultVO; + } + + @Operation( + summary = "기본코드 그룹 저장", + description = "기본코드 그룹 저장", + tags = {"AdminConfigController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "저장 성공"), + @ApiResponse(responseCode = "303", description = "만료된 토큰"), + @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") + }) + @RequestMapping(method = RequestMethod.POST, value = "/code-grp", consumes = MediaType.APPLICATION_JSON_VALUE) + public ResultVO addCodeGrp(@RequestBody TcCodeGrp codeGrp, @AuthenticationPrincipal LoginVO user) throws Exception{ + ResultVO resultVO = new ResultVO(); + if(user == null){ + resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode()); + }else{ + if(!user.getUserSe().equals("ACC_TP01")){ + resultVO.setResultCode(ResponseCode.AUTH_ERROR.getCode()); + resultVO.setResultMessage(ResponseCode.AUTH_ERROR.getMessage()); + }else if(codeGrp.getGrpCd().isEmpty()){ + resultVO.setResultCode(ResponseCode.INPUT_CHECK_ERROR.getCode()); + resultVO.setResultMessage(ResponseCode.INPUT_CHECK_ERROR.getMessage()); + }else{ + codeGrp.setFrstCrtDt(LocalDateTime.now()); + codeGrp.setFrstCrtId(user.getId()); + codeGrp.setUseYn("Y"); + String result = adminConfigService.addCodeGrp(codeGrp); + if(result.equals("isSaved")){ + resultVO.setResultCode(ResponseCode.SAVE_ERROR.getCode()); + resultVO.setResultMessage("중복되는 코드그룹이 있습니다."); + }else{ + resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); + } + } + } + return resultVO; + } + + @Operation( + summary = "기본코드 그룹 수정", + description = "기본코드 그룹 수정", + tags = {"AdminConfigController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "수정 성공"), + @ApiResponse(responseCode = "303", description = "만료된 토큰"), + @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") + }) + @RequestMapping(method = RequestMethod.PUT, value = "/code-grp", consumes = MediaType.APPLICATION_JSON_VALUE) + public ResultVO modifyCodeGrp(@RequestBody TcCodeGrp codeGrp, @AuthenticationPrincipal LoginVO user) throws Exception{ + ResultVO resultVO = new ResultVO(); + if(user == null){ + resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode()); + }else{ + if(!user.getUserSe().equals("ACC_TP01")){ + resultVO.setResultCode(ResponseCode.AUTH_ERROR.getCode()); + resultVO.setResultMessage(ResponseCode.AUTH_ERROR.getMessage()); + }else if(codeGrp.getGrpCd().isEmpty()){ + resultVO.setResultCode(ResponseCode.INPUT_CHECK_ERROR.getCode()); + resultVO.setResultMessage(ResponseCode.INPUT_CHECK_ERROR.getMessage()); + }else{ + codeGrp.setLastChgDt(LocalDateTime.now()); + codeGrp.setLastChgId(user.getId()); + String result = adminConfigService.modifyCodeGrp(codeGrp); + if(result.equals("modified")){ + resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); + }else{ + resultVO.setResultCode(ResponseCode.SAVE_ERROR.getCode()); + } + } + } + return resultVO; + } + + @Operation( + summary = "기본코드 아이템 조회", + description = "기본코드 아이템 조회", + tags = {"AdminConfigController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "조회 성공"), + @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") + }) + @RequestMapping(method = RequestMethod.GET, value = "/code-item") + public ResultVO getCodeItem(String grpCd) throws Exception{ + ResultVO resultVO = new ResultVO(); + Map resultMap = new HashMap<>(); + resultMap.put("codeItemList", adminConfigService.selectCodeItemList(grpCd)); + resultVO.setResult(resultMap); + return resultVO; + } + + @Operation( + summary = "기본코드 아이템 저장", + description = "기본코드 아이템 저장", + tags = {"AdminConfigController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "저장 성공"), + @ApiResponse(responseCode = "303", description = "만료된 토큰"), + @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") + }) + @RequestMapping(method = RequestMethod.POST, value = "/code-item", consumes = MediaType.APPLICATION_JSON_VALUE) + public ResultVO addCodeItem(@RequestBody TcCodeItem codeItem, @AuthenticationPrincipal LoginVO user) throws Exception{ + ResultVO resultVO = new ResultVO(); + if(user == null){ + resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode()); + }else{ + if(!user.getUserSe().equals("ACC_TP01")){ + resultVO.setResultCode(ResponseCode.AUTH_ERROR.getCode()); + resultVO.setResultMessage(ResponseCode.AUTH_ERROR.getMessage()); + }else if(codeItem.getGrpCd()==null || codeItem.getGrpCd().isEmpty()){ + resultVO.setResultCode(ResponseCode.INPUT_CHECK_ERROR.getCode()); + resultVO.setResultMessage(ResponseCode.INPUT_CHECK_ERROR.getMessage()); + }else{ + codeItem.setFrstCrtDt(LocalDateTime.now()); + codeItem.setFrstCrtId(user.getId()); + codeItem.setUseYn("Y"); + String result = adminConfigService.addCodeItem(codeItem); + if(result.equals("isSaved")){ + resultVO.setResultCode(ResponseCode.SAVE_ERROR.getCode()); + resultVO.setResultMessage("중복되는 코드가 있습니다."); + }else{ + resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); + } + } + } + return resultVO; + } + + @Operation( + summary = "기본코드 아이템 수정", + description = "기본코드 아이템 수정", + tags = {"AdminConfigController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "수정 성공"), + @ApiResponse(responseCode = "303", description = "만료된 토큰"), + @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") + }) + @RequestMapping(method = RequestMethod.PUT, value = "/code-item", consumes = MediaType.APPLICATION_JSON_VALUE) + public ResultVO modifyCodeItem(@RequestBody TcCodeItem codeItem, @AuthenticationPrincipal LoginVO user) throws Exception{ + ResultVO resultVO = new ResultVO(); + if(user == null){ + resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode()); + }else{ + if(!user.getUserSe().equals("ACC_TP01")){ + resultVO.setResultCode(ResponseCode.AUTH_ERROR.getCode()); + resultVO.setResultMessage(ResponseCode.AUTH_ERROR.getMessage()); + }else if(codeItem.getGrpCd().isEmpty()){ + resultVO.setResultCode(ResponseCode.INPUT_CHECK_ERROR.getCode()); + resultVO.setResultMessage(ResponseCode.INPUT_CHECK_ERROR.getMessage()); + }else{ + codeItem.setLastChgDt(LocalDateTime.now()); + codeItem.setLastChgId(user.getId()); + String result = adminConfigService.modifyCodeItem(codeItem); + if(result.equals("modified")){ + resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); + }else{ + resultVO.setResultCode(ResponseCode.SAVE_ERROR.getCode()); + } + } + } + return resultVO; + } + + @Operation( + summary = "메뉴 조회", + description = "메뉴 조회", + tags = {"AdminConfigController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "조회 성공"), + @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") + }) + @RequestMapping(method = RequestMethod.GET, value = "/menu-mgt") + public ResultVO getMenuMgt(){ + ResultVO resultVO = new ResultVO(); + Map resultMap = new HashMap<>(); + resultMap.put("menuList", adminConfigService.selectMenuList()); + resultVO.setResult(resultMap); + return resultVO; + } + + @Operation( + summary = "메뉴 저장", + description = "메뉴 저장", + tags = {"AdminConfigController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "저장 성공"), + @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") + }) + @RequestMapping(method = RequestMethod.PUT, value = "/menu-mgt") + public ResultVO saveMenuMgt(@RequestBody @Valid TcMenu menu, Errors errors, @AuthenticationPrincipal LoginVO user){ + ResultVO resultVO = new ResultVO(); + if(user == null){ + resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode()); + }else { + menu.setRoleGrpId(menu.getMenuTypeCd().equals("MNU_0000")?"ADMIN_USER":"ALL_USER"); + if(errors.hasErrors()){ + StringBuilder msg = new StringBuilder(); + for(FieldError error: errors.getFieldErrors()){ + msg.append(error.getDefaultMessage()); + msg.append("\n"); + } + resultVO.setResultCode(ResponseCode.INPUT_CHECK_ERROR.getCode()); + resultVO.setResultMessage(msg.toString()); + }else if (!user.getUserSe().equals("ACC_TP01")) { + resultVO.setResultCode(ResponseCode.AUTH_ERROR.getCode()); + resultVO.setResultMessage(ResponseCode.AUTH_ERROR.getMessage()); + } else { + adminConfigService.saveMenu(menu, user.getId()); + resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); + } + } + return resultVO; + } + + @Operation( + summary = "메뉴 삭제", + description = "메뉴 삭제", + tags = {"AdminConfigController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "삭제 성공"), + @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") + }) + @RequestMapping(method = RequestMethod.DELETE, value = "/menu-mgt") + public ResultVO removeMenuMgt(@RequestBody TcMenu menu, @AuthenticationPrincipal LoginVO user){ + ResultVO resultVO = new ResultVO(); + if(user == null){ + resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode()); + }else { + if (!user.getUserSe().equals("ACC_TP01")) { + resultVO.setResultCode(ResponseCode.AUTH_ERROR.getCode()); + resultVO.setResultMessage(ResponseCode.AUTH_ERROR.getMessage()); + } else { + String result = adminConfigService.deleteMenu(menu.getMenuId(), user.getId()); + if(result==null){ + resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); + }else if(result.equals("notFind")){ + resultVO.setResultCode(ResponseCode.SAVE_ERROR.getCode()); + resultVO.setResultMessage("대상이 존재하지 않습니다."); + } + } + } + return resultVO; + } + + @Operation( + summary = "메뉴 권한 조회", + description = "메뉴 권한 조회", + tags = {"AdminConfigController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "조회 성공"), + @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") + }) + @RequestMapping(method = RequestMethod.GET, value = "/menu-auth-mgt") + public ResultVO getMenuAuthMgt(){ + ResultVO resultVO = new ResultVO(); + Map resultMap = new HashMap<>(); + resultMap.put("menuList", adminConfigService.selectMenuAuthList()); + resultMap.put("roleList", commonCodeService.selectCodeItemList("ROLE")); + resultVO.setResult(resultMap); + return resultVO; + } + + @Operation( + summary = "메뉴 권한 수정", + description = "메뉴 권한 수정", + tags = {"AdminConfigController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "수정 성공"), + @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") + }) + @RequestMapping(method = RequestMethod.PUT, value = "/menu-auth-mgt") + public ResultVO editMenuAuthMgt(@RequestBody TcMenu menu, @AuthenticationPrincipal LoginVO user){ + ResultVO resultVO = new ResultVO(); + if(user == null){ + resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode()); + }else { + if (!user.getUserSe().equals("ACC_TP01")) { + resultVO.setResultCode(ResponseCode.AUTH_ERROR.getCode()); + resultVO.setResultMessage(ResponseCode.AUTH_ERROR.getMessage()); + } else { + adminConfigService.editMenuAuth(menu); + resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); + } + } + return resultVO; + } + + @Operation( + summary = "'위원회 코드 관리' 페이지에서 목록 불러오는 API", + description = "관리자 단에서 '환경설정' > '위원회코드 관리' 페이지에서 목록 불러오는 API", + tags = {"AdminConfigController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "조회 성공"), + @ApiResponse(responseCode = "303", description = "만료된 토큰"), + @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") + }) + @GetMapping(value = "/committee-code-management") + public ResultVO getCommitteeCodeManagement( + @AuthenticationPrincipal LoginVO user, + HttpServletRequest request, + @ApiParam(value="상위 code") @RequestParam(required=true) String paramCodeGroup, + @ApiParam(value="code level") @RequestParam(required=true) String paramCodeLevel + ) throws Exception { + + ResultVO resultVO = new ResultVO(); + if(user == null) { + resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode()); + } else { + try { + Long upCmtSeq = null; + if (!paramCodeGroup.equals("null")) { + upCmtSeq = Long.parseLong(paramCodeGroup); + } + resultVO = adminCommitteeCodeManagementService.getCommitteeCodeManagement(resultVO, request, user, upCmtSeq, paramCodeLevel); + } catch (Exception e) { + resultVO.setResultCode(ResponseCode.FAILED.getCode()); + resultVO.setResultMessage(e.getMessage()); + } + } + + System.out.println( + "\n--------------------------------------------------------------\n" + + request.getRequestURI() + " OUT:" + + "\n--------------------------------------------------------------\n" + + "resultVO.toString():" + "\n" + + resultVO.toString() + "\n" + + "\n--------------------------------------------------------------\n" + ); + + return resultVO; + } + + + @Operation( + summary = "'위원회 코드 관리' 페이지에서 위원회 코드 추가하는 API", + description = "관리자 단에서 '환경설정' > '위원회코드 관리' 페이지에서 +(추가) 버튼으로 항목 추가하는 API", + tags = {"AdminConfigController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "조회 성공"), + @ApiResponse(responseCode = "303", description = "만료된 토큰"), + @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") + }) + @PostMapping(value = "/committee-code-management") + public ResultVO createCommitteeCodeManagement( + @AuthenticationPrincipal LoginVO user, + HttpServletRequest request, + CreateCommitteeCodeManagementVO createCommitteeCodeManagementVO + ) throws Exception { + + ResultVO resultVO = new ResultVO(); + if(user == null) { + resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode()); + } else { + try { + resultVO = adminCommitteeCodeManagementService.createCommitteeCodeManagement(resultVO, request, user, createCommitteeCodeManagementVO); + } catch (Exception e) { + resultVO.setResultCode(ResponseCode.FAILED.getCode()); + resultVO.setResultMessage(e.getMessage()); + } + } + + System.out.println( + "\n--------------------------------------------------------------\n" + + request.getRequestURI() + " OUT:" + + "\n--------------------------------------------------------------\n" + + "resultVO.toString():" + "\n" + + resultVO.toString() + "\n" + + "\n--------------------------------------------------------------\n" + ); + + return resultVO; + } + + @Operation( + summary = "'위원회 코드 관리' 페이지에서 위원회 코드 삭제하는 API", + description = "관리자 단에서 '환경설정' > '위원회코드 관리' 페이지에서 휴지통 모양 삭제 버튼으로 항목 삭제하는 API", + tags = {"AdminConfigController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "등록 성공"), + @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") + }) + @DeleteMapping(value = "/committee-code-management/{orgId}") + public ResultVO deleteSchedule + ( + @AuthenticationPrincipal LoginVO user, + HttpServletRequest request, + @PathVariable("orgId") String strOrgId + ) throws Exception { + + ResultVO resultVO = new ResultVO(); + Long orgId = Long.valueOf(strOrgId); + try { + resultVO = adminCommitteeCodeManagementService.deleteCommitteeCodeManagement(resultVO, request, user, orgId); + } catch (Exception e) { + resultVO.setResultCode(ResponseCode.FAILED.getCode()); + resultVO.setResultMessage(e.getMessage()); + } + + + System.out.println( + "\n--------------------------------------------------------------\n" + + request.getRequestURI() + " OUT:" + + "\n--------------------------------------------------------------\n" + + "resultVO.toString():" + "\n" + + resultVO.toString() + "\n" + + "\n--------------------------------------------------------------\n" + ); + + return resultVO; + + } + + + /* ---- 관련사이트 관리 ----- */ + @Operation( + summary = "관련사이트 목록 조회", + description = "관련사이트 목록 조회", + tags = {"AdminConfigController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "조회 성공"), + @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") + }) + @RequestMapping(method = RequestMethod.GET, value = "/partner-site-list", consumes = MediaType.APPLICATION_JSON_VALUE) + public ResultVO getPartnerSiteList() throws Exception { + ResultVO resultVO = new ResultVO(); + Map resultMap = new HashMap<>(); + + resultMap.put("partnerSiteList", adminConfigService.selectPartnerSiteList()); + resultVO.setResult(resultMap); + return resultVO; + } + + @Operation( + summary = "관련사이트 저장", + description = "관련사이트 저장", + tags = {"AdminConfigController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "저장 성공"), + @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") + }) + @RequestMapping(method = RequestMethod.PUT, value = "/partner-site-mgt") + public ResultVO savePartnerSite(@RequestBody @Valid TnPartnerSite tnPartnerSite, Errors errors, @AuthenticationPrincipal LoginVO user) { + ResultVO resultVO = new ResultVO(); + if (user == null) { + resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode()); + } else { + if (errors.hasErrors()) { + StringBuilder msg = new StringBuilder(); + for (FieldError error : errors.getFieldErrors()) { + msg.append(error.getDefaultMessage()); + msg.append("\n"); + } + resultVO.setResultCode(ResponseCode.INPUT_CHECK_ERROR.getCode()); + resultVO.setResultMessage(msg.toString()); + } else { + System.out.println("@@@ bbs.getBbsSeq() : " + tnPartnerSite.getSiteSeq()); + adminConfigService.savePartnerSite(tnPartnerSite, user.getId()); + resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); + } + } + return resultVO; + } + + @Operation( + summary = "관련사이트 삭제", + description = "관련사이트 삭제", + tags = {"AdminConfigController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "삭제 성공"), + @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") + }) + @RequestMapping(method = RequestMethod.DELETE, value = "/partner-site-mgt") + public ResultVO removePartnerSite(@RequestBody TnPartnerSite tnPartnerSite, @AuthenticationPrincipal LoginVO user) { + ResultVO resultVO = new ResultVO(); + if (user == null) { + resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode()); + } else { + String result = adminConfigService.deletePartnerSite(tnPartnerSite, user.getId()); + if (result == null) { + resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); + } else if (result.equals("notFind")) { + resultVO.setResultCode(ResponseCode.SAVE_ERROR.getCode()); + resultVO.setResultMessage("대상이 존재하지 않습니다."); + } + } + return resultVO; + } + + @Operation( + summary = "'위원회 코드 관리' 페이지에서 위원회 코드 수정하는 API", + description = "관리자 단에서 '환경설정' > '위원회코드 관리' 페이지에서 연필 모양 수정 버튼으로 항목 수정하는 API", + tags = {"AdminConfigController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "등록 성공"), + @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님"), + }) + @PutMapping(value = "/committee-code-management/{orgId}") + public ResultVO setCommitteeCodeManagement( + HttpServletRequest request, + @AuthenticationPrincipal LoginVO loginVO, + SetCommitteeCodeManagementVO setCommitteeCodeManagementVO, + @PathVariable("orgId") Long orgId + ) throws Exception { + ResultVO resultVO = new ResultVO(); + + try { + resultVO = adminCommitteeCodeManagementService.setCommitteeCodeManagement(resultVO, request, loginVO, setCommitteeCodeManagementVO, orgId); + } catch (Exception e) { + resultVO.setResultCode(ResponseCode.FAILED.getCode()); + resultVO.setResultMessage(e.getMessage()); + } + + + System.out.println( + "\n--------------------------------------------------------------\n" + + request.getRequestURI() + " OUT:" + + "\n--------------------------------------------------------------\n" + + "resultVO.toString():" + "\n" + + resultVO.toString() + "\n" + + "\n--------------------------------------------------------------\n" + ); + + return resultVO; + + } + +} diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/entity/TnCmtDraft.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/entity/TnCmtDraft.java new file mode 100644 index 0000000..22e0205 --- /dev/null +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/entity/TnCmtDraft.java @@ -0,0 +1,39 @@ +package com.dbnt.kcscbackend.admin.config.entity; + +import lombok.*; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.persistence.*; +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.time.LocalDateTime; + +@Getter +@Setter +@Entity +@NoArgsConstructor +@DynamicInsert +@DynamicUpdate +@Table(name = "tb_menu_role") +@IdClass(TbMenuRole.TbMenuRoleId.class) +public class TbMenuRole { + @Id + @Column(name = "role_id") + private String roleId; + @Id + @Column(name = "menu_id") + private String menuId; + @Column(name = "write_yn") + private String writeYn; + + @Embeddable + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class TbMenuRoleId implements Serializable { + private String roleId; + private String menuId; + } +} diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/entity/TnCmtDraftAttend.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/entity/TnCmtDraftAttend.java new file mode 100644 index 0000000..ef8e53f --- /dev/null +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/entity/TnCmtDraftAttend.java @@ -0,0 +1,93 @@ +package com.dbnt.kcscbackend.admin.committee.entity; + +import lombok.*; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; + +import javax.persistence.*; + +@Getter +@Setter +@Entity +@NoArgsConstructor +@DynamicInsert +@DynamicUpdate +@Table(name = "tn_cmt_draft") +public class TnCmtDraft { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "drft_seq") + private String drftSeq; + + @Column(name = "drft_title") + private String drftTitle; + + @Column(name = "doc_info_seq") + private String docInfoSeq; + + @Column(name = "drft_type_cd") + private String drftTypeCd; + + @Column(name = "drft_dt") + private String drftDt; + + @Column(name = "cmt_seq") + private String cmtSeq; + + @Column(name = "measure_pre_data_file_grp_id") + private String measurePreDataFileGrpId; + + @Column(name = "measure_pre_form_file_grp_id") + private String measurePreFormFileGrpId; + + @Column(name = "measure_partner_file_grp_id") + private String measurePartnerFileGrpId; + + @Column(name = "drft_confe_charger") + private String drftConfeCharger; + + @Column(name = "drft_confe_pw") + private String drftConfePw; + + @Column(name = "drft_confe_room") + private String drftConfeRoom; + + @Column(name = "drft_stat_cd") + private String drftStatCd; + + @Column(name = "drft_summery") + private String drftSummery; + + @Column(name = "measure_plan_file_grp_id") + private String measurePlanFileGrpId; + + @Column(name = "measure_result_file_grp_id") + private String measureResultFileGrpId; + + @Column(name = "start_dt") + private String startDt; + + @Column(name = "end_dt") + private String endDt; + + @Column(name = "frst_crt_id") + private String frstCrtId; + + @Column(name = "frst_crt_dt") + private String frstCrtDt; + + @Column(name = "last_chg_id") + private String lastChgId; + + @Column(name = "last_chg_dt") + private String lastChgDt; + + @Column(name = "use_yn") + private String useYn; + + @Column(name = "old_seq") + private String oldSeq; + + +} diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/entity/TnCmtDraftDetail.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/entity/TnCmtDraftDetail.java new file mode 100644 index 0000000..e34f4ef --- /dev/null +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/entity/TnCmtDraftDetail.java @@ -0,0 +1,46 @@ +package com.dbnt.kcscbackend.admin.committee.entity; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; + +import javax.persistence.*; + +@Getter +@Setter +@Entity +@NoArgsConstructor +@DynamicInsert +@DynamicUpdate +@Table(name = "tn_cmt_draft_attend") +public class TnCmtDraftAttend { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "drft_atd_seq") + private Long drftAtdSeq; + + @Column(name = "drft_seq") + private Long drftSeq; + + @Column(name = "drft_final_type") + private String drftFinalType; + + @Column(name = "drft_final_comment") + private String drftFinalComment; + + @Column(name = "user_id") + private String userId; + + @Column(name = "nick_name") + private String nickName; + + @Column(name = "write_dt") + private String writeDt; + + @Column(name = "drft_file_grp_id") + private String drftFileGrpId; + +} diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/service/AdminCommitteeProgressStatusService.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/service/AdminCommitteeProgressStatusService.java new file mode 100644 index 0000000..88112ac --- /dev/null +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/service/AdminCommitteeProgressStatusService.java @@ -0,0 +1,23 @@ +package com.dbnt.kcscbackend.admin.config.service; + +import com.dbnt.kcscbackend.admin.config.model.CreateCommitteeCodeManagementVO; +import com.dbnt.kcscbackend.admin.config.model.SetCommitteeCodeManagementVO; +import com.dbnt.kcscbackend.admin.standardResearch.model.CreateStandardResearchVO; +import com.dbnt.kcscbackend.admin.standardResearch.model.UpdateStandardResearchVO; +import com.dbnt.kcscbackend.auth.entity.LoginVO; +import com.dbnt.kcscbackend.config.common.ResultVO; +import io.swagger.annotations.ApiParam; +import org.springframework.data.domain.Pageable; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartHttpServletRequest; + +import javax.servlet.http.HttpServletRequest; + +public interface AdminCommitteeCodeManagementService { + public ResultVO createCommitteeCodeManagement(ResultVO resultVO, HttpServletRequest request, LoginVO user, CreateCommitteeCodeManagementVO createCommitteeCodeManagementVO) throws Exception; + public ResultVO getCommitteeCodeManagement(ResultVO resultVO, HttpServletRequest request, LoginVO user, Long upCmtSeq, String cmtType) throws Exception; + public ResultVO setCommitteeCodeManagement(ResultVO resultVO, HttpServletRequest request, LoginVO user, SetCommitteeCodeManagementVO setCommitteeCodeManagementVO, Long cmtSeq) throws Exception; + public ResultVO deleteCommitteeCodeManagement(ResultVO resultVO, HttpServletRequest request, LoginVO user, Long cmtSeq) throws Exception; + + +} \ No newline at end of file diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/service/impl/AdminCommitteeProgressStatusServiceImpl.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/service/impl/AdminCommitteeProgressStatusServiceImpl.java new file mode 100644 index 0000000..24a6cbf --- /dev/null +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/service/impl/AdminCommitteeProgressStatusServiceImpl.java @@ -0,0 +1,209 @@ +package com.dbnt.kcscbackend.admin.config.service.impl; + +import com.dbnt.kcscbackend.admin.config.model.CreateCommitteeCodeManagementVO; +import com.dbnt.kcscbackend.admin.config.model.SetCommitteeCodeManagementVO; +import com.dbnt.kcscbackend.admin.config.service.AdminCommitteeCodeManagementService; +import com.dbnt.kcscbackend.admin.standardResearch.model.CreateStandardResearchVO; +import com.dbnt.kcscbackend.admin.standardResearch.model.UpdateStandardResearchVO; +import com.dbnt.kcscbackend.auth.entity.LoginVO; +import com.dbnt.kcscbackend.commonCode.entity.TnCmtOrg; +import com.dbnt.kcscbackend.commonCode.repository.TnCmtOrgRepository; +import com.dbnt.kcscbackend.config.common.ResponseCode; +import com.dbnt.kcscbackend.config.common.ResultVO; +import lombok.RequiredArgsConstructor; +import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl; +import org.egovframe.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; +import org.springframework.data.domain.Pageable; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartHttpServletRequest; + +import javax.servlet.http.HttpServletRequest; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service("adminCommitteeCodeManagementService") +@RequiredArgsConstructor +public class AdminCommitteeCodeManagementServiceImpl extends EgovAbstractServiceImpl implements AdminCommitteeCodeManagementService { + + private final TnCmtOrgRepository tnCmtOrgRepository; + + @Override + public ResultVO createCommitteeCodeManagement(ResultVO resultVO, HttpServletRequest request, LoginVO user, CreateCommitteeCodeManagementVO createCommitteeCodeManagementVO) throws Exception { + System.out.println( + "\n--------------------------------------------------------------\n" + + request.getRequestURI() + " IN:" + + "\n--------------------------------------------------------------\n" + + "user.getEmail():" + "\n" + + user.getEmail() + "\n" + + "\n--------------------------------------------------------------\n" + ); + + // 아래 null로 전달 되는 부분 확인하기. + // 유효성 검사 실시 + if(createCommitteeCodeManagementVO.getParamCodeLevel().trim().isEmpty()) { + throw new Exception("오류가 발생했습니다. 시스템 담당자에게 문의 바랍니다. paramCodeLevel is empty."); + } + Integer upCmtSeq = null; + if( createCommitteeCodeManagementVO.getParamOrgId().trim().equals("00") == false ) { // 00은 '중앙건설기술심의' 항목의 부모 sequnce이다. 그러나 DB에 실제 00이란 sequence는 존재하지 않는다. + upCmtSeq = Integer.parseInt(createCommitteeCodeManagementVO.getParamOrgId()); + } + + Map response = tnCmtOrgRepository.spAddTnCmtOrg( + createCommitteeCodeManagementVO.getParamOrgNm(), // 위원회 이름 + createCommitteeCodeManagementVO.getParamCodeLevel(), // 위원회 등급 + createCommitteeCodeManagementVO.getParamOrgDesc(), // 위원회 설명 + upCmtSeq, // 상위 위원회 sequence + 1, // 정렬 순서 + user.getId(), + null, + null, + null, + null + ); + + Map dto = new HashMap(); + dto.put("id", response.get("_cmt_seq") ); + + resultVO.setResult(dto); + resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); + resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage()); + + return resultVO; + } + + @Override + public ResultVO getCommitteeCodeManagement(ResultVO resultVO, HttpServletRequest request, LoginVO user, Long upCmtSeq, String cmtType) throws Exception { + + System.out.println( + "\n--------------------------------------------------------------\n" + + request.getRequestURI() + " IN:" + + "\n--------------------------------------------------------------\n" + + "user.getEmail():" + "\n" + + user.getEmail() + "\n" + + "\n--------------------------------------------------------------\n" + ); + + List> list = tnCmtOrgRepository.findByUseYnAndUpCmtSeqAndCmtTypeOrderByCmtOrder("Y", upCmtSeq, cmtType).stream() + .map(item -> { + Map returnMap = new HashMap<>(); + returnMap.put("orgId", item.getCmtSeq()); + returnMap.put("orgNm", item.getCmtNm()); + returnMap.put("orgDesc", item.getCmtDesc()); + returnMap.put("omtOrder", item.getCmtOrder()); + returnMap.put("upCmtSeq", item.getUpCmtSeq()); + return returnMap; + }) + .collect(Collectors.toList()); + + Map dto = new HashMap(); + dto.put("list", list); + resultVO.setResult(dto); + resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); + resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage()); + + return resultVO; + } + + @Override + public ResultVO setCommitteeCodeManagement(ResultVO resultVO, HttpServletRequest request, LoginVO user, SetCommitteeCodeManagementVO setCommitteeCodeManagementVO, Long cmtSeq) throws Exception { + System.out.println( + "\n--------------------------------------------------------------\n" + + request.getRequestURI() + " IN:" + + "\n--------------------------------------------------------------\n" + + "setCommitteeCodeManagementVO:" + "\n" + + setCommitteeCodeManagementVO.toString() + "\n" + + "cmtSeq:" + "\n" + + cmtSeq + "\n" + + "\n--------------------------------------------------------------\n" + ); + + // 유효성 검사 실시 + int isValid = tnCmtOrgRepository.spIsValidTnCmtOrgId(cmtSeq.intValue()); + + if( isValid == 0 ) { + throw new Exception("대상이 존재하지 않습니다."); + } + + TnCmtOrg tnCmtOrg = tnCmtOrgRepository.findByCmtSeq(cmtSeq); + + Map response = tnCmtOrgRepository.spUpdateTnCmtOrg( + cmtSeq.intValue(), + setCommitteeCodeManagementVO.getParamOrgNm(), + setCommitteeCodeManagementVO.getParamOrgDesc(), + tnCmtOrg.getCmtOrder(), + user.getId(), + null, + null, + null + ); + + + Map dto = new HashMap(); + dto.put("errorMessage", response.get("_error_message") ); + dto.put("orgId", cmtSeq); + + resultVO.setResult(dto); + resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); + resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage()); + + return resultVO; + } + + @Override + public ResultVO deleteCommitteeCodeManagement(ResultVO resultVO, HttpServletRequest request, LoginVO user, Long cmtSeq) throws Exception { + System.out.println( + "\n--------------------------------------------------------------\n" + + request.getRequestURI() + " IN:" + + "\n--------------------------------------------------------------\n" + + "cmtSeq:" + "\n" + + cmtSeq + "\n" + + "\n--------------------------------------------------------------\n" + ); + + + Map response = tnCmtOrgRepository.spDeleteTnCmtOrg( + cmtSeq.intValue(), + user.getId(), + null, + null, + null + ); + + // 자식 코드들을 모두 제거한다. + getChildrenOrg(user, cmtSeq); + + + Map dto = new HashMap(); + dto.put("errorMessage", response.get("_error_message") ); + dto.put("orgId", cmtSeq ); + + resultVO.setResult(dto); + resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); + resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage()); + + return resultVO; + } + + private void getChildrenOrg(LoginVO user, Long upCmtSeq) { + List> list = tnCmtOrgRepository.findByUpCmtSeq(upCmtSeq).stream() + .map(item -> { + Map returnMap = new HashMap<>(); + returnMap.put("cmtSeq", item.getCmtSeq()); + getChildrenOrg( user, item.getCmtSeq() ); + Map response = tnCmtOrgRepository.spDeleteTnCmtOrg( + item.getCmtSeq().intValue(), + user.getId(), + null, + null, + null + ); + return returnMap; + }).collect(Collectors.toList()); + + System.out.println("for Debugging"); + } +} diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnCmtDraftAttendRepository.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnCmtDraftAttendRepository.java new file mode 100644 index 0000000..e670e98 --- /dev/null +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnCmtDraftAttendRepository.java @@ -0,0 +1,100 @@ +package com.dbnt.kcscbackend.commonCode.repository; + +import com.dbnt.kcscbackend.commonCode.entity.TnPopupMng; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.jpa.repository.query.Procedure; +import org.springframework.data.repository.query.Param; + +import java.util.Map; + + +public interface TnCmtDraftRepository extends JpaRepository { + + @Query(value = "CALL sp_add_tn_popup_mng (" + + ":_popup_title, " + + "TO_TIMESTAMP(" + + " :_popup_start_date," + + " 'YYYYMMDDHH24MISS'" + + ")::::timestamptz AT TIME ZONE 'UTC', " + + "TO_TIMESTAMP(" + + " :_popup_end_date," + + " 'YYYYMMDDHH24MISS'" + + ")::::timestamptz AT TIME ZONE 'UTC', " + + ":_file_grp_id, " + + ":_popup_contents, " + + ":_modi_id, " + + ":_popup_seq, " + + ":_result_count, " + + ":_result_code, " + + ":_error_message)", + nativeQuery = true) + Map spAddTnPopupMng( + @Param("_popup_title") String popupTitle, + @Param("_popup_start_date") String popupStartDate, + @Param("_popup_end_date") String popupEndDate, + @Param("_file_grp_id") String fileGrpId, + @Param("_popup_contents") String popupContents, + @Param("_modi_id") String modiId, + @Param("_popup_seq") Integer popupSeq, + @Param("_result_count") Integer resultCount, + @Param("_result_code") String resultCode, + @Param("_error_message") String errorMessage + ); + + + @Query(value = "CALL sp_update_tn_popup_mng (" + + ":_popup_seq, " + + ":_popup_title, " + + "TO_TIMESTAMP(" + + " :_popup_start_date," + + " 'YYYYMMDDHH24MISS'" + + ")::::timestamptz AT TIME ZONE 'UTC', " + + "TO_TIMESTAMP(" + + " :_popup_end_date," + + " 'YYYYMMDDHH24MISS'" + + ")::::timestamptz AT TIME ZONE 'UTC', " + + ":_file_grp_id, " + + ":_popup_contents, " + + ":_modi_id, " + + ":_result_count, " + + ":_result_code, " + + ":_error_message)", + nativeQuery = true) + Map spUpdateTnPopupMng( + @Param("_popup_seq") Integer popupSeq, + @Param("_popup_title") String popupTitle, + @Param("_popup_start_date") String popupStartDate, + @Param("_popup_end_date") String popupEndDate, + @Param("_file_grp_id") String fileGrpId, + @Param("_popup_contents") String popupContents, + @Param("_modi_id") String modiId, + @Param("_result_count") Integer resultCount, + @Param("_result_code") String resultCode, + @Param("_error_message") String errorMessage + ); + + + @Query(value = "CALL sp_delete_tn_popup_mng (" + + ":_popup_seq, " + + ":_modi_id, " + + ":_result_count, " + + ":_result_code, " + + ":_error_message)", + nativeQuery = true) + Map spDeleteTnPopupMng( + @Param("_popup_seq") Integer popupSeq, + @Param("_modi_id") String modiId, + @Param("_result_count") Integer resultCount, + @Param("_result_code") String resultCode, + @Param("_error_message") String errorMessage + ); + + + @Procedure("sp_is_valid_tn_popup_mng_id") + int spIsValidTnPopupMngId( Integer popupSeq ); + + TnPopupMng findByPopupSeq(Long popupSeq); + + +} diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnCmtDraftDetailRepository.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnCmtDraftDetailRepository.java new file mode 100644 index 0000000..e983ca1 --- /dev/null +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnCmtDraftDetailRepository.java @@ -0,0 +1,100 @@ +package com.dbnt.kcscbackend.commonCode.repository; + +import com.dbnt.kcscbackend.commonCode.entity.TnPopupMng; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.jpa.repository.query.Procedure; +import org.springframework.data.repository.query.Param; + +import java.util.Map; + + +public interface TnCmtDraftAttendRepository extends JpaRepository { + + @Query(value = "CALL sp_add_tn_popup_mng (" + + ":_popup_title, " + + "TO_TIMESTAMP(" + + " :_popup_start_date," + + " 'YYYYMMDDHH24MISS'" + + ")::::timestamptz AT TIME ZONE 'UTC', " + + "TO_TIMESTAMP(" + + " :_popup_end_date," + + " 'YYYYMMDDHH24MISS'" + + ")::::timestamptz AT TIME ZONE 'UTC', " + + ":_file_grp_id, " + + ":_popup_contents, " + + ":_modi_id, " + + ":_popup_seq, " + + ":_result_count, " + + ":_result_code, " + + ":_error_message)", + nativeQuery = true) + Map spAddTnPopupMng( + @Param("_popup_title") String popupTitle, + @Param("_popup_start_date") String popupStartDate, + @Param("_popup_end_date") String popupEndDate, + @Param("_file_grp_id") String fileGrpId, + @Param("_popup_contents") String popupContents, + @Param("_modi_id") String modiId, + @Param("_popup_seq") Integer popupSeq, + @Param("_result_count") Integer resultCount, + @Param("_result_code") String resultCode, + @Param("_error_message") String errorMessage + ); + + + @Query(value = "CALL sp_update_tn_popup_mng (" + + ":_popup_seq, " + + ":_popup_title, " + + "TO_TIMESTAMP(" + + " :_popup_start_date," + + " 'YYYYMMDDHH24MISS'" + + ")::::timestamptz AT TIME ZONE 'UTC', " + + "TO_TIMESTAMP(" + + " :_popup_end_date," + + " 'YYYYMMDDHH24MISS'" + + ")::::timestamptz AT TIME ZONE 'UTC', " + + ":_file_grp_id, " + + ":_popup_contents, " + + ":_modi_id, " + + ":_result_count, " + + ":_result_code, " + + ":_error_message)", + nativeQuery = true) + Map spUpdateTnPopupMng( + @Param("_popup_seq") Integer popupSeq, + @Param("_popup_title") String popupTitle, + @Param("_popup_start_date") String popupStartDate, + @Param("_popup_end_date") String popupEndDate, + @Param("_file_grp_id") String fileGrpId, + @Param("_popup_contents") String popupContents, + @Param("_modi_id") String modiId, + @Param("_result_count") Integer resultCount, + @Param("_result_code") String resultCode, + @Param("_error_message") String errorMessage + ); + + + @Query(value = "CALL sp_delete_tn_popup_mng (" + + ":_popup_seq, " + + ":_modi_id, " + + ":_result_count, " + + ":_result_code, " + + ":_error_message)", + nativeQuery = true) + Map spDeleteTnPopupMng( + @Param("_popup_seq") Integer popupSeq, + @Param("_modi_id") String modiId, + @Param("_result_count") Integer resultCount, + @Param("_result_code") String resultCode, + @Param("_error_message") String errorMessage + ); + + + @Procedure("sp_is_valid_tn_popup_mng_id") + int spIsValidTnPopupMngId( Integer popupSeq ); + + TnPopupMng findByPopupSeq(Long popupSeq); + + +} diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnCmtDraftRepository.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnCmtDraftRepository.java new file mode 100644 index 0000000..b98a290 --- /dev/null +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnCmtDraftRepository.java @@ -0,0 +1,102 @@ +package com.dbnt.kcscbackend.commonCode.repository; + +import com.dbnt.kcscbackend.commonCode.entity.TnCmtEvent; +import com.dbnt.kcscbackend.commonCode.entity.TnPopupMng; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.jpa.repository.query.Procedure; +import org.springframework.data.repository.query.Param; + +import java.util.List; +import java.util.Map; + + +public interface TnPopupMngRepository extends JpaRepository { + + @Query(value = "CALL sp_add_tn_popup_mng (" + + ":_popup_title, " + + "TO_TIMESTAMP(" + + " :_popup_start_date," + + " 'YYYYMMDDHH24MISS'" + + ")::::timestamptz AT TIME ZONE 'UTC', " + + "TO_TIMESTAMP(" + + " :_popup_end_date," + + " 'YYYYMMDDHH24MISS'" + + ")::::timestamptz AT TIME ZONE 'UTC', " + + ":_file_grp_id, " + + ":_popup_contents, " + + ":_modi_id, " + + ":_popup_seq, " + + ":_result_count, " + + ":_result_code, " + + ":_error_message)", + nativeQuery = true) + Map spAddTnPopupMng( + @Param("_popup_title") String popupTitle, + @Param("_popup_start_date") String popupStartDate, + @Param("_popup_end_date") String popupEndDate, + @Param("_file_grp_id") String fileGrpId, + @Param("_popup_contents") String popupContents, + @Param("_modi_id") String modiId, + @Param("_popup_seq") Integer popupSeq, + @Param("_result_count") Integer resultCount, + @Param("_result_code") String resultCode, + @Param("_error_message") String errorMessage + ); + + + @Query(value = "CALL sp_update_tn_popup_mng (" + + ":_popup_seq, " + + ":_popup_title, " + + "TO_TIMESTAMP(" + + " :_popup_start_date," + + " 'YYYYMMDDHH24MISS'" + + ")::::timestamptz AT TIME ZONE 'UTC', " + + "TO_TIMESTAMP(" + + " :_popup_end_date," + + " 'YYYYMMDDHH24MISS'" + + ")::::timestamptz AT TIME ZONE 'UTC', " + + ":_file_grp_id, " + + ":_popup_contents, " + + ":_modi_id, " + + ":_result_count, " + + ":_result_code, " + + ":_error_message)", + nativeQuery = true) + Map spUpdateTnPopupMng( + @Param("_popup_seq") Integer popupSeq, + @Param("_popup_title") String popupTitle, + @Param("_popup_start_date") String popupStartDate, + @Param("_popup_end_date") String popupEndDate, + @Param("_file_grp_id") String fileGrpId, + @Param("_popup_contents") String popupContents, + @Param("_modi_id") String modiId, + @Param("_result_count") Integer resultCount, + @Param("_result_code") String resultCode, + @Param("_error_message") String errorMessage + ); + + + @Query(value = "CALL sp_delete_tn_popup_mng (" + + ":_popup_seq, " + + ":_modi_id, " + + ":_result_count, " + + ":_result_code, " + + ":_error_message)", + nativeQuery = true) + Map spDeleteTnPopupMng( + @Param("_popup_seq") Integer popupSeq, + @Param("_modi_id") String modiId, + @Param("_result_count") Integer resultCount, + @Param("_result_code") String resultCode, + @Param("_error_message") String errorMessage + ); + + + @Procedure("sp_is_valid_tn_popup_mng_id") + int spIsValidTnPopupMngId( Integer popupSeq ); + + TnPopupMng findByPopupSeq(Long popupSeq); + + +} From fba3342c696df6e6e6827f903f487badff1f3a2c Mon Sep 17 00:00:00 2001 From: thkim Date: Thu, 7 Mar 2024 15:18:29 +0900 Subject: [PATCH 3/5] =?UTF-8?q?feat:=20=EA=B4=80=EB=A6=AC=EC=9E=90=20-=20?= =?UTF-8?q?=EC=9C=84=EC=9B=90=ED=9A=8C=EA=B4=80=EB=A6=AC=20-=20=EC=A7=84?= =?UTF-8?q?=ED=96=89=ED=98=84=ED=99=A9=20=EA=B4=80=EB=A6=AC=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EB=AA=A9=EB=A1=9D=20=EA=B5=AC=ED=98=84=20=EA=B1=B4?= =?UTF-8?q?=20-=20backEnd?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../committee/AdminCommitteeController.java | 552 +----------------- .../admin/committee/entity/TnCmtDraft.java | 102 +++- .../committee/entity/TnCmtDraftAttend.java | 89 +-- .../committee/entity/TnCmtDraftDetail.java | 16 +- .../AdminCommitteeProgressStatusService.java | 17 +- ...minCommitteeProgressStatusServiceImpl.java | 153 ++--- .../TnCmtDraftAttendRepository.java | 7 +- .../TnCmtDraftDetailRepository.java | 7 +- .../repository/TnCmtDraftRepository.java | 224 +++++-- 9 files changed, 391 insertions(+), 776 deletions(-) diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/AdminCommitteeController.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/AdminCommitteeController.java index 92412e5..c57b67a 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/AdminCommitteeController.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/AdminCommitteeController.java @@ -1,14 +1,15 @@ -package com.dbnt.kcscbackend.admin.config; +package com.dbnt.kcscbackend.admin.committee; +import com.dbnt.kcscbackend.admin.committee.service.AdminCommitteeProgressStatusService; import com.dbnt.kcscbackend.admin.config.entity.TcMenu; import com.dbnt.kcscbackend.admin.config.entity.TnPartnerSite; import com.dbnt.kcscbackend.admin.config.model.CreateCommitteeCodeManagementVO; import com.dbnt.kcscbackend.admin.config.model.SetCommitteeCodeManagementVO; import com.dbnt.kcscbackend.admin.config.service.AdminCommitteeCodeManagementService; -import com.dbnt.kcscbackend.commonCode.entity.TcCodeGrp; -import com.dbnt.kcscbackend.commonCode.entity.TcCodeItem; import com.dbnt.kcscbackend.admin.config.service.AdminConfigService; import com.dbnt.kcscbackend.auth.entity.LoginVO; +import com.dbnt.kcscbackend.commonCode.entity.TcCodeGrp; +import com.dbnt.kcscbackend.commonCode.entity.TcCodeItem; import com.dbnt.kcscbackend.commonCode.service.CommonCodeService; import com.dbnt.kcscbackend.config.common.BaseController; import com.dbnt.kcscbackend.config.common.ResponseCode; @@ -19,6 +20,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; import org.springframework.http.MediaType; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.validation.Errors; @@ -34,345 +36,32 @@ import java.util.Map; @RestController @RequiredArgsConstructor -@RequestMapping("/admin/config") -@Tag(name="AdminConfigController", description = "사이트관리 환결설정 메뉴 컨트롤러") -public class AdminConfigController extends BaseController { +@RequestMapping("/admin/committee") +@Tag(name="AdminCommitteeController", description = "사이트관리 위원회관리 메뉴 컨트롤러") +public class AdminCommitteeController extends BaseController { private final AdminConfigService adminConfigService; private final CommonCodeService commonCodeService; - @Resource(name = "adminCommitteeCodeManagementService") - private AdminCommitteeCodeManagementService adminCommitteeCodeManagementService; + @Resource(name = "adminCommitteeProgressStatusService") + private AdminCommitteeProgressStatusService adminCommitteeProgressStatusService; + @Operation( - summary = "기본코드 그룹 조회", - description = "기본코드 그룹 조회", - tags = {"AdminConfigController"} + summary = "'진행현황 관리' 페이지에서 목록 불러오는 API", + description = "관리자 단에서 '위원회관리' > '진행현황 관리' 페이지에서 목록 불러오는 API", + tags = {"AdminCommitteeController"} ) @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "조회 성공"), - @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") - }) - @RequestMapping(method = RequestMethod.GET, value = "/code-grp") - public ResultVO getCodeGrp() throws Exception{ - ResultVO resultVO = new ResultVO(); - Map resultMap = new HashMap<>(); - resultMap.put("codeGrpList", adminConfigService.selectCodeGrpList()); - resultVO.setResult(resultMap); - return resultVO; - } - - @Operation( - summary = "기본코드 그룹 저장", - description = "기본코드 그룹 저장", - tags = {"AdminConfigController"} - ) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "저장 성공"), - @ApiResponse(responseCode = "303", description = "만료된 토큰"), - @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") - }) - @RequestMapping(method = RequestMethod.POST, value = "/code-grp", consumes = MediaType.APPLICATION_JSON_VALUE) - public ResultVO addCodeGrp(@RequestBody TcCodeGrp codeGrp, @AuthenticationPrincipal LoginVO user) throws Exception{ - ResultVO resultVO = new ResultVO(); - if(user == null){ - resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode()); - }else{ - if(!user.getUserSe().equals("ACC_TP01")){ - resultVO.setResultCode(ResponseCode.AUTH_ERROR.getCode()); - resultVO.setResultMessage(ResponseCode.AUTH_ERROR.getMessage()); - }else if(codeGrp.getGrpCd().isEmpty()){ - resultVO.setResultCode(ResponseCode.INPUT_CHECK_ERROR.getCode()); - resultVO.setResultMessage(ResponseCode.INPUT_CHECK_ERROR.getMessage()); - }else{ - codeGrp.setFrstCrtDt(LocalDateTime.now()); - codeGrp.setFrstCrtId(user.getId()); - codeGrp.setUseYn("Y"); - String result = adminConfigService.addCodeGrp(codeGrp); - if(result.equals("isSaved")){ - resultVO.setResultCode(ResponseCode.SAVE_ERROR.getCode()); - resultVO.setResultMessage("중복되는 코드그룹이 있습니다."); - }else{ - resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); - } - } - } - return resultVO; - } - - @Operation( - summary = "기본코드 그룹 수정", - description = "기본코드 그룹 수정", - tags = {"AdminConfigController"} - ) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "수정 성공"), - @ApiResponse(responseCode = "303", description = "만료된 토큰"), - @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") - }) - @RequestMapping(method = RequestMethod.PUT, value = "/code-grp", consumes = MediaType.APPLICATION_JSON_VALUE) - public ResultVO modifyCodeGrp(@RequestBody TcCodeGrp codeGrp, @AuthenticationPrincipal LoginVO user) throws Exception{ - ResultVO resultVO = new ResultVO(); - if(user == null){ - resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode()); - }else{ - if(!user.getUserSe().equals("ACC_TP01")){ - resultVO.setResultCode(ResponseCode.AUTH_ERROR.getCode()); - resultVO.setResultMessage(ResponseCode.AUTH_ERROR.getMessage()); - }else if(codeGrp.getGrpCd().isEmpty()){ - resultVO.setResultCode(ResponseCode.INPUT_CHECK_ERROR.getCode()); - resultVO.setResultMessage(ResponseCode.INPUT_CHECK_ERROR.getMessage()); - }else{ - codeGrp.setLastChgDt(LocalDateTime.now()); - codeGrp.setLastChgId(user.getId()); - String result = adminConfigService.modifyCodeGrp(codeGrp); - if(result.equals("modified")){ - resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); - }else{ - resultVO.setResultCode(ResponseCode.SAVE_ERROR.getCode()); - } - } - } - return resultVO; - } - - @Operation( - summary = "기본코드 아이템 조회", - description = "기본코드 아이템 조회", - tags = {"AdminConfigController"} - ) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "조회 성공"), - @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") - }) - @RequestMapping(method = RequestMethod.GET, value = "/code-item") - public ResultVO getCodeItem(String grpCd) throws Exception{ - ResultVO resultVO = new ResultVO(); - Map resultMap = new HashMap<>(); - resultMap.put("codeItemList", adminConfigService.selectCodeItemList(grpCd)); - resultVO.setResult(resultMap); - return resultVO; - } - - @Operation( - summary = "기본코드 아이템 저장", - description = "기본코드 아이템 저장", - tags = {"AdminConfigController"} - ) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "저장 성공"), - @ApiResponse(responseCode = "303", description = "만료된 토큰"), - @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") - }) - @RequestMapping(method = RequestMethod.POST, value = "/code-item", consumes = MediaType.APPLICATION_JSON_VALUE) - public ResultVO addCodeItem(@RequestBody TcCodeItem codeItem, @AuthenticationPrincipal LoginVO user) throws Exception{ - ResultVO resultVO = new ResultVO(); - if(user == null){ - resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode()); - }else{ - if(!user.getUserSe().equals("ACC_TP01")){ - resultVO.setResultCode(ResponseCode.AUTH_ERROR.getCode()); - resultVO.setResultMessage(ResponseCode.AUTH_ERROR.getMessage()); - }else if(codeItem.getGrpCd()==null || codeItem.getGrpCd().isEmpty()){ - resultVO.setResultCode(ResponseCode.INPUT_CHECK_ERROR.getCode()); - resultVO.setResultMessage(ResponseCode.INPUT_CHECK_ERROR.getMessage()); - }else{ - codeItem.setFrstCrtDt(LocalDateTime.now()); - codeItem.setFrstCrtId(user.getId()); - codeItem.setUseYn("Y"); - String result = adminConfigService.addCodeItem(codeItem); - if(result.equals("isSaved")){ - resultVO.setResultCode(ResponseCode.SAVE_ERROR.getCode()); - resultVO.setResultMessage("중복되는 코드가 있습니다."); - }else{ - resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); - } - } - } - return resultVO; - } - - @Operation( - summary = "기본코드 아이템 수정", - description = "기본코드 아이템 수정", - tags = {"AdminConfigController"} - ) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "수정 성공"), - @ApiResponse(responseCode = "303", description = "만료된 토큰"), - @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") - }) - @RequestMapping(method = RequestMethod.PUT, value = "/code-item", consumes = MediaType.APPLICATION_JSON_VALUE) - public ResultVO modifyCodeItem(@RequestBody TcCodeItem codeItem, @AuthenticationPrincipal LoginVO user) throws Exception{ - ResultVO resultVO = new ResultVO(); - if(user == null){ - resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode()); - }else{ - if(!user.getUserSe().equals("ACC_TP01")){ - resultVO.setResultCode(ResponseCode.AUTH_ERROR.getCode()); - resultVO.setResultMessage(ResponseCode.AUTH_ERROR.getMessage()); - }else if(codeItem.getGrpCd().isEmpty()){ - resultVO.setResultCode(ResponseCode.INPUT_CHECK_ERROR.getCode()); - resultVO.setResultMessage(ResponseCode.INPUT_CHECK_ERROR.getMessage()); - }else{ - codeItem.setLastChgDt(LocalDateTime.now()); - codeItem.setLastChgId(user.getId()); - String result = adminConfigService.modifyCodeItem(codeItem); - if(result.equals("modified")){ - resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); - }else{ - resultVO.setResultCode(ResponseCode.SAVE_ERROR.getCode()); - } - } - } - return resultVO; - } - - @Operation( - summary = "메뉴 조회", - description = "메뉴 조회", - tags = {"AdminConfigController"} - ) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "조회 성공"), - @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") - }) - @RequestMapping(method = RequestMethod.GET, value = "/menu-mgt") - public ResultVO getMenuMgt(){ - ResultVO resultVO = new ResultVO(); - Map resultMap = new HashMap<>(); - resultMap.put("menuList", adminConfigService.selectMenuList()); - resultVO.setResult(resultMap); - return resultVO; - } - - @Operation( - summary = "메뉴 저장", - description = "메뉴 저장", - tags = {"AdminConfigController"} - ) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "저장 성공"), - @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") - }) - @RequestMapping(method = RequestMethod.PUT, value = "/menu-mgt") - public ResultVO saveMenuMgt(@RequestBody @Valid TcMenu menu, Errors errors, @AuthenticationPrincipal LoginVO user){ - ResultVO resultVO = new ResultVO(); - if(user == null){ - resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode()); - }else { - menu.setRoleGrpId(menu.getMenuTypeCd().equals("MNU_0000")?"ADMIN_USER":"ALL_USER"); - if(errors.hasErrors()){ - StringBuilder msg = new StringBuilder(); - for(FieldError error: errors.getFieldErrors()){ - msg.append(error.getDefaultMessage()); - msg.append("\n"); - } - resultVO.setResultCode(ResponseCode.INPUT_CHECK_ERROR.getCode()); - resultVO.setResultMessage(msg.toString()); - }else if (!user.getUserSe().equals("ACC_TP01")) { - resultVO.setResultCode(ResponseCode.AUTH_ERROR.getCode()); - resultVO.setResultMessage(ResponseCode.AUTH_ERROR.getMessage()); - } else { - adminConfigService.saveMenu(menu, user.getId()); - resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); - } - } - return resultVO; - } - - @Operation( - summary = "메뉴 삭제", - description = "메뉴 삭제", - tags = {"AdminConfigController"} - ) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "삭제 성공"), - @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") - }) - @RequestMapping(method = RequestMethod.DELETE, value = "/menu-mgt") - public ResultVO removeMenuMgt(@RequestBody TcMenu menu, @AuthenticationPrincipal LoginVO user){ - ResultVO resultVO = new ResultVO(); - if(user == null){ - resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode()); - }else { - if (!user.getUserSe().equals("ACC_TP01")) { - resultVO.setResultCode(ResponseCode.AUTH_ERROR.getCode()); - resultVO.setResultMessage(ResponseCode.AUTH_ERROR.getMessage()); - } else { - String result = adminConfigService.deleteMenu(menu.getMenuId(), user.getId()); - if(result==null){ - resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); - }else if(result.equals("notFind")){ - resultVO.setResultCode(ResponseCode.SAVE_ERROR.getCode()); - resultVO.setResultMessage("대상이 존재하지 않습니다."); - } - } - } - return resultVO; - } - - @Operation( - summary = "메뉴 권한 조회", - description = "메뉴 권한 조회", - tags = {"AdminConfigController"} - ) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "조회 성공"), - @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") - }) - @RequestMapping(method = RequestMethod.GET, value = "/menu-auth-mgt") - public ResultVO getMenuAuthMgt(){ - ResultVO resultVO = new ResultVO(); - Map resultMap = new HashMap<>(); - resultMap.put("menuList", adminConfigService.selectMenuAuthList()); - resultMap.put("roleList", commonCodeService.selectCodeItemList("ROLE")); - resultVO.setResult(resultMap); - return resultVO; - } - - @Operation( - summary = "메뉴 권한 수정", - description = "메뉴 권한 수정", - tags = {"AdminConfigController"} - ) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "수정 성공"), - @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") - }) - @RequestMapping(method = RequestMethod.PUT, value = "/menu-auth-mgt") - public ResultVO editMenuAuthMgt(@RequestBody TcMenu menu, @AuthenticationPrincipal LoginVO user){ - ResultVO resultVO = new ResultVO(); - if(user == null){ - resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode()); - }else { - if (!user.getUserSe().equals("ACC_TP01")) { - resultVO.setResultCode(ResponseCode.AUTH_ERROR.getCode()); - resultVO.setResultMessage(ResponseCode.AUTH_ERROR.getMessage()); - } else { - adminConfigService.editMenuAuth(menu); - resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); - } - } - return resultVO; - } - - @Operation( - summary = "'위원회 코드 관리' 페이지에서 목록 불러오는 API", - description = "관리자 단에서 '환경설정' > '위원회코드 관리' 페이지에서 목록 불러오는 API", - tags = {"AdminConfigController"} - ) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "조회 성공"), + @ApiResponse(responseCode = "200", description = "조 회 성공"), @ApiResponse(responseCode = "303", description = "만료된 토큰"), @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") }) - @GetMapping(value = "/committee-code-management") - public ResultVO getCommitteeCodeManagement( + @GetMapping(value = "/progress-status/list") + public ResultVO getCommitteeProgressStatus( @AuthenticationPrincipal LoginVO user, HttpServletRequest request, - @ApiParam(value="상위 code") @RequestParam(required=true) String paramCodeGroup, - @ApiParam(value="code level") @RequestParam(required=true) String paramCodeLevel + Pageable pageable ) throws Exception { ResultVO resultVO = new ResultVO(); @@ -380,11 +69,7 @@ public class AdminConfigController extends BaseController { resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode()); } else { try { - Long upCmtSeq = null; - if (!paramCodeGroup.equals("null")) { - upCmtSeq = Long.parseLong(paramCodeGroup); - } - resultVO = adminCommitteeCodeManagementService.getCommitteeCodeManagement(resultVO, request, user, upCmtSeq, paramCodeLevel); + resultVO = adminCommitteeProgressStatusService.getCommitteeProgressStatus(resultVO, request, user, pageable); } catch (Exception e) { resultVO.setResultCode(ResponseCode.FAILED.getCode()); resultVO.setResultMessage(e.getMessage()); @@ -404,203 +89,4 @@ public class AdminConfigController extends BaseController { } - @Operation( - summary = "'위원회 코드 관리' 페이지에서 위원회 코드 추가하는 API", - description = "관리자 단에서 '환경설정' > '위원회코드 관리' 페이지에서 +(추가) 버튼으로 항목 추가하는 API", - tags = {"AdminConfigController"} - ) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "조회 성공"), - @ApiResponse(responseCode = "303", description = "만료된 토큰"), - @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") - }) - @PostMapping(value = "/committee-code-management") - public ResultVO createCommitteeCodeManagement( - @AuthenticationPrincipal LoginVO user, - HttpServletRequest request, - CreateCommitteeCodeManagementVO createCommitteeCodeManagementVO - ) throws Exception { - - ResultVO resultVO = new ResultVO(); - if(user == null) { - resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode()); - } else { - try { - resultVO = adminCommitteeCodeManagementService.createCommitteeCodeManagement(resultVO, request, user, createCommitteeCodeManagementVO); - } catch (Exception e) { - resultVO.setResultCode(ResponseCode.FAILED.getCode()); - resultVO.setResultMessage(e.getMessage()); - } - } - - System.out.println( - "\n--------------------------------------------------------------\n" + - request.getRequestURI() + " OUT:" + - "\n--------------------------------------------------------------\n" + - "resultVO.toString():" + "\n" + - resultVO.toString() + "\n" + - "\n--------------------------------------------------------------\n" - ); - - return resultVO; - } - - @Operation( - summary = "'위원회 코드 관리' 페이지에서 위원회 코드 삭제하는 API", - description = "관리자 단에서 '환경설정' > '위원회코드 관리' 페이지에서 휴지통 모양 삭제 버튼으로 항목 삭제하는 API", - tags = {"AdminConfigController"} - ) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "등록 성공"), - @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") - }) - @DeleteMapping(value = "/committee-code-management/{orgId}") - public ResultVO deleteSchedule - ( - @AuthenticationPrincipal LoginVO user, - HttpServletRequest request, - @PathVariable("orgId") String strOrgId - ) throws Exception { - - ResultVO resultVO = new ResultVO(); - Long orgId = Long.valueOf(strOrgId); - try { - resultVO = adminCommitteeCodeManagementService.deleteCommitteeCodeManagement(resultVO, request, user, orgId); - } catch (Exception e) { - resultVO.setResultCode(ResponseCode.FAILED.getCode()); - resultVO.setResultMessage(e.getMessage()); - } - - - System.out.println( - "\n--------------------------------------------------------------\n" + - request.getRequestURI() + " OUT:" + - "\n--------------------------------------------------------------\n" + - "resultVO.toString():" + "\n" + - resultVO.toString() + "\n" + - "\n--------------------------------------------------------------\n" - ); - - return resultVO; - - } - - - /* ---- 관련사이트 관리 ----- */ - @Operation( - summary = "관련사이트 목록 조회", - description = "관련사이트 목록 조회", - tags = {"AdminConfigController"} - ) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "조회 성공"), - @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") - }) - @RequestMapping(method = RequestMethod.GET, value = "/partner-site-list", consumes = MediaType.APPLICATION_JSON_VALUE) - public ResultVO getPartnerSiteList() throws Exception { - ResultVO resultVO = new ResultVO(); - Map resultMap = new HashMap<>(); - - resultMap.put("partnerSiteList", adminConfigService.selectPartnerSiteList()); - resultVO.setResult(resultMap); - return resultVO; - } - - @Operation( - summary = "관련사이트 저장", - description = "관련사이트 저장", - tags = {"AdminConfigController"} - ) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "저장 성공"), - @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") - }) - @RequestMapping(method = RequestMethod.PUT, value = "/partner-site-mgt") - public ResultVO savePartnerSite(@RequestBody @Valid TnPartnerSite tnPartnerSite, Errors errors, @AuthenticationPrincipal LoginVO user) { - ResultVO resultVO = new ResultVO(); - if (user == null) { - resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode()); - } else { - if (errors.hasErrors()) { - StringBuilder msg = new StringBuilder(); - for (FieldError error : errors.getFieldErrors()) { - msg.append(error.getDefaultMessage()); - msg.append("\n"); - } - resultVO.setResultCode(ResponseCode.INPUT_CHECK_ERROR.getCode()); - resultVO.setResultMessage(msg.toString()); - } else { - System.out.println("@@@ bbs.getBbsSeq() : " + tnPartnerSite.getSiteSeq()); - adminConfigService.savePartnerSite(tnPartnerSite, user.getId()); - resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); - } - } - return resultVO; - } - - @Operation( - summary = "관련사이트 삭제", - description = "관련사이트 삭제", - tags = {"AdminConfigController"} - ) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "삭제 성공"), - @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") - }) - @RequestMapping(method = RequestMethod.DELETE, value = "/partner-site-mgt") - public ResultVO removePartnerSite(@RequestBody TnPartnerSite tnPartnerSite, @AuthenticationPrincipal LoginVO user) { - ResultVO resultVO = new ResultVO(); - if (user == null) { - resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode()); - } else { - String result = adminConfigService.deletePartnerSite(tnPartnerSite, user.getId()); - if (result == null) { - resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); - } else if (result.equals("notFind")) { - resultVO.setResultCode(ResponseCode.SAVE_ERROR.getCode()); - resultVO.setResultMessage("대상이 존재하지 않습니다."); - } - } - return resultVO; - } - - @Operation( - summary = "'위원회 코드 관리' 페이지에서 위원회 코드 수정하는 API", - description = "관리자 단에서 '환경설정' > '위원회코드 관리' 페이지에서 연필 모양 수정 버튼으로 항목 수정하는 API", - tags = {"AdminConfigController"} - ) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "등록 성공"), - @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님"), - }) - @PutMapping(value = "/committee-code-management/{orgId}") - public ResultVO setCommitteeCodeManagement( - HttpServletRequest request, - @AuthenticationPrincipal LoginVO loginVO, - SetCommitteeCodeManagementVO setCommitteeCodeManagementVO, - @PathVariable("orgId") Long orgId - ) throws Exception { - ResultVO resultVO = new ResultVO(); - - try { - resultVO = adminCommitteeCodeManagementService.setCommitteeCodeManagement(resultVO, request, loginVO, setCommitteeCodeManagementVO, orgId); - } catch (Exception e) { - resultVO.setResultCode(ResponseCode.FAILED.getCode()); - resultVO.setResultMessage(e.getMessage()); - } - - - System.out.println( - "\n--------------------------------------------------------------\n" + - request.getRequestURI() + " OUT:" + - "\n--------------------------------------------------------------\n" + - "resultVO.toString():" + "\n" + - resultVO.toString() + "\n" + - "\n--------------------------------------------------------------\n" - ); - - return resultVO; - - } - } diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/entity/TnCmtDraft.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/entity/TnCmtDraft.java index 22e0205..981b507 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/entity/TnCmtDraft.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/entity/TnCmtDraft.java @@ -1,14 +1,10 @@ -package com.dbnt.kcscbackend.admin.config.entity; +package com.dbnt.kcscbackend.admin.committee.entity; import lombok.*; import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicUpdate; -import org.springframework.format.annotation.DateTimeFormat; import javax.persistence.*; -import javax.validation.constraints.NotBlank; -import java.io.Serializable; -import java.time.LocalDateTime; @Getter @Setter @@ -16,24 +12,82 @@ import java.time.LocalDateTime; @NoArgsConstructor @DynamicInsert @DynamicUpdate -@Table(name = "tb_menu_role") -@IdClass(TbMenuRole.TbMenuRoleId.class) -public class TbMenuRole { - @Id - @Column(name = "role_id") - private String roleId; - @Id - @Column(name = "menu_id") - private String menuId; - @Column(name = "write_yn") - private String writeYn; +@Table(name = "tn_cmt_draft") +public class TnCmtDraft { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "drft_seq") + private Long drftSeq; + + @Column(name = "drft_title") + private String drftTitle; + + @Column(name = "doc_info_seq") + private Long docInfoSeq; + + @Column(name = "drft_type_cd") + private String drftTypeCd; + + @Column(name = "drft_dt") + private String drftDt; + + @Column(name = "cmt_seq") + private Long cmtSeq; + + @Column(name = "measure_pre_data_file_grp_id") + private String measurePreDataFileGrpId; + + @Column(name = "measure_pre_form_file_grp_id") + private String measurePreFormFileGrpId; + + @Column(name = "measure_partner_file_grp_id") + private String measurePartnerFileGrpId; + + @Column(name = "drft_confe_charger") + private String drftConfeCharger; + + @Column(name = "drft_confe_pw") + private String drftConfePw; + + @Column(name = "drft_confe_room") + private String drftConfeRoom; + + @Column(name = "drft_stat_cd") + private String drftStatCd; + + @Column(name = "drft_summery") + private String drftSummery; + + @Column(name = "measure_plan_file_grp_id") + private String measurePlanFileGrpId; + + @Column(name = "measure_result_file_grp_id") + private String measureResultFileGrpId; + + @Column(name = "start_dt") + private String startDt; + + @Column(name = "end_dt") + private String endDt; + + @Column(name = "frst_crt_id") + private String frstCrtId; + + @Column(name = "frst_crt_dt") + private String frstCrtDt; + + @Column(name = "last_chg_id") + private String lastChgId; + + @Column(name = "last_chg_dt") + private String lastChgDt; + + @Column(name = "use_yn") + private String useYn; + + @Column(name = "old_seq") + private Long oldSeq; + - @Embeddable - @Data - @NoArgsConstructor - @AllArgsConstructor - public static class TbMenuRoleId implements Serializable { - private String roleId; - private String menuId; - } } diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/entity/TnCmtDraftAttend.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/entity/TnCmtDraftAttend.java index ef8e53f..e34f4ef 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/entity/TnCmtDraftAttend.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/entity/TnCmtDraftAttend.java @@ -1,6 +1,8 @@ package com.dbnt.kcscbackend.admin.committee.entity; -import lombok.*; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicUpdate; @@ -12,82 +14,33 @@ import javax.persistence.*; @NoArgsConstructor @DynamicInsert @DynamicUpdate -@Table(name = "tn_cmt_draft") -public class TnCmtDraft { +@Table(name = "tn_cmt_draft_attend") +public class TnCmtDraftAttend { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "drft_atd_seq") + private Long drftAtdSeq; + @Column(name = "drft_seq") - private String drftSeq; + private Long drftSeq; - @Column(name = "drft_title") - private String drftTitle; + @Column(name = "drft_final_type") + private String drftFinalType; - @Column(name = "doc_info_seq") - private String docInfoSeq; + @Column(name = "drft_final_comment") + private String drftFinalComment; - @Column(name = "drft_type_cd") - private String drftTypeCd; + @Column(name = "user_id") + private String userId; - @Column(name = "drft_dt") - private String drftDt; + @Column(name = "nick_name") + private String nickName; - @Column(name = "cmt_seq") - private String cmtSeq; - - @Column(name = "measure_pre_data_file_grp_id") - private String measurePreDataFileGrpId; - - @Column(name = "measure_pre_form_file_grp_id") - private String measurePreFormFileGrpId; - - @Column(name = "measure_partner_file_grp_id") - private String measurePartnerFileGrpId; - - @Column(name = "drft_confe_charger") - private String drftConfeCharger; - - @Column(name = "drft_confe_pw") - private String drftConfePw; - - @Column(name = "drft_confe_room") - private String drftConfeRoom; - - @Column(name = "drft_stat_cd") - private String drftStatCd; - - @Column(name = "drft_summery") - private String drftSummery; - - @Column(name = "measure_plan_file_grp_id") - private String measurePlanFileGrpId; - - @Column(name = "measure_result_file_grp_id") - private String measureResultFileGrpId; - - @Column(name = "start_dt") - private String startDt; - - @Column(name = "end_dt") - private String endDt; - - @Column(name = "frst_crt_id") - private String frstCrtId; - - @Column(name = "frst_crt_dt") - private String frstCrtDt; - - @Column(name = "last_chg_id") - private String lastChgId; - - @Column(name = "last_chg_dt") - private String lastChgDt; - - @Column(name = "use_yn") - private String useYn; - - @Column(name = "old_seq") - private String oldSeq; + @Column(name = "write_dt") + private String writeDt; + @Column(name = "drft_file_grp_id") + private String drftFileGrpId; } diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/entity/TnCmtDraftDetail.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/entity/TnCmtDraftDetail.java index e34f4ef..b3865c6 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/entity/TnCmtDraftDetail.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/entity/TnCmtDraftDetail.java @@ -14,22 +14,22 @@ import javax.persistence.*; @NoArgsConstructor @DynamicInsert @DynamicUpdate -@Table(name = "tn_cmt_draft_attend") -public class TnCmtDraftAttend { +@Table(name = "tn_cmt_draft_detail") +public class TnCmtDraftDetail { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "drft_atd_seq") - private Long drftAtdSeq; + @Column(name = "drft_dt_seq") + private Long drftDtSeq; @Column(name = "drft_seq") private Long drftSeq; - @Column(name = "drft_final_type") - private String drftFinalType; + @Column(name = "drft_dt_type") + private String drftDtType; - @Column(name = "drft_final_comment") - private String drftFinalComment; + @Column(name = "drft_dt_value") + private String drftDtValue; @Column(name = "user_id") private String userId; diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/service/AdminCommitteeProgressStatusService.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/service/AdminCommitteeProgressStatusService.java index 88112ac..be7a069 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/service/AdminCommitteeProgressStatusService.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/service/AdminCommitteeProgressStatusService.java @@ -1,23 +1,18 @@ -package com.dbnt.kcscbackend.admin.config.service; +package com.dbnt.kcscbackend.admin.committee.service; import com.dbnt.kcscbackend.admin.config.model.CreateCommitteeCodeManagementVO; import com.dbnt.kcscbackend.admin.config.model.SetCommitteeCodeManagementVO; -import com.dbnt.kcscbackend.admin.standardResearch.model.CreateStandardResearchVO; -import com.dbnt.kcscbackend.admin.standardResearch.model.UpdateStandardResearchVO; import com.dbnt.kcscbackend.auth.entity.LoginVO; import com.dbnt.kcscbackend.config.common.ResultVO; -import io.swagger.annotations.ApiParam; import org.springframework.data.domain.Pageable; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.multipart.MultipartHttpServletRequest; import javax.servlet.http.HttpServletRequest; -public interface AdminCommitteeCodeManagementService { - public ResultVO createCommitteeCodeManagement(ResultVO resultVO, HttpServletRequest request, LoginVO user, CreateCommitteeCodeManagementVO createCommitteeCodeManagementVO) throws Exception; - public ResultVO getCommitteeCodeManagement(ResultVO resultVO, HttpServletRequest request, LoginVO user, Long upCmtSeq, String cmtType) throws Exception; - public ResultVO setCommitteeCodeManagement(ResultVO resultVO, HttpServletRequest request, LoginVO user, SetCommitteeCodeManagementVO setCommitteeCodeManagementVO, Long cmtSeq) throws Exception; - public ResultVO deleteCommitteeCodeManagement(ResultVO resultVO, HttpServletRequest request, LoginVO user, Long cmtSeq) throws Exception; +public interface AdminCommitteeProgressStatusService { + public ResultVO createCommitteeProgressStatus(ResultVO resultVO, HttpServletRequest request, LoginVO user, CreateCommitteeCodeManagementVO createCommitteeCodeManagementVO) throws Exception; + public ResultVO getCommitteeProgressStatus(ResultVO resultVO, HttpServletRequest request, LoginVO user, Pageable pageable) throws Exception; + public ResultVO setCommitteeProgressStatus(ResultVO resultVO, HttpServletRequest request, LoginVO user, SetCommitteeCodeManagementVO setCommitteeCodeManagementVO, Long cmtSeq) throws Exception; + public ResultVO deleteCommitteeProgressStatus(ResultVO resultVO, HttpServletRequest request, LoginVO user, Long cmtSeq) throws Exception; } \ No newline at end of file diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/service/impl/AdminCommitteeProgressStatusServiceImpl.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/service/impl/AdminCommitteeProgressStatusServiceImpl.java index 24a6cbf..d90dce0 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/service/impl/AdminCommitteeProgressStatusServiceImpl.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/committee/service/impl/AdminCommitteeProgressStatusServiceImpl.java @@ -1,38 +1,38 @@ -package com.dbnt.kcscbackend.admin.config.service.impl; +package com.dbnt.kcscbackend.admin.committee.service.impl; +import com.dbnt.kcscbackend.admin.committee.entity.TnCmtDraft; +import com.dbnt.kcscbackend.admin.committee.entity.TnCmtDraftAttend; +import com.dbnt.kcscbackend.admin.committee.service.AdminCommitteeProgressStatusService; import com.dbnt.kcscbackend.admin.config.model.CreateCommitteeCodeManagementVO; import com.dbnt.kcscbackend.admin.config.model.SetCommitteeCodeManagementVO; -import com.dbnt.kcscbackend.admin.config.service.AdminCommitteeCodeManagementService; -import com.dbnt.kcscbackend.admin.standardResearch.model.CreateStandardResearchVO; -import com.dbnt.kcscbackend.admin.standardResearch.model.UpdateStandardResearchVO; +import com.dbnt.kcscbackend.admin.contents.popUp.model.FileVO; import com.dbnt.kcscbackend.auth.entity.LoginVO; -import com.dbnt.kcscbackend.commonCode.entity.TnCmtOrg; -import com.dbnt.kcscbackend.commonCode.repository.TnCmtOrgRepository; +import com.dbnt.kcscbackend.commonCode.repository.TnCmtDraftAttendRepository; +import com.dbnt.kcscbackend.commonCode.repository.TnCmtDraftDetailRepository; +import com.dbnt.kcscbackend.commonCode.repository.TnCmtDraftRepository; import com.dbnt.kcscbackend.config.common.ResponseCode; import com.dbnt.kcscbackend.config.common.ResultVO; import lombok.RequiredArgsConstructor; import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl; import org.egovframe.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; import org.springframework.data.domain.Pageable; -import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartHttpServletRequest; import javax.servlet.http.HttpServletRequest; -import java.time.format.DateTimeFormatter; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; -@Service("adminCommitteeCodeManagementService") +@Service("adminCommitteeProgressStatusService") @RequiredArgsConstructor -public class AdminCommitteeCodeManagementServiceImpl extends EgovAbstractServiceImpl implements AdminCommitteeCodeManagementService { +public class AdminCommitteeProgressStatusServiceImpl extends EgovAbstractServiceImpl implements AdminCommitteeProgressStatusService { - private final TnCmtOrgRepository tnCmtOrgRepository; + private final TnCmtDraftRepository tnCmtDraftRepository; + private final TnCmtDraftAttendRepository tnCmtDraftAttendRepository; + private final TnCmtDraftDetailRepository tnCmtDraftDetailRepository; @Override - public ResultVO createCommitteeCodeManagement(ResultVO resultVO, HttpServletRequest request, LoginVO user, CreateCommitteeCodeManagementVO createCommitteeCodeManagementVO) throws Exception { + public ResultVO createCommitteeProgressStatus(ResultVO resultVO, HttpServletRequest request, LoginVO user, CreateCommitteeCodeManagementVO createCommitteeCodeManagementVO) throws Exception { System.out.println( "\n--------------------------------------------------------------\n" + request.getRequestURI() + " IN:" + @@ -47,17 +47,24 @@ public class AdminCommitteeCodeManagementServiceImpl extends EgovAbstractService if(createCommitteeCodeManagementVO.getParamCodeLevel().trim().isEmpty()) { throw new Exception("오류가 발생했습니다. 시스템 담당자에게 문의 바랍니다. paramCodeLevel is empty."); } - Integer upCmtSeq = null; - if( createCommitteeCodeManagementVO.getParamOrgId().trim().equals("00") == false ) { // 00은 '중앙건설기술심의' 항목의 부모 sequnce이다. 그러나 DB에 실제 00이란 sequence는 존재하지 않는다. - upCmtSeq = Integer.parseInt(createCommitteeCodeManagementVO.getParamOrgId()); - } - Map response = tnCmtOrgRepository.spAddTnCmtOrg( + Map response = tnCmtDraftRepository.spAddTnCmtDraft( createCommitteeCodeManagementVO.getParamOrgNm(), // 위원회 이름 - createCommitteeCodeManagementVO.getParamCodeLevel(), // 위원회 등급 + null, // 위원회 등급 createCommitteeCodeManagementVO.getParamOrgDesc(), // 위원회 설명 - upCmtSeq, // 상위 위원회 sequence - 1, // 정렬 순서 + null, // 상위 위원회 sequence + null, // 정렬 순서 + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, user.getId(), null, null, @@ -76,7 +83,7 @@ public class AdminCommitteeCodeManagementServiceImpl extends EgovAbstractService } @Override - public ResultVO getCommitteeCodeManagement(ResultVO resultVO, HttpServletRequest request, LoginVO user, Long upCmtSeq, String cmtType) throws Exception { + public ResultVO getCommitteeProgressStatus(ResultVO resultVO, HttpServletRequest request, LoginVO user, Pageable pageable) throws Exception { System.out.println( "\n--------------------------------------------------------------\n" + @@ -84,23 +91,38 @@ public class AdminCommitteeCodeManagementServiceImpl extends EgovAbstractService "\n--------------------------------------------------------------\n" + "user.getEmail():" + "\n" + user.getEmail() + "\n" + + "pageable.getPageSize():" + "\n" + + pageable.getPageSize() + "\n" + + "pageable.getPageNumber():" + "\n" + + pageable.getPageNumber() + "\n" + "\n--------------------------------------------------------------\n" ); - List> list = tnCmtOrgRepository.findByUseYnAndUpCmtSeqAndCmtTypeOrderByCmtOrder("Y", upCmtSeq, cmtType).stream() - .map(item -> { - Map returnMap = new HashMap<>(); - returnMap.put("orgId", item.getCmtSeq()); - returnMap.put("orgNm", item.getCmtNm()); - returnMap.put("orgDesc", item.getCmtDesc()); - returnMap.put("omtOrder", item.getCmtOrder()); - returnMap.put("upCmtSeq", item.getUpCmtSeq()); - return returnMap; - }) - .collect(Collectors.toList()); + + List> list = new ArrayList<>(); + long totalRecordCount = tnCmtDraftRepository.findByUseYnOrderByDrftSeqDesc("Y").size(); + List> itemList = tnCmtDraftRepository.getCommitteeProgressStatus(pageable.getPageSize(),pageable.getPageNumber()); + AtomicInteger index = new AtomicInteger(); + for (Map item : itemList) { + + Map item2 = new HashMap<>(); + for (String key : item.keySet()) { + item2.put(key, item.get(key)); + } + item2.put("number", totalRecordCount - (long) pageable.getPageNumber() * pageable.getPageSize() - index.getAndIncrement()); + list.add(item2); + } + + PaginationInfo paginationInfo = new PaginationInfo(); + paginationInfo.setCurrentPageNo(pageable.getPageNumber()+1); + paginationInfo.setRecordCountPerPage(pageable.getPageSize()); + paginationInfo.setPageSize(5);//hard coded + paginationInfo.setTotalRecordCount((int) totalRecordCount); Map dto = new HashMap(); + dto.put("list", list); + dto.put("paginationInfo", paginationInfo); resultVO.setResult(dto); resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage()); @@ -109,7 +131,7 @@ public class AdminCommitteeCodeManagementServiceImpl extends EgovAbstractService } @Override - public ResultVO setCommitteeCodeManagement(ResultVO resultVO, HttpServletRequest request, LoginVO user, SetCommitteeCodeManagementVO setCommitteeCodeManagementVO, Long cmtSeq) throws Exception { + public ResultVO setCommitteeProgressStatus(ResultVO resultVO, HttpServletRequest request, LoginVO user, SetCommitteeCodeManagementVO setCommitteeCodeManagementVO, Long cmtSeq) throws Exception { System.out.println( "\n--------------------------------------------------------------\n" + request.getRequestURI() + " IN:" + @@ -122,23 +144,37 @@ public class AdminCommitteeCodeManagementServiceImpl extends EgovAbstractService ); // 유효성 검사 실시 - int isValid = tnCmtOrgRepository.spIsValidTnCmtOrgId(cmtSeq.intValue()); + int isValid = tnCmtDraftRepository.spIsValidTnCmtDraftId(cmtSeq.intValue()); if( isValid == 0 ) { throw new Exception("대상이 존재하지 않습니다."); } - TnCmtOrg tnCmtOrg = tnCmtOrgRepository.findByCmtSeq(cmtSeq); + //TnCmtDraft tnCmtDraft = tnCmtDraftRepository.findByDrftSeq(cmtSeq); - Map response = tnCmtOrgRepository.spUpdateTnCmtOrg( + Map response = tnCmtDraftRepository.spUpdateTnCmtDraft( cmtSeq.intValue(), setCommitteeCodeManagementVO.getParamOrgNm(), - setCommitteeCodeManagementVO.getParamOrgDesc(), - tnCmtOrg.getCmtOrder(), - user.getId(), - null, - null, - null + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + user.getId(), + null, + null, + null ); @@ -154,7 +190,7 @@ public class AdminCommitteeCodeManagementServiceImpl extends EgovAbstractService } @Override - public ResultVO deleteCommitteeCodeManagement(ResultVO resultVO, HttpServletRequest request, LoginVO user, Long cmtSeq) throws Exception { + public ResultVO deleteCommitteeProgressStatus(ResultVO resultVO, HttpServletRequest request, LoginVO user, Long cmtSeq) throws Exception { System.out.println( "\n--------------------------------------------------------------\n" + request.getRequestURI() + " IN:" + @@ -165,7 +201,7 @@ public class AdminCommitteeCodeManagementServiceImpl extends EgovAbstractService ); - Map response = tnCmtOrgRepository.spDeleteTnCmtOrg( + Map response = tnCmtDraftRepository.spDeleteTnCmtDraft( cmtSeq.intValue(), user.getId(), null, @@ -173,9 +209,6 @@ public class AdminCommitteeCodeManagementServiceImpl extends EgovAbstractService null ); - // 자식 코드들을 모두 제거한다. - getChildrenOrg(user, cmtSeq); - Map dto = new HashMap(); dto.put("errorMessage", response.get("_error_message") ); @@ -188,22 +221,4 @@ public class AdminCommitteeCodeManagementServiceImpl extends EgovAbstractService return resultVO; } - private void getChildrenOrg(LoginVO user, Long upCmtSeq) { - List> list = tnCmtOrgRepository.findByUpCmtSeq(upCmtSeq).stream() - .map(item -> { - Map returnMap = new HashMap<>(); - returnMap.put("cmtSeq", item.getCmtSeq()); - getChildrenOrg( user, item.getCmtSeq() ); - Map response = tnCmtOrgRepository.spDeleteTnCmtOrg( - item.getCmtSeq().intValue(), - user.getId(), - null, - null, - null - ); - return returnMap; - }).collect(Collectors.toList()); - - System.out.println("for Debugging"); - } } diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnCmtDraftAttendRepository.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnCmtDraftAttendRepository.java index e670e98..c16f630 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnCmtDraftAttendRepository.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnCmtDraftAttendRepository.java @@ -1,5 +1,6 @@ package com.dbnt.kcscbackend.commonCode.repository; +import com.dbnt.kcscbackend.admin.committee.entity.TnCmtDraftAttend; import com.dbnt.kcscbackend.commonCode.entity.TnPopupMng; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -8,8 +9,8 @@ import org.springframework.data.repository.query.Param; import java.util.Map; - -public interface TnCmtDraftRepository extends JpaRepository { +/** 작성 중 ...*/ +public interface TnCmtDraftAttendRepository extends JpaRepository { @Query(value = "CALL sp_add_tn_popup_mng (" + ":_popup_title, " + @@ -94,7 +95,7 @@ public interface TnCmtDraftRepository extends JpaRepository { @Procedure("sp_is_valid_tn_popup_mng_id") int spIsValidTnPopupMngId( Integer popupSeq ); - TnPopupMng findByPopupSeq(Long popupSeq); + TnCmtDraftAttend findByDrftAtdSeq(Long drftAtdSeq); } diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnCmtDraftDetailRepository.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnCmtDraftDetailRepository.java index e983ca1..d57f4fc 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnCmtDraftDetailRepository.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/commonCode/repository/TnCmtDraftDetailRepository.java @@ -1,5 +1,6 @@ package com.dbnt.kcscbackend.commonCode.repository; +import com.dbnt.kcscbackend.admin.committee.entity.TnCmtDraftDetail; import com.dbnt.kcscbackend.commonCode.entity.TnPopupMng; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -8,8 +9,8 @@ import org.springframework.data.repository.query.Param; import java.util.Map; - -public interface TnCmtDraftAttendRepository extends JpaRepository { +/** 작성 중 ...*/ +public interface TnCmtDraftDetailRepository extends JpaRepository { @Query(value = "CALL sp_add_tn_popup_mng (" + ":_popup_title, " + @@ -94,7 +95,7 @@ public interface TnCmtDraftAttendRepository extends JpaRepository { +public interface TnCmtDraftRepository extends JpaRepository { - @Query(value = "CALL sp_add_tn_popup_mng (" + - ":_popup_title, " + - "TO_TIMESTAMP(" + - " :_popup_start_date," + - " 'YYYYMMDDHH24MISS'" + - ")::::timestamptz AT TIME ZONE 'UTC', " + - "TO_TIMESTAMP(" + - " :_popup_end_date," + - " 'YYYYMMDDHH24MISS'" + - ")::::timestamptz AT TIME ZONE 'UTC', " + - ":_file_grp_id, " + - ":_popup_contents, " + + @Query(value = "CALL sp_add_tn_cmt_draft (" + + ":_drft_title, " + + ":_drft_type_cd, " + + ":_drft_dt, " + + ":_cmt_seq, " + + ":_measure_pre_data_file_grp_id, " + + ":_measure_pre_form_file_grp_id, " + + ":_measure_partner_file_grp_id, " + + ":_drft_confe_charger, " + + ":_drft_confe_pw, " + + ":_drft_confe_room, " + + ":_drft_stat_cd, " + + ":_drft_summery, " + + ":_measure_plan_file_grp_id, " + + ":_measure_result_file_grp_id, " + + ":_start_dt, " + + ":_end_dt, " + ":_modi_id, " + - ":_popup_seq, " + + ":_drft_seq, " + ":_result_count, " + ":_result_code, " + ":_error_message)", nativeQuery = true) - Map spAddTnPopupMng( - @Param("_popup_title") String popupTitle, - @Param("_popup_start_date") String popupStartDate, - @Param("_popup_end_date") String popupEndDate, - @Param("_file_grp_id") String fileGrpId, - @Param("_popup_contents") String popupContents, - @Param("_modi_id") String modiId, - @Param("_popup_seq") Integer popupSeq, - @Param("_result_count") Integer resultCount, - @Param("_result_code") String resultCode, - @Param("_error_message") String errorMessage + Map spAddTnCmtDraft( + @Param("_drft_title") String drftTitle, + @Param("_drft_type_cd") Integer drftTypeCd, + @Param("_drft_dt") String drftDt, + @Param("_cmt_seq") Integer cmtSeq, + @Param("_measure_pre_data_file_grp_id") String measurePreDataFileGrpId, + @Param("_measure_pre_form_file_grp_id") String measurePreFormFileGrpId, + @Param("_measure_partner_file_grp_id") String measurePartnerFileGrpId, + @Param("_drft_confe_charger") String drftConfeCharger, + @Param("_drft_confe_pw") String drftConfePw, + @Param("_drft_confe_room") String drftConfeRoom, + @Param("_drft_stat_cd") String drftStatCd, + @Param("_drft_summery") String drftSummery, + @Param("_measure_plan_file_grp_id") String measurePlanFileGrpId, + @Param("_measure_result_file_grp_id") String measureResultFileGrpId, + @Param("_start_dt") String startDt, + @Param("_end_dt") String endDt, + @Param("_modi_id") String modiId, + @Param("_drft_seq") Integer drftSeq, + @Param("_result_count") Integer resultCount, + @Param("_result_code") String resultCode, + @Param("_error_message") String errorMessage ); - @Query(value = "CALL sp_update_tn_popup_mng (" + - ":_popup_seq, " + - ":_popup_title, " + - "TO_TIMESTAMP(" + - " :_popup_start_date," + - " 'YYYYMMDDHH24MISS'" + - ")::::timestamptz AT TIME ZONE 'UTC', " + - "TO_TIMESTAMP(" + - " :_popup_end_date," + - " 'YYYYMMDDHH24MISS'" + - ")::::timestamptz AT TIME ZONE 'UTC', " + - ":_file_grp_id, " + - ":_popup_contents, " + + @Query(value = "CALL sp_update_tn_cmt_draft (" + + ":_drft_seq, " + + ":_drft_title, " + + ":_doc_info_seq, " + + ":_drft_type_cd, " + + ":_drft_dt, " + + ":_cmt_seq, " + + ":_measure_pre_data_file_grp_id, " + + ":_measure_pre_form_file_grp_id, " + + ":_measure_partner_file_grp_id, " + + ":_drft_confe_charger, " + + ":_drft_confe_pw, " + + ":_drft_confe_room, " + + ":_drft_stat_cd, " + + ":_drft_summery, " + + ":_measure_plan_file_grp_id, " + + ":_measure_result_file_grp_id, " + + ":_start_dt, " + + ":_end_dt, " + ":_modi_id, " + ":_result_count, " + ":_result_code, " + ":_error_message)", nativeQuery = true) - Map spUpdateTnPopupMng( - @Param("_popup_seq") Integer popupSeq, - @Param("_popup_title") String popupTitle, - @Param("_popup_start_date") String popupStartDate, - @Param("_popup_end_date") String popupEndDate, - @Param("_file_grp_id") String fileGrpId, - @Param("_popup_contents") String popupContents, - @Param("_modi_id") String modiId, - @Param("_result_count") Integer resultCount, - @Param("_result_code") String resultCode, - @Param("_error_message") String errorMessage + Map spUpdateTnCmtDraft( + @Param("_drft_seq") Integer drftSeq, + @Param("_drft_title") String drftTitle, + @Param("_doc_info_seq") Integer docInfoSeq, + @Param("_drft_type_cd") String drftTypeCd, + @Param("_drft_dt") String drftDt, + @Param("_cmt_seq") Integer cmtSeq, + @Param("_measure_pre_data_file_grp_id") String measurePreDataFileGrpId, + @Param("_measure_pre_form_file_grp_id") String measurePreFormFileGrpId, + @Param("_measure_partner_file_grp_id") String measurePartnerFileGrpId, + @Param("_drft_confe_charger") String drftConfeCharger, + @Param("_drft_confe_pw") String drftConfePw, + @Param("_drft_confe_room") String drftConfeRoom, + @Param("_drft_stat_cd") String drftStatCd, + @Param("_drft_summery") String drftSummery, + @Param("_measure_plan_file_grp_id") String measurePlanFileGrpId, + @Param("_measure_result_file_grp_id") String measureResultFileGrpId, + @Param("_start_dt") String startDt, + @Param("_end_dt") String endDt, + @Param("_modi_id") String modiId, + @Param("_result_count") Integer resultCount, + @Param("_result_code") String resultCode, + @Param("_error_message") String errorMessage ); - @Query(value = "CALL sp_delete_tn_popup_mng (" + - ":_popup_seq, " + + @Query(value = "CALL sp_delete_tn_cmt_draft (" + + ":_drft_seq, " + ":_modi_id, " + ":_result_count, " + ":_result_code, " + ":_error_message)", nativeQuery = true) - Map spDeleteTnPopupMng( - @Param("_popup_seq") Integer popupSeq, + Map spDeleteTnCmtDraft( + @Param("_drft_seq") Integer drftSeq, @Param("_modi_id") String modiId, @Param("_result_count") Integer resultCount, @Param("_result_code") String resultCode, @@ -93,10 +127,86 @@ public interface TnPopupMngRepository extends JpaRepository { ); - @Procedure("sp_is_valid_tn_popup_mng_id") - int spIsValidTnPopupMngId( Integer popupSeq ); + @Procedure("sp_is_valid_tn_cmt_draft_id") + int spIsValidTnCmtDraftId( Integer drftSeq ); - TnPopupMng findByPopupSeq(Long popupSeq); + TnCmtDraft findByDrftSeq(Long drftSeq); + List findByUseYnOrderByDrftSeqDesc(String useYn); + + + @Query(value = + "select " + + " tcd.drft_seq as \"seq\", " + + " tcd.doc_info_seq as \"categoryId\", " + + " tcd.drft_dt as \"drftDatetime\", " + + " tcd.drft_title as \"title\", " + + " null as \"drftCharger\", " + + " null as \"drftChargerEmail\", " + + " null as \"drftChargerPhone\", " + + " null as \"drftStatCode\", " + + " tcd.drft_type_cd as \"drftTypeCode\", " + + " tcd.cmt_seq as \"orgId\", " + + " null as \"startDatetime\", " + + " null as \"endDatetime\", " + + " null as \"closeDatetime\", " + + " tcd.frst_crt_dt as \"createDate\", " + + " tcd.last_chg_dt as \"updateDate\", " + + " null as \"createUserId\", " + + " null as \"updateUserId\", " + + " case when UPPER(tcd.use_yn) = 'Y' then 'N' else 'Y' end as \"delYn\", " + + " tcd.drft_summery as \"drftSummery\", " + + " tcd.drft_confe_charger as \"drftConfeCharger\", " + + " tcd.drft_confe_pw as \"drftConfePw\", " + + " tcd.drft_confe_room as \"drftConfeRoom\", " + + " null as \"drftMeasurePlanFileSeq\", " + + " null as \"drftMeasureResultFileSeq\", " + + " null as \"drftMeasurePlanFileName\", " + + " null as \"drftMeasureResultFileName\", " + + " null as \"drftMeasurePreDataFileName\", " + + " null as \"drftMeasurePreDataFileSeq\", " + + " null as \"drftMeasurePreFormFileName\", " + + " null as \"drftMeasurePreFormFileSeq\", " + + " null as \"drftMeasurePartnerFileName\", " + + " null as \"drftMeasurePartnerFileSeq\", " + + " null as \"drftProcess\", " + + " ( " + + " select tci.item_nm " + + " from tc_code_item tci " + + " where tci.item_cd = tcd.drft_type_cd " + + " limit 1 offset 0 " + + " ) as \"drftTypeNm\", " + + " concat(tdi.kcsc_cd, ' ', tdi.doc_nm) as \"categoryNm\", " + + " tco.cmt_nm as \"orgNm\", " + + " ( " + + " select tci.item_nm " + + " from tc_code_item tci " + + " where tci.item_cd = tcd.drft_stat_cd " + + " limit 1 offset 0 " + + " ) as \"drftStatNm\", " + + " null as \"categoryInfo\", " + + " null as \"orgType\", " + + " null as \"upOrgId\", " + + " null as \"orgList\", " + + " null as \"orgList1\", " + + " null as \"orgList2\", " + + " null as \"orgList3\", " + + " null as \"depthOrgId\", " + + " null as \"depthOrgId1\", " + + " null as \"depthOrgId2\", " + + " null as \"depthOrgId3\", " + + " to_char(tcd.frst_crt_dt, 'yyyy-mm-dd') as \"regDate\" " + + "from tn_cmt_draft tcd " + + "left join tn_document_info tdi on tcd.doc_info_seq = tdi.doc_info_seq " + + "left join tn_document_group tdg on tdi.group_seq = tdg.group_seq " + + "left join tn_cmt_org tco on tcd.cmt_seq = tco.cmt_seq " + + "where tcd.use_yn = 'Y' " + + "order by tcd.drft_seq desc " + + "limit :limit offset :limit * :offset", + nativeQuery = true) + List> getCommitteeProgressStatus( + @Param("limit") Integer limit, + @Param("offset") Integer offset + ); } From 9fd00518a535eb860b9afb9d2e5fb8fa9634b09c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EB=AF=BC=ED=98=95?= Date: Thu, 7 Mar 2024 17:57:35 +0900 Subject: [PATCH 4/5] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=ED=8C=90=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/admin/board/AdminPostMgtEdit.jsx | 187 ++++++++++++++++++ .../pages/admin/board/AdminPostMgtList.jsx | 94 +++++---- .../pages/admin/board/EgovAdminBoardEdit.jsx | 111 ++++++++++- .../src/pages/admin/boards/List.jsx | 10 +- .../src/pages/admin/config/AboutSiteMgt.jsx | 10 +- .../admin/boards/AdminBoardsController.java | 25 ++- .../admin/boards/entity/TnBbs.java | 6 + .../boards/service/AdminBoardsService.java | 10 +- 8 files changed, 393 insertions(+), 60 deletions(-) create mode 100644 egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtEdit.jsx diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtEdit.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtEdit.jsx new file mode 100644 index 0000000..0335671 --- /dev/null +++ b/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtEdit.jsx @@ -0,0 +1,187 @@ +import React, {useState, useEffect, useRef} from 'react'; +import {Link, useNavigate, useLocation, useParams} from 'react-router-dom'; +import Modal from "react-bootstrap/Modal"; + +import * as EgovNet from 'api/egovFetch'; +import URL from 'constants/url'; +import CODE from 'constants/code'; + +import {default as EgovLeftNav} from 'components/leftmenu/EgovLeftNavAdmin'; +import EgovRadioButtonGroup from 'components/EgovRadioButtonGroup'; +import {Form} from "react-bootstrap"; + + +function AdminPostMgtEdit({props, reloadFunction}) { + console.group("AdminPostMgtEdit"); + console.log("[Start] AdminPostMgtEdit ------------------------------"); + console.log("AdminPostMgtEdit [props] : ", props); + + const navigate = useNavigate(); + const location = useLocation(); + const checkRef = useRef([]); + + console.log("AdminPostMgtEdit [location] : ", location); + + let item = null; + item = props; + console.log("@@@ item : " + JSON.stringify(item)); + + const [modeInfo, setModeInfo] = useState(item != null ? {mode: props.mode} : {mode: CODE.MODE_CREATE}); + const [boardDetail, setBoardDetail] = useState({}); + console.log("@@@ mode : " + modeInfo.mode); + + useEffect(() => { + initMode(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const initMode = () => { + if (modeInfo.mode === CODE.MODE_MODIFY) { + setBoardDetail(item); + } + } + + function editPartnerSite(e) { + e.preventDefault(); + e.stopPropagation(); + const form = e.target; + const info = { + siteTitle: form.siteTitle.value, + siteUrl: form.siteUrl.value, + fileGrpId: form.fileGrpId.value, + siteOrder: form.siteOrder.value, + useYn: form.useYn.value + } + if (modeInfo.mode === CODE.MODE_MODIFY) { + info.siteSeq = props.siteSeq; + } + EgovNet.requestFetch( + '/admin/config/partner-site-mgt', + { + method: "PUT", + headers: { + 'Content-type': 'application/json' + }, + body: JSON.stringify(info) + }, + (resp) => { + if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) { + alert("저장되었습니다."); + reloadFunction(); + } else if (Number(resp.resultCode) === Number(CODE.RCV_ERROR_AUTH)) { + console.log("토큰 갱신중.") + } else { + alert(resp.result.resultMessage) + } + } + ) + } + + function deletePartnerSite(partnerSite){ + if(window.confirm("삭제하시겠습니까?")) { + EgovNet.requestFetch( + '/admin/config/partner-site-mgt', + { + method: "DELETE", + headers: { + 'Content-type': 'application/json' + }, + body: JSON.stringify(partnerSite) + }, + (resp) => { + if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) { + alert("삭제되었습니다.") + reloadFunction(); + } else if (Number(resp.resultCode) === Number(CODE.RCV_ERROR_AUTH)) { + console.log("토큰 갱신중.") + } else { + alert(resp.result.resultMessage) + } + } + ) + } + } + + console.log("------------------------------AdminPostMgtEdit [End]"); + console.groupEnd("AdminPostMgtEdit"); + + const [defaultFixedYn, setDefaultFixedYn] = useState(props?.fixedYn || "N"); + + return ( + <> + {/* */} + + + {modeInfo.mode === CODE.MODE_CREATE && '글 작성'} + {modeInfo.mode === CODE.MODE_MODIFY && '글 수정'} + + + + +
+
{editPartnerSite(e)}} noValidate> +
+
필수
+
+ setDefaultFixedYn(e.target.checked ? 'Y' : 'N')} + /> +
+
+
+
필수
+
+ +
+
+
+
필수
+
+ +
+
+
+
필수
+
+ +
+
+
+
필수
+
+ +
+
+ + {/* */} +
+
+ + {modeInfo.mode === CODE.MODE_MODIFY && + + } +
+ +
+ +
+
+ {/* */} +
+
+
+ + + ); +} + +export default AdminPostMgtEdit; \ No newline at end of file diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtList.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtList.jsx index 36b6e2b..4f65a0d 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtList.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/board/AdminPostMgtList.jsx @@ -8,14 +8,18 @@ import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin'; import EgovPaging from 'components/EgovPaging'; import { itemIdxByPage } from 'utils/calc'; +import CODE from "../../../constants/code"; +import AboutSiteModal from "../config/aboutSiteMgt/AboutSiteModal"; +import AdminPostMgtEdit from "./AdminPostMgtEdit"; +import Modal from "react-bootstrap/Modal"; function AdminPostMgtList(props) { - console.group("EgovAdminBoardList"); - console.log("[Start] EgovAdminBoardList ------------------------------"); - console.log("EgovAdminBoardList [props] : ", props); + console.group("EgovAdminPostList"); + console.log("[Start] EgovAdminPostList ------------------------------"); + console.log("EgovAdminPostList [props] : ", props); const location = useLocation(); - console.log("EgovAdminBoardList [location] : ", location); + console.log("EgovAdminPostList [location] : ", location); // eslint-disable-next-line no-unused-vars const [searchCondition, setSearchCondition] = useState(location.state?.searchCondition || { pageIndex: 1, searchCnd: '0', searchWrd: '' });// 기존 조회에서 접근 했을 시 || 신규로 접근 했을 시 @@ -26,18 +30,23 @@ function AdminPostMgtList(props) { const [listTag, setListTag] = useState([]); - const retrieveList = useCallback((srchCnd) => { - console.groupCollapsed("EgovAdminBoardList.retrieveList()"); + const [show, setShow] = useState(false); + const [modalBody, setModalBody] = useState(); + const handleClose = () => setShow(false); + const handleShow = () => setShow(true); - const retrieveListURL = '/cop/bbs/selectBBSMasterInfsAPI.do'; + const retrieveList = useCallback(() => { + console.groupCollapsed("EgovAdminPostList.retrieveList()"); + + const retrieveListURL = '/admin/boards/post-list'; const requestOptions = { - method: "POST", + method: "GET", headers: { 'Content-type': 'application/json', }, - body: JSON.stringify(srchCnd) + body: JSON.stringify() } EgovNet.requestFetch(retrieveListURL, @@ -48,31 +57,19 @@ function AdminPostMgtList(props) { let mutListTag = []; listTag.push(

검색된 결과가 없습니다.

); // 게시판 목록 초기값 - const resultCnt = parseInt(resp.result.resultCnt); - const currentPageNo = resp.result.paginationInfo.currentPageNo; - const pageSize = resp.result.paginationInfo.pageSize; - // 리스트 항목 구성 - resp.result.resultList.forEach(function (item, index) { + resp.result.postList.forEach(function (item, index) { if (index === 0) mutListTag = []; // 목록 초기화 - const listIdx = itemIdxByPage(resultCnt , currentPageNo, pageSize, index); mutListTag.push( - -
{listIdx}
-
{item.bbsNm}
-
{item.bbsTyCodeNm}
-
{item.bbsAttrbCodeNm}
-
{item.frstRegisterPnttm}
-
{item.useAt === "Y" ? "사용" : "사용안함"}
- +
+
{item.bbsContSeq}
+
{item.bbsSeq}
+
{item.bbsContTitle}
+
{item.bbsContents}
+
{item.bbsReadCnt}
+
{item.bbsContLevel}
+
); }); @@ -82,7 +79,7 @@ function AdminPostMgtList(props) { console.log("err response : ", resp); } ); - console.groupEnd("EgovAdminBoardList.retrieveList()"); + console.groupEnd("EgovAdminPostList.retrieveList()"); },[listTag, searchCondition]); useEffect(() => { @@ -90,8 +87,16 @@ function AdminPostMgtList(props) { // eslint-disable-next-line react-hooks/exhaustive-deps }, []); - console.log("------------------------------EgovAdminBoardList [End]"); - console.groupEnd("EgovAdminBoardList"); + function editPost(item){ + handleShow(); + if(item != undefined) { + item.mode = CODE.MODE_MODIFY; + } + setModalBody() + } + + console.log("------------------------------EgovAdminPostList [End]"); + console.groupEnd("EgovAdminPostList"); return (
@@ -99,7 +104,8 @@ function AdminPostMgtList(props) {
  • Home
  • -
  • 사이트관리
  • +
  • 사이트관리
  • +
  • 게시판현황
  • 게시물 관리
@@ -114,11 +120,9 @@ function AdminPostMgtList(props) { {/* */}
-

사이트관리

+

게시물 관리

-

게시물 관리

- {/* */}
    @@ -159,12 +163,13 @@ function AdminPostMgtList(props) { {/* */}
    - 번호 - 게시판명 - 게시판유형 - 게시판속성 - 생성일 - 사용여부 + + 제목 + 작성자 + 작성일 + 조회수 + 파일 +
    {listTag} @@ -184,6 +189,9 @@ function AdminPostMgtList(props) {
+ + {modalBody} +
diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/board/EgovAdminBoardEdit.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/board/EgovAdminBoardEdit.jsx index 1051483..eb120ad 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/board/EgovAdminBoardEdit.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/board/EgovAdminBoardEdit.jsx @@ -1,4 +1,4 @@ -import React, {useState, useEffect, useRef} from 'react'; +import React, {useState, useEffect, useRef, useCallback} from 'react'; import {Link, useNavigate, useLocation, useParams} from 'react-router-dom'; import Modal from "react-bootstrap/Modal"; @@ -30,7 +30,35 @@ function EgovAdminBoardEdit({props, reloadFunction}) { const [boardDetail, setBoardDetail] = useState({}); console.log("@@@ mode : " + modeInfo.mode); + const [bbsTypeList, setBbsTypeList] = useState([]); + const [roleList, setRoleList] = useState([]); + + const retrieveList = useCallback(() => { + const retrieveListURL = '/admin/boards/get-option-list'; + + const requestOptions = { + method: "GET", + headers: { + 'Content-type': 'application/json', + }, + body: JSON.stringify() + } + + EgovNet.requestFetch(retrieveListURL, + requestOptions, + (resp) => { + setBbsTypeList(resp.result.bbsTypeList); + setRoleList(resp.result.roleList); + console.log("@@@ bbsTypeList : " + JSON.stringify(resp.result.bbsTypeList)); + }, + function (resp) { + console.log("err response : ", resp); + } + ); + },[]); + useEffect(() => { + retrieveList(); initMode(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); @@ -48,7 +76,13 @@ function EgovAdminBoardEdit({props, reloadFunction}) { const info = { bbsId: form.bbsId.value, bbsTitle: form.bbsTitle.value, - bbsDesc: form.bbsDesc.value + bbsDesc: form.bbsDesc.value, + bbsType: form.bbsType.value, + bbsAnsYn: bbsAnsYn, + bbsReplYn: bbsReplYn, + useYn: useYn, + readRole: form.readRole.value, + writeRole: form.writeRole.value } if (modeInfo.mode === CODE.MODE_MODIFY) { info.bbsSeq = props.bbsSeq; @@ -103,6 +137,10 @@ function EgovAdminBoardEdit({props, reloadFunction}) { console.log("------------------------------EgovAdminBoardEdit [End]"); console.groupEnd("EgovAdminBoardEdit"); + const [bbsAnsYn, setBbsAnsYn] = useState(props?.bbsAnsYn || "N"); + const [bbsReplYn, setBbsReplYn] = useState(props?.bbsReplYn || "N"); + const [useYn, setUseYn] = useState(props?.useYn || "N"); + return ( <> {/* */} @@ -137,6 +175,75 @@ function EgovAdminBoardEdit({props, reloadFunction}) { defaultValue={props?.bbsDesc}/> +
+
필수
+
+ + + {bbsTypeList.map((item) => ( + + ))} + +
+
+
+
필수
+
+ setBbsAnsYn(e.target.checked ? 'Y' : 'N')} + /> +
+
+
+
필수
+
+ setBbsReplYn(e.target.checked ? 'Y' : 'N')} + /> +
+
+
+
필수
+
+ setUseYn(e.target.checked ? 'Y' : 'N')} + /> +
+
+
+
필수
+
+ + + {roleList.map((item) => ( + + ))} + +
+
+
+
필수
+
+ + + {roleList.map((item) => ( + + ))} + +
+
{/* */}
diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/boards/List.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/boards/List.jsx index fe4318e..2a1381b 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/boards/List.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/boards/List.jsx @@ -56,7 +56,7 @@ function EgovAdminBoardList(props) { mutListTag.push(
-
{item.bbsSeq}
+
{item.bbsId}
{item.bbsTitle}
{item.frstCrtId}
@@ -99,7 +99,8 @@ function EgovAdminBoardList(props) {
  • Home
  • -
  • 사이트관리
  • +
  • 사이트관리
  • +
  • 게시판현황
  • 게시판 관리
@@ -114,10 +115,9 @@ function EgovAdminBoardList(props) { {/* */}
-

사이트관리

+

게시판 관리

-

게시판 관리

{/* */} {/*
@@ -159,7 +159,7 @@ function EgovAdminBoardList(props) { {/* */}
- 번호 + 아이디 제목 작성자 diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/config/AboutSiteMgt.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/config/AboutSiteMgt.jsx index 0003462..3bf6bab 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/config/AboutSiteMgt.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/config/AboutSiteMgt.jsx @@ -50,13 +50,13 @@ function StandardCodeMgt(props) { mutListTag.push(
-
{item.siteSeq}
+
{item.siteTitle}
{item.siteUrl}
{item.fileGrpId}
{item.siteOrder}
{item.useYn}
-
+
); }); @@ -76,7 +76,7 @@ function StandardCodeMgt(props) { // eslint-disable-next-line react-hooks/exhaustive-deps }, []); - function editBoard(item){ + function editPartnerSite(item){ handleShow(); if(item != undefined) { item.mode = CODE.MODE_MODIFY; @@ -147,13 +147,13 @@ function StandardCodeMgt(props) { {/* */}
- 번호 + 사이트명 URL 배너이미지 정렬순서 사용여부 - +
{listTag} diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/AdminBoardsController.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/AdminBoardsController.java index 9215a7b..1a2ec86 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/AdminBoardsController.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/AdminBoardsController.java @@ -4,6 +4,8 @@ import com.dbnt.kcscbackend.admin.boards.entity.TnBbs; import com.dbnt.kcscbackend.admin.boards.service.AdminBoardsService; import com.dbnt.kcscbackend.admin.config.entity.TcMenu; import com.dbnt.kcscbackend.auth.entity.LoginVO; +import com.dbnt.kcscbackend.commonCode.CommonCodeController; +import com.dbnt.kcscbackend.commonCode.service.CommonCodeService; import com.dbnt.kcscbackend.config.common.BaseController; import com.dbnt.kcscbackend.config.common.ResponseCode; import com.dbnt.kcscbackend.config.common.ResultVO; @@ -32,6 +34,7 @@ import java.util.Map; public class AdminBoardsController extends BaseController { private final AdminBoardsService adminBoardsService; + private final CommonCodeService commonCodeService; /* ---- 게시판관리 ----- */ @Operation( @@ -53,6 +56,26 @@ public class AdminBoardsController extends BaseController { return resultVO; } + @Operation( + summary = "게시판 셀렉트박스 옵션 조회", + description = "게시판 셀렉트박스 옵션 조회", + tags = {"AdminBoardsController"} + ) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "조회 성공"), + @ApiResponse(responseCode = "403", description = "인가된 사용자가 아님") + }) + @RequestMapping(method = RequestMethod.GET, value = "/get-option-list", consumes = MediaType.APPLICATION_JSON_VALUE) + public ResultVO getOptionList() throws Exception { + ResultVO resultVO = new ResultVO(); + Map resultMap = new HashMap<>(); + + resultMap.put("bbsTypeList", commonCodeService.selectCodeItemList("BBS_TYPE")); + resultMap.put("roleList", commonCodeService.selectCodeItemList("ROLE")); + resultVO.setResult(resultMap); + return resultVO; + } + @Operation( summary = "게시판 저장", description = "게시판 저장", @@ -126,7 +149,7 @@ public class AdminBoardsController extends BaseController { ResultVO resultVO = new ResultVO(); Map resultMap = new HashMap<>(); - resultMap.put("boardList", adminBoardsService.selectBoardList()); + resultMap.put("postList", adminBoardsService.selectPostList()); resultVO.setResult(resultMap); return resultVO; } diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/entity/TnBbs.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/entity/TnBbs.java index f91277a..1226a05 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/entity/TnBbs.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/entity/TnBbs.java @@ -70,4 +70,10 @@ public class TnBbs { @Column(name = "oldd_seq") private Long olddSeq; + @Column(name = "read_role") + private Long readRole; + + @Column(name = "write_role") + private Long writeRole; + } \ No newline at end of file diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/service/AdminBoardsService.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/service/AdminBoardsService.java index 48a4bca..796d21f 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/service/AdminBoardsService.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/service/AdminBoardsService.java @@ -34,16 +34,18 @@ public class AdminBoardsService extends EgovAbstractServiceImpl { if (bbs.getBbsSeq() == null) { bbs.setFrstCrtDt(LocalDateTime.now()); bbs.setFrstCrtId(userId); - bbs.setBbsAnsYn("N"); - bbs.setBbsReplYn("N"); - bbs.setUseYn("Y"); tnBbsRepository.save(bbs); } else { TnBbs savedBoard = tnBbsRepository.findById(bbs.getBbsSeq()).orElse(null); savedBoard.setBbsId(bbs.getBbsId()); savedBoard.setBbsTitle(bbs.getBbsTitle()); savedBoard.setBbsDesc(bbs.getBbsDesc()); - //savedBoard.setUseYn("Y"); + savedBoard.setBbsType(bbs.getBbsType()); + savedBoard.setBbsAnsYn(bbs.getBbsAnsYn()); + savedBoard.setBbsReplYn(bbs.getBbsReplYn()); + savedBoard.setUseYn(bbs.getUseYn()); + savedBoard.setReadRole(bbs.getReadRole()); + savedBoard.setWriteRole(bbs.getWriteRole()); savedBoard.setLastChgId(userId); savedBoard.setLastChgDt(LocalDateTime.now()); tnBbsRepository.save(savedBoard); From 4c5567f6ae114a5ab2f47aafd2cb7d57433f5026 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EB=AF=BC=ED=98=95?= Date: Thu, 7 Mar 2024 18:01:27 +0900 Subject: [PATCH 5/5] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=ED=8C=90=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20useYn=EC=97=90=20=EC=83=81=EA=B4=80=EC=97=86?= =?UTF-8?q?=EC=9D=B4=20=EC=B6=9C=EB=A0=A5=EB=90=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kcscbackend/admin/boards/repository/TnBbsRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/repository/TnBbsRepository.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/repository/TnBbsRepository.java index 5291413..874c5f0 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/repository/TnBbsRepository.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/boards/repository/TnBbsRepository.java @@ -8,7 +8,7 @@ import java.util.List; public interface TnBbsRepository extends JpaRepository { - @Query(value = "SELECT * FROM tn_bbs WHERE use_yn = 'Y' ORDER BY bbs_seq DESC", nativeQuery = true) + @Query(value = "SELECT * FROM tn_bbs ORDER BY bbs_seq DESC", nativeQuery = true) List findAllByOrderByBbsSeqDesc(); }