yjryu / KERIS star
Stormen123 2023-11-29
231129 김성훈 매칭관리 통계 진행중
@11ce38b80d9430f38eda829d03e88884bb19089d
client/views/pages/admin/statistics/MatchingStatistics.vue
--- client/views/pages/admin/statistics/MatchingStatistics.vue
+++ client/views/pages/admin/statistics/MatchingStatistics.vue
@@ -3,31 +3,32 @@
         <div class="content-wrap">
             <ul class="tab-menu">
                 <li v-for="(tab, index) in tabMenu" :key="index">
-                    <a @click="currentTab = index" :class="{ active: currentTab === index }">{{ tab }}</a>
+                    <a @click="currentTabChange(index)" :class="{ active: currentTab === index }">{{ tab }}</a>
                 </li>
             </ul>
             <div class="tab-content">
-                <div v-show="currentTab == 0">
+                <div v-if="currentTab == 0">
                     <div class="chart">
                         <div class="chart-top">
                             <div class="flex">
                                 <div class="date-zone flex-start">
-                                    <input type="date" name="" id="">
+                                    <input type="date" name="" id="" min="2023-11-24" :max="listSearch.endDate" v-model="listSearch.startDate">
                                     <span>~</span>
-                                    <input type="date" name="" id="">
-                                    <button class="blue-btn">조회</button>
+                                    <input type="date" name="" id="" :min="listSearch.startDate" :max="oneMonthLater"
+                                        v-model="listSearch.endDate">
+                                    <button class="blue-btn" @click="listDateCheck()">조회</button>
                                 </div>
                                 <div class="date-check flex-end">
                                     <div>
                                         <input type="radio" name="pickMatching1" id="pick1" style="display:none"
                                         @click="handleRadioClick('pick',$event)"
-                                            :checked="selectedOption2 === 'pick'">
+                                            :checked="selectedOption1 === 'pick'">
                                         <label for="pick1">Pick</label>
                                     </div>
                                     <div>
                                         <input type="radio" name="pickMatching1" id="matching1" style="display:none"
                                         @click="handleRadioClick('matching',$event)"
-                                            :checked="selectedOption2 === 'matching'">
+                                            :checked="selectedOption1 === 'matching'">
                                         <label for="matching1">Matching</label>
                                     </div>
                                 </div>
@@ -77,21 +78,23 @@
                             </tbody>
                         </table>
                     </div>
+                    <div class="bottom-wrap">
+                        <PaginationButton v-model:currentPage="listSearch.currentPage" :perPage="listSearch.perPage"
+                        :total-count="companySelectListCount" :max-range="5" :click="listDateCheck" />
+                    </div>
                 </div>
             </div>
-            <div class="bottom-wrap">
-            <PaginationButton v-model:currentPage="listSearch.currentPage" :perPage="listSearch.perPage"
-                :total-count="companySelectListCount" :max-range="5" :click="companyPickStatistics" />
-            </div>
-            <div v-show="currentTab == 1">
+            
+            <div v-if="currentTab == 1">
                 <div class="chart">
                     <div class="chart-top">
                         <div class="flex">
                             <div class="date-zone flex-start">
-                                <input type="date" name="" id="">
+                                <input type="date" name="" id="" min="2023-11-24" :max="listSearch.endDate" v-model="listSearch.startDate">
                                 <span>~</span>
-                                <input type="date" name="" id="">
-                                <button class="blue-btn">조회</button>
+                                <input type="date" name="" id="" :min="listSearch.startDate" :max="oneMonthLater"
+                                    v-model="listSearch.endDate">
+                                <button class="blue-btn" @click="detailDateCheck()">조회</button>
                             </div>
                             <div class="date-check flex-end">
                                 <div>
@@ -112,13 +115,8 @@
                     <BarChart :data="menuVisitData" :mapping="keyMapping" />
                     <div class="table-zone">
                         <div class="flex middle-zone">
-                            <select name="" id="">
-                                <option value="">A사</option>
-                                <option value="">B사</option>
-                                <option value="">C사</option>
-                                <option value="">D사</option>
-                                <option value="">E사</option>
-                                <option value="">F사</option>
+                            <select name="" id="" >
+                                <option v-for="(item, idx) in companyList" :key="idx" :value=item.company_id>{{ item.company_nm }}</option>
                             </select>
                             <button class="blue-border-bnt">Excel 다운로드</button>
                         </div>
@@ -131,7 +129,7 @@
                             </colgroup>
                             <thead>
                                 <tr>
-                                    <th rowspan="2">기업별</th>
+                                    <th rowspan="2">기업명</th>
                                     <th colspan="3" v-if="selectedOption2 === 'pick'">Pick</th>
                                     <th colspan="3" v-else-if="selectedOption2 === 'matching'">Matching</th>
                                 </tr>
@@ -141,7 +139,7 @@
                                 </tr>
                             </thead>
                             <tbody>
-                                <tr v-for="(item, index) in companyStatisticsList" :key="index">
+                                <tr>
                                     <td>{{ item.date }}</td>
                                     <td>{{ item.total }}</td>
                                     <td>{{ item.company }}</td>
@@ -149,6 +147,10 @@
                                 </tr>
                             </tbody>
                         </table>
+                    </div>
+                    <div class="bottom-wrap">
+                        <PaginationButton v-model:currentPage="listSearch.currentPage" :perPage="listSearch.perPage"
+                        :total-count="companySelectListCount" :max-range="5" :click="detailDateCheck" />
                     </div>
                 </div>
             </div>
