Ver código fonte

배송관리 작업중

DESKTOP-T61HUSC\user 4 meses atrás
pai
commit
6bae9391f4

+ 45 - 0
assets/scss/default.scss

@@ -49,6 +49,51 @@
           justify-content: space-between;
           padding-bottom:25px;
         }
+        .left--sections{
+          display: flex;
+          gap: 1rem;
+        }
+        .right--sections{
+          display: flex;
+          gap: 1rem;
+        }
+        .item--section{
+          border: 1px solid #ccc;
+          padding: 2rem;
+          display: flex;
+          gap: 1rem;
+          border-radius: 1rem;
+          margin-bottom: 25px;
+          .item--thumb{
+            background-color: #d9d9d9;
+            justify-content: center;
+            align-items: center;
+            width: 20%;
+            height: auto;
+            overflow: hidden;
+            display: flex;
+            &.min--240{
+              min-height: 240px;
+            }
+            img{
+              width: 100%;
+              height: 100%;
+              object-fit: cover;
+            }
+          }
+          .item--info{
+            display: flex;
+            flex-direction: column;
+            h2{
+              font-size: 1.5rem;
+              margin-bottom: 1rem;
+            }
+            p{
+              font-size: 1rem;
+              line-height: 1.4;
+            }
+          }
+        }
       }
       
       .search--modules{

+ 4 - 0
assets/scss/mode-w-m.scss

@@ -2064,6 +2064,10 @@ z
             }
           }
 
+          &.btn-pink{
+            background-color: #F74F78;
+          }
+
           &.btn-white {
             background-color: #6f8aa6;
 

+ 13 - 0
assets/scss/style.scss

@@ -1338,9 +1338,22 @@ p.success-txt {
     }
   }
 
