Forráskód Böngészése

검색기능 적용 (공동구매/고객센터)

DESKTOP-T61HUSC\user 4 hónapja
szülő
commit
18a5b87699

+ 3 - 0
.claude/commands/create.md

@@ -0,0 +1,3 @@
+- $ARGUMENT로 입력한 요소들을 잘 이해해줘
+- 모든 css 수정은 명시하지 않았을 경우 mode-w-m.scss 상단에 작업할 것
+- 요청하지 않은 내용은 작업하지 않음, 기존의 기능을 수정하지 않음

+ 115 - 2
assets/scss/default.scss

@@ -41,7 +41,6 @@
 
       .data--list--wrap{
         width:100%;
-        padding-top:40px;
         
         .btn--actions--wrap{
           display: flex;
@@ -498,7 +497,7 @@
         .item--pagination{
           display: flex;
           justify-content: center;
-          margin-top: 80px;
+          margin-top: 30px;
           gap: 30px;
           .v-pagination{
             width: 50%;
@@ -1568,4 +1567,118 @@
       border-radius: 0 8px 8px 0 !important;
     }
   }
+}
+
+// ========== 모달 공통 스타일 ==========
+.v-common-dialog-wrapper {
+  &.custom-dialog {
+    background: #fafafa;
+    overflow: hidden;
+      .modal-tit {
+        background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+        color: white;
+        font-size: 20px;
+        font-weight: 600;
+        position: relative;
+        padding: 2.5rem 1.56rem 2.19rem 1.56rem;
+        &::before {
+          content: '';
+          position: absolute;
+          top: 0;
+          left: 0;
+          right: 0;
+          bottom: 0;
+          background: radial-gradient(circle at 30% 30%, rgba(255,255,255,0.1) 0%, transparent 70%);
+          pointer-events: none;
+        }
+
+        h3 {
+          margin: 0;
+          position: relative;
+          z-index: 2;
+        }
+
+        .close-btn {
+          display: inline-block;
+          position: absolute;
+          right: 16px;
+          top: 50%;
+          transform: translateY(-50%);
+          background: rgba(255, 255, 255, 0.2) !important;
+          color: white !important;
+          z-index: 3;
+          border: none;
+          border-radius: 50%;
+          width: 40px;
+          height: 40px;
+          cursor: pointer;
+          transition: all 0.2s ease;
+          
+          &:hover {
+            background: rgba(255, 255, 255, 0.3) !important;
+          }
+
+          &::before {
+            content: '×';
+            font-size: 24px;
+            font-weight: bold;
+            line-height: 1;
+            position: absolute;
+            top: 50%;
+            left: 50%;
+            transform: translate(-50%, -50%);
+          }
+
+          .v-icon {
+            font-size: 20px;
+          }
+        }
+      }
+
+      .v-common-dialog-content {
+        border-top: 1px solid #f3f4f6;
+        justify-content: flex-end;
+        gap: 12px;
+
+      }
+      .v-btn {
+        border-radius: 10px;
+        font-weight: 500;
+        text-transform: none;
+        padding: 0 24px;
+        height: 44px;
+        box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+        transition: all 0.2s ease;
+
+          &:hover {
+            transform: translateY(-1px);
+            box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
+          }
+
+          &.cancel-btn {
+            background: #f3f4f6 !important;
+            color: #6b7280 !important;
+
+            &:hover {
+              background: #e5e7eb !important;
+            }
+          }
+
+          &.submit-btn {
+            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%) !important;
+            color: white !important;
+
+            &:hover {
+              background: linear-gradient(135deg, #5a67d8 0%, #6b46c1 100%) !important;
+            }
+
+            &.v-btn--loading {
+              .v-btn__loader {
+                color: white;
+              }
+            }
+          }
+      }
+
+  }
 }

+ 85 - 1
assets/scss/mode-w-m.scss

@@ -3,6 +3,89 @@
 | 2024-08-26 김민정 :
 **********************************************/
 
+// ========== 검색 영역 스타일 (cs--list 내부) ==========
+.cs--search-area {
+  background: linear-gradient(#f0f4ff 0%, #ffffff 100%);
+  padding: 1.25rem;
+
+  .search-controls {
+    display: flex;
+    align-items: center;
+    gap: 1rem;
+    flex-wrap: wrap;
+
+    .search-filter {
+      min-width: 120px;
+      
+      .v-select {
+        .v-field {
+          background: white;
+          border-radius: 8px;
+          border: 1px solid #dee2e6;
+          
+          &:hover {
+            border-color: #adb5bd;
+          }
+          
+          &.v-field--focused {
+            border-color: #0d6efd;
+          }
+        }
+      }
+    }
+
+    .search-input {
+      flex: 1;
+      min-width: 250px;
+      
+      .v-text-field {
+        .v-field {
+          background: white;
+          border-radius: 8px;
+          border: 1px solid #dee2e6;
+          
+          &:hover {
+            border-color: #adb5bd;
+          }
+          
+          &.v-field--focused {
+            border-color: #0d6efd;
+          }
+        }
+        
+        .v-field__prepend-inner {
+          .mdi-magnify {
+            color: #6c757d;
+            opacity: 0.7;
+          }
+        }
+      }
+    }
+
+    .search-actions {
+      display: flex;
+      gap: 0.5rem;
+
+      .btn--pp{
+        background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+      }
+      
+      .v-btn {
+        border-radius: 8px;
+        font-weight: 500;
+        text-transform: none;
+        box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+        transition: all 0.2s ease;
+        font-size: 1rem;
+        &:hover {
+          transform: translateY(-1px);
+          box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);
+        }
+      }
+    }
+  }
+}
+
 // ========== 아이템 추가 페이지 스타일 ==========
 .modern-item-add {
   min-height: 100vh;
@@ -7815,4 +7898,5 @@ z
       }
     }
   }
