Эх сурвалжийг харах

[배송 관리] 인플루언서-개별배송

DESKTOP-T61HUSC\user 4 сар өмнө
parent
commit
20f2210a92

+ 13 - 19
backend/app/Config/Routes.php

@@ -50,6 +50,7 @@
   $routes->get('item/download/(:segment)', 'Item::file/$1');
 
 // 제품 주문 라우트
+  $routes->post('deli/itemlist', 'Deli::itemlist');
   $routes->post('deli/list', 'Deli::delilist');
   $routes->post('deli/reg', 'Deli::deliRegister');
 
@@ -75,25 +76,8 @@
       $routes->post('delete', 'VendorController::delete');
     });
     
-    // 벤더사-인플루언서 매핑 관련 API (VendorInfluencerController → 새 컨트롤러들로 교체)
-    $routes->group('vendor-influencer', function($routes) {
-      $routes->post('search-vendors', 'InfluencerController::searchVendors'); // 벤더사 검색
-      $routes->post('request', 'InfluencerController::createApprovalRequest'); // 기존 createRequest → createApprovalRequest
-      $routes->post('requests', 'VendorController::getInfluencerRequests'); // 기존 getList → getInfluencerRequests
-      $routes->post('approve', 'VendorController::approveInfluencerRequest'); // 새로 추가 (프론트엔드용)
-      $routes->post('process', 'VendorController::processInfluencerRequest'); // 기존 approveRequest → processInfluencerRequest
-      $routes->post('terminate', 'VendorController::terminatePartnership'); // 파트너십 해지
-      $routes->post('reapply-request', 'InfluencerController::createReapplyRequest'); // 재승인요청
-      $routes->post('list', 'VendorController::getInfluencerRequests'); // 기존 getList → getInfluencerRequests
-      $routes->post('detail', 'VendorController::getRequestDetail'); // 기존 getDetail → getRequestDetail
-      $routes->post('cancel', 'InfluencerController::cancelRequest');
-      $routes->post('stats', 'VendorController::getStatusStats'); // 기존 getStats → getStatusStats
-      $routes->post('history/(:num)', 'VendorController::getHistory/$1');
-      $routes->post('create-request', 'InfluencerController::createApprovalRequest'); // 추가 호환성
-      $routes->post('my-partnerships', 'InfluencerController::getMyPartnerships'); // 추가 호환성
-      $routes->post('process-request', 'VendorController::processInfluencerRequest'); // 추가 호환성
-      $routes->post('status-stats', 'VendorController::getStatusStats'); // 추가 호환성
-    });
+    // 벤더사-인플루언서 매핑 관련 API는 Routes2.php에서 관리
+    // (기존 파트너십 라우팅은 별도 파일로 분리됨)
     
     // 인증 관련 API
     $routes->group('auth', function($routes) {
@@ -204,6 +188,15 @@
     $routes->get('simple-update', 'DebugController::testSimpleUpdate');
   });
 
