From efd35230c10e5c892c947ab79e42a7e8369d2388 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EC=84=9D=20=EC=B5=9C?= Date: Fri, 8 Mar 2024 18:01:14 +0900 Subject: [PATCH] =?UTF-8?q?=ED=97=A4=EB=8D=94=20=EB=A9=94=EB=89=B4=20?= =?UTF-8?q?=EC=84=A0=ED=83=9D=20=ED=9B=84=20=EB=8B=AB=ED=9E=88=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95.=20=EC=84=A4=EB=AC=B8=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20=EC=9E=91=EC=97=85=EC=A4=91.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/EgovHeader.jsx | 5 +- .../src/pages/admin/contents/Survey.jsx | 35 ++++++-- .../admin/contents/survey/QuestionModal.jsx | 47 ++++++++-- .../admin/contents/survey/SurveyModal.jsx | 90 ++++++++++++------- .../survey/AdminSurveyController.java | 46 ++++++++-- .../contents/survey/entity/TnSurvey.java | 11 ++- .../contents/survey/entity/TnSurveyQt.java | 1 + .../survey/entity/TnSurveyQtItem.java | 6 +- .../survey/service/AdminSurveyService.java | 34 +++++++ 9 files changed, 210 insertions(+), 65 deletions(-) diff --git a/egovframe-template-simple-react-contribution/src/components/EgovHeader.jsx b/egovframe-template-simple-react-contribution/src/components/EgovHeader.jsx index ef899bb..4937059 100644 --- a/egovframe-template-simple-react-contribution/src/components/EgovHeader.jsx +++ b/egovframe-template-simple-react-contribution/src/components/EgovHeader.jsx @@ -1,4 +1,4 @@ -import React, {useState} from 'react'; +import React, {useEffect, useState} from 'react'; import { Link, NavLink, useNavigate } from 'react-router-dom'; import * as EgovNet from 'api/egovFetch'; @@ -64,6 +64,9 @@ function EgovHeader({ loginUser, onChangeLogin }) { console.log("------------------------------EgovHeader [End]"); console.groupEnd("EgovHeader"); + useEffect(() => { + setMenuDiv(false); + }, [navigate]); return ( diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/contents/Survey.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/contents/Survey.jsx index c4cad4f..530d364 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/contents/Survey.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/contents/Survey.jsx @@ -1,13 +1,13 @@ import React, {useCallback, useEffect, useState} from 'react'; import { Link } from 'react-router-dom'; - import URL from 'constants/url'; - import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin'; -import * as EgovNet from "../../../api/egovFetch"; +import * as EgovNet from "api/egovFetch"; import Modal from "react-bootstrap/Modal"; +import Form from "react-bootstrap/Form"; import SurveyModal from "./survey/SurveyModal"; import QuestionModal from "./survey/QuestionModal"; +import CODE from "../../../constants/code"; function Survey({}) { @@ -38,15 +38,12 @@ function Survey({}) {
{item.svyTitle}
{item.svyStartDt}~{item.svyEndDt}
-
+
editUseYn(item.svySeq)}/>
-
- -
); }); @@ -59,6 +56,29 @@ function Survey({}) { ); },[]); + function editUseYn(svySeq){ + EgovNet.requestFetch( + '/admin/survey/info-use-yn', + { + method: "PUT", + headers: { + 'Content-type': 'application/json' + }, + body: JSON.stringify({svySeq:svySeq}) + }, + (resp) => { + if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) { + alert("저장되었습니다.") + retrieveList(); + }else{ + alert(resp.resultMessage) + } + } + ) + } + + + function editSurvey(item){ handleShow(); setModalSize("md") @@ -103,7 +123,6 @@ function Survey({}) { 사용여부 설문지 보기 통계 보기 -
diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/contents/survey/QuestionModal.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/contents/survey/QuestionModal.jsx index 7cc790d..3ef8bc8 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/contents/survey/QuestionModal.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/contents/survey/QuestionModal.jsx @@ -10,10 +10,11 @@ function QuestionModal({svySeq}){ const [qtList, setQtList] = useState([]); const [selectedQt, setSelectedQt] = useState(null); + const [tempSeq, setTempSeq] = useState(1); function getSurveyQt(){ EgovNet.requestFetch( - '/admin/survey/edit-qt?svySeq='+svySeq, + '/admin/survey/info-qt?svySeq='+svySeq, { method: "GET" }, @@ -27,7 +28,20 @@ function QuestionModal({svySeq}){ } function addQt(){ - + const temp = [...qtList] + temp.push({ + qtSeq: null, + tempSeq: tempSeq, + svySeq: svySeq, + qtTitle: '', + qtDesc: '', + qtType: '', + maxNo: '', + etcYn: '', + itemList:[] + }) + setQtList(temp); + setTempSeq(tempSeq+1); } function addItem(){ @@ -42,6 +56,20 @@ function QuestionModal({svySeq}){ getSurveyQt() }, []); + useEffect(() => { + const tempQt = [...qtList]; + tempQt.forEach(function (qt, index){ + if(qt.qtSeq === null){ + if(qt.tempSeq === selectedQt.tempSeq){ + qt = selectedQt; + } + }else if(qt.qtSeq === selectedQt.qtSeq){ + qt = selectedQt; + } + }) + setQtList(tempQt); + }, [selectedQt]); + return ( <> @@ -76,7 +104,7 @@ function QuestionModal({svySeq}){ - + 질문유형 @@ -93,13 +121,13 @@ function QuestionModal({svySeq}){ 최대 선택 개수 - + {setSelectedQt({...selectedQt, maxNo:e.target.value})}}/> 기타 여부 - + {setSelectedQt({...selectedQt, etcYn:e.target.checked?'Y':'N'})}}/> @@ -109,11 +137,16 @@ function QuestionModal({svySeq}){ - {selectedQt?.itemList.map(item=>{ + {selectedQt?.itemList.map((item, index)=>{ return ( ); diff --git a/egovframe-template-simple-react-contribution/src/pages/admin/contents/survey/SurveyModal.jsx b/egovframe-template-simple-react-contribution/src/pages/admin/contents/survey/SurveyModal.jsx index 2858270..0234b73 100644 --- a/egovframe-template-simple-react-contribution/src/pages/admin/contents/survey/SurveyModal.jsx +++ b/egovframe-template-simple-react-contribution/src/pages/admin/contents/survey/SurveyModal.jsx @@ -1,41 +1,61 @@ -import React from "react"; +import React, {useEffect, useState} from "react"; import Modal from "react-bootstrap/Modal"; import Form from "react-bootstrap/Form"; import Row from "react-bootstrap/Row"; import Col from "react-bootstrap/Col"; import * as EgovNet from "api/egovFetch"; import CODE from "constants/code"; +import DatePicker from "react-datepicker"; function SurveyModal({savedInfo, reloadFunction}){ + const [survey, setSurvey] = useState({ + svySeq: savedInfo?savedInfo.svySeq:null, + svyTitle: savedInfo?savedInfo.svyTitle:'', + svyDesc: savedInfo?savedInfo.svyDesc:'', + svyStartDt: savedInfo?new Date(savedInfo.svyStartDt):new Date(), + svyEndDt: savedInfo?new Date(savedInfo.svyEndDt):new Date(), + }) + function editSurvey(e){ e.preventDefault(); e.stopPropagation(); - const form = e.target; - const info = { - menuId: form.menuId.value, - menuTitle: form.menuTitle.value, - menuGroup: form.menuGroup.value, - menuLevel: form.menuLevel.value, - menuSort: form.menuSort.value, - menuUrl: form.menuUrl.value, - menuTypeCd: form.menuTypeCd.value, - } EgovNet.requestFetch( - '/admin/config/menu-mgt', + '/admin/survey/info', { method: "PUT", headers: { 'Content-type': 'application/json' }, - body: JSON.stringify(info) + body: JSON.stringify(survey) }, (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.resultMessage) + } + } + ) + } + + function deleteSurvey(e,svySeq){ + e.preventDefault(); + e.stopPropagation(); + EgovNet.requestFetch( + '/admin/survey/info', + { + method: "DELETE", + headers: { + 'Content-type': 'application/json' + }, + body: JSON.stringify({svySeq:svySeq}) + }, + (resp) => { + if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) { + alert("삭제되었습니다.") + reloadFunction(); }else{ alert(resp.resultMessage) } @@ -57,7 +77,8 @@ function SurveyModal({savedInfo, reloadFunction}){ 제목 - + {setSurvey({...survey, svyTitle:e.target.value})}}/> @@ -65,37 +86,38 @@ function SurveyModal({savedInfo, reloadFunction}){ 설명 - + {setSurvey({...survey, svyDesc:e.target.value})}}/> - 시작일 + 설문기간 - + { + const [start, end] = dates; + setSurvey({...survey, svyStartDt:start, svyEndDt: end}) + }}/> - - 종료일 + + * 목록에서 사용 여부를 변경해야 설문이 노출됩니다. - - - - - - - 첨부파일 - - - - - + {survey.svySeq? + + + + :''} + - + diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/AdminSurveyController.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/AdminSurveyController.java index a39ce99..091f153 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/AdminSurveyController.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/AdminSurveyController.java @@ -3,15 +3,20 @@ package com.dbnt.kcscbackend.admin.contents.survey; import com.dbnt.kcscbackend.admin.contents.survey.entity.TnSurvey; import com.dbnt.kcscbackend.admin.contents.survey.service.AdminSurveyService; import com.dbnt.kcscbackend.auth.entity.LoginVO; +import com.dbnt.kcscbackend.config.common.ResponseCode; import com.dbnt.kcscbackend.config.common.ResultVO; import lombok.RequiredArgsConstructor; import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.validation.Errors; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; import java.util.HashMap; import java.util.Map; @@ -32,17 +37,44 @@ public class AdminSurveyController { return resultVO; } - @RequestMapping(method = RequestMethod.GET, value = "/edit") - public ResultVO surveyEdit(TnSurvey survey) throws Exception{ - + @RequestMapping(method = RequestMethod.PUT, value = "/info") + public ResultVO surveyEdit(@RequestBody @Valid TnSurvey survey, Errors errors, @AuthenticationPrincipal LoginVO user) throws Exception{ ResultVO resultVO = new ResultVO(); - Map resultMap = new HashMap<>(); - resultMap.put("survey", adminSurveyService.selectSurvey(survey)); - resultVO.setResult(resultMap); + 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 { + adminSurveyService.insertSurvey(survey, user.getId()); + resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); + resultVO.setResultMessage("저장 되었습니다."); + } return resultVO; } - @RequestMapping(method = RequestMethod.GET, value = "/edit-qt") + @RequestMapping(method = RequestMethod.DELETE, value = "/info") + public ResultVO surveyDelete(@RequestBody TnSurvey survey, @AuthenticationPrincipal LoginVO user) throws Exception{ + ResultVO resultVO = new ResultVO(); + adminSurveyService.deleteSurvey(survey.getSvySeq()); + resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); + resultVO.setResultMessage("저장 되었습니다."); + return resultVO; + } + + @RequestMapping(method = RequestMethod.PUT, value = "/info-use-yn") + public ResultVO surveyUseYn(@RequestBody TnSurvey survey, @AuthenticationPrincipal LoginVO user) throws Exception{ + ResultVO resultVO = new ResultVO(); + adminSurveyService.updateSurveyUseYn(survey.getSvySeq(), user.getId()); + resultVO.setResultCode(ResponseCode.SUCCESS.getCode()); + resultVO.setResultMessage("저장 되었습니다."); + return resultVO; + } + + @RequestMapping(method = RequestMethod.GET, value = "/info-qt") public ResultVO surveyEditQt(TnSurvey survey) throws Exception{ ResultVO resultVO = new ResultVO(); diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/entity/TnSurvey.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/entity/TnSurvey.java index 94832e1..b870f16 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/entity/TnSurvey.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/entity/TnSurvey.java @@ -5,11 +5,10 @@ import lombok.NoArgsConstructor; import lombok.Setter; import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicUpdate; +import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import javax.persistence.*; +import javax.validation.constraints.NotBlank; import java.time.LocalDate; import java.time.LocalDateTime; @@ -22,16 +21,20 @@ import java.time.LocalDateTime; @Table(name = "tn_survey") public class TnSurvey { @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "svy_seq") private Integer svySeq; @Column(name = "svy_title") + @NotBlank(message = "설문 제목을 입력해주세요.") private String svyTitle; @Column(name = "svy_desc") private String svyDesc; @Column(name = "svy_start_dt") + @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate svyStartDt; @Column(name = "svy_end_dt") + @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate svyEndDt; @Column(name = "file_grp_id") private String fileGrpId; diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/entity/TnSurveyQt.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/entity/TnSurveyQt.java index 28f0041..bc2a622 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/entity/TnSurveyQt.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/entity/TnSurveyQt.java @@ -21,6 +21,7 @@ import java.util.List; @Table(name = "tn_survey_qt") public class TnSurveyQt { @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "qt_seq") private Integer qtSeq; diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/entity/TnSurveyQtItem.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/entity/TnSurveyQtItem.java index c2e81a4..0cd9a93 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/entity/TnSurveyQtItem.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/entity/TnSurveyQtItem.java @@ -6,10 +6,7 @@ import lombok.Setter; import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicUpdate; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import javax.persistence.*; @Getter @Setter @@ -20,6 +17,7 @@ import javax.persistence.Table; @Table(name = "tn_survey_qt_item") public class TnSurveyQtItem { @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "qt_item_seq") private Integer qtItemSeq; diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/service/AdminSurveyService.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/service/AdminSurveyService.java index 8f1531b..657e8c2 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/service/AdminSurveyService.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/admin/contents/survey/service/AdminSurveyService.java @@ -8,7 +8,9 @@ import com.dbnt.kcscbackend.admin.contents.survey.repository.TnSurveyQtRepositor import com.dbnt.kcscbackend.admin.contents.survey.repository.TnSurveyRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @@ -43,4 +45,36 @@ public class AdminSurveyService { } return qtList; } + + @Transactional + public void insertSurvey(TnSurvey survey, String insertUser) { + if(survey.getSvySeq()==null){ + survey.setFrstCrtId(insertUser); + survey.setFrstCrtDt(LocalDateTime.now()); + survey.setUseYn("N"); + surveyRepository.save(survey); + }else{ + TnSurvey savedInfo = surveyRepository.findById(survey.getSvySeq()).orElse(null); + savedInfo.setSvyTitle(survey.getSvyTitle()); + savedInfo.setSvyDesc(survey.getSvyDesc()); + savedInfo.setSvyStartDt(survey.getSvyStartDt()); + savedInfo.setSvyEndDt(survey.getSvyEndDt()); + savedInfo.setLastChgId(insertUser); + savedInfo.setLastChgDt(LocalDateTime.now()); + surveyRepository.save(savedInfo); + } + } + + @Transactional + public void updateSurveyUseYn(Integer svySeq, String updateUser) { + TnSurvey savedInfo = surveyRepository.findById(svySeq).orElse(null); + savedInfo.setUseYn(savedInfo.getUseYn().equals("Y")?"N":"Y"); + savedInfo.setLastChgId(updateUser); + savedInfo.setLastChgDt(LocalDateTime.now()); + } + + @Transactional + public void deleteSurvey(Integer svySeq) { + surveyRepository.deleteById(svySeq); + } }
- + { + const qt = {...selectedQt} + qt.itemList[index].itemNm = e.target.value + setSelectedQt(qt); + }}/>