@@ -175,24 +177,34 @@
             listSearch: {
                 currentPage: 1,
                 perPage: 10,
-                startDate: '2023-11-24',
-                endDate: COMMON_UTIL.yesterday(),
+                startDate: '2023-11-01',
+                endDate: COMMON_UTIL.today(),
             },
-
+            oneMonthLater: COMMON_UTIL.today(),
+            companyList:[],
             companyStatisticsList: [],
-            companySelectListCount: 0
+            companySelectListCount: 0,
+            companyDetailStatistics: [],
         };
     },
     methods: {
+        currentTabChange: function(index) {
+            this.currentTab = index;
+            if(index == 1) {
+                this.companySelectList();
+            }
+        },
+
         handleRadioClick(option,e) {
             const clickedRadioName = e.target.name;
             console.log(clickedRadioName);
             if(clickedRadioName == "pickMatching1"){
                 this.selectedOption1 = option;
-            }else if(clickedRadioName == "pickMatching2")
-            console.log("실행");
-            this.selectedOption2 = option;
-            console.log(this.selectedOption2);
+                this.listDateCheck();
+            } else if(clickedRadioName == "pickMatching2") {
+                this.selectedOption2 = option;
+                this.detailDateCheck();
+            }
         },
 
         /** 기업 별 픽 통계 */
@@ -210,16 +222,123 @@
                 vm.companySelectListCount = response.data.companySelectListCount;
             }).catch(function (error) {
                 console.log("error - ", error)
-                alert("게시글 별 조회수 조회 오류, 관리자에게 문의하세요.");
+                alert("PICK 통계 조회 오류, 관리자에게 문의하세요.");
             })
         },
 
+        /** 기업 별 매칭 통계 */
+        companyMatchingStatistics: function () {
+            const vm = this;
+            axios({
+                url: '/statistics/companyMatchingStatistics.json',
+                method: 'post',
+                hearder: {
+                    'Content-Type': "application/json; charset=UTF-8",
+                },
+                data: vm.listSearch
+            }).then(function (response) {
+                vm.companyStatisticsList = response.data.companyMatchingStatistics;
+                vm.companySelectListCount = response.data.companySelectListCount;
+            }).catch(function (error) {
+                console.log("error - ", error)
+                alert("MATCHING 통계 조회 오류, 관리자에게 문의하세요.");
+            })
+        },
+        
+        /** 선택기업 픽 세부통계 */
+        companyDetailPickStatistics: function () {
+            const vm = this;
+            axios({
+                url: '/statistics/companyDetailPickStatistics.json',
+                method: 'post',
+                hearder: {
+                    'Content-Type': "application/json; charset=UTF-8",
+                },
+                data: vm.listSearch
+            }).then(function (response) {
+                vm.companyStatisticsList = response.data.companyPickStatistics;
+                vm.companySelectListCount = response.data.companySelectListCount;
+            }).catch(function (error) {
+                console.log("error - ", error)
+                alert("PICK 통계 조회 오류, 관리자에게 문의하세요.");
+            })
+        },
 
+        /** 선택기업 매칭 세부통계 */
+        companyDetailMatchingStatistics: function () {
+            const vm = this;
+            axios({
+                url: '/statistics/companyDetailMatchingStatistics.json',
+                method: 'post',
+                hearder: {
+                    'Content-Type': "application/json; charset=UTF-8",
+                },
+                data: vm.listSearch
+            }).then(function (response) {
+                vm.companyStatisticsList = response.data.companyMatchingStatistics;
+                vm.companySelectListCount = response.data.companySelectListCount;
+            }).catch(function (error) {
+                console.log("error - ", error)
+                alert("MATCHING 통계 조회 오류, 관리자에게 문의하세요.");
+            })
+        },
 
+        /**매칭관리 날짜선택 유효성 검사 */
+        listDateCheck: function() {
+            if(COMMON_UTIL.isEmpty(this.listSearch.endDate) === false) {
+                alert("날짜를 선택해주세요.");
+            } else {
 
+                if(this.selectedOption1 == 'pick') {
+                    this.companyPickStatistics();
+                } else {
+                    this.companyMatchingStatistics();
+                }
+            }
+        },
+
+        /**매칭관리 세부통계 날짜선택 유효성 검사 */
+        detailDateCheck: function() {
+            if(COMMON_UTIL.isEmpty(this.listSearch.endDate) === false) {
+                alert("날짜를 선택해주세요.");
+            } else {
+
+                if(this.selectedOption1 == 'pick') {
+                    this.companyPickStatistics();
+                } else {
+                    this.companyMatchingStatistics();
+                }
+            }
+        },
+        
+        /** 기업 리스트 */
+        companySelectList: function () {
+            const vm = this;
+            axios({
+                url: '/statistics/companyNameSelectList.json',
+                method: 'post',
+                hearder: {
+                    'Content-Type': "application/json; charset=UTF-8",
+                },
+                data: vm.listSearch
+            }).then(function (response) {
+                vm.companyList = response.data
+            }).catch(function (error) {
+                console.log("error - ", error)
+                alert("기업 리스트 조회 오류, 관리자에게 문의하세요.");
+            })
+        },
     },
     watch: {
-
+        'listSearch.startDate': function(newValue) {
+            let date = COMMON_UTIL.oneMonthLater(newValue);
+            this.listSearch.endDate = null;
+            if(date > COMMON_UTIL.today()) {
+                this.oneMonthLater = COMMON_UTIL.today();
+            } else {
+                this.oneMonthLater = date;
+            }
+        },
     },
     computed: {},
     components: {
Add a comment
List