+// =============================================================================
+// 추가 라우팅 파일 로드
+// =============================================================================
+
+// Routes2.php 파일 로드 (파트너십 관련 라우팅)
+if (file_exists(APPPATH . 'Config/Routes2.php')) {
+    require_once APPPATH . 'Config/Routes2.php';
+}
+
 // 인플루언서 요청 라우트 (기존 구조와 호환성)
   $routes->group('influencer-request', function($routes) {
     $routes->post('create', 'InfluencerController::createApprovalRequest');
@@ -222,5 +215,6 @@
     // 디버깅 라우트 (개발용)
     $routes->get('debug/mapping/(:num)', 'VendorController::debugMappingStatus/$1');
     $routes->get('debug/mapping', 'VendorController::debugMappingStatus');
+    $routes->get('debug/sync-mapping', 'VendorController::syncMappingStatus');
     $routes->post('debug/history-insert', 'VendorController::debugHistoryInsert');
 

+ 57 - 12
backend/app/Controllers/Deli.php

@@ -6,6 +6,45 @@ use CodeIgniter\RESTful\ResourceController;
 
 class Deli extends ResourceController
 {
+    //아이템 리스트
+    public function itemlist()
+    {
+        $db = \Config\Database::connect();
+
+        // POST JSON 파라미터 받기
+        $request = $this->request->getJSON(true);
+
+        $showYn = isset($request['SHOW_YN']) ? $request['SHOW_YN'] : null;
+        $infSeq = isset($request['INF_SEQ']) ? $request['INF_SEQ'] : null;
+
+        // 서브쿼리: INF_SEQ 기준으로 QTY, TOTAL 합계와 최신 REG_DATE 구하기
+        $subQuery = $db->table('ITEM_ORDER_LIST')
+            ->select('ITEM_SEQ, SUM(QTY) AS sum_qty, SUM(TOTAL) AS sum_total, MAX(REG_DATE) AS latest_reg_date');
+
+        if (!is_null($infSeq)) {
+            $subQuery->where('INF_SEQ', $infSeq);
+        }
+
+        $subQuery->groupBy('ITEM_SEQ');
+
+        // 메인 쿼리: ITEM_LIST와 위 서브쿼리 조인
+        $builder = $db->table('ITEM_LIST I')
+            ->select('I.*, O.sum_qty, O.sum_total, O.latest_reg_date')
+            ->join("(" . $subQuery->getCompiledSelect() . ") O", 'I.SEQ = O.ITEM_SEQ', 'left')
+            ->where('I.DEL_YN', 'N');
+
+        if (!is_null($showYn) && $showYn !== '') {
+            $builder->where('I.SHOW_YN', $showYn);
+        }
+
+        $builder->orderBy('I.UDPDATE', 'DESC');
+
+        $lists = $builder->get()->getResultArray();
+
+        return $this->respond($lists, 200);
+    }
+
+
     //구매자 리스트
     public function delilist()
     {
@@ -13,16 +52,19 @@ class Deli extends ResourceController
         $request = $this->request->getJSON(true);
         $itemSeq = isset($request['item_seq']) ? $request['item_seq'] : null;
         $infSeq = isset($request['inf_seq']) ? $request['inf_seq'] : null;
+
         // 쿼리 빌더
-        // 인플루언서 시퀀스가 들어올 경우 해당 정보만 노출, 들어오지 않으면 전체 노출
-        if($infSeq){
-            $builder = $db->table('ITEM_ORDER_LIST')->where('ITEM_SEQ', $itemSeq )->where('INF_SEQ', $infSeq);
-        } else {
-            $builder = $db->table('ITEM_ORDER_LIST')->where('ITEM_SEQ', $itemSeq );
+        $builder = $db->table('ITEM_ORDER_LIST I');
+        $builder->select('I.*, U.NICK_NAME');
+        $builder->join('USER_LIST U', 'I.INF_SEQ = U.SEQ', 'left');
+
+        $builder->where('I.ITEM_SEQ', $itemSeq);
+        if ($infSeq) {
+            $builder->where('I.INF_SEQ', $infSeq);
         }
 
         // 주문일 기준으로 정렬
-        $builder->orderBy('ORDER_DATE', 'DESC');
+        $builder->orderBy('I.ORDER_DATE', 'DESC');
         $lists = $builder->get()->getResultArray();
 
         return $this->respond($lists, 200);
@@ -38,11 +80,7 @@ class Deli extends ResourceController
         $infSeq = isset($request['inf_seq']) ? $request['inf_seq'] : null;
         $deliveryList = $request['deliveryList'] ?? [];
 
-        $db->table('ITEM_ORDER_LIST')
-            ->where('ITEM_SEQ', $itemSeq)
-            ->where('INF_SEQ', $infSeq)
-            ->delete();
-
+        // 🔍 먼저 전체 유효성 검사
         foreach ($deliveryList as $index => $delivery) {
             $requiredFields = ['buyerName', 'address', 'phone', 'qty', 'total', 'orderDate'];
             foreach ($requiredFields as $field) {
@@ -50,8 +88,15 @@ class Deli extends ResourceController
                     return $this->fail("deliveryList[$index] 항목의 '{$field}' 값이 누락되었습니다.", 400);
                 }
             }
+        }
+
+        // ✅ 유효성 통과 후 삭제 + 삽입
+        $db->table('ITEM_ORDER_LIST')
+            ->where('ITEM_SEQ', $itemSeq)
+            ->where('INF_SEQ', $infSeq)
+            ->delete();
 
-            // 삽입
+        foreach ($deliveryList as $delivery) {
             $data = [
                 'ITEM_SEQ' => $itemSeq,
                 'INF_SEQ' => $infSeq,

+ 5 - 4
pages/view/common/deli/detail.vue

@@ -131,6 +131,7 @@ import pagination from "../components/common/pagination.vue";
 |    전역
  ************************************************************************/
   const memberType = useAtStore.auth.memberType;
+  const memberSeq = useAtStore.auth.seq;
   const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
   const router = useRouter();
   const pageId = ref("배송 관리");
@@ -185,9 +186,9 @@ import pagination from "../components/common/pagination.vue";
       },
       {
         headerName: "인플루언서",
-        field: "INF_NAME",
+        field: "NICK_NAME",
         width: 150,
-        //hide: true,
+        hide: memberType == 'INFLUENCER',
       },
       {
         headerName: "구매자명",
@@ -533,6 +534,7 @@ import pagination from "../components/common/pagination.vue";
     useAxios()
     .post(`/deli/list`, req2)
     .then((res) => {
+      console.log(res.data)
       tblItems.value = res.data;
       pageObj.value.totalCnt = tblItems.value.length;
       })
@@ -546,8 +548,7 @@ import pagination from "../components/common/pagination.vue";
   const fnInsert = () => {
     const deliveryData = {
       item_seq: useDtStore.boardInfo.seq,
-      // 임시 인플루언서 시퀀스
-      inf_seq: 8,
+      inf_seq: memberSeq,
       deliveryList: tblItems.value.map(item => ({
         buyerName: item.BUYER_NAME,
         address: item.ADDRESS,

+ 16 - 8
pages/view/common/deli/index.vue

@@ -133,9 +133,12 @@ import pagination from "../components/common/pagination.vue";
 |    스토어
  ************************************************************************/
   const useDtStore = useDetailStore();
+  const useAtStore = useAuthStore();
   /************************************************************************
-|    전역
- ************************************************************************/
+   |    전역
+   ************************************************************************/
+  const memberType = useAtStore.auth.memberType;
+  const memberSeq = useAtStore.auth.seq;
   const searchModel = ref("");
   const selectedRange = ref('all');
   const itemStartDate = ref("");
@@ -193,23 +196,23 @@ import pagination from "../components/common/pagination.vue";
       },
       {
         headerName: "제품 총수량",
-        field: "STATUS",
+        field: "sum_qty",
         width: 140,
         cellRenderer: (params) => {
-          return params.value;
+          return Number(params.value).toLocaleString();
         },
       },
       {
         headerName: "총 주문금액",
-        field: "STATUS",
+        field: "sum_total",
         width: 140,
         cellRenderer: (params) => {
-          return params.value;
+          return Number(params.value).toLocaleString();
         },
       },
       {
         headerName: "주문일",
-        field: "ORDDATE",
+        field: "latest_reg_date",
         width: 140,
       },
     ],
@@ -290,10 +293,15 @@ import pagination from "../components/common/pagination.vue";
   const itemListGet = async () => {
     let _req = {
       // compId: useAuthStore().getCompanyId,
+      INF_SEQ: ""
     };
 
+    if (memberType === "INFLUENCER"){
+      _req.INF_SEQ = memberSeq;
+    }
+
     useAxios()
-      .post("/item/list", _req)
+      .post("/deli/itemlist", _req)
       .then((res) => {
         tblItems.value = res.data;
         pageObj.value.totalCnt = tblItems.value.length;

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

@@ -240,6 +240,7 @@ import dayjs from 'dayjs';
       SHOW_YN: "",
     };
 
+    // 인플루언서의 경우 비노출 처리된 제품 숨김
     if (memberType === "INFLUENCER") {
       _req.SHOW_YN = "Y";
     }