하석형 하석형 04-24
250424 하석형 만족도 조사 등록 기능 및 사용여부/조사여부에 따른 표시
@78c797e21e55bdea5d20715826d786cf5cb7793a
client/resources/api/menuDgstfn.js
--- client/resources/api/menuDgstfn.js
+++ client/resources/api/menuDgstfn.js
@@ -8,6 +8,10 @@
   return apiClient.post(`/admin/menuDgstfn/findAllByMenuId.json`, menuDgstfn);
 };
 
+export const findByMenuId = (menuDgstfn) => {
+  return apiClient.post(`/admin/menuDgstfn/findByMenuId.json`, menuDgstfn);
+};
+
 export const save = (menuDgstfn) => {
   return apiClient.post(`/admin/menuDgstfn/saveProc.json`, menuDgstfn);
 };
client/views/component/Breadcrumb/Breadcrumb.vue
--- client/views/component/Breadcrumb/Breadcrumb.vue
+++ client/views/component/Breadcrumb/Breadcrumb.vue
@@ -31,7 +31,7 @@
           this.generateBreadcrumb();
         }
       }
-    }
+    },
   },
   methods: {
     generateBreadcrumb() {
@@ -42,7 +42,10 @@
       const findFromTree = (menus, path, trail = []) => {
         for (const menu of menus) {
           const newTrail = [...trail, menu];
-          if (menu.routerUrl === path) return newTrail;
+          if (menu.routerUrl === path) {
+            this.$store.commit('setMenu', menu);
+            return newTrail;
+          }
           if (menu.childList?.length) {
             const found = findFromTree(menu.childList, path, newTrail);
             if (found) return found;
@@ -56,6 +59,8 @@
         const findCurrent = flatMenus.find(menu => menu.routerUrl === path);
         if (!findCurrent) return [];
 
+        this.$store.commit('setMenu', findCurrent);
+
         const buildTrail = (menu, trail = []) => {
           const parent = flatMenus.find(m => m.menuId === menu.upMenuId);
           if (parent) {
client/views/layout/menuSatisfaction.vue
--- client/views/layout/menuSatisfaction.vue
+++ client/views/layout/menuSatisfaction.vue
@@ -1,26 +1,47 @@
 <template>
     <div v-if="dgstfnExmnUseYn == 'Y'">
-        <label class="form-title">{{pgNm}} 만족도 조사</label>
-        <div class="check-area">
-            <div class="form-check">
-                <input type="radio" name="rspns" id="rspnsFive" class="mr5" v-model="menuDgstfn.rspnsFive"
-                    value="Y" />
-                <label for="rspnsFive">매우 만족</label>
+        <div v-if="rspnsYn == 'N'">
+            <label class="form-title">{{pgNm}} 만족도 조사</label>
+            <div class="check-area">
+                <div class="form-check">
+                    <input type="radio" name="rspns" id="rspnsFive" class="mr5" v-model="checkRspns"
+                        value="5" />
+                    <label for="rspnsFive">매우 만족</label>
+                </div>
+                <div class="form-check">
+                    <input type="radio" name="rspns" id="rspnsFour" class="mr5" v-model="checkRspns"
+                        value="4" />
+                    <label for="rspnsFour">만족</label>
+                </div>
+                <div class="form-check">
+                    <input type="radio" name="rspns" id="rspnsThree" class="mr5" v-model="checkRspns"
+                        value="3" />
+                    <label for="rspnsThree">보통</label>
+                </div>
+                <div class="form-check">
+                    <input type="radio" name="rspns" id="rspnsTwo" class="mr5" v-model="checkRspns"
+                        value="2" />
+                    <label for="rspnsTwo">불만족</label>
+                </div>
+                <div class="form-check">
+                    <input type="radio" name="rspns" id="rspnsOne" class="mr5" v-model="checkRspns"
+                        value="1" />
+                    <label for="rspnsOne">매우 불만족</label>
+                </div>
             </div>
-            <div class="form-check">
-                <input type="radio" name="rspns" id="rspnsFour" class="mr5" v-model="menuDgstfn.rspnsFour"
-                    value="Y" />
-                <label for="rspnsFour">만족</label>
+            <div class="layout">
+                <label class="form-title">의견</label>
+                <input
+                type="text"
+                class="form-control sm"
+                v-model="menuDgstfn.opnn"
+                placeholder="의견을 남겨주세요"
+                />
             </div>
+            <button class="btn sm" @click="save">제출</button>
         </div>
-        <div class="layout">
-            <label class="form-title">의견</label>
-            <input
-            type="text"
-            class="form-control sm"
-            v-model="menuDgstfn.opnn"
-            placeholder="의견을 남겨주세요"
-            />
+        <div v-else-if="rspnsYn == 'Y'">
+            <label class="form-title">설문에 참여해주셔서 감사합니다.</label>
         </div>
     </div>
     <div v-else>
@@ -31,7 +52,7 @@
 <script>
 import store from "../pages/AppStore";
 import { menuFindByMenu } from '../../resources/api/menu.js';
-import { save } from '../../resources/api/menuDgstfn.js';
+import { findByMenuId, save } from '../../resources/api/menuDgstfn.js';
 
 export default {
     data() {
@@ -40,23 +61,51 @@
             pgNm: store.state.menu && store.state.menu.menuNm ? store.state.menu.menuNm : "홈",
             menuId: null,
 
-            dgstfnExmnUseYn: "N", // 메뉴 사용 여부
-            // satisfaction: {}, // 만족도
-            menuDgstfn: {}, // 메뉴 만족도
+            dgstfnExmnUseYn: "N", // 메뉴 만족도 사용 여부
+            rspnsYn: 'N', // 응답 여부
+            checkRspns: '', // '5' ~ '1' 중 하나
+            menuDgstfn: {
+                rspnsFive: 'N',
+                rspnsFour: 'N',
+                rspnsThree: 'N',
+                rspnsTwo: 'N',
+                rspnsOne: 'N',
+                opnn: '', // 의견
+            }, // 메뉴 만족도
         }
     },
     created() {
-        this.fnView(store.state.menu.menuId);
     },
     methods: {
         // 상세 조회
         async fnView(menuId) {
             try {
-                const params = { menuId: menuId };
+                const params = { menuId: this.menuId };
                 const res = await menuFindByMenu(params);
                 if (res.status == 200) {
-                    console.log("메뉴상태: ", res.data.data);
                     this.dgstfnExmnUseYn = res.data.data.dgstfnExmnUseYn;
+                    if(res.data.data.dgstfnExmnUseYn == 'Y') {
+                        this.fnViewByMenuId();
+                    } else {
+                        this.dgstfnExmnUseYn = 'N';
+                    }
+                }
+            } catch (error) {
+                alert(error.response.data.message);
+            }
+        },
+
+        // 만족도 응답 이력 조회
+        async fnViewByMenuId() {
+            try {
+                const params = { menuId: this.menuId };
+                const res = await findByMenuId(params);
+                if (res.status == 200) {
+                    if(res.data.data != null) {
+                        this.rspnsYn = 'Y'; // 응답
+                    } else {
+                        this.rspnsYn = 'N'; // 미응답
+                    }
                 }
             } catch (error) {
                 alert(error.response.data.message);
@@ -66,14 +115,27 @@
         // 저장
         async save() {
             try {
+                this.checkRspnsVal(); // 응답 값 체크
+                this.menuDgstfn.menuId = this.menuId; // 메뉴 ID
                 const res = await save(this.menuDgstfn);
-                alert(res.data.message);
                 if (res.status == 200) {
+                    alert("설문에 참여해주셔서 감사합니다.");
+                    this.fnView(); // 메뉴 상세 조회
                 }
             } catch (error) {
                 alert(error.response.data.message);
             }
         },
+
+        // 선택 응답값 체크
+        checkRspnsVal () {
+            const rspnsVal = this.checkRspns;
+            this.menuDgstfn.rspnsFive = rspnsVal === '5' ? 'Y' : 'N';
+            this.menuDgstfn.rspnsFour = rspnsVal === '4' ? 'Y' : 'N';
+            this.menuDgstfn.rspnsThree = rspnsVal === '3' ? 'Y' : 'N';
+            this.menuDgstfn.rspnsTwo = rspnsVal === '2' ? 'Y' : 'N';
+            this.menuDgstfn.rspnsOne = rspnsVal === '1' ? 'Y' : 'N';
+        }
 
     },
     watch: {
@@ -81,12 +143,10 @@
             console.log(oldValue)
         },
         '$store.state.menu'(newValue) {
-            console.log("newValue : ", newValue);
             this.pgNm = newValue.menuNm
             this.menuId = newValue.menuId
-            this.fnView(this.menuId);
+            this.fnView();
         },
-
     },
     computed: {
 
client/views/pages/App.vue
--- client/views/pages/App.vue
+++ client/views/pages/App.vue
@@ -4,8 +4,9 @@
     <AdminMenu />
     <main class="main-wrap">
         <div :class="{'content-wrap': true, 'main': this.$route.path === this.$filters.ctxPath('/adm/main.page')}">
-          <!-- <MenuSatisfaction/> -->
+          <MenuSatisfaction/> <!-- 내용 확인용 -->
           <router-view />
+          <!-- <MenuSatisfaction/> --> <!-- 진짜 위치 -->
         </div>
     </main>
   </div> 
@@ -14,7 +15,7 @@
     <main class="main-wrap">
       <Breadcrumb v-if="$route.path !== this.$filters.ctxPath('/adm/main.page') && $route.path !== this.$filters.ctxPath('/main.page')" />
       <router-view />
-      <!-- <MenuSatisfaction/> -->
+      <MenuSatisfaction/>
     </main>
   </div>
 </template>
client/views/pages/AppStore.js
--- client/views/pages/AppStore.js
+++ client/views/pages/AppStore.js
@@ -4,7 +4,7 @@
 
 export default createStore({
   plugins: [createPersistedState({
-    paths: ['loginMode', 'authorization', 'mbrId', 'mbrNm', 'roles', 'contextPath']
+    paths: ['loginMode', 'authorization', 'mbrId', 'mbrNm', 'roles', 'contextPath', 'pageAuth']
   })],
   state: {
     authorization: null,
client/views/pages/adm/menuManagement/menuSatisfactionManagement/MenuSatisfactionSelectList.vue
--- client/views/pages/adm/menuManagement/menuSatisfactionManagement/MenuSatisfactionSelectList.vue
+++ client/views/pages/adm/menuManagement/menuSatisfactionManagement/MenuSatisfactionSelectList.vue
@@ -71,14 +71,14 @@
   data() {
     return {
       // 페이지 권한 객체
-   //   pageAuth: JSON.parse(localStorage.getItem("vuex")).pageAuth,
+      // pageAuth: JSON.parse(localStorage.getItem("vuex")).pageAuth,
       search: { ...defaultSearchParams },
       satisfaction: false,
       colgroup: ["30%", "10%", "10%", "10%", "10%", "10%", "10%", "10%"],
-      colgroup2: ["12%", "12%", "12%", "12%", "12%", "40%"],
+      colgroup2: ["8%", "12%", "12%", "12%", "12%", "12%", "32%"],
       thead: [
         "메뉴명",
-        "매우만족",
+        "매우 만족",
         "만족",
         "보통",
         "불만족",
@@ -87,7 +87,9 @@
         "상세보기",
       ],
       thead2: [
-        "매우만족",
+        "NO",
+        // "IP",
+        "매우 만족",
         "만족",
         "보통",
         "불만족",
@@ -133,7 +135,6 @@
         const res = await findAllByMenuId(params);
         if (res.status == 200) {
           this.menuStfndgList = res.data.data; // 메뉴별 만족도 목록
-          console.log("this.menuStfndgList : ", this.menuStfndgList);
           this.makeStfndgTbody();
         }
       } catch (error) {
@@ -158,7 +159,8 @@
     // 만족도 tbody 생성
     makeStfndgTbody() {
       this.stfndgTbody = [];
-      this.stfndgTbody = this.menuStfndgList.map((menuStfndg) => ({
+      this.stfndgTbody = this.menuStfndgList.map((menuStfndg, index) => ({
+        no: index + 1, // 번호
         // regIp: menuStfndg.regIp, // 등록IP
         rspnsFive: menuStfndg.rspnsFive, // 매우만족
         rspnsFour: menuStfndg.rspnsFour, // 만족
Add a comment
List