하석형 하석형 04-23
250423 하석형 메뉴 만족도 관리 페이지 구현, 만족도 조사 작업 중
@188a9201377e3406cdc78d3f3b6d34c5ee858c25
 
client/resources/api/menuDgstfn.js (added)
+++ client/resources/api/menuDgstfn.js
@@ -0,0 +1,13 @@
+import apiClient from "./index";
+
+export const findAll = () => {
+  return apiClient.get(`/admin/menuDgstfn/findAll.json`);
+};
+
+export const findAllByMenuId = (menuDgstfn) => {
+  return apiClient.post(`/admin/menuDgstfn/findAllByMenuId.json`, menuDgstfn);
+};
+
+export const save = (menuDgstfn) => {
+  return apiClient.post(`/admin/menuDgstfn/saveProc.json`, menuDgstfn);
+};
 
client/views/layout/menuSatisfaction.vue (added)
+++ client/views/layout/menuSatisfaction.vue
@@ -0,0 +1,102 @@
+<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>
+            <div class="form-check">
+                <input type="radio" name="rspns" id="rspnsFour" class="mr5" v-model="menuDgstfn.rspnsFour"
+                    value="Y" />
+                <label for="rspnsFour">만족</label>
+            </div>
+        </div>
+        <div class="layout">
+            <label class="form-title">의견</label>
+            <input
+            type="text"
+            class="form-control sm"
+            v-model="menuDgstfn.opnn"
+            placeholder="의견을 남겨주세요"
+            />
+        </div>
+    </div>
+    <div v-else>
+        <label class="form-title">[만족도 조사 비활성화 상태]</label>
+    </div>
+</template>
+
+<script>
+import store from "../pages/AppStore";
+import { menuFindByMenu } from '../../resources/api/menu.js';
+import { save } from '../../resources/api/menuDgstfn.js';
+
+export default {
+    data() {
+        return {
+            mbrNm: store.state.mbrNm,
+            pgNm: store.state.menu && store.state.menu.menuNm ? store.state.menu.menuNm : "홈",
+            menuId: null,
+
+            dgstfnExmnUseYn: "N", // 메뉴 사용 여부
+            // satisfaction: {}, // 만족도
+            menuDgstfn: {}, // 메뉴 만족도
+        }
+    },
+    created() {
+        this.fnView(store.state.menu.menuId);
+    },
+    methods: {
+        // 상세 조회
+        async fnView(menuId) {
+            try {
+                const params = { menuId: menuId };
+                const res = await menuFindByMenu(params);
+                if (res.status == 200) {
+                    console.log("메뉴상태: ", res.data.data);
+                    this.dgstfnExmnUseYn = res.data.data.dgstfnExmnUseYn;
+                }
+            } catch (error) {
+                alert(error.response.data.message);
+            }
+        },
+
+        // 저장
+        async save() {
+            try {
+                const res = await save(this.menuDgstfn);
+                alert(res.data.message);
+                if (res.status == 200) {
+                }
+            } catch (error) {
+                alert(error.response.data.message);
+            }
+        },
+
+    },
+    watch: {
+        'pgNm'(newValue, oldValue) {
+            console.log(oldValue)
+        },
+        '$store.state.menu'(newValue) {
+            console.log("newValue : ", newValue);
+            this.pgNm = newValue.menuNm
+            this.menuId = newValue.menuId
+            this.fnView(this.menuId);
+        },
+
+    },
+    computed: {
+
+        pgNm() {
+            return store.state.menu && store.state.menu.menuNm ? store.state.menu.menuNm : "홈";
+        }
+
+    },
+    mounted() {
+
+    }
+}
+</script>(파일 끝에 줄바꿈 문자 없음)
client/views/pages/App.vue
--- client/views/pages/App.vue
+++ client/views/pages/App.vue
@@ -4,6 +4,7 @@
     <AdminMenu />
     <main class="main-wrap">
         <div :class="{'content-wrap': true, 'main': this.$route.path === this.$filters.ctxPath('/adm/main.page')}">
+          <!-- <MenuSatisfaction/> -->
           <router-view />
         </div>
     </main>
@@ -13,6 +14,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/> -->
     </main>
   </div>
 </template>
@@ -22,6 +24,7 @@
 import AdminHeader from "../layout/AdminHeader.vue";
 import AdminMenu from "../layout/AdminMenu.vue";
 import Breadcrumb from "../component/Breadcrumb/Breadcrumb.vue";