-}
+}
+

+ 22 - 12
backend/app/Controllers/Item.php

@@ -74,17 +74,26 @@ class Item extends ResourceController
             'name' => 'NAME',
         ];
 
-        // 평문 검색 (LIKE 연산 사용)
-        $builder = $db->table('ITEM_LIST');
+        // 평문 검색 (LIKE 연산 사용) - 회사명 조인 추가
+        $builder = $db->table('ITEM_LIST I')
+            ->select('I.*, COALESCE(V.COMPANY_NAME, B.COMPANY_NAME) as COMPANY_NAME')
+            ->join('VENDOR_LIST V', 'I.COMPANY_NUMBER = V.COMPANY_NUMBER', 'left')
+            ->join('BRAND_LIST B', 'I.COMPANY_NUMBER = B.COMPANY_NUMBER', 'left');
 
         // 사용자 타입별 필터링
         if ($memberType === 'VENDOR' && !empty($companyNumber)) {
             // 벤더사의 경우: 자사 제품만 검색
-            $builder->where('COMPANY_NUMBER', $companyNumber);
+            $builder->where('I.COMPANY_NUMBER', $companyNumber);
+        } elseif ($memberType === 'BRAND' && !empty($memberSeq)) {
+            // 브랜드사의 경우: 자사가 담당하는 제품만 검색 (CONTACT_BRD로 필터링)
+            $builder->where('I.CONTACT_BRD', $memberSeq);
+            if (!empty($companyNumber)) {
+                $builder->orWhere('I.COMPANY_NUMBER', $companyNumber);
+            }
         } elseif ($memberType === 'INFLUENCER' && !empty($memberSeq)) {
             // 인플루언서의 경우: 파트너십이 체결된 벤더사의 제품만 검색
-            $builder->select('ITEM_LIST.*, VIP.STATUS as PARTNERSHIP_STATUS');
-            $builder->join('VENDOR_LIST VL', 'ITEM_LIST.COMPANY_NUMBER = VL.COMPANY_NUMBER', 'inner');
+            $builder->select('I.*, COALESCE(V.COMPANY_NAME, B.COMPANY_NAME) as COMPANY_NAME, VIP.STATUS as PARTNERSHIP_STATUS');
+            $builder->join('VENDOR_LIST VL', 'I.COMPANY_NUMBER = VL.COMPANY_NUMBER', 'inner');
             $builder->join('VENDOR_INFLUENCER_PARTNERSHIP VIP', 'VL.SEQ = VIP.VENDOR_SEQ', 'inner');
             $builder->where('VIP.INFLUENCER_SEQ', $memberSeq);
             $builder->where('VIP.STATUS', 'APPROVED');
@@ -111,22 +120,22 @@ class Item extends ResourceController
 
         // 인플루언서의 경우는 비노출 항목 가림
         if (!empty($showYN)) {
-            $builder->where('SHOW_YN', $showYN);
+            $builder->where('I.SHOW_YN', $showYN);
         }
         if (!empty($itemType)) {
-            $builder->where('TYPE', $itemType);
+            $builder->where('I.TYPE', $itemType);
         }
 
         // INF_SEQ 조건 추가 (값이 있을 때만)
         if (!empty($infSeq)) {
-            $builder->where('CONTACT_INF', $infSeq);
+            $builder->where('I.CONTACT_INF', $infSeq);
         }
 
         // 정렬: UPDATE 기준 최신순
-        $builder->where('UDPDATE >=', $startDate . ' 00:00:00');
-        $builder->where('UDPDATE <=', $endDate . ' 23:59:59');
-        $builder->where('DEL_YN =', 'N');
-        $builder->orderBy('ITEM_LIST.UDPDATE', 'DESC');
+        $builder->where('I.UDPDATE >=', $startDate . ' 00:00:00');
+        $builder->where('I.UDPDATE <=', $endDate . ' 23:59:59');
+        $builder->where('I.DEL_YN =', 'N');
+        $builder->orderBy('I.UDPDATE', 'DESC');
 
         // 조회
         $lists = $builder->get()->getResultArray();
@@ -324,6 +333,7 @@ class Item extends ResourceController
 //            'ADD_INFO' => $request->getPost('add_info') ?? 0,
 //            'COMPANY_NUMBER' => $request->getPost('company_number'),
             'CONTACT_INF' => $request->getPost('contact_inf') ?? 0,
+            'CONTACT_BRD' => $request->getPost('contact_brd') ?? 0,
             'ORDER_LINK' => $request->getPost('order_link') ?? 0,
             'ORDER_START_DATE' => $request->getPost('order_start_date'),
             'ORDER_END_DATE' => $request->getPost('order_end_date'),

+ 5 - 5
components/common/confirmDialog.vue

@@ -2,18 +2,18 @@
   <v-dialog v-model="isOpenPop" persistent width="32.81rem">
     <div class="v-common-dialog-wrapper custom-dialog alert">
       <div class="modal-tit">
-        <strong>{{ popUpOption.title }}</strong>
-        <button class="btn-close" @click="fnProcNo"></button>
+        <h3>{{ popUpOption.title }}</h3>
+        <button class="close-btn" @click="fnProcNo"></button>
       </div>
       <!-- 신뢰할수있는 코드... 작성자만 넣을수있기때문에 -->
       <div class="v-common-dialog-content">
         <p class="alert-txt" v-html="popUpOption.content"></p>
       </div>
       <div class="btn-wrap">
-        <v-btn class="custom-btn btn-white mini" v-if="popUpOption.no" @click="fnProcNo"
+        <v-btn class="custom-btn cancel-btn" v-if="popUpOption.no" @click="fnProcNo"
           ><i class="ico"></i>{{ popUpOption.no.text }}</v-btn
         >
-        <v-btn class="custom-btn btn-blue mini" @click="fnProcYes"
+        <v-btn class="custom-btn submit-btn" @click="fnProcYes"
           ><i class="ico"></i>{{ popUpOption.yes.text }}</v-btn
         >
       </div>
@@ -22,7 +22,7 @@
 </template>
 
 <script setup>
-  import { useRouter, useRoute } from "vue-router";
+  import { useRoute, useRouter } from "vue-router";
   let pageId = "confirmDialog";
   const router = useRouter();
   const route = useRoute();

+ 79 - 84
pages/view/common/cs/index.vue

@@ -8,67 +8,6 @@
       </div>
     </div>
 
-    <div class="search--modules type2">
-      <div class="search--inner">
-        <div class="form--cont--filter">
-          <v-select
-            v-model="filter"
-            :items="filderArr"
-            variant="outlined"
-            class="custom-select"
-          >
-          </v-select>
-        </div>
-        <div class="form--cont--text">
-          <v-text-field
-            v-model="searchModel"
-            class="custom-input mini"
-            style="width: 100%"
-            placeholder="검색어를 입력하세요"
-          ></v-text-field>
-        </div>
-      </div>
-      <div class="search--inner">
-        <div class="calendar-wrap ml--0">
-          <div class="calendar">
-            <VueDatePicker
-              :format="datePickerFormat"
-              v-model="searchStartDate"
-              placeholder="날짜를 선택하세요"
-              :auto-apply="true"
-              week-start="0"
-            ></VueDatePicker>
-          </div>
-          <span class="text">~</span>
-          <div class="calendar">
-            <VueDatePicker
-              v-model="searchEndDate"
-              :format="datePickerFormat"
-              placeholder="날짜를 선택하세요"
-              :auto-apply="true"
-              week-start="0"
-            ></VueDatePicker>
-          </div>
-          <div class="month--selector">
-            <v-btn
-              v-for="option in dateOptions"
-              :key="option.value"
-              :class="{ actv: selectedRange === option.value }"
-              @click="setDateRange(option.value)"
-              elevation="0"
-            >
-              {{ option.label }}
-            </v-btn>
-          </div>
-        </div>
-      </div>
-      <v-btn
-        class="custom-btn btn-blue mini sch--btn"
-        @click="fnSearch(searchModel, filter)"
-        >검색</v-btn
-      >
-    </div>
-
     <div class="data--list--wrap">
       <div class="item--list--wrap">
         <div class="cs--list--wrap">
@@ -79,6 +18,48 @@
           <div class="cs--header">
             <h3>나의 문의 내역</h3>
           </div>
+          <!-- 검색 영역 -->
+          <div class="cs--search-area">
+            <div class="search-controls">
+              <div class="search-filter">
+                <v-select
+                  v-model="filter"
+                  :items="filderArr"
+                  variant="outlined"
+                  density="compact"
+                  hide-details
+                ></v-select>
+              </div>
+              <div class="search-input">
+                <v-text-field
+                  v-model="searchModel"
+                  placeholder="검색어를 입력하세요"
+                  variant="outlined"
+                  density="compact"
+                  hide-details
+                  prepend-inner-icon="mdi-magnify"
+                  @keyup.enter="fnSearch(searchModel, filter)"
+                ></v-text-field>
+              </div>
+              <div class="search-actions">
+                <v-btn
+                  class="custom-btn mini btn--pp"
+                  color="primary"
+                  @click="fnSearch(searchModel, filter)"
+                >
+                  검색
+                </v-btn>
+                <v-btn
+                  class="custom-btn mini btn-white"
+                  color="secondary"
+                  variant="outlined"
+                  @click="resetSearch"
+                >
+                  초기화
+                </v-btn>
+              </div>
+            </div>
+          </div>
           <div class="cs--list" v-if="csList.length > 0">
             <div v-for="(items, index) in paginatedItems" :key="index">
               <div class="list" @click="toItemDetail(items.SEQ)">
@@ -183,7 +164,6 @@
 </template>
 
 <script setup>
-import VueDatePicker from "@vuepic/vue-datepicker";
 import "@vuepic/vue-datepicker/dist/main.css";
 import dayjs from 'dayjs';
   /************************************************************************
@@ -235,6 +215,7 @@ import dayjs from 'dayjs';
     return '고객센터';
   });
   const csList = ref([]);
+  const allCsList = ref([]); // 전체 데이터 저장용
   const itemsPerPage = 7;
   const currentPage = ref(1);
 
@@ -330,34 +311,48 @@ import dayjs from 'dayjs';
     await useAxios()
       .post("/cs/list", _req)
       .then((res) => {
-        csList.value = res.data;
+        allCsList.value = res.data; // 전체 데이터 저장
+        csList.value = res.data; // 초기 표시용
       });
   };
 
   const fnSearch = (__KEYWORD, __FILTER) => {
-    let _req = {
-      USER_SEQ: useAtStore.auth.seq,
-      filter: __FILTER,
-      keyword: __KEYWORD,
-      startDate: searchStartDate.value ? dayjs(searchStartDate.value).format('YYYY-MM-DD') : '',
-      endDate: searchEndDate.value ? dayjs(searchEndDate.value).format('YYYY-MM-DD') : ''
-    };
-
-    // 관리자인 경우 모든 문의 조회
-    if(useAtStore.auth.seq == 2){
-      _req.USER_SEQ = 0;
+    let filteredItems = [...allCsList.value];
+    
+    // 키워드 검색
+    if (__KEYWORD && __KEYWORD.trim() !== '') {
+      const keyword = __KEYWORD.toLowerCase();
+      filteredItems = filteredItems.filter(item => {
+        if (__FILTER === 'title') {
+          return item.TITLE && item.TITLE.toLowerCase().includes(keyword);
+        } else if (__FILTER === 'content') {
+          return item.CONTENT && item.CONTENT.toLowerCase().includes(keyword);
+        } else if (__FILTER === 'writer') {
+          // 작성자 검색: 닉네임, 회사명, 이름 모두 검색
+          return (item.NICK_NAME && item.NICK_NAME.toLowerCase().includes(keyword)) ||
+                 (item.COMPANY_NAME && item.COMPANY_NAME.toLowerCase().includes(keyword)) ||
+                 (item.NAME && item.NAME.toLowerCase().includes(keyword));
+        } else {
+          // 전체 검색 (제목, 내용, 작성자 모두)
+          return (item.TITLE && item.TITLE.toLowerCase().includes(keyword)) ||
+                 (item.CONTENT && item.CONTENT.toLowerCase().includes(keyword)) ||
+                 (item.NICK_NAME && item.NICK_NAME.toLowerCase().includes(keyword)) ||
+                 (item.COMPANY_NAME && item.COMPANY_NAME.toLowerCase().includes(keyword)) ||
+                 (item.NAME && item.NAME.toLowerCase().includes(keyword));
+        }
+      });
     }
+    
+    csList.value = filteredItems;
+    currentPage.value = 1; // 검색 시 첫 페이지로 이동
+  };
 
-    useAxios()
-      .post("/cs/search", _req)
-      .then((res) => {
-        csList.value = res.data;
-        currentPage.value = 1; // 검색 후 첫 페이지로 이동
-      })
-      .catch((error) => {
-        console.error('검색 실패:', error);
-        $toast.error('검색에 실패했습니다.');
-      });
+  // 검색 초기화
+  const resetSearch = () => {
+    searchModel.value = '';
+    filter.value = '';
+    csList.value = [...allCsList.value];
+    currentPage.value = 1;
   };
 
 

+ 36 - 0
pages/view/common/item/add.vue

@@ -115,6 +115,16 @@
                       <i class="mdi mdi-account-search"></i>
                       선택
                     </v-btn>
+                    <v-btn
+                      v-if="form.contact_inf_display"
+                      class="selector-btn delete-btn"
+                      color="error"
+                      variant="outlined"
+                      @click="clearInfluencer"
+                    >
+                      <i class="mdi mdi-close"></i>
+                      삭제
+                    </v-btn>
                   </div>
                 </div>
               </div>
@@ -141,6 +151,16 @@
                       <i class="mdi mdi-domain"></i>
                       선택
                     </v-btn>
+                    <v-btn
+                      v-if="form.contact_brd_display"
+                      class="selector-btn delete-btn"
+                      color="error"
+                      variant="outlined"
+                      @click="clearBrand"
+                    >
+                      <i class="mdi mdi-close"></i>
+                      삭제
+                    </v-btn>
                   </div>
                 </div>
               </div>
@@ -736,6 +756,18 @@ const selectBrand = (brand) => {
   selectedBrand.value = brand;
 };
 
+// 인플루언서 삭제
+const clearInfluencer = () => {
+  form.value.contact_inf = "";
+  form.value.contact_inf_display = "";
+};
+
+// 브랜드사 삭제
+const clearBrand = () => {
+  form.value.contact_brd = "";
+  form.value.contact_brd_display = "";
+};
+
 // 브랜드사 이름 가져오기
 const getBrandNameBySeq = async (brandSeq) => {
   try {
@@ -1161,4 +1193,8 @@ watch(() => form.value.order_end_date, (newEndDate) => {
   color: #999;
   font-style: italic;
 }
+
+.delete-btn.v-btn--variant-outlined {
+  border-color: #f44336 !important;
+}
 </style>

+ 85 - 88
pages/view/common/item/index.vue

@@ -8,67 +8,6 @@
       </div>
     </div>
 
-    <div class="search--modules type2">
-      <div class="search--inner">
-        <div class="form--cont--filter">
-          <v-select
-            v-model="filter"
-            :items="filderArr"
-            variant="outlined"
-            class="custom-select"
-          >
-          </v-select>
-        </div>
-        <div class="form--cont--text">
-          <v-text-field
-            v-model="searchModel"
-            class="custom-input mini"
-            style="width: 100%"
-            placeholder="검색어를 입력하세요"
-          ></v-text-field>
-        </div>
-      </div>
-      <div class="search--inner">
-        <div class="calendar-wrap ml--0">
-          <div class="calendar">
-            <VueDatePicker
-              :format="datePickerFormat"
-              v-model="searchStartDate"
-              placeholder="날짜를 선택하세요"
-              :auto-apply="true"
-              week-start="0"
-            ></VueDatePicker>
-          </div>
-          <span class="text">~</span>
-          <div class="calendar">
-            <VueDatePicker
-              v-model="searchEndDate"
-              :format="datePickerFormat"
-              placeholder="날짜를 선택하세요"
-              :auto-apply="true"
-              week-start="0"
-            ></VueDatePicker>
-          </div>
-          <div class="month--selector">
-            <v-btn
-              v-for="option in dateOptions"
-              :key="option.value"
-              :class="{ actv: selectedRange === option.value }"
-              @click="setDateRange(option.value)"
-              elevation="0"
-            >
-              {{ option.label }}
-            </v-btn>
-          </div>
-        </div>
-      </div>
-      <v-btn
-        class="custom-btn btn-blue mini sch--btn"
-        @click="fnSearch(searchModel, filter)"
-        >검색</v-btn
-      >
-    </div>
-
     <div class="data--list--wrap">
       <!-- <div class="btn--actions--wrap">
         <div class="left--sections">
@@ -94,6 +33,49 @@
           <div class="cs--header">
             <h3>나의 공동구매</h3>
           </div>
+          
+          <!-- 검색 영역 -->
+          <div class="cs--search-area">
+            <div class="search-controls">
+              <div class="search-filter">
+                <v-select
+                  v-model="filter"
+                  :items="filderArr"
+                  variant="outlined"
+                  density="compact"
+                  hide-details
+                ></v-select>
+              </div>
+              <div class="search-input">
+                <v-text-field
+                  v-model="searchModel"
+                  placeholder="검색어를 입력하세요"
+                  variant="outlined"
+                  density="compact"
+                  hide-details
+                  prepend-inner-icon="mdi-magnify"
+                  @keyup.enter="fnSearch(searchModel, filter)"
+                ></v-text-field>
+              </div>
+              <div class="search-actions">
+                <v-btn
+                  class="custom-btn mini btn--pp"
+                  color="primary"
+                  @click="fnSearch(searchModel, filter)"
+                >
+                  검색
+                </v-btn>
+                <v-btn
+                  class="custom-btn mini btn-white"
+                  color="secondary"
+                  variant="outlined"
+                  @click="resetSearch"
+                >
+                  초기화
+                </v-btn>
+              </div>
+            </div>
+          </div>
           <div class="cs--list" v-if="itemList.length > 0">
             <div v-for="(items, index) in paginatedItems" :key="index" class="">
               <!-- <div v-if="itemType == 'E'" @click="toItemDetail(items.SEQ)" class="item-content">
@@ -141,7 +123,6 @@
 </template>
 
 <script setup>
-import VueDatePicker from "@vuepic/vue-datepicker";
 import "@vuepic/vue-datepicker/dist/main.css";
 import dayjs from 'dayjs';
   /************************************************************************
@@ -185,6 +166,7 @@ import dayjs from 'dayjs';
   const filderArr = ref([
     { title: "전체", value: "" },
     { title: "제품명", value: "name" },
+    { title: "회사명", value: "company" },
   ]);
   const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
   const router = useRouter();
@@ -193,7 +175,8 @@ import dayjs from 'dayjs';
     //return memberType === 'INFLUENCER' ? '제품 관리 (파트너십)' : '제품 관리 (자사)';
   });
   const itemList = ref([]);
-  const itemsPerPage = 5;
+  const allItemList = ref([]); // 전체 데이터 저장용
+  const itemsPerPage = 10;
   const currentPage = ref(1);
 
   /* eslint-disable */
@@ -275,38 +258,52 @@ import dayjs from 'dayjs';
     await useAxios()
     .post("/item/list", _req)
     .then((res) => {
-        itemList.value = res.data;
-        console.log(res.data);
+        allItemList.value = res.data; // 전체 데이터 저장
+        itemList.value = res.data; // 초기 표시용
       });
   };
 
   const fnSearch = (__KEYWORD, __FILTER) => {
-    let _req = {
-      filter: __FILTER,
-      keyword: __KEYWORD,
-      startDate: searchStartDate.value ? dayjs(searchStartDate.value).format('YYYY-MM-DD') : '',
-      endDate: searchEndDate.value ? dayjs(searchEndDate.value).format('YYYY-MM-DD') : '',
-      TYPE: itemType.value,
-      showYN: "Y"
-    };
+    let filteredItems = [...allItemList.value];
     
-    if (memberType === "INFLUENCER") {
-      // 인플루언서의 경우: 파트너십이 체결된 제품만 검색 + 노출된 제품만
-      _req.showYN = "Y";
-      _req.MEMBER_TYPE = "INFLUENCER";
-      _req.MEMBER_SEQ = useAtStore.auth.seq;
-    } else {
-      // 벤더사의 경우: 자사 제품만 검색
-      _req.MEMBER_TYPE = "VENDOR";
-      _req.COMPANY_NUMBER = useAtStore.auth.companyNumber || "1";
+    // 키워드 검색
+    if (__KEYWORD && __KEYWORD.trim() !== '') {
+      const keyword = __KEYWORD.toLowerCase();
+      filteredItems = filteredItems.filter(item => {
+        if (__FILTER === 'name') {
+          return item.NAME && item.NAME.toLowerCase().includes(keyword);
+        } else if (__FILTER === 'company') {
+          return item.COMPANY_NAME && item.COMPANY_NAME.toLowerCase().includes(keyword);
+        } else {
+          // 전체 검색 (이름 또는 회사명)
+          return (item.NAME && item.NAME.toLowerCase().includes(keyword)) ||
+                 (item.COMPANY_NAME && item.COMPANY_NAME.toLowerCase().includes(keyword));
+        }
+      });
     }
+    
+    // 날짜 필터링 (마감일 기준)
+    // if (searchStartDate.value && searchEndDate.value) {
+    //   const startDate = dayjs(searchStartDate.value).format('YYYY-MM-DD');
+    //   const endDate = dayjs(searchEndDate.value).format('YYYY-MM-DD');
+    //   filteredItems = filteredItems.filter(item => {
+    //     const orderEndDate = dayjs(item.ORDER_END_DATE).format('YYYY-MM-DD');
+    //     return orderEndDate >= startDate && orderEndDate <= endDate;
+    //   });
+    // }
+    
+    itemList.value = filteredItems;
+    currentPage.value = 1; // 검색 시 첫 페이지로 이동
+  };
 
-    useAxios()
-      .post("/item/search", _req)
-      .then((res) => {
-        itemList.value = res.data;
-      })
-      .catch((error) => {});
+  // 검색 초기화
+  const resetSearch = () => {
+    searchModel.value = '';
+    searchStartDate.value = null;
+    searchEndDate.value = null;
+    selectedRange.value = '';
+    itemList.value = [...allItemList.value];
+    currentPage.value = 1;
   };