+  &.btn-pink{
+    background-color: #F74F78;
+    &.bdrs--10{
+      border-radius: 10px;
+    }
+    .v-btn__content{
+      color: #fff;
+    }
+  }
+
   &.btn-white {
     border: 0.06rem solid #DFE7EF;
     background: #fff;
+    &.bdrs--10{
+      border-radius: 10px;
+    }
 
     .v-btn__content {
       color: #9DA9B6;

+ 4 - 4
components/common/header.vue

@@ -57,7 +57,7 @@
         menuId: "menu00",
         parentMenuId: "menu00",
         menuName: "주문 관리",
-        linkType: "/view/order",
+        linkType: "/view/vendor/dashboard",
       },
       {
         menuId: "menu01",
@@ -69,7 +69,7 @@
         menuId: "menu02",
         parentMenuId: "menu02",
         menuName: "배송 관리",
-        linkType: "/view/deli",
+        linkType: "/view/common/deli",
       },
       {
         menuId: "menu03",
@@ -81,13 +81,13 @@
         menuId: "menu04",
         parentMenuId: "menu04",
         menuName: "정산 관리",
-        linkType: "/view/settle",
+        linkType: "/view/common/settle",
       },
       {
         menuId: "menu05",
         parentMenuId: "menu05",
         menuName: "고객센터",
-        linkType: "/view/cs",
+        linkType: "/view/common/cs",
       }
       // {
       //   menuId: "menu06",

+ 0 - 0
pages/view/cs/financial.vue → pages/view/common/cs/financial.vue


+ 0 - 0
pages/view/cs/index.vue → pages/view/common/cs/index.vue


+ 456 - 0
pages/view/common/deli/detail.vue

@@ -0,0 +1,456 @@
+<template>
+  <div>
+    <div class="inner--headers">
+      <h2>{{ pageId }}</h2>
+      <div class="bread--crumbs--wrap">
+        <span>홈</span>
+        <span>{{ pageId }}</span>
+      </div>
+    </div>
+    <div class="data--list--wrap">
+      <div class="btn--actions--wrap">
+        <div class="left--sections">
+          <v-btn class="custom-btn btn-pink bdrs--10"
+            ><i class="ico"></i>개별 배송</v-btn
+          >
+          <v-btn class="custom-btn bdrs--10 btn-white" @click="deliLocated()"
+            ><i class="ico"></i>공동구매 배송</v-btn
+          >
+        </div>
+        <div class="right--sections">
+        </div>
+      </div>
+      <div class="item--section">
+        <div v-if="imgTemp" class="item--thumb">
+          <img :src="imgTemp" alt="">
+        </div>
+        <div v-else class="item--thumb min--240">
+          NO IMAGE
+        </div>
+        <div class="item--info">
+          <h2>{{ form.formValue1 }}</h2>
+          <p>공급가: {{ form.formValue2 }}원</p>
+          <p>판매가: {{ form.formValue3 }}원</p>
+        </div>
+      </div>
+      <div class="btn--actions--wrap">
+        <div class="left--sections">
+        </div>
+        <div class="right--sections">
+          <input 
+            ref="excelFileInput" 
+            type="file" 
+            accept=".xlsx,.xls" 
+            @change="handleExcelUpload"
+            style="display: none"
+          />
+          <v-btn class="custom-btn btn-excel" @click="$refs.excelFileInput.click()"
+            ><i class="ico"></i>엑셀 업로드</v-btn
+          >
+          <v-btn class="custom-btn btn-excel"
+            ><i class="ico"></i>엑셀 다운로드</v-btn
+          >
+        </div>
+      </div>
+      <div class="tbl-wrapper">
+        <div class="tbl-wrap">
+          <!-- ag grid -->
+          <ag-grid-vue
+            style="width: 100%; height: calc(10 * 2.94rem)"
+            class="ag-theme-quartz"
+            :gridOptions="gridOptions"
+            :rowData="tblItems"
+            rowSelection="multiple"
+            :paginationPageSize="pageObj.pageSize"
+            :suppressPaginationPanel="true"
+            @grid-ready="onGridReady"
+            @rowClicked="detailLocated"
+          >
+          </ag-grid-vue>
+
+          <!-- 페이징 -->
+          <div class="ag-grid-custom-pagenations">
+            <pagination @chg_page="chgPage" :pageObj="pageObj"></pagination>
+          </div>
+        </div>
+      </div>
+      <div class="view-btm-btn">
+        <div class="btn-l">
+          <v-btn class="custom-btn btn-list" @click="listLocated"
+            ><i class="ico"></i>목록</v-btn
+          >
+        </div>
+        <div class="btn-r">
+          <v-btn v-if="pageType !== 'D'" class="custom-btn btn-blue2" @click="fnBtnEvt"
+            ><i class="ico"></i>저장</v-btn
+          >
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import "@vuepic/vue-datepicker/dist/main.css";
+import { AgGridVue } from "ag-grid-vue3";
+import * as XLSX from 'xlsx';
+import pagination from "../components/common/pagination.vue";
+  /************************************************************************
+|    레이아웃
+************************************************************************/
+  definePageMeta({
+    layout: "default",
+  });
+  /************************************************************************
+|   PROPS
+ ************************************************************************/
+  const props = defineProps({
+    propsData: {
+      type: Object,
+      default: () => {},
+    },
+  });
+  /************************************************************************
+|    스토어
+ ************************************************************************/
+  const useDtStore = useDetailStore();
+  /************************************************************************
+|    전역
+ ************************************************************************/
+  const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
+  const router = useRouter();
+  const pageId = ref("배송 관리");
+  let pageObj = ref({
+    page: 1, // 현재 페이지
+    pageMaxNumSize: 10, // 페이지 숫자 최대 표현 개수
+    pageSize: 10, // 테이블 조회 데이터 개수
+    totalCnt: 0, // 전체 페이지
+  });
+  const imgTemp = ref("");
+  const tblItems = ref([]); // stat 데이터
+  const form = ref({
+    formValue1: "",
+    formValue2: "",
+    formValue3: "",
+    formValue4: "",
+    formValue5: null,
+    formValue6: "",
+    formValue7: "",
+    formValue8: "0",
+    formValue8Arr: [
+      { title: "판매중", value: "0" },
+      { title: "품절", value: "1" },
+    ],
+    formValue9: "Y",
+    formValue9Arr: [
+      { title: "노출", value: "Y" },
+      { title: "비노출", value: "N" },
+    ],
+    formValue10: "",
+  });
+
+  /* eslint-disable */
+  /* prettier-ignore */
+
+  pageObj.value.totalCnt = tblItems.value.length;
+
+  const remToPx = () => parseFloat(getComputedStyle(document.documentElement).fontSize);
+  const rowHeightRem = 2.65; // 원하는 rem 값
+  const rowHeightPx = rowHeightRem * remToPx();
+  const gridApi = shallowRef();
+
+  // gridOption
+  const gridOptions = {
+    columnDefs: [
+      //{ checkboxSelection: true, headerCheckboxSelection: true, width: 0 },
+      {
+        headerName: "No",
+        valueGetter: (params) => params.api.getDisplayedRowCount() - params.node.rowIndex,
+        sortable: false,
+        width: 70,
+      },
+      {
+        headerName: "구매자명",
+        field: "BUYER_NAME",
+        width: 120,
+        editable: true,
+      },
+      {
+        headerName: "주소",
+        field: "ADDRESS",
+        editable: true,
+      },
+      {
+        headerName: "연락처",
+        field: "PHONE",
+        width: 140,
+        editable: true,
+      },
+      {
+        headerName: "이메일",
+        field: "EMAIL",
+        editable: true,
+      },
+      {
+        headerName: "구매수량",
+        field: "QTY",
+        width: 120,
+        editable: true,
+      },
+      {
+        headerName: "총구매금액",
+        field: "TOTAL",
+        editable: true,
+      },
+      {
+        headerName: "배송업체",
+        field: "DELIVERY_COMPANY",
+        width: 100,
+        editable: true,
+      },
+      {
+        headerName: "송장번호",
+        field: "TRACKING_NUMBER",
+        editable: true,
+      },
+      {
+        headerName: "주문일",
+        field: "ORDER_DATE",
+        editable: true,
+      },
+    ],
+    rowData: tblItems.value, // 테이블 데이터
+    autoSizeStrategy: {
+      type: "fitGridWidth", // width맞춤
+    },
+    suppressMovableColumns: true,
+    headerHeight: rowHeightPx,
+    rowHeight: rowHeightPx,
+    pagination: true,
+    suppressPaginationPanel: true, // 하단 default 페이징 컨트롤 숨김
+    //rowSelection: {
+    // checkboxes: true,
+    // headerCheckbox: true,
+    // enableClickSelection: false,
+    // mode: "multiRow",
+    //},
+  };
+
+  /************************************************************************
+|    함수(METHODS)
+************************************************************************/
+  const listLocated = () => {
+    router.push({
+      path: "/view/common/deli/",
+    });
+  };
+  const onGridReady = (__PARAMS) => {
+    gridApi.value = __PARAMS.api;
+  };
+
+  const chgPage = (__PAGE) => {
+    pageObj.value.page = __PAGE;
+    gridApi.value.paginationGoToPage(__PAGE - 1);
+  };
+
+  
+const fnBtnEvt = () => {
+  if (!tblItems.value || tblItems.value.length === 0) {
+    let param = {
+      id: pageId,
+      title: pageId,
+      content: "저장할 배송 데이터가 없습니다.",
+      yes: {
+        text: "확인",
+        isProc: false,
+      }
+    };
+    $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
+    return;
+  }
+  
+  fnRegEvt();
+};
+
+  const fnRegEvt = () => {
+    let param = {
+      id: pageId,
+      title: pageId,
+      content: "등록하시겠습니까?",
+      yes: {
+        text: "등록",
+        isProc: true,
+        event: "FN_INSERT",
+        param: "",
+      },
+      no: {
+        text: "취소",
+        isProc: false,
+      },
+    };
+    $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
+  };
+  // 엑셀 컬럼명 매핑 테이블
+  const excelColumnMapping = {
+    '구매자명': 'BUYER_NAME',
+    '주소': 'ADDRESS',
+    '연락처': 'PHONE',
+    '이메일': 'EMAIL',
+    '구매수량': 'QTY',
+    '총구매금액': 'TOTAL',
+    '배송업체': 'DELIVERY_COMPANY',
+    '송장번호': 'TRACKING_NUMBER',
+    '주문일': 'ORDER_DATE'
+  };
+
+  const handleExcelUpload = (event) => {
+    const file = event.target.files[0];
+    if (!file) return;
+
+    const reader = new FileReader();
+    reader.onload = (e) => {
+      try {
+        const data = new Uint8Array(e.target.result);
+        const workbook = XLSX.read(data, { type: 'array' });
+        const sheetName = workbook.SheetNames[0];
+        const worksheet = workbook.Sheets[sheetName];
+        const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
+
+        if (jsonData.length < 2) {
+          $toast.error('엑셀 파일에 데이터가 없습니다.');
+          return;
+        }
+
+        const headers = jsonData[0];
+        const rows = jsonData.slice(1);
+        
+        // 컬럼명 매핑 및 데이터 변환
+        const mappedData = rows.map(row => {
+          const mappedRow = {};
+          headers.forEach((header, index) => {
+            const fieldName = excelColumnMapping[header];
+            if (fieldName && row[index] !== undefined) {
+              mappedRow[fieldName] = row[index];
+            }
+          });
+          return mappedRow;
+        }).filter(row => Object.keys(row).length > 0);
+
+        if (mappedData.length === 0) {
+          $toast.error('매핑 가능한 컬럼이 없습니다. 엑셀 헤더명을 확인해주세요.');
+          return;
+        }
+
+        // ag-grid에 데이터 추가
+        // 기존 데이터는 지우고 추가
+        tblItems.value = [];
+        tblItems.value = [...tblItems.value, ...mappedData];
+        pageObj.value.totalCnt = tblItems.value.length;
+        
+        $toast.success(`${mappedData.length}건의 데이터가 추가되었습니다.`);
+        
+      } catch (error) {
+        console.error('엑셀 파일 처리 중 오류:', error);
+        $toast.error('엑셀 파일을 읽는 중 오류가 발생했습니다.');
+      }
+    };
+    reader.readAsArrayBuffer(file);
+    
+    // 파일 input 초기화
+    event.target.value = '';
+  };
+
+  const fnDetail = () => {
+    let req = {
+      seq: useDtStore.boardInfo.seq,
+    };
+    useAxios()
+    .get(`/item/detail/${req.seq}`)
+    .then((res) => {
+        form.value.formValue1 = res.data.NAME;
+        form.value.formValue2 = res.data.PRICE1;
+        form.value.formValue3 = res.data.PRICE2;
+        form.value.formValue4 = res.data.DELI_FEE;
+        form.value.formValue5 = res.data.THUMB_FILE;
+        form.value.formValue6 = res.data.SUB_TITLE;
+        form.value.formValue8 = res.data.STATUS;
+        form.value.formValue9 = res.data.SHOW_YN;
+        form.value.formValue10 = res.data.ADD_INFO;
+        //썸네일 파일이 있으면 넣어줌
+        if(form.value.formValue5){
+          imgTemp.value = `https://shopdeli.mycafe24.com/writable/uploads/item/thumb/${form.value.formValue5}`;
+        }
+      })
+      .catch((error) => {
+        console.error('제품 상세 조회 오류:', error);
+        $toast.error('제품 정보를 불러오는 중 오류가 발생했습니다.');
+      })
+      .finally(() => {
+      });
+  };
+
+  const fnInsert = () => {
+    if (!tblItems.value || tblItems.value.length === 0) {
+      $toast.error('저장할 배송 데이터가 없습니다.');
+      return;
+    }
+
+    const deliveryData = {
+      itemSeq: useDtStore.boardInfo.seq,
+      deliveryList: tblItems.value.map(item => ({
+        buyerName: item.BUYER_NAME,
+        address: item.ADDRESS,
+        phone: item.PHONE,
+        email: item.EMAIL,
+        qty: item.QTY,
+        total: item.TOTAL,
+        deliveryCompany: item.DELIVERY_COMPANY,
+        trackingNumber: item.TRACKING_NUMBER,
+        orderDate: item.ORDER_DATE
+      }))
+    };
+
+    useAxios()
+      .post('/delivery/save', deliveryData)
+      .then((res) => {
+        $toast.success('배송 데이터가 성공적으로 저장되었습니다.');
+        // 저장 후 목록으로 이동하거나 데이터 새로고침
+        listLocated();
+      })
+      .catch((error) => {
+        console.error('배송 데이터 저장 오류:', error);
+        let errorMessage = '배송 데이터 저장 중 오류가 발생했습니다.';
+        
+        if (error.response && error.response.data && error.response.data.message) {
+          errorMessage = error.response.data.message;
+        }
+        
+        $toast.error(errorMessage);
+      })
+      .finally(() => {
+      });
+  };
+  /************************************************************************
+|    팝업 이벤트버스 정의
+************************************************************************/
+$eventBus.off("FN_INSERT");
+$eventBus.on("FN_INSERT", () => {
+  fnInsert();
+});
+  /************************************************************************
+|    WATCH
+************************************************************************/
+
+  watch(
+    () => props,
+    () => {
+      searchObj.value = props.propsData;
+      fnGetStat();
+    },
+    { deep: true }
+  );
+
+  onMounted(() => {
+    fnDetail();
+  });
+</script>

+ 158 - 158
pages/view/deli/mngListDeleted.vue → pages/view/common/deli/index.vue

@@ -4,28 +4,63 @@
       <h2>{{ pageId }}</h2>
       <div class="bread--crumbs--wrap">
         <span>홈</span>
-        <span>관리자 관리</span>
         <span>{{ pageId }}</span>
       </div>
     </div>
 
-    <div class="search--modules">
-      <div class="form--cont--filter">
-        <v-select
-          v-model="filter"
-          :items="filderArr"
-          variant="outlined"
-          class="custom-select"
-        >
-        </v-select>
+    <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="form--cont--text">
-        <v-text-field
-          v-model="searchModel"
-          class="custom-input mini"
-          style="width: 100%"
-          placeholder="검색어를 입력하세요"
-        ></v-text-field>
+      <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"
@@ -37,15 +72,16 @@
     <div class="data--list--wrap">
       <div class="btn--actions--wrap">
         <div class="left--sections">
+          <v-btn class="custom-btn btn-pink bdrs--10"
+            ><i class="ico"></i>개별 배송</v-btn
+          >
+          <v-btn class="custom-btn bdrs--10 btn-white" @click="deliLocated()"
+            ><i class="ico"></i>공동구매 배송</v-btn
+          >
         </div>
         <div class="right--sections">
-          <v-btn class="custom-btn mini btn-white" @click="fnDelEvt">선택 삭제</v-btn>
-          <v-btn class="custom-btn mini btn-reg ml--10" @click="fnResEvt"
-            >선택 복원</v-btn
-          >
         </div>
       </div>
-
       <div class="tbl-wrapper">
         <div class="tbl-wrap">
           <!-- ag grid -->
@@ -58,6 +94,7 @@
             :paginationPageSize="pageObj.pageSize"
             :suppressPaginationPanel="true"
             @grid-ready="onGridReady"
+            @rowClicked="detailLocated"
           >
           </ag-grid-vue>
 
@@ -72,7 +109,10 @@
 </template>
 
 <script setup>
-  import { AgGridVue } from "ag-grid-vue3";
+import VueDatePicker from "@vuepic/vue-datepicker";
+import "@vuepic/vue-datepicker/dist/main.css";
+import { AgGridVue } from "ag-grid-vue3";
+import dayjs from 'dayjs';
 import pagination from "../components/common/pagination.vue";
   /************************************************************************
 |    레이아웃
@@ -97,15 +137,26 @@ import pagination from "../components/common/pagination.vue";
 |    전역
  ************************************************************************/
   const searchModel = ref("");
+  const selectedRange = ref('all');
+  const itemStartDate = ref("");
+  const searchStartDate = ref("");
+  const searchEndDate = ref("");
+  const datePickerFormat = "yyyy-MM-dd";
+  const dateOptions = [
+    { label: '오늘', value: 'today' },
+    { label: '7일', value: '7d' },
+    { label: '1개월', value: '1m' },
+    { label: '3개월', value: '3m' },
+    { label: '전체', value: 'all' },
+  ]
   const filter = ref("");
   const filderArr = ref([
-    { title: "선택하세요", value: "" },
-    { title: "이름", value: "name" },
-    { title: "아이디", value: "id" },
+    { title: "전체", value: "" },
+    { title: "제품명", value: "name" },
   ]);
   const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
   const router = useRouter();
-  const pageId = ref("삭제 관리자 리스트");
+  const pageId = ref("배송 관리");
   let pageObj = ref({
     page: 1, // 현재 페이지
     pageMaxNumSize: 10, // 페이지 숫자 최대 표현 개수
@@ -127,7 +178,7 @@ import pagination from "../components/common/pagination.vue";
   // gridOption
   const gridOptions = {
     columnDefs: [
-      { checkboxSelection: true, headerCheckboxSelection: true, width: 0 },
+      //{ checkboxSelection: true, headerCheckboxSelection: true, width: 0 },
       {
         headerName: "No",
         valueGetter: (params) => params.api.getDisplayedRowCount() - params.node.rowIndex,
@@ -135,24 +186,32 @@ import pagination from "../components/common/pagination.vue";
         width: 70,
       },
       // { headerName: "번호", field: "NO", sortable: false },
-      { headerName: "아이디", field: "ID", sortable: false },
-      { headerName: "이름", field: "NAME", sortable: false },
-      { headerName: "이메일", field: "EMAIL", sortable: false },
-      { headerName: "상태",
+      {
+        headerName: "제품명",
+        field: "NAME",
+        //sortable: useAuthStore().getCompanyId == "0-000000" ? true : false,
+      },
+      {
+        headerName: "제품 총수량",
         field: "STATUS",
-        sortable: false,
         width: 140,
         cellRenderer: (params) => {
-          return params.value == 0 ? '사용중' : params.value == 1 ? '정지' : '삭제';
-        }
+          return params.value;
+        },
+      },
+      {
+        headerName: "총 주문금액",
+        field: "STATUS",
+        width: 140,
+        cellRenderer: (params) => {
+          return params.value;
+        },
+      },
+      {
+        headerName: "주문일",
+        field: "ORDDATE",
+        width: 140,
       },
-      { headerName: "삭제일", field: "REGDATE", sortable: false, width: 140 },
-      // {
-      //   headerName: "알림 메일 수신 여부",
-      //   field: "mail_recp_yn",
-      //   sortable: false,
-      //   width: 130,
-      // },
     ],
     rowData: tblItems.value, // 테이블 데이터
     autoSizeStrategy: {
@@ -174,6 +233,44 @@ import pagination from "../components/common/pagination.vue";
   /************************************************************************
 |    함수(METHODS)
 ************************************************************************/
+  const deliLocated = () => {
+    router.push({
+      path: "/view/common/deli/index2",
+    });
+  };
+
+  const setDateRange = (range) => {
+    const today = dayjs();
+
+    switch(range) {
+      case 'today' :
+        searchStartDate.value = today.format('YYYY-MM-DD');
+        searchEndDate.value = today.format('YYYY-MM-DD');
+        selectedRange.value = 'today';
+        break;
+      case '7d':
+        searchStartDate.value = today.subtract(7, 'day').format('YYYY-MM-DD');
+        searchEndDate.value = today.format('YYYY-MM-DD');
+        selectedRange.value = '7d';
+        break;
+      case '1m':
+        searchStartDate.value = today.subtract(1, 'month').format('YYYY-MM-DD');
+        searchEndDate.value = today.format('YYYY-MM-DD');
+        selectedRange.value = '1m';
+        break;
+      case '3m':
+        searchStartDate.value = today.subtract(3, 'month').format('YYYY-MM-DD');
+        searchEndDate.value = today.format('YYYY-MM-DD');
+        selectedRange.value = '3m';
+        break;
+      case 'all':
+        searchStartDate.value = itemStartDate.value;
+        searchEndDate.value = today.format('YYYY-MM-DD');
+        selectedRange.value = 'all';
+        break
+    }
+  }
+
   const onGridReady = (__PARAMS) => {
     gridApi.value = __PARAMS.api;
   };
@@ -183,147 +280,50 @@ import pagination from "../components/common/pagination.vue";
     gridApi.value.paginationGoToPage(__PAGE - 1);
   };
 
-  // const detailLocated = (__EVENT) => {
-  //   router.push({
-  //     path: "/view/mng/mngAdd",
-  //   });
-  //   useDtStore.adminInfo.adminId = __EVENT.data.ID;
-  //   useDtStore.adminInfo.pageType = "U";
-  // };
+  const detailLocated = (__EVENT) => {
+    router.push({
+      path: "/view/common/deli/detail",
+    });
+    useDtStore.boardInfo.seq = __EVENT.data.SEQ;
+  };
 
-  const adminListGet = () => {
+  const itemListGet = async () => {
     let _req = {
-      _size: 1000,
-      _index: 0,
-      status: "-1",
+      // compId: useAuthStore().getCompanyId,
     };
 
     useAxios()
-      .post("/mng/list", _req)
+      .post("/item/list", _req)
       .then((res) => {
-        _req._size = res.data.length;
         tblItems.value = res.data;
         pageObj.value.totalCnt = tblItems.value.length;
+
+        itemStartDate.value = res.data[res.data.length-1].UDPDATE;
+        searchStartDate.value = itemStartDate.value;
+        searchEndDate.value = dayjs();
       });
   };
 
   const fnSearch = (__KEYWORD, __FILTER) => {
     let _req = {
-      _size: 1000,
-      _index: 0,
       filter: __FILTER,
       keyword: __KEYWORD,
-      status: "-1"
+      startDate: searchStartDate.value,
+      endDate: searchEndDate.value,
     };
 
     useAxios()
-      .post("/mng/search", _req)
+      .post("/item/search", _req)
       .then((res) => {
-        _req._size = res.data.length;
-
         tblItems.value = res.data;
         pageObj.value.totalCnt = tblItems.value.length;
       })
       .catch((error) => {});
   };
-
-  const fnRestore = async (idArr) => {
-    if (!idArr.length) return;
-    
-    for (const id of idArr) {
-      await useAxios().post(`mng/stupdate/${id}`);
-    }
-    window.location.reload();
-  };
-
-  const fnResEvt = () => {
-    const selected = gridApi.value.getSelectedRows();
-    if(selected.length ===  0){
-      let param = {
-        id: pageId,
-        title: "관리자 복원",
-        content: "복원할 관리자를 선택하세요.",
-        yes: {
-          text: "확인",
-          isProc: false,
-        },
-      };
-      $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
-    } else{
-      let param = {
-        id: pageId,
-        title: "관리자 복원",
-        content: "복원하시겠습니까?",
-        yes: {
-          text: "확인",
-          isProc: true,
-          event: "FN_RESTORE",
-          param: selected,
-        },
-        no: {
-          text: "취소",
-          isProc: false,
-        },
-      };
-      $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
-    }
-  };
-
-  const fnDelete = async (idArr) => {
-    if (!idArr.length) return;
-    
-    for (const id of idArr) {
-      await useAxios().post(`mng/delete/${id}`);
-    }
-    window.location.reload();
-  };
-
-  const fnDelEvt = () => {
-    const selected = gridApi.value.getSelectedRows();
-    if(selected.length ===  0){
-      let param = {
-        id: pageId,
-        title: "관리자 삭제",
-        content: "삭제할 관리자를 선택하세요.",
-        yes: {
-          text: "확인",
-          isProc: false,
-        },
-      };
-      $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
-    } else{
-      let param = {
-        id: pageId,
-        title: "관리자 삭제",
-        content: "삭제하시겠습니까?",
-        yes: {
-          text: "확인",
-          isProc: true,
-          event: "FN_DELETE",
-          param: selected,
-        },
-        no: {
-          text: "취소",
-          isProc: false,
-        },
-      };
-      $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
-    }
-  };
-/************************************************************************
+  /************************************************************************
 |    팝업 이벤트버스 정의
 ************************************************************************/
-$eventBus.off("FN_RESTORE");
-$eventBus.on("FN_RESTORE", (selected) => {
-  const idList = selected.map(row => row.ID);
-  fnRestore(idList);
-});
-$eventBus.off("FN_DELETE");
-$eventBus.on("FN_DELETE", (selected) => {
-  const idList = selected.map(row => row.ID);
-  fnDelete(idList);
-});
-/************************************************************************
+  /************************************************************************
 |    WATCH
 ************************************************************************/
 
@@ -337,6 +337,6 @@ $eventBus.on("FN_DELETE", (selected) => {
   );
 
   onMounted(() => {
-    adminListGet();
+    itemListGet();
   });
 </script>

+ 141 - 127
pages/view/deli/index.vue → pages/view/common/deli/index2.vue

@@ -4,28 +4,63 @@
       <h2>{{ pageId }}</h2>
       <div class="bread--crumbs--wrap">
         <span>홈</span>
-        <span>관리자 관리</span>
         <span>{{ pageId }}</span>
       </div>
     </div>
 
-    <div class="search--modules">
-      <div class="form--cont--filter">
-        <v-select
-          v-model="filter"
-          :items="filderArr"
-          variant="outlined"
-          class="custom-select"
-        >
-        </v-select>
+    <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="form--cont--text">
-        <v-text-field
-          v-model="searchModel"
-          class="custom-input mini"
-          style="width: 100%"
-          placeholder="검색어를 입력하세요"
-        ></v-text-field>
+      <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"
@@ -37,12 +72,14 @@
     <div class="data--list--wrap">
       <div class="btn--actions--wrap">
         <div class="left--sections">
-          <v-btn class="custom-btn mini btn-white" @click="fnDelEvt">선택 삭제</v-btn>
+          <v-btn class="custom-btn bdrs--10 btn-white" @click="deliLocated()"
+            ><i class="ico"></i>개별 배송</v-btn
+          >
+          <v-btn class="custom-btn btn-pink bdrs--10"
+            ><i class="ico"></i>공동구매 배송</v-btn
+          >
         </div>
         <div class="right--sections">
-          <v-btn class="custom-btn mini btn-reg" @click="addLocated()"
-            ><i class="ico"></i>신규 등록</v-btn
-          >
         </div>
       </div>
 
@@ -73,8 +110,11 @@
 </template>
 
 <script setup>
-  import { AgGridVue } from "ag-grid-vue3";
-  import pagination from "../components/common/pagination.vue";
+import VueDatePicker from "@vuepic/vue-datepicker";
+import "@vuepic/vue-datepicker/dist/main.css";
+import { AgGridVue } from "ag-grid-vue3";
+import dayjs from 'dayjs';
+import pagination from "../components/common/pagination.vue";
   /************************************************************************
 |    레이아웃
 ************************************************************************/
@@ -98,15 +138,26 @@
 |    전역
  ************************************************************************/
   const searchModel = ref("");
+  const selectedRange = ref('all');
+  const itemStartDate = ref("");
+  const searchStartDate = ref("");
+  const searchEndDate = ref("");
+  const datePickerFormat = "yyyy-MM-dd";
+  const dateOptions = [
+    { label: '오늘', value: 'today' },
+    { label: '7일', value: '7d' },
+    { label: '1개월', value: '1m' },
+    { label: '3개월', value: '3m' },
+    { label: '전체', value: 'all' },
+  ]
   const filter = ref("");
   const filderArr = ref([
-    { title: "선택하세요", value: "" },
-    { title: "이름", value: "name" },
-    { title: "아이디", value: "id" },
+    { title: "전체", value: "" },
+    { title: "제품명", value: "name" },
   ]);
   const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
   const router = useRouter();
-  const pageId = ref("관리자 리스트");
+  const pageId = ref("배송 관리");
   let pageObj = ref({
     page: 1, // 현재 페이지
     pageMaxNumSize: 10, // 페이지 숫자 최대 표현 개수
@@ -128,7 +179,7 @@
   // gridOption
   const gridOptions = {
     columnDefs: [
-      { checkboxSelection: true, headerCheckboxSelection: true, width: 0 },
+      //{ checkboxSelection: true, headerCheckboxSelection: true, width: 0 },
       {
         headerName: "No",
         valueGetter: (params) => params.api.getDisplayedRowCount() - params.node.rowIndex,
@@ -137,46 +188,31 @@
       },
       // { headerName: "번호", field: "NO", sortable: false },
       {
-        headerName: "아이디",
-        field: "ID",
-        sortable: useAuthStore().getCompanyId == "0-000000" ? true : false,
-      },
-      {
-        headerName: "회사명",
-        field: "COMP_NAME",
-        sortable: useAuthStore().getCompanyId == "0-000000" ? true : false,
-      },
-      {
-        headerName: "이름",
+        headerName: "제품명",
         field: "NAME",
-        sortable: useAuthStore().getCompanyId == "0-000000" ? true : false,
+        //sortable: useAuthStore().getCompanyId == "0-000000" ? true : false,
       },
       {
-        headerName: "이메일",
-        field: "EMAIL",
-        sortable: useAuthStore().getCompanyId == "0-000000" ? true : false,
+        headerName: "제품 총수량",
+        field: "STATUS",
+        width: 140,
+        cellRenderer: (params) => {
+          return params.value;
+        },
       },
       {
-        headerName: "상태",
+        headerName: "총 주문금액",
         field: "STATUS",
-        sortable: useAuthStore().getCompanyId == "0-000000" ? true : false,
         width: 140,
         cellRenderer: (params) => {
-          return params.value == 0 ? "사용중" : params.value == 1 ? "정지" : "삭제";
+          return params.value;
         },
       },
       {
-        headerName: "등록일",
-        field: "REGDATE",
-        sortable: useAuthStore().getCompanyId == "0-000000" ? true : false,
+        headerName: "주문일",
+        field: "ORDDATE",
         width: 140,
       },
-      // {
-      //   headerName: "알림 메일 수신 여부",
-      //   field: "mail_recp_yn",
-      //   sortable: false,
-      //   width: 130,
-      // },
     ],
     rowData: tblItems.value, // 테이블 데이터
     autoSizeStrategy: {
@@ -198,6 +234,44 @@
   /************************************************************************
 |    함수(METHODS)
 ************************************************************************/
+  const deliLocated = () => {
+    router.push({
+      path: "/view/common/deli",
+    });
+  };
+
+  const setDateRange = (range) => {
+    const today = dayjs();
+
+    switch(range) {
+      case 'today' :
+        searchStartDate.value = today.format('YYYY-MM-DD');
+        searchEndDate.value = today.format('YYYY-MM-DD');
+        selectedRange.value = 'today';
+        break;
+      case '7d':
+        searchStartDate.value = today.subtract(7, 'day').format('YYYY-MM-DD');
+        searchEndDate.value = today.format('YYYY-MM-DD');
+        selectedRange.value = '7d';
+        break;
+      case '1m':
+        searchStartDate.value = today.subtract(1, 'month').format('YYYY-MM-DD');
+        searchEndDate.value = today.format('YYYY-MM-DD');
+        selectedRange.value = '1m';
+        break;
+      case '3m':
+        searchStartDate.value = today.subtract(3, 'month').format('YYYY-MM-DD');
+        searchEndDate.value = today.format('YYYY-MM-DD');
+        selectedRange.value = '3m';
+        break;
+      case 'all':
+        searchStartDate.value = itemStartDate.value;
+        searchEndDate.value = today.format('YYYY-MM-DD');
+        selectedRange.value = 'all';
+        break
+    }
+  }
+
   const onGridReady = (__PARAMS) => {
     gridApi.value = __PARAMS.api;
   };
@@ -207,110 +281,50 @@
     gridApi.value.paginationGoToPage(__PAGE - 1);
   };
 
-  const addLocated = () => {
-    router.push({
-      path: "/view/mng/mngAdd",
-    });
-    useDtStore.adminInfo.pageType = "I";
-  };
-
   const detailLocated = (__EVENT) => {
     router.push({
-      path: "/view/mng/mngAdd",
+      path: "/view/common/deli/detail",
     });
     useDtStore.adminInfo.adminId = __EVENT.data.ID;
     useDtStore.adminInfo.pageType = "U";
   };
 
-  const adminListGet = () => {
+  const itemListGet = async () => {
     let _req = {
-      compId: useAuthStore().getCompanyId,
-      _size: 1000,
-      _index: 0,
+      // compId: useAuthStore().getCompanyId,
     };
 
     useAxios()
-      .post("/mng/list", _req)
+      .post("/item/list", _req)
       .then((res) => {
-        //console.error(res.data)
-        _req._size = res.data.length - 1; //나 자신의 정보는 제외
-        if (res.data.length > 0) {
-          res.data = res.data.filter((item) => item.ID !== useAuthStore().getUserId);
-        }
         tblItems.value = res.data;
         pageObj.value.totalCnt = tblItems.value.length;
+
+        itemStartDate.value = res.data[res.data.length-1].UDPDATE;
+        searchStartDate.value = itemStartDate.value;
+        searchEndDate.value = dayjs();
       });
   };
 
   const fnSearch = (__KEYWORD, __FILTER) => {
     let _req = {
-      _size: 1000,
-      _index: 0,
-      compId: useAuthStore().getCompanyId,
       filter: __FILTER,
       keyword: __KEYWORD,
+      startDate: searchStartDate.value,
+      endDate: searchEndDate.value,
     };
 
     useAxios()
-      .post("/mng/search", _req)
+      .post("/item/search", _req)
       .then((res) => {
-        _req._size = res.data.length;
-
         tblItems.value = res.data;
         pageObj.value.totalCnt = tblItems.value.length;
       })
       .catch((error) => {});
   };
-
-  const fnDelete = async (idArr) => {
-    if (!idArr.length) return;
-
-    for (const id of idArr) {
-      await useAxios().post(`mng/stupdate/${id}`);
-    }
-    window.location.reload();
-  };
-
-  const fnDelEvt = () => {
-    const selected = gridApi.value.getSelectedRows();
-    if (selected.length === 0) {
-      let param = {
-        id: pageId,
-        title: "관리자 삭제",
-        content: "삭제할 관리자를 선택하세요.",
-        yes: {
-          text: "확인",
-          isProc: false,
-        },
-      };
-      $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
-    } else {
-      let param = {
-        id: pageId,
-        title: "관리자 삭제",
-        content: "삭제하시겠습니까?",
-        yes: {
-          text: "확인",
-          isProc: true,
-          event: "FN_DELETE",
-          param: selected,
-        },
-        no: {
-          text: "취소",
-          isProc: false,
-        },
-      };
-      $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
-    }
-  };
   /************************************************************************
 |    팝업 이벤트버스 정의
 ************************************************************************/
-  $eventBus.off("FN_DELETE");
-  $eventBus.on("FN_DELETE", (selected) => {
-    const idList = selected.map((row) => row.ID);
-    fnDelete(idList);
-  });
   /************************************************************************
 |    WATCH
 ************************************************************************/
@@ -325,6 +339,6 @@
   );
 
   onMounted(() => {
-    adminListGet();
+    itemListGet();
   });
 </script>

+ 1 - 1
pages/view/common/item/index.vue

@@ -151,6 +151,7 @@ import dayjs from 'dayjs';
     { label: '3개월', value: '3m' },
     { label: '전체', value: 'all' },
   ]
+  const datePickerFormat = "yyyy-MM-dd";
   const filter = ref("");
   const filderArr = ref([
     { title: "전체", value: "" },
@@ -159,7 +160,6 @@ import dayjs from 'dayjs';
   const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
   const router = useRouter();
   const pageId = ref("제품 관리");
-  const datePickerFormat = "yyyy-MM-dd";
   const itemList = ref([]);
   const itemsPerPage = 5;
   const currentPage = ref(1);

+ 0 - 0
pages/view/settle/curationAdd.vue → pages/view/common/settle/curationAdd.vue


+ 0 - 0
pages/view/settle/curationList.vue → pages/view/common/settle/curationList.vue


+ 113 - 49
pages/view/settle/index.vue → pages/view/common/settle/index.vue

@@ -9,23 +9,59 @@
       </div>
     </div>
 
-    <div class="search--modules">
-      <div class="form--cont--filter">
-        <v-select
-          v-model="filter"
-          :items="filderArr"
-          variant="outlined"
-          class="custom-select"
-        >
-        </v-select>
+    <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="form--cont--text">
-        <v-text-field
-          v-model="searchModel"
-          class="custom-input mini"
-          style="width: 100%"
-          placeholder="검색어를 입력하세요"
-        ></v-text-field>
+      <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"
@@ -39,11 +75,6 @@
         <div class="left--sections">
           <!-- <v-btn class="custom-btn mini btn-white">선택 삭제</v-btn> -->
         </div>
-        <div class="right--sections">
-          <v-btn class="custom-btn mini btn-reg" @click="addLocated"
-            ><i class="ico"></i>신규 등록</v-btn
-          >
-        </div>
       </div>
       <div class="tbl-wrapper">
         <div class="tbl-wrap">
@@ -71,6 +102,8 @@
 </template>
 
 <script setup>
+import VueDatePicker from "@vuepic/vue-datepicker";
+import "@vuepic/vue-datepicker/dist/main.css";
 import { AgGridVue } from "ag-grid-vue3";
 import pagination from "../components/common/pagination.vue";
 
@@ -98,15 +131,26 @@ const useDtStore = useDetailStore();
  ************************************************************************/
 const filter = ref("");
 const filderArr = ref([
-  { title: "선택하세요", value: "" },
-  { title: "제목", value: "title" },
-  { title: "내용", value: "content" },
+  { title: "전체", value: "" },
+  { title: "벤더사", value: "title" },
 ]);
 const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
 const router = useRouter();
-const pageId = ref("IR");
+const pageId = ref("정산 관리");
 const pageIdSub = ref();
 const searchModel = ref("");
+const selectedRange = ref('all');
+const itemStartDate = ref("");
+const searchStartDate = ref("");
+const searchEndDate = ref("");
+const datePickerFormat = "yyyy-MM-dd";
+const dateOptions = [
+  { label: '오늘', value: 'today' },
+  { label: '7일', value: '7d' },
+  { label: '1개월', value: '1m' },
+  { label: '3개월', value: '3m' },
+  { label: '전체', value: 'all' },
+]
 let pageObj = ref({
   page: 1, // 현재 페이지
   pageMaxNumSize: 10, // 페이지 숫자 최대 표현 개수
@@ -132,12 +176,10 @@ const gridOptions = {
       sortable: false,
       width: 70,
     },
-    { headerName: "언어", field: "brd_lang", sortable: true, width: 70 },
-    { headerName: "제목", field: "title", sortable: false, width: 500 },
-    // { headerName: "조회수", field: "", sortable: false },
-    { headerName: "노출여부", field: "show_yn", sortable: true, width: 70 },
-    { headerName: "작성자", field: "admin_name", sortable: false, width: 120 },
-    { headerName: "등록일", field: "crt_dtime", sortable: false, width: 120 },
+    { headerName: "벤더사", field: "brd_lang", sortable: true, width: 150 },
+    { headerName: "제품 총수량", field: "title", sortable: false, width: 70 },
+    { headerName: "판매금액", field: "show_yn", sortable: true, width: 70 },
+    { headerName: "정산기간", field: "crt_dtime", sortable: false, width: 120 },
   ],
   rowData: tblItems.value, // 테이블 데이터
 
@@ -169,14 +211,6 @@ const chgPage = (__PAGE) => {
   gridApi.value.paginationGoToPage(__PAGE - 1);
 };
 
-const addLocated = () => {
-  router.push({
-    path: "/view/media/irAdd",
-    //query: { id: rowId },
-  });
-  useDtStore.boardInfo.pageType = "I";
-};
-
 const detailLocated = (__EVENT) => {
   router.push({
     path: "/view/media/irAdd",
@@ -203,22 +237,52 @@ const newsListGet = () => {
     .catch((error) => {});
 };
 
+const setDateRange = (range) => {
+  const today = dayjs();
+
+  switch(range) {
+    case 'today' :
+      searchStartDate.value = today.format('YYYY-MM-DD');
+      searchEndDate.value = today.format('YYYY-MM-DD');
+      selectedRange.value = 'today';
+      break;
+    case '7d':
+      searchStartDate.value = today.subtract(7, 'day').format('YYYY-MM-DD');
+      searchEndDate.value = today.format('YYYY-MM-DD');
+      selectedRange.value = '7d';
+      break;
+    case '1m':
+      searchStartDate.value = today.subtract(1, 'month').format('YYYY-MM-DD');
+      searchEndDate.value = today.format('YYYY-MM-DD');
+      selectedRange.value = '1m';
+      break;
+    case '3m':
+      searchStartDate.value = today.subtract(3, 'month').format('YYYY-MM-DD');
+      searchEndDate.value = today.format('YYYY-MM-DD');
+      selectedRange.value = '3m';
+      break;
+    case 'all':
+      searchStartDate.value = itemStartDate.value;
+      searchEndDate.value = today.format('YYYY-MM-DD');
+      selectedRange.value = 'all';
+      break
+  }
+}
+
 const fnSearch = (__KEYWORD, __FILTER) => {
   let _req = {
-    _size: 1000,
-    _index: 0,
-    brd_lang: "",
-    brd_cd: "BR02",
-    content: __FILTER == "content" ? __KEYWORD : __FILTER == "" ? __KEYWORD : null,
-    title: __FILTER == "title" ? __KEYWORD : __FILTER == "" ? __KEYWORD : null,
+    filter: __FILTER,
+    keyword: __KEYWORD,
+    startDate: searchStartDate.value,
+    endDate: searchEndDate.value,
+    //인플루언서의 경우 showYN 추가
+    //showYN: "Y"
   };
 
   useAxios()
-    .post("/brd/list", _req)
+    .post("/item/search", _req)
     .then((res) => {
-      _req._size = res.data.list.length;
-      tblItems.value = res.data.list;
-      pageObj.value.totalCnt = tblItems.value.length;
+      itemList.value = res.data;
     })
     .catch((error) => {});
 };

+ 0 - 0
pages/view/settle/irAdd.vue → pages/view/common/settle/irAdd.vue


+ 0 - 0
pages/view/settle/mediaAdd.vue → pages/view/common/settle/mediaAdd.vue


+ 0 - 0
pages/view/settle/mediaList.vue → pages/view/common/settle/mediaList.vue


+ 0 - 0
pages/view/settle/newsAdd.vue → pages/view/common/settle/newsAdd.vue


+ 0 - 0
pages/view/settle/newsList.vue → pages/view/common/settle/newsList.vue


+ 0 - 568
pages/view/deli/mngAdd.vue

@@ -1,568 +0,0 @@
-<template>
-  <div>
-    <div class="inner--headers">
-      <h2>{{ pageId }}</h2>
-      <div class="bread--crumbs--wrap">
-        <span>홈</span>
-        <span>관리자 관리</span>
-        <span>{{ pageId }}</span>
-      </div>
-    </div>
-
-    <div class="view-wrap mt--45">
-      <div class="view-box">
-        <div class="view-box-top">
-          <h3 v-if="pageType == 'I'">관리자 등록</h3>
-          <h3 v-else>관리자 수정</h3>
-        </div>
-        <div class="view-box-btm">
-          <div class="form-style1">
-            <v-form ref="addForm">
-              <table>
-                <colgroup>
-                  <col style="width: 12.5rem" />
-                  <col />
-                </colgroup>
-                <tbody>
-                  <tr v-if="useAuthStore().getCompanyId == '0-000000'">
-                    <th>회사명<span class="bul">*</span></th>
-                    <td>
-                      <v-text-field
-                        v-model="form.companyName"
-                        maxlength="10"
-                        class="custom-input mini"
-                        style="max-width: 200px"
-                        :readonly="pageType == 'U'"
-                        :rules="[useValid.required('회사명')]"
-                      ></v-text-field>
-                    </td>
-                  </tr>
-                  <tr>
-                    <th>아이디<span class="bul">*</span></th>
-                    <td>
-                      <div class="form--group--inner align-start">
-                        <v-text-field
-                          v-model="form.id"
-                          class="custom-input mini"
-                          style="max-width: 200px"
-                          :readonly="isReadonly"
-                          placeholder=""
-                          :rules="[useValid.required('아이디')]"
-                        ></v-text-field>
-                        <v-btn
-                          v-if="!isReadonly"
-                          class="custom-btn mini btn-black"
-                          @click="idCheck"
-                          :class="{ disabled: form.idCheck }"
-                          >중복 확인</v-btn
-                        >
-                      </div>
-                    </td>
-                  </tr>
-                  <tr>
-                    <th>패스워드<span v-if="pageType == 'I'" class="bul">*</span></th>
-                    <td>
-                      <v-text-field
-                        v-model="form.passWord"
-                        class="custom-input mini"
-                        type="password"
-                        style="max-width: 200px"
-                        :rules="
-                          pageType == 'U'
-                            ? form.passWord.length > 0
-                              ? [useValid.passWordChk(form.passWord)]
-                              : []
-                            : [useValid.passWordChk(form.passWord)]
-                        "
-                      ></v-text-field>
-                    </td>
-                  </tr>
-
-                  <tr>
-                    <th>
-                      패스워드 확인<span v-if="pageType == 'I'" class="bul">*</span>
-                    </th>
-                    <td>
-                      <v-text-field
-                        v-model="form.passWordCheck"
-                        type="password"
-                        class="custom-input mini"
-                        style="max-width: 200px"
-                        :rules="
-                          pageType == 'U' && form.passWord.length == 0
-                            ? []
-                            : [useValid.passWordConfirm(form.passWord)]
-                        "
-                      ></v-text-field>
-                    </td>
-                  </tr>
-                  <tr>
-                    <th>이름<span class="bul">*</span></th>
-                    <td>
-                      <v-text-field
-                        v-model="form.name"
-                        maxlength="10"
-                        :readonly="isReadonly"
-                        class="custom-input mini"
-                        style="max-width: 200px"
-                        :rules="[useValid.required('이름')]"
-                      ></v-text-field>
-                    </td>
-                  </tr>
-                  <tr>
-                    <th>연락처<span class="bul">*</span></th>
-                    <td>
-                      <div class="form--group--inner">
-                        <v-text-field
-                          v-model="form.phone[0]"
-                          class="custom-input mini"
-                          style="max-width: 150px"
-                          maxlength="4"
-                          :rules="[useValid.required('연락처')]"
-                        ></v-text-field>
-                        -
-                        <v-text-field
-                          v-model="form.phone[1]"
-                          class="custom-input mini"
-                          maxlength="4"
-                          :rules="[useValid.required('연락처')]"
-                          style="max-width: 150px"
-                        ></v-text-field>
-                        -
-                        <v-text-field
-                          v-model="form.phone[2]"
-                          maxlength="4"
-                          :rules="[useValid.required('연락처')]"
-                          class="custom-input mini"
-                          style="max-width: 150px"
-                        ></v-text-field>
-                      </div>
-                    </td>
-                  </tr>
-                  <tr>
-                    <th>이메일<span class="bul">*</span></th>
-                    <td>
-                      <div class="form--group--inner">
-                        <v-text-field
-                          v-model="form.email[0]"
-                          class="custom-input mini"
-                          :rules="[useValid.required('이메일')]"
-                          style="width: 200px"
-                        ></v-text-field>
-                        @
-                        <v-text-field
-                          :class="{ visible: hide }"
-                          v-model="form.email[1]"
-                          class="custom-input mini"
-                          :rules="[useValid.required('이메일')]"
-                          style="width: 250px"
-                        ></v-text-field>
-                        <v-select
-                          v-model="form.emailSet"
-                          variant="outlined"
-                          style="max-width: 250px"
-                          class="custom-select"
-                          :items="form.emailArr"
-                          @update:modelValue="emailPush(form.emailSet)"
-                        >
-                        </v-select>
-                      </div>
-                    </td>
-                  </tr>
-                  <tr v-if="useAuthStore().getCompanyId == '0-000000'">
-                    <th class="bg le">기업코드<span class="bul">*</span></th>
-                    <td>
-                      <div class="form--group--inner">
-                        <v-text-field
-                          class="custom-input mini"
-                          v-model="form.companyId"
-                          style="max-width: 200px"
-                          :readonly="pageType == 'U'"
-                        ></v-text-field>
-                        <span class="caution--text fts--14"
-                          >* 0-000000 형식의 자릿수 맞추어 등록(주의 : 등록 후
-                          수정불가능!)</span
-                        >
-                      </div>
-                    </td>
-                  </tr>
-                  <tr v-if="pageType == 'U'">
-                    <th>상태<span class="bul">*</span></th>
-                    <td>
-                      <v-select
-                        variant="outlined"
-                        style="width: 250px"
-                        class="custom-select"
-                        v-model="form.status"
-                        :items="form.statusArr"
-                      >
-                      </v-select>
-                    </td>
-                  </tr>
-                </tbody>
-              </table>
-            </v-form>
-          </div>
-        </div>
-      </div>
-
-      <div class="view-btm-btn">
-        <div class="btn-l">
-          <v-btn class="custom-btn btn-list" @click="listLocated"
-            ><i class="ico"></i>목록</v-btn
-          >
-        </div>
-        <div class="btn-r">
-          <v-btn v-show="pageType == 'I'" class="custom-btn btn-blue2" @click="fnRegCheck"
-            ><i class="ico"></i>저장</v-btn
-          >
-          <v-btn v-show="pageType == 'U'" class="custom-btn btn-blue2" @click="fnRegCheck"
-            ><i class="ico"></i>수정</v-btn
-          >
-        </div>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script setup>
-  import VueDatePicker from "@vuepic/vue-datepicker";
-  import "@vuepic/vue-datepicker/dist/main.css";
-  import { now } from "lodash";
-  /************************************************************************
-|    레이아웃
-************************************************************************/
-  definePageMeta({
-    layout: "default",
-  });
-  /************************************************************************
-|    스토어
- ************************************************************************/
-  const useDtStore = useDetailStore();
-  /************************************************************************
-|    전역
-************************************************************************/
-  const hide = ref(null);
-  const addForm = ref(null);
-  const router = useRouter();
-  const { $eventBus } = useNuxtApp();
-  const isReadonly = ref(false);
-  const pageType = ref("");
-  const adminId = ref("");
-  const pageId = ref("");
-  const datePickerFormat = "yyyy-MM-dd";
-  const today = new Date().toISOString().slice(0, 10);
-  const form = ref({
-    companyId: "",
-    companyName: "",
-    id: "",
-    passWord: "",
-    passWordCheck: "",
-    name: "",
-    phone: ["", "", ""],
-    email: ["", ""],
-    emailSet: "직접 입력",
-    emailArr: [
-      { title: "직접 입력", value: "" },
-      { title: "naver.com", value: "naver.com" },
-      { title: "gmail.com", value: "gmail.com" },
-      { title: "daum.net", value: "daum.net" },
-      { title: "yahoo.com", value: "yahoo.com" },
-      { title: "icloud.com", value: "icloud.com" },
-      { title: "hotmail.com", value: "hotmail.com" },
-      { title: "outlook.com", value: "outlook.com" },
-    ],
-    regDate: today,
-    status: "",
-    statusArr: [
-      { title: "사용중", value: "0" },
-      { title: "정지", value: "1" },
-    ],
-    idCheck: false,
-  });
-
-  const fnUpdEvt = () => {
-    let param = {
-      id: pageId,
-      title: "관리자 수정",
-      content: "저장하시겠습니까?",
-      yes: {
-        text: "저장",
-        isProc: true,
-        event: "FN_UPDATE",
-        param: "",
-      },
-      no: {
-        text: "취소",
-        isProc: false,
-      },
-    };
-    $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
-  };
-
-  const fnRegCheck = () => {
-    nextTick(() => {
-      if (addForm.value && typeof addForm.value.validate === "function") {
-        addForm.value
-          .validate()
-          .then((isValid) => {
-            if (isValid.valid) {
-              if (pageType.value == "I") {
-                if (form.value.idCheck) {
-                  fnRegEvt();
-                }
-              } else {
-                fnUpdEvt();
-              }
-            } else {
-              if (pageType.value == "I") {
-                if (form.value.idCheck == false) {
-                  let param = {
-                    id: pageId,
-                    title: "관리자 등록",
-                    content: "중복 여부를 체크한 뒤 다시 시도해주세요.",
-                    yes: {
-                      text: "확인",
-                      isProc: false,
-                    },
-                  };
-                  $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
-                } else {
-                  let param = {
-                    id: pageId,
-                    title: "관리자 등록",
-                    content: "필수항목을 입력해주세요.",
-                    yes: {
-                      text: "확인",
-                      isProc: false,
-                    },
-                  };
-                  $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
-                }
-              } else {
-                let param = {
-                  id: pageId,
-                  title: "관리자 수정",
-                  content: "필수항목을 입력해주세요.",
-                  yes: {
-                    text: "확인",
-                    isProc: false,
-                  },
-                };
-                $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
-              }
-            }
-          })
-          .catch((err) => {
-            console.error("벨리데이션 에러", err);
-          });
-      } else {
-        console.error("항목 누락체크[fnRegCheck]]");
-      }
-    });
-  };
-
-  const fnRegEvt = () => {
-    let param = {
-      id: pageId,
-      title: "관리자 등록",
-      content: "등록하시겠습니까?",
-      yes: {
-        text: "등록",
-        isProc: true,
-        event: "FN_INSERT",
-        param: "",
-      },
-      no: {
-        text: "취소",
-        isProc: false,
-      },
-    };
-    $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
-  };
-
-  const fnInsert = () => {
-    let params = {
-      id: form.value.id,
-      password: form.value.passWord,
-      name: form.value.name,
-      phone: form.value.phone[0] + "-" + form.value.phone[1] + "-" + form.value.phone[2],
-      email: form.value.email[0] + "@" + form.value.email[1],
-      regdate: Date.now(),
-      comp_name:
-        useAuthStore().getCompanyId == "0-000000"
-          ? form.value.companyName
-          : useAuthStore().getCompanyName,
-      comp_id:
-        useAuthStore().getCompanyId == "0-000000"
-          ? form.value.companyId
-          : useAuthStore().getCompanyId,
-    };
-
-    useAxios()
-      .post("/mng/reg", params)
-      .then((res) => {
-        router.push("/view/mng");
-      })
-      .catch((error) => {
-        //$log.debug("[equipMgmtReg][fnGetTenantList][error]");
-        //useErrorHandler().fnSetCommErrorHandle(error, fnGetTenantList);
-      })
-      .finally(() => {
-        //$log.debug("[equipMgmtReg][fnGetTenantList][finished]");
-        //objSlt.value.tenantNameList = _cloneDeep(temp);
-      });
-  };
-
-  const fnUpdate = () => {
-    let params = {
-      id: useDtStore.adminInfo.adminId,
-      password: form.value.passWord,
-      name: form.value.name,
-      phone: form.value.phone[0] + "-" + form.value.phone[1] + "-" + form.value.phone[2],
-      email: form.value.email[0] + "@" + form.value.email[1],
-      regdate: form.value.regDate,
-      status: form.value.status,
-      comp_name:
-        useAuthStore().getCompanyId == "0-000000"
-          ? form.value.companyName
-          : useAuthStore().getCompanyName,
-      comp_id:
-        useAuthStore().getCompanyId == "0-000000"
-          ? form.value.companyId
-          : useAuthStore().getCompanyId,
-    };
-
-    useAxios()
-      .post("/mng/update", params)
-      .then((res) => {
-        window.location.reload();
-      })
-      .catch((error) => {})
-      .finally(() => {});
-  };
-
-  const fnDetail = () => {
-    let _req = {
-      id: useDtStore.adminInfo.adminId,
-    };
-    useAxios()
-      .get(`/mng/detail/${_req.id}`)
-      .then((res) => {
-        form.value.companyId = res.data.COMP_ID;
-        form.value.companyName = res.data.COMP_NAME;
-        form.value.id = res.data.ID;
-        form.value.name = res.data.NAME;
-        form.value.phone[0] = res.data.PHONE.split("-")[0];
-        form.value.phone[1] = res.data.PHONE.split("-")[1];
-        form.value.phone[2] = res.data.PHONE.split("-")[2];
-        form.value.email[0] = res.data.EMAIL.split("@")[0];
-        form.value.email[1] = res.data.EMAIL.split("@")[1];
-        form.value.regDate = new Date(res.data.REGDATE);
-        form.value.status = res.data.STATUS;
-      })
-      .catch((error) => {})
-      .finally(() => {});
-  };
-
-  const emailPush = (__VAL) => {
-    form.value.email[1] = __VAL;
-    hide.value = __VAL.length > 0 ? true : false;
-  };
-
-  /************************************************************************
-|    함수(METHODS)
-************************************************************************/
-
-  const listLocated = () => {
-    router.push({
-      path: "/view/mng",
-    });
-  };
-
-  const idCheck = () => {
-    let params = {
-      id: form.value.id,
-    };
-
-    if (form.value.id.length > 0) {
-      useAxios()
-        .post("/mng/chk", params)
-        .then((res) => {
-          let param = {
-            id: pageId,
-            title: "아이디 중복체크",
-            content: "사용가능한 아이디입니다.",
-            yes: {
-              text: "확인",
-              isProc: false,
-            },
-          };
-          $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
-          form.value.idCheck = true;
-        })
-        .catch((error) => {
-          let param = {
-            id: pageId,
-            title: "아이디 중복체크",
-            content: "사용할 수 없는 아이디입니다.",
-            yes: {
-              text: "확인",
-              isProc: false,
-            },
-          };
-          $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
-          form.value.idCheck = false;
-          //$log.debug("[equipMgmtReg][fnGetTenantList][error]");
-          //useErrorHandler().fnSetCommErrorHandle(error, fnGetTenantList);
-        })
-        .finally(() => {
-          //$log.debug("[equipMgmtReg][fnGetTenantList][finished]");
-          //objSlt.value.tenantNameList = _cloneDeep(temp);
-        });
-    } else {
-      let param = {
-        id: pageId,
-        title: "아이디 중복체크",
-        content: "아이디를 입력해주세요.",
-        yes: {
-          text: "확인",
-          isProc: false,
-        },
-      };
-      $eventBus.emit("OPEN_CONFIRM_POP_UP", param);
-    }
-  };
-
-  /************************************************************************
-|    라이프사이클
-************************************************************************/
-  onMounted(() => {
-    pageType.value = useDtStore.adminInfo.pageType;
-
-    //관리자 등록/수정 분기처리
-    if (pageType.value == "U") {
-      adminId.value = useDtStore.adminInfo.adminId;
-      pageId.value = "관리자 수정";
-      isReadonly.value = true;
-      fnDetail();
-    } else {
-      pageId.value = "관리자 등록";
-    }
-  });
-
-  /************************************************************************
-|    팝업 이벤트버스 정의
-************************************************************************/
-  $eventBus.off("FN_INSERT");
-  $eventBus.on("FN_INSERT", () => {
-    fnInsert();
-  });
-  $eventBus.off("FN_UPDATE");
-  $eventBus.on("FN_UPDATE", () => {
-    fnUpdate();
-  });
-  /************************************************************************
-|    WATCH
-************************************************************************/
-</script>

+ 0 - 440
pages/view/order/index.vue

@@ -1,440 +0,0 @@
-<template>
-  <div>
-    <div class="inner--headers">
-      <h2>{{ pageId }}</h2>
-      <div class="bread--crumbs--wrap">
-        <span>홈</span>
-        <!-- <span>주문 관리</span> -->
-        <span>{{ pageId }}</span>
-      </div>
-    </div>
-
-    <div class="view-wrap mt--45">
-      <div class="view-box">
-        <div class="view-box-top">
-          <h3 >주문 관리</h3>
-        </div>
-        <div class="view-box-btm">
-          <div class="form-style1">
-            <v-form ref="addForm">
-              <table>
-                <colgroup>
-                  <col style="width: 12.5rem" />
-                  <col />
-                </colgroup>
-                <tbody>
-                  <tr>
-                    <th>이벤트 명</th>
-                    <td>{{ form.title }}</td>
-                  </tr>
-
-                  <tr>
-                    <th>이벤트 기간</th>
-                    <td>{{ form.startDate }} ~ {{ form.endDate }}</td>
-                  </tr>
-                </tbody>
-              </table>
-            </v-form>
-          </div>
-        </div>
-      </div>
-
-      <div
-        class="winner--rank--wrapper mt--45"
-        :class="form.winnerArr.length > 0 ? 'count--' + form.winnerArr.length : ''"
-      >
-        <dl v-for="(item, index) in form.winnerArr" :key="index">
-          <dt>
-            <span class="rank"
-              >{{ index + 1 }}등 (<i>{{ item.itemName }}</i></span
-            >)
-          </dt>
-          <dd>
-            <span class="name">
-              {{ item.name }} <i v-if="item.count > 1">{{ item.count }} 외</i>
-            </span>
-            <span class="rank--count"> ( 1 / {{ item.count }} )</span>
-          </dd>
-        </dl>
-        <!-- 3의 배수가 아닐 경우 또는 0개일 때 빈 dl 추가 -->
-        <dl
-          v-for="n in form.winnerArr.length === 0
-            ? 4
-            : form.winnerArr.length % 4 === 0
-            ? 0
-            : 4 - (form.winnerArr.length % 4)"
-          :key="'empty-' + n"
-        >
-          <dt>&nbsp;</dt>
-          <dd>&nbsp;</dd>
-        </dl>
-      </div>
-
-      <div class="data--list--wrap">
-        <div class="btn--actions--wrap">
-          <div class="left--sections">
-            <!-- <v-btn class="custom-btn mini btn-white">선택 삭제</v-btn> -->
-          </div>
-          <div class="right--sections d-flex gap--10">
-            <!-- <v-btn class="custom-btn mini btn-reg" @click="addLocated()"
-              ><i class="ico"></i>신규 등록</v-btn
-            > -->
-            <v-btn
-              class="custom-btn btn-excel"
-              @click="fnExcelDown"
-              :disabled="Number(pageObj.totalCnt) <= 0"
-              ><i class="ico"></i>엑셀 다운로드</v-btn
-            >
-            <div class="form--group--inner">
-              <v-select
-                v-model="form.productItemsSet"
-                variant="outlined"
-                style="min-width: 200px"
-                class="custom-select"
-                :items="form.productItemsArr"
-                @update:modelValue="emailPush(form.productItemsSet)"
-              >
-              </v-select>
-            </div>
-          </div>
-        </div>
-
-        <div class="tbl-wrapper">
-          <div class="tbl-wrap">
-            <!-- ag grid -->
-            <ag-grid-vue
-              style="width: 100%; height: calc(4 * 2.94rem)"
-              class="ag-theme-quartz"
-              :gridOptions="gridOptions"
-              :rowData="tblItems"
-              :paginationPageSize="pageObj.pageSize"
-              :suppressPaginationPanel="true"
-              @grid-ready="onGridReady"
-            >
-            </ag-grid-vue>
-
-            <!-- 페이징 -->
-            <div class="ag-grid-custom-pagenations">
-              <pagination @chg_page="chgPage" :pageObj="pageObj"></pagination>
-            </div>
-          </div>
-        </div>
-      </div>
-
-      <div class="view-btm-btn">
-        <div class="btn-l">
-          <!-- <v-btn class="custom-btn btn-list" @click="listLocated"
-            ><i class="ico"></i>목록</v-btn
-          > -->
-          <!-- <v-btn v-show="pageType == 'U'" class="custom-btn btn-del" @click="fnDelEvt"
-            ><i class="ico"></i>삭제</v-btn
-          > -->
-        </div>
-        <div class="btn-r">
-          <v-btn class="custom-btn btn-list" @click="listLocated"
-            ><i class="ico"></i>목록</v-btn
-          >
-          <!-- <v-btn v-show="pageType == 'I'" class="custom-btn btn-blue2" @click="fnRegCheck"
-            ><i class="ico"></i>저장</v-btn
-          >
-          <v-btn v-show="pageType == 'U'" class="custom-btn btn-blue2" @click="fnRegCheck"
-            ><i class="ico"></i>수정</v-btn
-          > -->
-        </div>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script setup>
-  import customButtonSms from "@/components/cellRenderer/customButtonSms";
-import useUtil from "@/composables/useUtil";
-import { AgGridVue } from "ag-grid-vue3";
-import pagination from "../components/common/pagination.vue";
-
-  /***********************
-   *     plugins inject
-   ************************/
-  const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
-
-  /************************************************************************
-  |    레이아웃
-  ************************************************************************/
-  definePageMeta({
-    layout: "default",
-  });
-  /************************************************************************
-  |    스토어
-   ************************************************************************/
-  const useDtStore = useDetailStore();
-  /************************************************************************
-  |    전역
-  ************************************************************************/
-  let pageObj = ref({
-    page: 1, // 현재 페이지
-    pageMaxNumSize: 10, // 페이지 숫자 최대 표현 개수
-    pageSize: 3, // 테이블 조회 데이터 개수
-    totalCnt: 0, // 전체 페이지
-  });
-  const tblItems = ref([]); // stat 데이터
-  const hide = ref(null);
-  const addForm = ref(null);
-  const router = useRouter();
-  const isReadonly = ref(false);
-  const pageType = ref("");
-  const adminId = ref("");
-  const pageId = ref("");
-  const form = ref({
-    id: "",
-    passWord: "",
-    passWordCheck: "",
-    name: "",
-    phone: ["", "", ""],
-    email: ["", ""],
-    title: "",
-    startDate: "",
-    endDate: "",
-    emailAlarmArr: [
-      { title: "Y", value: "Y" },
-      { title: "N", value: "N" },
-    ],
-    emailSet: "",
-    emailArr: [
-      { title: "직접 입력하세요", value: "" },
-      { title: "naver.com", value: "naver.com" },
-      { title: "gmail.com", value: "gmail.com" },
-      { title: "daum.net", value: "daum.net" },
-      { title: "yahoo.com", value: "yahoo.com" },
-      { title: "icloud.com", value: "icloud.com" },
-      { title: "hotmail.com", value: "hotmail.com" },
-      { title: "outlook.com", value: "outlook.com" },
-    ],
-    productItemsArr: [{ title: "선택 하세요.", value: "" }],
-    productItemsSet: "",
-
-    winnerArr: [],
-    authority: {
-      auth01: false,
-      auth02: false,
-      auth03: false,
-      auth04: false,
-      auth05: false,
-      auth06: false,
-    },
-    idCheck: false,
-  });
-
-  pageObj.value.totalCnt = tblItems.value.length;
-
-  const remToPx = () => parseFloat(getComputedStyle(document.documentElement).fontSize);
-  const rowHeightRem = 2.65; // 원하는 rem 값
-  const rowHeightPx = rowHeightRem * remToPx();
-  const gridApi = shallowRef();
-
-  // gridOption
-  const gridOptions = {
-    columnDefs: [
-      {
-        headerName: "No",
-        valueGetter: (params) => params.api.getDisplayedRowCount() - params.node.rowIndex,
-        sortable: false,
-        width: 70,
-      },
-      // { headerName: "번호", field: "NO", sortable: false },
-      { headerName: "순위", field: "rank", sortable: false },
-      { headerName: "상품명", field: "item_name", sortable: true },
-      { headerName: "이름", field: "name", sortable: false, width: 140 },
-      { headerName: "핸드폰", field: "phone", sortable: false, width: 140 },
-      {
-        headerName: "개인정보동의",
-        field: "privacy_agree",
-        sortable: false,
-        width: 140,
-        valueFormatter: (params) => (params.value == 1 ? "동의" : ""),
-      },
-      {
-        headerName: "개인정보3자 동의",
-        field: "thirdparty_agree",
-        sortable: false,
-        width: 140,
-        valueFormatter: (params) => (params.value == 1 ? "동의" : ""),
-      },
-      { headerName: "당첨일", field: "winner_date", sortable: false, width: 140 },
-      {
-        headerName: "SMS",
-        field: "phone",
-        cellRenderer: customButtonSms,
-        cellRendererParams: {
-          onSendKakao: (phone) => sendKakaoMessage(phone),
-        },
-      },
-    ],
-    rowData: tblItems.value, // 테이블 데이터
-    autoSizeStrategy: {
-      type: "fitGridWidth", // width맞춤
-    },
-    suppressMovableColumns: true,
-    headerHeight: rowHeightPx,
-    rowHeight: rowHeightPx,
-    pagination: true,
-    suppressPaginationPanel: true, // 하단 default 페이징 컨트롤 숨김
-  };
-
-  /************************************************************************
-  |    함수(METHODS)
-  ************************************************************************/
-
-  const onGridReady = (__PARAMS) => {
-    gridApi.value = __PARAMS.api;
-  };
-
-  const chgPage = (__PAGE) => {
-    pageObj.value.page = __PAGE;
-    gridApi.value.paginationGoToPage(__PAGE - 1);
-  };
-
-  const fnDetail = () => {
-    let url = "/winner/detail/" + useDtStore.boardInfo.seq;
-    useAxios()
-      .get(url, null)
-      .then((res) => {
-        let winnerList = res.data.participations_cal;
-        form.value.title = res.data.title;
-        form.value.startDate = res.data.startdate;
-        form.value.endDate = res.data.enddate;
-
-        //아이템 리스트
-        res.data.items.forEach((element) => {
-          form.value.productItemsArr.push({
-            title: element.name,
-            value: element.name,
-          });
-        });
-
-        //당첨자 리스트
-        winnerList.forEach((element) => {
-          if (element.rank > 0) {
-            form.value.winnerArr.push({
-              rank: element.rank,
-              itemName: element.item_name,
-              name: element.name,
-              count: element.count,
-            });
-          }
-        });
-
-        tblItems.value = res.data.participations;
-        pageObj.value.totalCnt = tblItems.value.length;
-      })
-      .catch((error) => {})
-      .finally(() => {});
-  };
-
-  const emailPush = (__VAL) => {
-    form.value.email[1] = __VAL;
-    hide.value = __VAL.length > 0 ? true : false;
-  };
-
-  function sendKakaoMessage(phone) {
-    // 문자 발송 API 호출
-    alert(phone + "번호로 문자가 발송되었습니다.");
-
-    // useAxios()
-    //   .post("/kakao/send", { phone })
-    //   .then(() => {
-    //     // 성공 처리
-    //   })
-    //   .catch(() => {
-    //     // 실패 처리
-    //   });
-  }
-
-  function fnExcelDown() {
-    let headers = [];
-    let excelData = [];
-
-    tblItems.value.forEach((item) => {
-      let excelRow = {};
-      excelRow.ipAddr = item.ipAddr;
-      excelRow.allowYnTxt = item.allowYnTxt;
-      excelRow.ipDesc = item.ipDesc;
-      excelRow.updateDate = $dayjs(item.updateDate).format("YYYY-MM-DD HH:mm:ss");
-      excelData.push(excelRow);
-    });
-    headers.push({ header: "순위", dataKey: "rank" });
-    headers.push({ header: "상품명", dataKey: "item_name" });
-    headers.push({ header: "이름", dataKey: "name" });
-    headers.push({ header: "핸드폰", dataKey: "phone" });
-    headers.push({ header: "개인정보 동의", dataKey: "privacy_agree" });
-    headers.push({ header: "개인정보3자 동의", dataKey: "thirdparty_agree" });
-    headers.push({ header: "당첨일", dataKey: "winner_date" });
-
-    let params = {
-      uri: "",
-      title: "접속IP설정",
-    };
-    // Excel 다운로드 요청
-    useUtil.fnExcelDownLoad(params, headers, excelData);
-  }
-
-  function fnPartList(EVT_SEQ, ITEM_NAME) {
-    let params = {
-      seq: EVT_SEQ,
-      item_name: ITEM_NAME,
-    };
-    useAxios()
-      .post("/winner/partclist", params)
-      .then((res) => {
-        tblItems.value = res.data.list;
-        pageObj.value.totalCnt = tblItems.value.length;
-      })
-      .catch((error) => {})
-      .finally(() => {});
-  }
-  /************************************************************************
-  |    함수(METHODS)
-  ************************************************************************/
-
-  const listLocated = () => {
-    router.push({
-      path: "/view/winner",
-    });
-  };
-
-  /************************************************************************
-  |    라이프사이클
-  ************************************************************************/
-  onMounted(() => {
-    pageType.value = useDtStore.adminInfo.pageType;
-
-    //관리자 등록/수정 분기처리
-      pageId.value = "주문 관리";
-  });
-
-  /************************************************************************
-  |    팝업 이벤트버스 정의
-  ************************************************************************/
-  // $eventBus.off("FN_INSERT");
-  // $eventBus.on("FN_INSERT", () => {
-  //   fnInsert();
-  // });
-  // $eventBus.off("FN_UPDATE");
-  // $eventBus.on("FN_UPDATE", () => {
-  //   fnUpdate();
-  // });
-  // $eventBus.off("FN_DELETE");
-  // $eventBus.on("FN_DELETE", () => {
-  //   fnDelete();
-  // });
-  /************************************************************************
-  |    WATCH
-  ************************************************************************/
-  watch(
-    () => form.value.productItemsSet,
-    (newVal, oldVal) => {
-      if (newVal !== oldVal) {
-        fnPartList(useDtStore.boardInfo.seq, newVal);
-      }
-    }
-  );
-</script>