+import MenuSatisfaction from "../layout/menuSatisfaction.vue";
 const App = {
   data: () => {
     return {
@@ -51,6 +54,7 @@
     'AdminHeader': AdminHeader,
     'AdminMenu': AdminMenu,
     'Breadcrumb' : Breadcrumb,
+    'MenuSatisfaction': MenuSatisfaction,
   },
   mounted() {},
 };
client/views/pages/adm/menuManagement/menuSatisfactionManagement/MenuSatisfactionSelectList.vue
--- client/views/pages/adm/menuManagement/menuSatisfactionManagement/MenuSatisfactionSelectList.vue
+++ client/views/pages/adm/menuManagement/menuSatisfactionManagement/MenuSatisfactionSelectList.vue
@@ -9,10 +9,10 @@
             :thead="thead"
             :tbody="tbody"
           >
-            <template v-slot:button>
+            <template v-slot:button="{ row, idx }">
               <button
                 class="btn btn-chip-outline sm main ico-view "
-                @click.stop="modalOpen"
+                @click.stop="modalOpen(row, idx)"
                 v-if="pageAuth.inqAuthrt == 'Y'"
               >
                 보기
@@ -45,7 +45,7 @@
       <ListTable
         :colgroup="colgroup2"
         :thead="thead2"
-        :tbody="tbody"
+        :tbody="stfndgTbody"
         :className="'data'"
       />
     </div>
@@ -57,6 +57,7 @@
 import PaginationButton from "../../../../component/pagination/PaginationButton.vue";
 import Modal from "../../../../component/modal/Modal.vue";
 import { defaultSearchParams } from "../../../../../resources/js/defaultSearchParams";
+import { findAll, findAllByMenuId } from "../../../../../resources/api/menuDgstfn";
 
 export default {
   components: {
@@ -69,10 +70,9 @@
       // 페이지 권한 객체
       pageAuth: JSON.parse(localStorage.getItem("vuex")).pageAuth,
       search: { ...defaultSearchParams },
-
       satisfaction: false,
       colgroup: ["30%", "10%", "10%", "10%", "10%", "10%", "10%", "10%"],
-      colgroup2: ["13%", "13%", "13%", "13%", "13%", "13%", "22%"],
+      colgroup2: ["12%", "12%", "12%", "12%", "12%", "40%"],
       thead: [
         "메뉴명",
         "매우만족",
@@ -80,8 +80,8 @@
         "보통",
         "불만족",
         "매우 불만족",
-        "점수 합계",
-        "의견",
+        "평균 점수",
+        "상세보기",
       ],
       thead2: [
         "매우만족",
@@ -89,66 +89,82 @@
         "보통",
         "불만족",
         "매우 불만족",
-        "합계",
         "의견",
       ],
-      tbody: [
-        {
-          id: 1,
-          1: "a기업",
-          2: "홍길동",
-          3: "정상",
-          4: "정상",
-          5: "정상",
-          6: "정상",
-        },
-        {
-          id: 2,
-          1: "a기업",
-          2: "홍길동",
-          3: "정상",
-          4: "정상",
-          5: "정상",
-          6: "정상",
-        },
-        {
-          id: 3,
-          1: "a기업",
-          2: "홍길동",
-          3: "정상",
-          4: "정상",
-          5: "정상",
-          6: "정상",
-        },
-        {
-          id: 4,
-          1: "a기업",
-          2: "홍길동",
-          3: "정상",
-          4: "정상",
-          5: "정상",
-          6: "정상",
-        },
-        {
-          id: 5,
-          1: "a기업",
-          2: "홍길동",
-          3: "정상",
-          4: "정상",
-          5: "정상",
-          6: "정상",
-        },
-      ],
+      tbody: [],
+      stfndgTbody: [], // 만족도 목록
+      menuList: [], // 메뉴 목록
+      menuStfndgList: [], // 메뉴별 만족도 목록
     };
   },
-  created() {},
+  created() {
+    this.findAll();
+  },
   methods: {
-    modalOpen: function () {
+    modalOpen: function (row, idx) {
+      this.findAllByMenuId(this.menuList[idx]);
       this.satisfaction = true;
     },
     modalClose: function () {
       this.satisfaction = false;
     },
+
+    // 목록 조회
+    async findAll() {
+      try {
+        const res = await findAll();
+        if (res.status == 200) {
+          console.log("res.data.data : ", res.data.data);
+          this.menuList = res.data.data; // 메뉴 목록
+          this.makeTbody();
+        }
+      } catch (error) {
+        alert(error.response.data.message);
+      }
+    },
+
+    // 메뉴별 만족도 조회
+    async findAllByMenuId(menu) {
+      try {
+        const params = { menuId: menu.menuId };
+        const res = await findAllByMenuId(params);
+        if (res.status == 200) {
+          this.menuStfndgList = res.data.data; // 메뉴별 만족도 목록
+          console.log("this.menuStfndgList : ", this.menuStfndgList);
+          this.makeStfndgTbody();
+        }
+      } catch (error) {
+        alert(error.response.data.message);
+      }
+    },
+
+    // tbody 생성
+    makeTbody() {
+      this.tbody = [];
+      this.tbody = this.menuList.map((menu) => ({
+        menuNm: menu.menuNm, // 메뉴명
+        rspnsFiveCnt: menu.rspnsFiveCnt, // 매우만족
+        rspnsFourCnt: menu.rspnsFourCnt, // 만족
+        rspnsThreeCnt: menu.rspnsThreeCnt, // 보통
+        rspnsTwoCnt: menu.rspnsTwoCnt, // 불만족
+        rspnsOneCnt: menu.rspnsOneCnt, // 매우불만족
+        avrgRspnsScore: menu.avrgRspnsScore, // 점수 평균
+      }));
+    },
+
+    // 만족도 tbody 생성
+    makeStfndgTbody() {
+      this.stfndgTbody = [];
+      this.stfndgTbody = this.menuStfndgList.map((menuStfndg) => ({
+        // regIp: menuStfndg.regIp, // 등록IP
+        rspnsFive: menuStfndg.rspnsFive, // 매우만족
+        rspnsFour: menuStfndg.rspnsFour, // 만족
+        rspnsThree: menuStfndg.rspnsThree, // 보통
+        rspnsTwo: menuStfndg.rspnsTwo, // 불만족
+        rspnsOne: menuStfndg.rspnsOne, // 매우불만족
+        opnn: menuStfndg.opnn, // 의견
+      }));
+    },
   },
   watch: {},
   computed: {},
Add a comment
List