index.vue 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. <template>
  2. <div>
  3. <div class="inner--headers">
  4. <h2>{{ pageId }}</h2>
  5. <div class="bread--crumbs--wrap">
  6. <span>홈</span>
  7. <span>{{ pageId }}</span>
  8. <span v-if="pageIdSub">{{ pageIdSub }}</span>
  9. </div>
  10. </div>
  11. <div class="search--modules type2">
  12. <div class="search--inner">
  13. <div class="form--cont--filter">
  14. <v-select
  15. v-model="filter"
  16. :items="filderArr"
  17. variant="outlined"
  18. class="custom-select"
  19. >
  20. </v-select>
  21. </div>
  22. <div class="form--cont--text">
  23. <v-text-field
  24. v-model="searchModel"
  25. class="custom-input mini"
  26. style="width: 100%"
  27. placeholder="검색어를 입력하세요"
  28. ></v-text-field>
  29. </div>
  30. </div>
  31. <div class="search--inner">
  32. <div class="calendar-wrap ml--0">
  33. <div class="calendar">
  34. <VueDatePicker
  35. :format="datePickerFormat"
  36. v-model="searchStartDate"
  37. placeholder="날짜를 선택하세요"
  38. :auto-apply="true"
  39. week-start="0"
  40. ></VueDatePicker>
  41. </div>
  42. <span class="text">~</span>
  43. <div class="calendar">
  44. <VueDatePicker
  45. v-model="searchEndDate"
  46. :format="datePickerFormat"
  47. placeholder="날짜를 선택하세요"
  48. :auto-apply="true"
  49. week-start="0"
  50. ></VueDatePicker>
  51. </div>
  52. <div class="month--selector">
  53. <v-btn
  54. v-for="option in dateOptions"
  55. :key="option.value"
  56. :class="{ actv: selectedRange === option.value }"
  57. @click="setDateRange(option.value)"
  58. elevation="0"
  59. >
  60. {{ option.label }}
  61. </v-btn>
  62. </div>
  63. </div>
  64. </div>
  65. <v-btn
  66. class="custom-btn btn-blue mini sch--btn"
  67. @click="fnSearch(searchModel, filter)"
  68. >검색</v-btn
  69. >
  70. </div>
  71. <div class="data--list--wrap">
  72. <div class="btn--actions--wrap">
  73. <div class="left--sections">
  74. <!-- <v-btn class="custom-btn mini btn-white">선택 삭제</v-btn> -->
  75. </div>
  76. </div>
  77. <div class="tbl-wrapper">
  78. <div class="tbl-wrap">
  79. <!-- ag grid -->
  80. <ag-grid-vue
  81. style="width: 100%; height: calc(10 * 2.94rem)"
  82. class="ag-theme-quartz"
  83. :gridOptions="gridOptions"
  84. :rowData="tblItems"
  85. :paginationPageSize="pageObj.pageSize"
  86. :suppressPaginationPanel="true"
  87. @grid-ready="onGridReady"
  88. @rowClicked="detailLocated"
  89. >
  90. </ag-grid-vue>
  91. <!-- 페이징 -->
  92. <div class="ag-grid-custom-pagenations">
  93. <pagination @chg_page="chgPage" :pageObj="pageObj"></pagination>
  94. </div>
  95. </div>
  96. </div>
  97. </div>
  98. </div>
  99. </template>
  100. <script setup>
  101. import VueDatePicker from "@vuepic/vue-datepicker";
  102. import "@vuepic/vue-datepicker/dist/main.css";
  103. import { AgGridVue } from "ag-grid-vue3";
  104. import pagination from "../components/common/pagination.vue";
  105. /************************************************************************
  106. | 레이아웃
  107. ************************************************************************/
  108. definePageMeta({
  109. layout: "default",
  110. });
  111. /************************************************************************
  112. | PROPS
  113. ************************************************************************/
  114. const props = defineProps({
  115. propsData: {
  116. type: Object,
  117. default: () => {},
  118. },
  119. });
  120. /************************************************************************
  121. | 스토어
  122. ************************************************************************/
  123. const useDtStore = useDetailStore();
  124. /************************************************************************
  125. | 전역
  126. ************************************************************************/
  127. const filter = ref("");
  128. const filderArr = ref([
  129. { title: "전체", value: "" },
  130. { title: "벤더사", value: "title" },
  131. ]);
  132. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
  133. const router = useRouter();
  134. const pageId = ref("정산 관리");
  135. const pageIdSub = ref();
  136. const searchModel = ref("");
  137. const selectedRange = ref('all');
  138. const itemStartDate = ref("");
  139. const searchStartDate = ref("");
  140. const searchEndDate = ref("");
  141. const datePickerFormat = "yyyy-MM-dd";
  142. const dateOptions = [
  143. { label: '오늘', value: 'today' },
  144. { label: '7일', value: '7d' },
  145. { label: '1개월', value: '1m' },
  146. { label: '3개월', value: '3m' },
  147. { label: '전체', value: 'all' },
  148. ]
  149. let pageObj = ref({
  150. page: 1, // 현재 페이지
  151. pageMaxNumSize: 10, // 페이지 숫자 최대 표현 개수
  152. pageSize: 10, // 테이블 조회 데이터 개수
  153. totalCnt: 0, // 전체 페이지
  154. });
  155. const tblItems = ref([]); // stat 데이터
  156. /* eslint-disable */
  157. /* prettier-ignore */
  158. const remToPx = () => parseFloat(getComputedStyle(document.documentElement).fontSize);
  159. const rowHeightRem = 2.65; // 원하는 rem 값
  160. const rowHeightPx = rowHeightRem * remToPx();
  161. const gridApi = shallowRef();
  162. // gridOption
  163. const gridOptions = {
  164. columnDefs: [
  165. {
  166. headerName: "No",
  167. valueGetter: (params) => params.api.getDisplayedRowCount() - params.node.rowIndex,
  168. sortable: false,
  169. width: 70,
  170. },
  171. { headerName: "벤더사", field: "brd_lang", sortable: true, width: 150 },
  172. { headerName: "제품 총수량", field: "title", sortable: false, width: 70 },
  173. { headerName: "판매금액", field: "show_yn", sortable: true, width: 70 },
  174. { headerName: "정산기간", field: "crt_dtime", sortable: false, width: 120 },
  175. ],
  176. rowData: tblItems.value, // 테이블 데이터
  177. autoSizeStrategy: {
  178. type: "fitGridWidth", // width맞춤
  179. },
  180. suppressMovableColumns: true,
  181. headerHeight: rowHeightPx,
  182. rowHeight: rowHeightPx,
  183. pagination: true,
  184. suppressPaginationPanel: true, // 하단 default 페이징 컨트롤 숨김
  185. // rowSelection: {
  186. // checkboxes: true,
  187. // headerCheckbox: true,
  188. // enableClickSelection: false,
  189. // mode: "multiRow",
  190. // },
  191. };
  192. /************************************************************************
  193. | 함수(METHODS)
  194. ************************************************************************/
  195. const onGridReady = (__PARAMS) => {
  196. gridApi.value = __PARAMS.api;
  197. };
  198. const chgPage = (__PAGE) => {
  199. pageObj.value.page = __PAGE;
  200. gridApi.value.paginationGoToPage(__PAGE - 1);
  201. };
  202. const detailLocated = (__EVENT) => {
  203. router.push({
  204. path: "/view/media/irAdd",
  205. });
  206. useDtStore.boardInfo.seq = __EVENT.data.seq;
  207. useDtStore.boardInfo.pageType = "U";
  208. };
  209. const newsListGet = () => {
  210. let _req = {
  211. _size: 1000,
  212. _index: 0,
  213. brd_lang: "",
  214. brd_cd: "BR02",
  215. };
  216. useAxios()
  217. .post("/brd/list", _req)
  218. .then((res) => {
  219. _req._size = res.data.list.length;
  220. tblItems.value = res.data.list;
  221. pageObj.value.totalCnt = tblItems.value.length;
  222. })
  223. .catch((error) => {});
  224. };
  225. const setDateRange = (range) => {
  226. const today = dayjs();
  227. switch(range) {
  228. case 'today' :
  229. searchStartDate.value = today.format('YYYY-MM-DD');
  230. searchEndDate.value = today.format('YYYY-MM-DD');
  231. selectedRange.value = 'today';
  232. break;
  233. case '7d':
  234. searchStartDate.value = today.subtract(7, 'day').format('YYYY-MM-DD');
  235. searchEndDate.value = today.format('YYYY-MM-DD');
  236. selectedRange.value = '7d';
  237. break;
  238. case '1m':
  239. searchStartDate.value = today.subtract(1, 'month').format('YYYY-MM-DD');
  240. searchEndDate.value = today.format('YYYY-MM-DD');
  241. selectedRange.value = '1m';
  242. break;
  243. case '3m':
  244. searchStartDate.value = today.subtract(3, 'month').format('YYYY-MM-DD');
  245. searchEndDate.value = today.format('YYYY-MM-DD');
  246. selectedRange.value = '3m';
  247. break;
  248. case 'all':
  249. searchStartDate.value = itemStartDate.value;
  250. searchEndDate.value = today.format('YYYY-MM-DD');
  251. selectedRange.value = 'all';
  252. break
  253. }
  254. }
  255. const fnSearch = (__KEYWORD, __FILTER) => {
  256. let _req = {
  257. filter: __FILTER,
  258. keyword: __KEYWORD,
  259. startDate: searchStartDate.value,
  260. endDate: searchEndDate.value,
  261. //인플루언서의 경우 showYN 추가
  262. //showYN: "Y"
  263. };
  264. useAxios()
  265. .post("/item/search", _req)
  266. .then((res) => {
  267. itemList.value = res.data;
  268. })
  269. .catch((error) => {});
  270. };
  271. /************************************************************************
  272. | WATCH
  273. ************************************************************************/
  274. onMounted(() => {
  275. newsListGet();
  276. });
  277. </script>